mirror of
https://github.com/shadps4-emu/ext-cryptopp.git
synced 2024-11-27 03:40:22 +00:00
Add TestSymmetricCipherWithFileSource stub
There are a couple of failures at the moment so it is not enabled
This commit is contained in:
parent
034297eafa
commit
dd59d58c19
134
datatest.cpp
134
datatest.cpp
@ -522,14 +522,15 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
|
|||||||
// BlockSize or Tweak, then it becomes latched in testDataPairs. The old
|
// BlockSize or Tweak, then it becomes latched in testDataPairs. The old
|
||||||
// value is used in subsequent tests, and it could cause a self test
|
// value is used in subsequent tests, and it could cause a self test
|
||||||
// failure in the next test. The behavior surfaced under Kalyna and
|
// failure in the next test. The behavior surfaced under Kalyna and
|
||||||
// Threefish. The Kalyna test vectors use NO_PADDING for all tests excpet
|
// Threefish. The Kalyna test vectors use NO_PADDING for all tests except
|
||||||
// one. For Threefish, using (and not using) a Tweak caused problems as
|
// one. For Threefish, using (and not using) a Tweak caused problems as
|
||||||
// we marched through test vectors. For BlockPadding, BlockSize or Tweak,
|
// we marched through test vectors. For BlockPadding, BlockSize or Tweak,
|
||||||
// unlatch them now, after the key has been set and NameValuePairs have
|
// unlatch them now, after the key has been set and NameValuePairs have
|
||||||
// been processed. Also note we only unlatch from testDataPairs. If
|
// been processed. Also note we only unlatch from testDataPairs. If
|
||||||
// overrideParameters are specified, the caller is responsible for
|
// overrideParameters are specified, the caller is responsible for
|
||||||
// managing the parameter.
|
// managing the parameter.
|
||||||
v.erase("Tweak"); v.erase("InitialBlock"); v.erase("BlockSize"); v.erase("BlockPaddingScheme");
|
v.erase("Tweak"); v.erase("InitialBlock");
|
||||||
|
v.erase("BlockSize"); v.erase("BlockPaddingScheme");
|
||||||
|
|
||||||
std::string encrypted, xorDigest, ciphertext, ciphertextXorDigest;
|
std::string encrypted, xorDigest, ciphertext, ciphertextXorDigest;
|
||||||
if (test == "EncryptionMCT" || test == "DecryptionMCT")
|
if (test == "EncryptionMCT" || test == "DecryptionMCT")
|
||||||
@ -622,6 +623,127 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestSymmetricCipherWithFileSource(TestData &v, const NameValuePairs &overrideParameters)
|
||||||
|
{
|
||||||
|
std::string name = GetRequiredDatum(v, "Name");
|
||||||
|
std::string test = GetRequiredDatum(v, "Test");
|
||||||
|
|
||||||
|
// Limit FileSource tests to Encrypt only.
|
||||||
|
if (test != "Encrypt") { return; }
|
||||||
|
|
||||||
|
std::string key = GetDecodedDatum(v, "Key");
|
||||||
|
std::string plaintext = GetDecodedDatum(v, "Plaintext");
|
||||||
|
|
||||||
|
TestDataNameValuePairs testDataPairs(v);
|
||||||
|
CombinedNameValuePairs pairs(overrideParameters, testDataPairs);
|
||||||
|
|
||||||
|
static member_ptr<SymmetricCipher> encryptor, decryptor;
|
||||||
|
static std::string lastName;
|
||||||
|
|
||||||
|
if (name != lastName)
|
||||||
|
{
|
||||||
|
encryptor.reset(ObjectFactoryRegistry<SymmetricCipher, ENCRYPTION>::Registry().CreateObject(name.c_str()));
|
||||||
|
decryptor.reset(ObjectFactoryRegistry<SymmetricCipher, DECRYPTION>::Registry().CreateObject(name.c_str()));
|
||||||
|
lastName = name;
|
||||||
|
|
||||||
|
// Code coverage
|
||||||
|
(void)encryptor->AlgorithmName();
|
||||||
|
(void)decryptor->AlgorithmName();
|
||||||
|
(void)encryptor->AlgorithmProvider();
|
||||||
|
(void)decryptor->AlgorithmProvider();
|
||||||
|
(void)encryptor->MinKeyLength();
|
||||||
|
(void)decryptor->MinKeyLength();
|
||||||
|
(void)encryptor->MaxKeyLength();
|
||||||
|
(void)decryptor->MaxKeyLength();
|
||||||
|
(void)encryptor->DefaultKeyLength();
|
||||||
|
(void)decryptor->DefaultKeyLength();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Most block ciphers don't specify BlockPaddingScheme. Kalyna uses it in test vectors.
|
||||||
|
// 0 is NoPadding, 1 is ZerosPadding, 2 is PkcsPadding, 3 is OneAndZerosPadding, etc
|
||||||
|
// Note: The machinery is wired such that paddingScheme is effectively latched. An
|
||||||
|
// old paddingScheme may be unintentionally used in a subsequent test.
|
||||||
|
int paddingScheme = pairs.GetIntValueWithDefault(Name::BlockPaddingScheme(), 0);
|
||||||
|
|
||||||
|
ConstByteArrayParameter iv;
|
||||||
|
if (pairs.GetValue(Name::IV(), iv) && iv.size() != encryptor->IVSize())
|
||||||
|
SignalTestFailure();
|
||||||
|
|
||||||
|
encryptor->SetKey(ConstBytePtr(key), BytePtrSize(key), pairs);
|
||||||
|
decryptor->SetKey(ConstBytePtr(key), BytePtrSize(key), pairs);
|
||||||
|
|
||||||
|
word64 seek64 = pairs.GetWord64ValueWithDefault("Seek64", 0);
|
||||||
|
if (seek64)
|
||||||
|
{
|
||||||
|
encryptor->Seek(seek64);
|
||||||
|
decryptor->Seek(seek64);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int seek = pairs.GetIntValueWithDefault("Seek", 0);
|
||||||
|
if (seek)
|
||||||
|
{
|
||||||
|
encryptor->Seek(seek);
|
||||||
|
decryptor->Seek(seek);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a per-test vector parameter was set for a test, like BlockPadding,
|
||||||
|
// BlockSize or Tweak, then it becomes latched in testDataPairs. The old
|
||||||
|
// value is used in subsequent tests, and it could cause a self test
|
||||||
|
// failure in the next test. The behavior surfaced under Kalyna and
|
||||||
|
// Threefish. The Kalyna test vectors use NO_PADDING for all tests except
|
||||||
|
// one. For Threefish, using (and not using) a Tweak caused problems as
|
||||||
|
// we marched through test vectors. For BlockPadding, BlockSize or Tweak,
|
||||||
|
// unlatch them now, after the key has been set and NameValuePairs have
|
||||||
|
// been processed. Also note we only unlatch from testDataPairs. If
|
||||||
|
// overrideParameters are specified, the caller is responsible for
|
||||||
|
// managing the parameter.
|
||||||
|
v.erase("Tweak"); v.erase("InitialBlock");
|
||||||
|
v.erase("BlockSize"); v.erase("BlockPaddingScheme");
|
||||||
|
|
||||||
|
std::string encrypted, ciphertext;
|
||||||
|
StreamTransformationFilter encFilter(*encryptor, new StringSink(encrypted),
|
||||||
|
static_cast<BlockPaddingSchemeDef::BlockPaddingScheme>(paddingScheme));
|
||||||
|
|
||||||
|
//StringStore pstore(plaintext);
|
||||||
|
//RandomizedTransfer(pstore, encFilter, true);
|
||||||
|
// encFilter.MessageEnd();
|
||||||
|
|
||||||
|
std::string testFilename = "test.dat";
|
||||||
|
StringSource(plaintext, true, new FileSink(testFilename.c_str()));
|
||||||
|
FileSource(testFilename.c_str(), true, new Redirector(encFilter));
|
||||||
|
encFilter.MessageEnd();
|
||||||
|
|
||||||
|
ciphertext = GetDecodedDatum(v, "Ciphertext");
|
||||||
|
|
||||||
|
if (encrypted != ciphertext)
|
||||||
|
{
|
||||||
|
std::cout << "\nincorrectly encrypted: ";
|
||||||
|
StringSource xx(encrypted, false, new HexEncoder(new FileSink(std::cout)));
|
||||||
|
xx.Pump(2048); xx.Flush(false);
|
||||||
|
std::cout << "\n";
|
||||||
|
SignalTestFailure();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string decrypted;
|
||||||
|
StreamTransformationFilter decFilter(*decryptor, new StringSink(decrypted),
|
||||||
|
static_cast<BlockPaddingSchemeDef::BlockPaddingScheme>(paddingScheme));
|
||||||
|
|
||||||
|
StringStore cstore(encrypted);
|
||||||
|
RandomizedTransfer(cstore, decFilter, true);
|
||||||
|
decFilter.MessageEnd();
|
||||||
|
|
||||||
|
if (decrypted != plaintext)
|
||||||
|
{
|
||||||
|
std::cout << "\nincorrectly decrypted: ";
|
||||||
|
StringSource xx(decrypted, false, new HexEncoder(new FileSink(std::cout)));
|
||||||
|
xx.Pump(256); xx.Flush(false);
|
||||||
|
std::cout << "\n";
|
||||||
|
SignalTestFailure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TestAuthenticatedSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
|
void TestAuthenticatedSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
|
||||||
{
|
{
|
||||||
std::string type = GetRequiredDatum(v, "AlgorithmType");
|
std::string type = GetRequiredDatum(v, "AlgorithmType");
|
||||||
@ -914,10 +1036,9 @@ void OutputNameValuePairs(const NameValuePairs &v)
|
|||||||
|
|
||||||
void TestDataFile(std::string filename, const NameValuePairs &overrideParameters, unsigned int &totalTests, unsigned int &failedTests)
|
void TestDataFile(std::string filename, const NameValuePairs &overrideParameters, unsigned int &totalTests, unsigned int &failedTests)
|
||||||
{
|
{
|
||||||
filename = DataDir(filename);
|
std::ifstream file(DataDir(filename).c_str());
|
||||||
std::ifstream file(filename.c_str());
|
|
||||||
if (!file.good())
|
if (!file.good())
|
||||||
throw Exception(Exception::OTHER_ERROR, "Can not open file " + filename + " for reading");
|
throw Exception(Exception::OTHER_ERROR, "Can not open file " + DataDir(filename) + " for reading");
|
||||||
|
|
||||||
TestData v;
|
TestData v;
|
||||||
s_currentTestData = &v;
|
s_currentTestData = &v;
|
||||||
@ -951,7 +1072,10 @@ void TestDataFile(std::string filename, const NameValuePairs &overrideParameters
|
|||||||
if (algType == "Signature")
|
if (algType == "Signature")
|
||||||
TestSignatureScheme(v);
|
TestSignatureScheme(v);
|
||||||
else if (algType == "SymmetricCipher")
|
else if (algType == "SymmetricCipher")
|
||||||
|
{
|
||||||
TestSymmetricCipher(v, overrideParameters);
|
TestSymmetricCipher(v, overrideParameters);
|
||||||
|
// TestSymmetricCipherWithFileSource(v, overrideParameters);
|
||||||
|
}
|
||||||
else if (algType == "AuthenticatedSymmetricCipher")
|
else if (algType == "AuthenticatedSymmetricCipher")
|
||||||
TestAuthenticatedSymmetricCipher(v, overrideParameters);
|
TestAuthenticatedSymmetricCipher(v, overrideParameters);
|
||||||
else if (algType == "AsymmetricCipher")
|
else if (algType == "AsymmetricCipher")
|
||||||
|
Loading…
Reference in New Issue
Block a user