From cd0d14563532332943faf27a5ee5205f294999e4 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Wed, 3 Jul 2019 03:06:58 -0400 Subject: [PATCH] Add legacy ECIES EC2N cryptosystem and kat (GH #856) --- Filelist.txt | 1 + TestData/ecies_t163.dat | 1 + validat3.cpp | 1 + validat8.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ validate.h | 1 + 5 files changed, 44 insertions(+) create mode 100644 TestData/ecies_t163.dat diff --git a/Filelist.txt b/Filelist.txt index 345428b0..bb118f85 100644 --- a/Filelist.txt +++ b/Filelist.txt @@ -438,6 +438,7 @@ TestData/dsa1024.dat TestData/dsa1024b.dat TestData/dsa512.dat TestData/ecies_p160.dat +TestData/ecies_t163.dat TestData/ed25519.dat TestData/ed25519_ver.dat TestData/ed25519v0.dat diff --git a/TestData/ecies_t163.dat b/TestData/ecies_t163.dat new file mode 100644 index 00000000..30508843 --- /dev/null +++ b/TestData/ecies_t163.dat @@ -0,0 +1 @@ +3081D10201003081AD06072A8648CE3D02013081A1020101302506072A8648CE3D0102301A020200A306092A8648CE3D010203033009020103020106020107302E041507B6882CAAEFA84F9554FF8428BD88E246D2782AE204150713612DCDDCB40AAB946BDA29CA91F73AF958AFD9042B040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883021503FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B020102041C301A02010104150003693AB4D83EE8B544548BE7647AEA0EA64E8211 diff --git a/validat3.cpp b/validat3.cpp index 1f84f24c..b5dcd6d2 100644 --- a/validat3.cpp +++ b/validat3.cpp @@ -193,6 +193,7 @@ bool ValidateAll(bool thorough) pass=ValidateECP() && pass; pass=ValidateEC2N() && pass; pass=ValidateECP_Legacy_Encrypt() && pass; + pass=ValidateEC2N_Legacy_Encrypt() && pass; pass=ValidateECDSA() && pass; pass=ValidateECDSA_RFC6979() && pass; pass=ValidateECGDSA(thorough) && pass; diff --git a/validat8.cpp b/validat8.cpp index a1d032c0..ab95ed76 100644 --- a/validat8.cpp +++ b/validat8.cpp @@ -232,6 +232,46 @@ bool ValidateECP_Legacy_Encrypt() 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::Decryptor privC(fc); + ECIES::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() { // DEREncode() changed to Save() at Issue 569. diff --git a/validate.h b/validate.h index 1a249a64..39d11bb0 100644 --- a/validate.h +++ b/validate.h @@ -373,6 +373,7 @@ bool ValidateECP_Encrypt(); bool ValidateECP_Sign(); bool ValidateECP_Legacy_Encrypt(); +bool ValidateEC2N_Legacy_Encrypt(); bool ValidateECP_NULLDigest_Encrypt(); bool ValidateEC2N();