Make datatest.cpp aware of padding schemes

This change was needed for Kalyna and its CBC test vectors. One test uses OneAndZeros padding
pull/416/head
Jeffrey Walton 2017-05-10 15:26:36 -04:00
parent 0de44edde1
commit b2a6ba460f
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
1 changed files with 13 additions and 4 deletions

View File

@ -375,9 +375,15 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
lastName = name;
}
// Most block ciphers don't specify this. Kalyna and Threefish use it.
// Most block ciphers don't specify BlockSize. Kalyna and Threefish use it.
int blockSize = pairs.GetIntValueWithDefault(Name::BlockSize(), 0);
// 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() && (int)iv.size() != blockSize)
SignalTestFailure();
@ -439,13 +445,15 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
return;
}
StreamTransformationFilter encFilter(*encryptor, new StringSink(encrypted), StreamTransformationFilter::NO_PADDING);
StreamTransformationFilter encFilter(*encryptor, new StringSink(encrypted),
static_cast<BlockPaddingSchemeDef::BlockPaddingScheme>(paddingScheme));
RandomizedTransfer(StringStore(plaintext).Ref(), encFilter, true);
encFilter.MessageEnd();
/*{
std::string z;
encryptor->Seek(seek);
StringSource ss(plaintext, false, new StreamTransformationFilter(*encryptor, new StringSink(z), StreamTransformationFilter::NO_PADDING));
StringSource ss(plaintext, false, new StreamTransformationFilter(*encryptor, new StringSink(z),
static_cast<BlockPaddingSchemeDef::BlockPaddingScheme>(paddingScheme)));
while (ss.Pump(64)) {}
ss.PumpAll();
for (int i=0; i<z.length(); i++)
@ -469,7 +477,8 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
SignalTestFailure();
}
std::string decrypted;
StreamTransformationFilter decFilter(*decryptor, new StringSink(decrypted), StreamTransformationFilter::NO_PADDING);
StreamTransformationFilter decFilter(*decryptor, new StringSink(decrypted),
static_cast<BlockPaddingSchemeDef::BlockPaddingScheme>(paddingScheme));
RandomizedTransfer(StringStore(encrypted).Ref(), decFilter, true);
decFilter.MessageEnd();
if (decrypted != plaintext)