Add legacy ECIES EC2N cryptosystem and kat (GH #856)

pull/867/head
Jeffrey Walton 2019-07-03 03:06:58 -04:00
parent ce6d3c1306
commit cd0d145635
5 changed files with 44 additions and 0 deletions

View File

@ -438,6 +438,7 @@ TestData/dsa1024.dat
TestData/dsa1024b.dat TestData/dsa1024b.dat
TestData/dsa512.dat TestData/dsa512.dat
TestData/ecies_p160.dat TestData/ecies_p160.dat
TestData/ecies_t163.dat
TestData/ed25519.dat TestData/ed25519.dat
TestData/ed25519_ver.dat TestData/ed25519_ver.dat
TestData/ed25519v0.dat TestData/ed25519v0.dat

1
TestData/ecies_t163.dat Normal file
View File

@ -0,0 +1 @@
3081D10201003081AD06072A8648CE3D02013081A1020101302506072A8648CE3D0102301A020200A306092A8648CE3D010203033009020103020106020107302E041507B6882CAAEFA84F9554FF8428BD88E246D2782AE204150713612DCDDCB40AAB946BDA29CA91F73AF958AFD9042B040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883021503FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B020102041C301A02010104150003693AB4D83EE8B544548BE7647AEA0EA64E8211

View File

@ -193,6 +193,7 @@ bool ValidateAll(bool thorough)
pass=ValidateECP() && pass; pass=ValidateECP() && pass;
pass=ValidateEC2N() && pass; pass=ValidateEC2N() && pass;
pass=ValidateECP_Legacy_Encrypt() && pass; pass=ValidateECP_Legacy_Encrypt() && pass;
pass=ValidateEC2N_Legacy_Encrypt() && pass;
pass=ValidateECDSA() && pass; pass=ValidateECDSA() && pass;
pass=ValidateECDSA_RFC6979() && pass; pass=ValidateECDSA_RFC6979() && pass;
pass=ValidateECGDSA(thorough) && pass; pass=ValidateECGDSA(thorough) && pass;

View File

@ -232,6 +232,46 @@ bool ValidateECP_Legacy_Encrypt()
return pass; return pass;
} }
// Ensure interop with Crypto++ 5.6.4 and earlier
bool ValidateEC2N_Legacy_Encrypt()
{
std::cout << "\nLegacy ECIES EC2N validation suite running...\n\n";
bool pass = true;
{
FileSource fc(DataDir("TestData/ecies_t163.dat").c_str(), true, new HexDecoder);
ECIES<EC2N,SHA1,NoCofactorMultiplication,false,true>::Decryptor privC(fc);
ECIES<EC2N,SHA1,NoCofactorMultiplication,false,true>::Encryptor pubC(privC);
pass = CryptoSystemValidate(privC, pubC) && pass;
// Test data generated by Crypto++ 5.6.2.
// Also see https://github.com/weidai11/cryptopp/pull/857.
const std::string plain = "Yoda said, Do or do not. There is no try.";
const std::string cipher =
"\x04\x01\x3F\x64\x94\x6A\xBE\x2B\x7E\x48\x67\x63\xA2\xD4\x01\xEF"
"\x2B\x13\x1C\x9A\x1B\x7C\x07\x4B\x89\x78\x6C\x65\x51\x1C\x1A\x4E"
"\x20\x7F\xB5\xBF\x12\x3B\x6E\x0A\x87\xFD\xB7\x94\xEF\x4B\xED\x40"
"\xD4\x7A\xCF\xB6\xFC\x9B\x6D\xB0\xB8\x43\x99\x7E\x37\xC1\xF0\xC0"
"\x95\xD4\x80\xE1\x8B\x84\xAE\x64\x9F\xA5\xBA\x32\x95\x8A\xD1\xBE"
"\x7F\xDE\x7E\xA9\xE6\x59\xBF\x89\xA6\xE9\x9F\x5B\x64\xB4\xDD\x0E"
"\x76\xB6\x82\xF6\xA9\xAD\xB5\xC4";
std::string recover;
recover.resize(privC.MaxPlaintextLength(cipher.size()));
DecodingResult result = privC.Decrypt(GlobalRNG(), C2B(&cipher[0]), cipher.size(), C2B(&recover[0]));
if (result.isValidCoding)
recover.resize(result.messageLength);
else
recover.resize(0);
pass = (plain == recover) && pass;
std::cout << (pass ? "passed " : "FAILED ");
std::cout << "decryption known answer\n";
}
return pass;
}
bool ValidateEC2N_Encrypt() bool ValidateEC2N_Encrypt()
{ {
// DEREncode() changed to Save() at Issue 569. // DEREncode() changed to Save() at Issue 569.

View File

@ -373,6 +373,7 @@ bool ValidateECP_Encrypt();
bool ValidateECP_Sign(); bool ValidateECP_Sign();
bool ValidateECP_Legacy_Encrypt(); bool ValidateECP_Legacy_Encrypt();
bool ValidateEC2N_Legacy_Encrypt();
bool ValidateECP_NULLDigest_Encrypt(); bool ValidateECP_NULLDigest_Encrypt();
bool ValidateEC2N(); bool ValidateEC2N();