5 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 49 #if (CRYPTOPP_MSC_VERSION >= 1410) 50 # pragma strict_gs_check (on) 53 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 54 # pragma GCC diagnostic ignored "-Wdeprecated-declarations" 67 m_source.Get(output, size);
76 cout <<
"\nBlumBlumShub validation suite running...\n\n";
78 Integer p(
"212004934506826557583707108431463840565872545889679278744389317666981496005411448865750399674653351");
79 Integer q(
"100677295735404212434355574418077394581488455772477016953458064183204108039226017738610663984508231");
80 Integer seed(
"63239752671357255800299643604761065219897634268887145610573595874544114193025997412441121667211431");
82 bool pass =
true, fail;
85 static const byte output1[] = {
86 0x49,0xEA,0x2C,0xFD,0xB0,0x10,0x64,0xA0,0xBB,0xB9,
87 0x2A,0xF1,0x01,0xDA,0xC1,0x8A,0x94,0xF7,0xB7,0xCE};
88 static const byte output2[] = {
89 0x74,0x45,0x48,0xAE,0xAC,0xB7,0x0E,0xDF,0xAF,0xD7,
90 0xD5,0x0E,0x8E,0x29,0x83,0x75,0x6B,0x27,0x46,0xA1};
97 fail = memcmp(output1, buf, 20) != 0;
100 cout << (fail ?
"FAILED " :
"passed ");
102 cout << setw(2) << setfill(
'0') << hex << (int)buf[j];
107 fail = memcmp(output1+10, buf, 10) != 0;
108 pass = pass && !fail;
110 cout << (fail ?
"FAILED " :
"passed ");
112 cout << setw(2) << setfill(
'0') << hex << (int)buf[j];
117 fail = memcmp(output2, buf, 20) != 0;
118 pass = pass && !fail;
120 cout << (fail ?
"FAILED " :
"passed ");
122 cout << setw(2) << setfill(
'0') << hex << (int)buf[j];
130 bool pass =
true, fail;
133 pass = pass && !fail;
135 cout << (fail ?
"FAILED " :
"passed ");
136 cout <<
"signature key validation\n";
138 const byte *message = (
byte *)
"test message";
139 const int messageLen = 12;
143 fail = !pub.
VerifyMessage(message, messageLen, signature, signatureLength);
144 pass = pass && !fail;
146 cout << (fail ?
"FAILED " :
"passed ");
147 cout <<
"signature and verification\n";
150 fail = pub.
VerifyMessage(message, messageLen, signature, signatureLength);
151 pass = pass && !fail;
153 cout << (fail ?
"FAILED " :
"passed ");
154 cout <<
"checking invalid signature" << endl;
161 fail = !(result.isValidCoding && result.messageLength == messageLen && memcmp(recovered, message, messageLen) == 0);
162 pass = pass && !fail;
164 cout << (fail ?
"FAILED " :
"passed ");
165 cout <<
"signature and verification with recovery" << endl;
168 result = pub.
RecoverMessage(recovered, NULL, 0, signature, signatureLength);
170 pass = pass && !fail;
172 cout << (fail ?
"FAILED " :
"passed ");
173 cout <<
"recovery with invalid signature" << endl;
181 bool pass =
true, fail;
184 pass = pass && !fail;
186 cout << (fail ?
"FAILED " :
"passed ");
187 cout <<
"cryptosystem key validation\n";
189 const byte *message = (
byte *)
"test message";
190 const int messageLen = 12;
196 fail = fail || memcmp(message, plaintext, messageLen);
197 pass = pass && !fail;
199 cout << (fail ?
"FAILED " :
"passed ");
200 cout <<
"encryption and decryption\n";
208 cout <<
"passed simple key agreement domain parameters validation" << endl;
211 cout <<
"FAILED simple key agreement domain parameters invalid" << endl;
222 memset(val1.begin(), 0x10, val1.size());
223 memset(val2.begin(), 0x11, val2.size());
225 if (!(d.
Agree(val1, priv1, pub2) && d.
Agree(val2, priv2, pub1)))
227 cout <<
"FAILED simple key agreement failed" << endl;
233 cout <<
"FAILED simple agreed values not equal" << endl;
237 cout <<
"passed simple key agreement" << endl;
244 cout <<
"passed authenticated key agreement domain parameters validation" << endl;
247 cout <<
"FAILED authenticated key agreement domain parameters invalid" << endl;
262 memset(val1.begin(), 0x10, val1.size());
263 memset(val2.begin(), 0x11, val2.size());
265 if (!(d.
Agree(val1, spriv1, epriv1, spub2, epub2) && d.
Agree(val2, spriv2, epriv2, spub1, epub1)))
267 cout <<
"FAILED authenticated key agreement failed" << endl;
273 cout <<
"FAILED authenticated agreed values not equal" << endl;
277 cout <<
"passed authenticated key agreement" << endl;
283 cout <<
"\nRSA validation suite running...\n\n";
285 byte out[100], outPlain[100];
286 bool pass =
true, fail;
289 const char *plain =
"Everyone gets Friday off.";
290 static const byte signature[] =
291 "\x05\xfa\x6a\x81\x2f\xc7\xdf\x8b\xf4\xf2\x54\x25\x09\xe0\x3e\x84" 292 "\x6e\x11\xb9\xc6\x20\xbe\x20\x09\xef\xb4\x40\xef\xbc\xc6\x69\x21" 293 "\x69\x94\xac\x04\xf3\x41\xb5\x7d\x05\x20\x2d\x42\x8f\xb2\xa2\x7b" 294 "\x5c\x77\xdf\xd9\xb1\x5b\xfc\x3d\x55\x93\x53\x50\x34\x10\xc1\xe1";
300 size_t signatureLength = rsaPriv.SignMessage(
GlobalRNG(), (
byte *)plain, strlen(plain), out);
301 fail = memcmp(signature, out, 64) != 0;
302 pass = pass && !fail;
304 cout << (fail ?
"FAILED " :
"passed ");
305 cout <<
"signature check against test vector\n";
307 fail = !rsaPub.VerifyMessage((
byte *)plain, strlen(plain), out, signatureLength);
308 pass = pass && !fail;
310 cout << (fail ?
"FAILED " :
"passed ");
311 cout <<
"verification check against test vector\n";
314 fail = rsaPub.VerifyMessage((
byte *)plain, strlen(plain), out, signatureLength);
315 pass = pass && !fail;
317 cout << (fail ?
"FAILED " :
"passed ");
318 cout <<
"invalid signature verification\n";
322 RSAES_PKCS1v15_Decryptor rsaPriv(keys);
323 RSAES_PKCS1v15_Encryptor rsaPub(rsaPriv);
335 "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
336 static const byte encrypted[] =
337 "\x14\xbd\xdd\x28\xc9\x83\x35\x19\x23\x80\xe8\xe5\x49\xb1\x58\x2a" 338 "\x8b\x40\xb4\x48\x6d\x03\xa6\xa5\x31\x1f\x1f\xd5\xf0\xa1\x80\xe4" 339 "\x17\x53\x03\x29\xa9\x34\x90\x74\xb1\x52\x13\x54\x29\x08\x24\x52" 341 static const byte oaepSeed[] =
342 "\xaa\xfd\x12\xf6\x59\xca\xe6\x34\x89\xb4\x79\xe5\x07\x6d\xde\xc2" 345 bq.
Put(oaepSeed, 20);
350 RSAES_OAEP_SHA_Decryptor rsaPriv;
351 rsaPriv.AccessKey().BERDecodePrivateKey(privFile,
false, 0);
352 RSAES_OAEP_SHA_Encryptor rsaPub(pubFile);
355 memset(outPlain, 0, 8);
356 rsaPub.Encrypt(rng, plain, 8, out);
359 pass = pass && !fail;
361 cout << (fail ?
"FAILED " :
"passed ");
362 cout <<
"PKCS 2.0 encryption and decryption\n";
370 cout <<
"\nDH validation suite running...\n\n";
379 cout <<
"\nMQV validation suite running...\n\n";
388 std::cout <<
"\nHMQV validation suite running...\n\n";
397 std::cout <<
"HMQV with NIST P-256 and SHA-256:" << std::endl;
400 std::cout <<
"passed authenticated key agreement domain parameters validation (server)" << std::endl;
403 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (server)" << std::endl;
407 const OID oid = ASN1::secp256r1();
411 std::cout <<
"passed authenticated key agreement domain parameters validation (client)" << std::endl;
414 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (client)" << std::endl;
429 memset(valA.begin(), 0x00, valA.size());
430 memset(valB.begin(), 0x11, valB.size());
432 if (!(hmqvA.
Agree(valA, sprivA, eprivA, spubB, epubB) && hmqvB.
Agree(valB, sprivB, eprivB, spubA, epubA)))
434 std::cout <<
"FAILED authenticated key agreement failed" << std::endl;
440 std::cout <<
"FAILED authenticated agreed values not equal" << std::endl;
444 std::cout <<
"passed authenticated key agreement" << std::endl;
448 std::cout <<
"HMQV with NIST P-384 and SHA-384:" << std::endl;
454 std::cout <<
"passed authenticated key agreement domain parameters validation (server)" << std::endl;
457 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (server)" << std::endl;
461 const OID oid384 = ASN1::secp384r1();
465 std::cout <<
"passed authenticated key agreement domain parameters validation (client)" << std::endl;
468 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (client)" << std::endl;
483 memset(valA384.begin(), 0x00, valA384.size());
484 memset(valB384.begin(), 0x11, valB384.size());
486 if (!(hmqvA384.
Agree(valA384, sprivA384, eprivA384, spubB384, epubB384) && hmqvB384.
Agree(valB384, sprivB384, eprivB384, spubA384, epubA384)))
488 std::cout <<
"FAILED authenticated key agreement failed" << std::endl;
494 std::cout <<
"FAILED authenticated agreed values not equal" << std::endl;
498 std::cout <<
"passed authenticated key agreement" << std::endl;
505 std::cout <<
"\nFHMQV validation suite running...\n\n";
514 std::cout <<
"FHMQV with NIST P-256 and SHA-256:" << std::endl;
517 std::cout <<
"passed authenticated key agreement domain parameters validation (server)" << std::endl;
520 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (server)" << std::endl;
524 const OID oid = ASN1::secp256r1();
528 std::cout <<
"passed authenticated key agreement domain parameters validation (client)" << std::endl;
531 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (client)" << std::endl;
546 memset(valA.begin(), 0x00, valA.size());
547 memset(valB.begin(), 0x11, valB.size());
549 if (!(fhmqvA.
Agree(valA, sprivA, eprivA, spubB, epubB) && fhmqvB.
Agree(valB, sprivB, eprivB, spubA, epubA)))
551 std::cout <<
"FAILED authenticated key agreement failed" << std::endl;
557 std::cout <<
"FAILED authenticated agreed values not equal" << std::endl;
561 std::cout <<
"passed authenticated key agreement" << std::endl;
565 std::cout <<
"FHMQV with NIST P-384 and SHA-384:" << std::endl;
571 std::cout <<
"passed authenticated key agreement domain parameters validation (server)" << std::endl;
574 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (server)" << std::endl;
578 const OID oid384 = ASN1::secp384r1();
582 std::cout <<
"passed authenticated key agreement domain parameters validation (client)" << std::endl;
585 std::cout <<
"FAILED authenticated key agreement domain parameters invalid (client)" << std::endl;
600 memset(valA384.begin(), 0x00, valA384.size());
601 memset(valB384.begin(), 0x11, valB384.size());
603 if (!(fhmqvA384.
Agree(valA384, sprivA384, eprivA384, spubB384, epubB384) && fhmqvB384.
Agree(valB384, sprivB384, eprivB384, spubA384, epubA384)))
605 std::cout <<
"FAILED authenticated key agreement failed" << std::endl;
611 std::cout <<
"FAILED authenticated agreed values not equal" << std::endl;
615 std::cout <<
"passed authenticated key agreement" << std::endl;
622 cout <<
"\nLUC-DH validation suite running...\n\n";
631 cout <<
"\nXTR-DH validation suite running...\n\n";
640 cout <<
"\nElGamal validation suite running...\n\n";
646 privC.AccessKey().Precompute();
648 privC.AccessKey().SavePrecomputation(queue);
649 privC.AccessKey().LoadPrecomputation(queue);
658 cout <<
"\nDLIES validation suite running...\n\n";
667 cout <<
"Generating new encryption key..." << endl;
671 decryptor.AccessKey().GenerateRandom(
GlobalRNG(), gp);
681 cout <<
"\nNR validation suite running...\n\n";
686 privS.AccessKey().Precompute();
692 cout <<
"Generating new signature key..." << endl;
703 cout <<
"\nDSA validation suite running...\n\n";
720 cout <<
"\nLUC validation suite running...\n\n";
739 cout <<
"\nLUC-HMP validation suite running...\n\n";
746 cout <<
"\nLUC-IES validation suite running...\n\n";
758 cout <<
"\nRabin validation suite running...\n\n";
777 cout <<
"\nRW validation suite running...\n\n";
799 #if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_IMPORTS) 801 bool TestPolynomialMod2()
803 bool pass1 =
true, pass2 =
true, pass3 =
true;
805 cout <<
"\nTesting PolynomialMod2 bit operations...\n\n";
807 static const unsigned int start = 0;
810 for (
unsigned int i=start; i <
stop; i++)
818 std::ostringstream oss1;
821 std::string str1, str2;
825 str1.erase(std::remove(str1.begin(), str1.end(),
','), str1.end());
828 str1.erase(str1.end() - 1);
833 pass1 &= (str1 == str2);
836 for (
unsigned int i=start; i <
stop; i++)
846 std::ostringstream oss1;
849 std::string str1, str2;
853 str1.erase(std::remove(str1.begin(), str1.end(),
','), str1.end());
856 str1.erase(str1.end() - 1);
861 pass2 &= (str1 == str2);
865 for (
unsigned int i=start; i <
stop; i++)
876 std::ostringstream oss1;
879 std::string str1, str2;
883 str1.erase(std::remove(str1.begin(), str1.end(),
','), str1.end());
886 str1.erase(str1.end() - 1);
893 cout <<
" Oops..." <<
"\n";
894 cout <<
" random: " << std::hex << n << std::dec <<
"\n";
895 cout <<
" str1: " << str1 <<
"\n";
896 cout <<
" str2: " << str2 <<
"\n";
899 pass3 &= (str1 == str2);
902 cout << (!pass1 ?
"FAILED" :
"passed") <<
": " <<
"1 shifted over range [" << dec << start <<
"," << stop <<
"]" <<
"\n";
903 cout << (!pass2 ?
"FAILED" :
"passed") <<
": " <<
"0x" << hex <<
word(
SIZE_MAX) << dec <<
" shifted over range [" << start <<
"," << stop <<
"]" <<
"\n";
904 cout << (!pass3 ?
"FAILED" :
"passed") <<
": " <<
"random values shifted over range [" << dec << start <<
"," << stop <<
"]" <<
"\n";
906 if (!(pass1 && pass2 && pass3))
909 return pass1 && pass2 && pass3;
915 cout <<
"\nECP validation suite running...\n\n";
920 cpriv.GetKey().DEREncode(bq);
921 cpub.AccessKey().AccessGroupParameters().SetEncodeAsOID(
true);
922 cpub.GetKey().DEREncode(bq);
928 spriv.AccessKey().Precompute();
930 spriv.AccessKey().SavePrecomputation(queue);
931 spriv.AccessKey().LoadPrecomputation(queue);
934 cpub.AccessKey().Precompute();
935 cpriv.AccessKey().Precompute();
940 cout <<
"Turning on point compression..." << endl;
941 cpriv.AccessKey().AccessGroupParameters().SetPointCompression(
true);
942 cpub.AccessKey().AccessGroupParameters().SetPointCompression(
true);
949 cout <<
"Testing SEC 2, NIST, and Brainpool recommended curves..." << endl;
956 pass = pass && !fail;
964 cout <<
"\nEC2N validation suite running...\n\n";
970 cpub.AccessKey().AccessGroupParameters().SetEncodeAsOID(
true);
977 spriv.AccessKey().Precompute();
979 spriv.AccessKey().SavePrecomputation(queue);
980 spriv.AccessKey().LoadPrecomputation(queue);
987 cout <<
"Turning on point compression..." << endl;
988 cpriv.AccessKey().AccessGroupParameters().SetPointCompression(
true);
989 cpub.AccessKey().AccessGroupParameters().SetPointCompression(
true);
996 #if 0 // TODO: turn this back on when I make EC2N faster for pentanomial basis 997 cout <<
"Testing SEC 2 recommended curves..." << endl;
1004 pass = pass && !fail;
1013 cout <<
"\nECDSA validation suite running...\n\n";
1016 GF2NT gf2n(191, 9, 0);
1017 byte a[]=
"\x28\x66\x53\x7B\x67\x67\x52\x63\x6A\x68\xF5\x65\x54\xE1\x26\x40\x27\x6B\x64\x9E\xF7\x52\x62\x67";
1018 byte b[]=
"\x2E\x45\xEF\x57\x1F\x00\x78\x6F\x67\xB0\x08\x1B\x94\x95\xA3\xD9\x54\x62\xF5\xDE\x0A\xA1\x85\xEC";
1022 ec.
DecodePoint(P, (
byte *)
"\x04\x36\xB3\xDA\xF8\xA2\x32\x06\xF9\xC4\xF2\x99\xD7\xB2\x1A\x9C\x36\x91\x37\xF2\xC8\x4A\xE1\xAA\x0D" 1023 "\x76\x5B\xE7\x34\x33\xB3\xF9\x5E\x33\x29\x32\xE7\x0E\xA2\x45\xCA\x24\x18\xEA\x0E\xF9\x80\x18\xFB", ec.
EncodedPointSize());
1024 Integer n(
"40000000000000000000000004a20e90c39067c893bbb9a5H");
1025 Integer d(
"340562e1dda332f9d2aec168249b5696ee39d0ed4d03760fH");
1030 Integer h(
"A9993E364706816ABA3E25717850C26C9CD0D89DH");
1031 Integer k(
"3eeace72b4919d991738d521879f787cb590aff8189d2b69H");
1032 static const byte sig[]=
"\x03\x8e\x5a\x11\xfb\x55\xe4\xc6\x54\x71\xdc\xd4\x99\x84\x52\xb1\xe0\x2d\x8a\xf7\x09\x9b\xb9\x30" 1033 "\x0c\x9a\x08\xc3\x44\x68\xc2\x44\xb4\xe5\xd6\xb2\x1b\x3c\x68\x36\x28\x07\x41\x60\x20\x32\x8b\x6e";
1038 bool fail,
pass=
true;
1040 priv.RawSign(k, h, rOut, sOut);
1041 fail = (rOut != r) || (sOut != s);
1042 pass = pass && !fail;
1044 cout << (fail ?
"FAILED " :
"passed ");
1045 cout <<
"signature check against test vector\n";
1047 fail = !pub.VerifyMessage((
byte *)
"abc", 3, sig,
sizeof(sig));
1048 pass = pass && !fail;
1050 cout << (fail ?
"FAILED " :
"passed ");
1051 cout <<
"verification check against test vector\n";
1053 fail = pub.VerifyMessage((
byte *)
"xyz", 3, sig,
sizeof(sig));
1054 pass = pass && !fail;
1064 cout <<
"\nECGDSA validation suite running...\n\n";
1066 bool fail,
pass=
true;
1070 OID oid = ASN1::brainpoolP192r1();
1072 Integer x(
"0x 80F2425E 89B4F585 F27F3536 ED834D68 E3E492DE 08FE84B9");
1076 Integer e(
"0x 00000000 577EF842 B32FDE45 79727FFF 02F7A280 74ADC4EF");
1077 Integer k(
"0x 22C17C2A 367DD85A B8A365ED 06F19C43 F9ED1834 9A9BC044");
1080 signer.RawSign(k, e, r, s);
1082 Integer rExp(
"0x 2D017BE7 F117FF99 4ED6FC63 CA5B4C7A 0430E9FA 095DAFC4");
1083 Integer sExp(
"0x C02B5CC5 C51D5411 060BF024 5049F824 839F671D 78A1BBF1");
1085 fail = (r != rExp) || (s != sExp);
1086 pass = pass && !fail;
1088 const byte msg[] =
"Example of ECGDSA with the hash function RIPEMD-160";
1089 const size_t len = strlen((
char*)msg);
1092 r.
Encode(signature+0, 24);
1093 s.
Encode(signature+24, 24);
1095 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1096 pass = pass && !fail;
1098 cout << (fail ?
"FAILED " :
"passed ");
1099 cout <<
"brainpoolP192r1 using RIPEMD-160\n";
1102 pass = pass && !fail;
1107 OID oid = ASN1::brainpoolP256r1();
1109 Integer x(
"0x 47B3A278 62DEF037 49ACF0D6 00E69F9B 851D01ED AEFA531F 4D168E78 7307F4D8");
1113 Integer e(
"0x 00000000 00000000 00000000 577EF842 B32FDE45 79727FFF 02F7A280 74ADC4EF");
1114 Integer k(
"0x 908E3099 776261A4 558FF7A9 FA6DFFE0 CA6BB3F9 CB35C2E4 E1DC73FD 5E8C08A3");
1117 signer.RawSign(k, e, r, s);
1119 Integer rExp(
"0x 62CCD1D2 91E62F6A 4FFBD966 C66C85AA BA990BB6 AB0C087D BD54A456 CCC84E4C");
1120 Integer sExp(
"0x 9119719B 08EEA0D6 BC56E4D1 D37369BC F3768445 EF65CAE4 A37BF6D4 3BD01646");
1122 fail = (r != rExp) || (s != sExp);
1123 pass = pass && !fail;
1125 const byte msg[] =
"Example of ECGDSA with the hash function RIPEMD-160";
1126 const size_t len = strlen((
char*)msg);
1129 r.
Encode(signature+0, 32);
1130 s.
Encode(signature+32, 32);
1132 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1133 pass = pass && !fail;
1135 cout << (fail ?
"FAILED " :
"passed ");
1136 cout <<
"brainpoolP256r1 using RIPEMD-160\n";
1139 pass = pass && !fail;
1144 OID oid = ASN1::brainpoolP320r1();
1146 Integer x(
"0x 48683594 5A3A284F FC52629A D48D8F37 F4B2E993 9C52BC72 362A9961 40192AEF 7D2AAFF0 C73A51C5");
1150 Integer e(
"0x 00000000 00000000 00000000 00000000 00000000 577EF842 B32FDE45 79727FFF 02F7A280 74ADC4EF");
1151 Integer k(
"0x C70BC00A 77AD7872 5D36CEEC 27D6F956 FB546EEF 6DC90E35 31452BD8 7ECE8A4A 7AD730AD C299D81B");
1154 signer.RawSign(k, e, r, s);
1156 Integer rExp(
"0x 3C925969 FAB22F7A E7B8CC5D 50CB0867 DFDB2CF4 FADA3D49 0DF75D72 F7563186 419494C9 8F9C82A6");
1157 Integer sExp(
"0x 06AB5250 B31A8E93 56194894 61733200 E4FD5C12 75C0AB37 E7E41149 5BAAE145 41DF6DE6 66B8CA56");
1159 fail = (r != rExp) || (s != sExp);
1160 pass = pass && !fail;
1162 const byte msg[] =
"Example of ECGDSA with the hash function RIPEMD-160";
1163 const size_t len = strlen((
char*)msg);
1166 r.
Encode(signature+0, 40);
1167 s.
Encode(signature+40, 40);
1169 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1170 pass = pass && !fail;
1172 cout << (fail ?
"FAILED " :
"passed ");
1173 cout <<
"brainpoolP320r1 using RIPEMD-160\n";
1176 pass = pass && !fail;
1181 OID oid = ASN1::brainpoolP192r1();
1183 Integer x(
"0x 80F2425E 89B4F585 F27F3536 ED834D68 E3E492DE 08FE84B9");
1187 Integer e(
"0x 00000000 CF00CD42 CAA80DDF 8DDEBDFD 32F2DA15 11B53F29");
1188 Integer k(
"0x 22C17C2A 367DD85A B8A365ED 06F19C43 F9ED1834 9A9BC044");
1191 signer.RawSign(k, e, r, s);
1193 Integer rExp(
"0x 2D017BE7 F117FF99 4ED6FC63 CA5B4C7A 0430E9FA 095DAFC4");
1194 Integer sExp(
"0x 18FD604E 5F00F55B 3585C052 8C319A2B 05B8F2DD EE9CF1A6");
1196 fail = (r != rExp) || (s != sExp);
1197 pass = pass && !fail;
1199 const byte msg[] =
"Example of ECGDSA with the hash function SHA-1";
1200 const size_t len = strlen((
char*)msg);
1203 r.
Encode(signature+0, 24);
1204 s.
Encode(signature+24, 24);
1206 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1207 pass = pass && !fail;
1209 cout << (fail ?
"FAILED " :
"passed ");
1210 cout <<
"brainpoolP192r1 using SHA-1\n";
1213 pass = pass && !fail;
1218 OID oid = ASN1::brainpoolP256r1();
1220 Integer x(
"0x 47B3A278 62DEF037 49ACF0D6 00E69F9B 851D01ED AEFA531F 4D168E78 7307F4D8");
1224 Integer e(
"0x 00000000 92AE8A0E 8D08EADE E9426378 714FF3E0 1957587D 2876FA70 D40E3144");
1225 Integer k(
"0x 908E3099 776261A4 558FF7A9 FA6DFFE0 CA6BB3F9 CB35C2E4 E1DC73FD 5E8C08A3");
1228 signer.RawSign(k, e, r, s);
1230 Integer rExp(
"0x 62CCD1D2 91E62F6A 4FFBD966 C66C85AA BA990BB6 AB0C087D BD54A456 CCC84E4C");
1231 Integer sExp(
"0x 6F029D92 1CBD2552 6EDCCF1C 45E3CBF7 B7A5D8D4 E005F0C4 1C49B052 DECB04EA");
1233 fail = (r != rExp) || (s != sExp);
1234 pass = pass && !fail;
1236 const byte msg[] =
"Example of ECGDSA with the hash function SHA-224";
1237 const size_t len = strlen((
char*)msg);
1240 r.
Encode(signature+0, 32);
1241 s.
Encode(signature+32, 32);
1243 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1244 pass = pass && !fail;
1246 cout << (fail ?
"FAILED " :
"passed ");
1247 cout <<
"brainpoolP256r1 using SHA-224\n";
1250 pass = pass && !fail;
1255 OID oid = ASN1::brainpoolP320r1();
1257 Integer x(
"0x 48683594 5A3A284F FC52629A D48D8F37 F4B2E993 9C52BC72 362A9961 40192AEF 7D2AAFF0 C73A51C5");
1261 Integer e(
"0x 00000000 00000000 00000000 92AE8A0E 8D08EADE E9426378 714FF3E0 1957587D 2876FA70 D40E3144");
1262 Integer k(
"0x C70BC00A 77AD7872 5D36CEEC 27D6F956 FB546EEF 6DC90E35 31452BD8 7ECE8A4A 7AD730AD C299D81B");
1265 signer.RawSign(k, e, r, s);
1267 Integer rExp(
"0x 3C925969 FAB22F7A E7B8CC5D 50CB0867 DFDB2CF4 FADA3D49 0DF75D72 F7563186 419494C9 8F9C82A6");
1268 Integer sExp(
"0x 6EA191CA 0D468AC3 E9568768 9338357C 7D0BACB3 F1D87E0D EC05F635 B7ADB842 75AA0086 60F812CF");
1270 fail = (r != rExp) || (s != sExp);
1271 pass = pass && !fail;
1273 const byte msg[] =
"Example of ECGDSA with the hash function SHA-224";
1274 const size_t len = strlen((
char*)msg);
1277 r.
Encode(signature+0, 40);
1278 s.
Encode(signature+40, 40);
1280 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1281 pass = pass && !fail;
1283 cout << (fail ?
"FAILED " :
"passed ");
1284 cout <<
"brainpoolP320r1 using SHA-224\n";
1287 pass = pass && !fail;
1292 OID oid = ASN1::brainpoolP320r1();
1294 Integer x(
"0x 48683594 5A3A284F FC52629A D48D8F37 F4B2E993 9C52BC72 362A9961 40192AEF 7D2AAFF0 C73A51C5");
1298 Integer e(
"0x 00000000 00000000 37ED8AA9 4AE667DB BB753330 E050EB8E 12195807 ECDC4FB1 0E0662B4 22C219D7");
1299 Integer k(
"0x C70BC00A 77AD7872 5D36CEEC 27D6F956 FB546EEF 6DC90E35 31452BD8 7ECE8A4A 7AD730AD C299D81B");
1302 signer.RawSign(k, e, r, s);
1304 Integer rExp(
"0x 3C925969 FAB22F7A E7B8CC5D 50CB0867 DFDB2CF4 FADA3D49 0DF75D72 F7563186 419494C9 8F9C82A6");
1305 Integer sExp(
"0x 24370797 A9D11717 BBBB2B76 2E08ECD0 7DD7E033 F544E47C BF3C6D16 FD90B51D CC2E4DD8 E6ECD8CD");
1307 fail = (r != rExp) || (s != sExp);
1308 pass = pass && !fail;
1310 const byte msg[] =
"Example of ECGDSA with the hash function SHA-256";
1311 const size_t len = strlen((
char*)msg);
1314 r.
Encode(signature+0, 40);
1315 s.
Encode(signature+40, 40);
1317 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1318 pass = pass && !fail;
1320 cout << (fail ?
"FAILED " :
"passed ");
1321 cout <<
"brainpoolP320r1 using SHA-256\n";
1324 pass = pass && !fail;
1329 OID oid = ASN1::brainpoolP512r1();
1331 Integer x(
"0x 92006A98 8AF96D91 57AADCF8 62716962 7CE2ECC4 C58ECE5C 1A0A8642 11AB764C 04236FA0 160857A7 8E71CCAE 4D79D52E 5A69A457 8AF50658 1F598FA9 B4F7DA68");
1335 Integer e(
"0x 00000000 00000000 00000000 00000000 68FEAB7D 8BF8A779 4466E447 5959946B 2136C084 A86090CA 8070C980 68B1250D 88213190 6B7E0CB8 475F9054 E9290C2E");
1336 Integer k(
"0x 6942B01D 5901BEC1 506BB874 9618E22E C0FCD7F3 5159D51E D53BA77A 78752128 A58232AD 8E0E021A FDE1477F F4C74FDF FE88AE2D 15D89B56 F6D73C03 77631D2B");
1339 signer.RawSign(k, e, r, s);
1341 Integer rExp(
"0x 0104918B 2B32B1A5 49BD43C3 0092953B 4164CA01 A1A97B5B 0756EA06 3AC16B41 B88A1BAB 4538CD7D 8466180B 3E3F5C86 46AC4A45 F564E9B6 8FEE72ED 00C7AC48");
1342 Integer sExp(
"0x 3D233E9F D9EB152E 889F4F7C F325B464 0894E5EA 44C51443 54305CD4 BF70D234 8257C2DB E06C5544 92CE9FDD 6861A565 77B53E5E E80E6062 31A4CF06 8FA1EC21");
1344 fail = (r != rExp) || (s != sExp);
1345 pass = pass && !fail;
1347 const byte msg[] =
"Example of ECGDSA with the hash function SHA-384";
1348 const size_t len = strlen((
char*)msg);
1350 byte signature[128];
1351 r.
Encode(signature+0, 64);
1352 s.
Encode(signature+64, 64);
1354 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1355 pass = pass && !fail;
1357 cout << (fail ?
"FAILED " :
"passed ");
1358 cout <<
"brainpoolP512r1 using SHA-384\n";
1361 pass = pass && !fail;
1366 OID oid = ASN1::brainpoolP512r1();
1368 Integer x(
"0x 92006A98 8AF96D91 57AADCF8 62716962 7CE2ECC4 C58ECE5C 1A0A8642 11AB764C 04236FA0 160857A7 8E71CCAE 4D79D52E 5A69A457 8AF50658 1F598FA9 B4F7DA68");
1372 Integer e(
"0x 1A95EF81 D213BD3B 8191E7FE 7F5BFD43 F51E3EE5 A4FD3D08 4A7C9BB5 411F4649 746AEBC6 623D4DEA 7E02DC5A 85E24AF2 96B5A555 AD470413 71E4BF64 380F3E34");
1373 Integer k(
"0x 6942B01D 5901BEC1 506BB874 9618E22E C0FCD7F3 5159D51E D53BA77A 78752128 A58232AD 8E0E021A FDE1477F F4C74FDF FE88AE2D 15D89B56 F6D73C03 77631D2B");
1376 signer.RawSign(k, e, r, s);
1378 Integer rExp(
"0x 0104918B 2B32B1A5 49BD43C3 0092953B 4164CA01 A1A97B5B 0756EA06 3AC16B41 B88A1BAB 4538CD7D 8466180B 3E3F5C86 46AC4A45 F564E9B6 8FEE72ED 00C7AC48");
1379 Integer sExp(
"0x 17A011F8 DD7B5665 2B27AA6D 6E7BDF3C 7C23B5FA 32910FBA A107E627 0E1CA8A7 A263F661 8E6098A0 D6CD6BA1 C03544C5 425875EC B3418AF5 A3EE3F32 143E48D2");
1381 fail = (r != rExp) || (s != sExp);
1382 pass = pass && !fail;
1384 const byte msg[] =
"Example of ECGDSA with the hash function SHA-512";
1385 const size_t len = strlen((
char*)msg);
1387 byte signature[128];
1388 r.
Encode(signature+0, 64);
1389 s.
Encode(signature+64, 64);
1391 fail = !verifier.VerifyMessage(msg, len, signature,
sizeof(signature));
1392 pass = pass && !fail;
1394 cout << (fail ?
"FAILED " :
"passed ");
1395 cout <<
"brainpoolP512r1 using SHA-512\n";
1398 pass = pass && !fail;
1406 cout <<
"\nESIGN validation suite running...\n\n";
1408 bool pass =
true, fail;
1410 static const char plain[] =
"test";
1411 static const byte signature[] =
1412 "\xA3\xE3\x20\x65\xDE\xDA\xE7\xEC\x05\xC1\xBF\xCD\x25\x79\x7D\x99\xCD\xD5\x73\x9D\x9D\xF3\xA4\xAA\x9A\xA4\x5A\xC8\x23\x3D\x0D\x37" 1413 "\xFE\xBC\x76\x3F\xF1\x84\xF6\x59\x14\x91\x4F\x0C\x34\x1B\xAE\x9A\x5C\x2E\x2E\x38\x08\x78\x77\xCB\xDC\x3C\x7E\xA0\x34\x44\x5B\x0F" 1414 "\x67\xD9\x35\x2A\x79\x47\x1A\x52\x37\x71\xDB\x12\x67\xC1\xB6\xC6\x66\x73\xB3\x40\x2E\xD6\xF2\x1A\x84\x0A\xB6\x7B\x0F\xEB\x8B\x88" 1415 "\xAB\x33\xDD\xE4\x83\x21\x90\x63\x2D\x51\x2A\xB1\x6F\xAB\xA7\x5C\xFD\x77\x99\xF2\xE1\xEF\x67\x1A\x74\x02\x37\x0E\xED\x0A\x06\xAD" 1416 "\xF4\x15\x65\xB8\xE1\xD1\x45\xAE\x39\x19\xB4\xFF\x5D\xF1\x45\x7B\xE0\xFE\x72\xED\x11\x92\x8F\x61\x41\x4F\x02\x00\xF2\x76\x6F\x7C" 1417 "\x79\xA2\xE5\x52\x20\x5D\x97\x5E\xFE\x39\xAE\x21\x10\xFB\x35\xF4\x80\x81\x41\x13\xDD\xE8\x5F\xCA\x1E\x4F\xF8\x9B\xB2\x68\xFB\x28";
1424 pass = pass && !fail;
1426 fail = !verifier.VerifyMessage((
byte *)plain, strlen(plain), signature, verifier.SignatureLength());
1427 pass = pass && !fail;
1429 cout << (fail ?
"FAILED " :
"passed ");
1430 cout <<
"verification check against test vector\n";
1432 cout <<
"Generating signature key from seed..." << endl;
1437 pass = pass && !fail;
Used to pass byte array input as part of a NameValuePairs object.
virtual bool Agree(byte *agreedValue, const byte *staticPrivateKey, const byte *ephemeralPrivateKey, const byte *staticOtherPublicKey, const byte *ephemeralOtherPublicKey, bool validateStaticOtherPublicKey=true) const =0
Derive agreed value.
bool Agree(byte *agreedValue, const byte *staticPrivateKey, const byte *ephemeralPrivateKey, const byte *staticOtherPublicKey, const byte *ephemeralOtherPublicKey, bool validateStaticOtherPublicKey=true) const
derive agreed value from your private keys and couterparty's public keys, return false in case of fai...
virtual void GenerateEphemeralKeyPair(RandomNumberGenerator &rng, byte *privateKey, byte *publicKey) const
Generate private/public key pair.
Classes for Rabin encryption and signature schemes.
Classes for Fully Hashed Menezes-Qu-Vanstone key agreement in GF(p)
virtual size_t SignMessageWithRecovery(RandomNumberGenerator &rng, const byte *recoverableMessage, size_t recoverableMessageLength, const byte *nonrecoverableMessage, size_t nonrecoverableMessageLength, byte *signature) const
Sign a recoverable message.
bool SimpleKeyAgreementValidate(SimpleKeyAgreementDomain &d)
virtual bool VerifyMessage(const byte *message, size_t messageLen, const byte *signature, size_t signatureLen) const
Check whether input signature is a valid signature for input message.
void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
virtual unsigned int StaticPublicKeyLength() const =0
Provides the size of the static public key.
Classes and functions for ElGamal key agreement and encryption schemes.
Classes for RIPEMD message digest.
void Encode(byte *output, size_t outputLen, Signedness sign=UNSIGNED) const
Encode in big-endian format.
virtual unsigned int AgreedValueLength() const =0
Provides the size of the agreed value.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
GF(2^n) with Trinomial Basis.
bool AuthenticatedKeyAgreementValidate(AuthenticatedKeyAgreementDomain &d)
bool ValidateDSA(bool thorough)
Implementation of Store interface.
Classes for Elliptic Curves over prime fields.
Fully Hashed Menezes-Qu-Vanstone in GF(p)
unsigned int AgreedValueLength() const
return length of agreed value produced
Interface for public-key signers.
Interface for public-key encryptors.
unsigned int StaticPrivateKeyLength() const
return length of static private keys in this domain
bool DecodePoint(Point &P, BufferedTransformation &bt, size_t len) const
Decodes an elliptic curve point.
Decode base 16 data back to bytes.
Abstract base classes that provide a uniform interface to this library.
virtual void Encrypt(RandomNumberGenerator &rng, const byte *plaintext, size_t plaintextLength, byte *ciphertext, const NameValuePairs ¶meters=g_nullNameValuePairs) const =0
Encrypt a byte string.
virtual size_t MaxPlaintextLength(size_t ciphertextLength) const =0
Provides the maximum length of plaintext for a given ciphertext length.
Hashed Menezes-Qu-Vanstone in GF(p)
void Seek(lword index)
Seek to an absolute position.
RandomNumberGenerator & GlobalRNG()
BufferedTransformation & m_source
ASN.1 object identifiers for algorthms and schemes.
virtual unsigned int PrivateKeyLength() const =0
Provides the size of the private key.
Classes for automatic resource management.
std::hash for asio::adress
unsigned int EphemeralPublicKeyLength() const
Provides the size of ephemeral public key.
Interface for random number generators.
size_t messageLength
Recovered message length if isValidCoding is true, undefined otherwise.
virtual unsigned int StaticPrivateKeyLength() const =0
Provides the size of the static private key.
virtual unsigned int PublicKeyLength() const =0
Provides the size of the public key.
GroupParameters & AccessGroupParameters()
const CryptoMaterial & GetMaterial() const
Retrieves a reference to a Private Key.
static const Integer &CRYPTOPP_API One()
Integer representing 1.
Classes providing ESIGN signature schemes as defined in IEEE P1363a.
Classes for Hashed Menezes-Qu-Vanstone key agreement in GF(p)
Classes for the LUC cryptosystem.
Polynomial with Coefficients in GF(2)
Classes for Elliptic Curves over binary fields.
virtual size_t MaxRecoverableLength() const =0
Provides the length of longest message that can be recovered.
virtual unsigned int EphemeralPrivateKeyLength() const =0
Provides the size of ephemeral private key.
Interface for domains of simple key agreement protocols.
Returns a decoding results.
const unsigned int WORD_BITS
Classes for Rabin-Williams signature scheme.
Interface for public-key decryptors.
unsigned int EncodedPointSize(bool compressed=false) const
Determines encoded point size.
MQV domain for performing authenticated key agreement.
void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
const EllipticCurve & GetCurve() const
XTR-DH with key validation.
virtual void GenerateKeyPair(RandomNumberGenerator &rng, byte *privateKey, byte *publicKey) const
Generate a private/public key pair.
virtual bool Validate(RandomNumberGenerator &rng, unsigned int level) const =0
Check this object for errors.
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
unsigned int EphemeralPrivateKeyLength() const
Provides the size of ephemeral private key.
unsigned int AgreedValueLength() const
return length of agreed value produced
bool SignatureValidate(PK_Signer &priv, PK_Verifier &pub, bool thorough=false)
Classes for Diffie-Hellman key exchange.
Classes for HexEncoder and HexDecoder.
virtual size_t MaxSignatureLength(size_t recoverablePartLength=0) const
Provides the maximum signature length produced given the length of the recoverable message part...
virtual void GenerateStaticKeyPair(RandomNumberGenerator &rng, byte *privateKey, byte *publicKey) const
Generate a static private/public key pair.
Point Multiply(const Integer &k, const Point &P) const
unsigned int MaxElementBitLength() const
Provides the maximum bit size of an element in the ring.
FixedRNG(BufferedTransformation &source)
Multiple precision integer with arithmetic operations.
Elliptic Curve over GF(2^n)
virtual DecodingResult RecoverMessage(byte *recoveredMessage, const byte *nonrecoverableMessage, size_t nonrecoverableMessageLength, const byte *signature, size_t signatureLength) const
Recover a message from its signature.
unsigned int StaticPublicKeyLength() const
return length of static public keys in this domain
virtual unsigned int EphemeralPublicKeyLength() const =0
Provides the size of ephemeral public key.
virtual const CryptoParameters & GetCryptoParameters() const
Retrieves a reference to Crypto Parameters.
const CryptoMaterial & GetMaterial() const
Retrieves a reference to a Public Key.
virtual size_t MaxRecoverableLengthFromSignatureLength(size_t signatureLength) const =0
Provides the length of longest message that can be recovered from a signature of given length...
unsigned int StaticPrivateKeyLength() const
return length of static private keys in this domain
Classes and functions for schemes based on Discrete Logs (DL) over GF(p)
unsigned int EphemeralPrivateKeyLength() const
Provides the size of ephemeral private key.
Classes for the DSA signature algorithm.
Miscellaneous classes for RNGs.
Classes and functions for schemes over GF(2^n)
unsigned int EphemeralPublicKeyLength() const
Provides the size of ephemeral public key.
virtual size_t SignMessage(RandomNumberGenerator &rng, const byte *message, size_t messageLen, byte *signature) const
Sign a message.
virtual bool Agree(byte *agreedValue, const byte *privateKey, const byte *otherPublicKey, bool validateOtherPublicKey=true) const =0
Derive agreed value.
#define CRYPTOPP_ASSERT(exp)
const NameValuePairs & g_nullNameValuePairs
An empty set of name-value pairs.
bool CryptoSystemValidate(PK_Decryptor &priv, PK_Encryptor &pub, bool thorough=false)
GroupParameters & AccessGroupParameters()
Data structure used to store byte strings.
Classes and functions for working with ANS.1 objects.
Classes for SHA-1 and SHA-2 family of message digests.
Elliptic Curve Parameters.
Implementation of BufferedTransformation's attachment interface.
#define USING_NAMESPACE(x)
"The XTR public key system" by Arjen K.
Classes for the RSA cryptosystem.
#define pass(a, b, c, mul, X)
Interface for public-key signature verifiers.
BlumBlumShub with factorization of the modulus.
uint8_t const size_t const size
virtual size_t CiphertextLength(size_t plaintextLength) const =0
Calculate the length of ciphertext given length of plaintext.
Classes for Blum Blum Shub generator.
virtual unsigned int AgreedValueLength() const =0
Provides the size of the agreed value.
void GenerateRandomWithKeySize(RandomNumberGenerator &rng, unsigned int keySize)
Generate a random key or crypto parameters.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
RSA encryption algorithm.
Multiple precision integer with arithmetic operations.
Classes providing file-based library services.
bool isValidCoding
Flag to indicate the decoding is valid.
Classes and functions for Elliptic Curves over prime and binary fields.
bool Agree(byte *agreedValue, const byte *staticPrivateKey, const byte *ephemeralPrivateKey, const byte *staticOtherPublicKey, const byte *ephemeralOtherPublicKey, bool validateStaticOtherPublicKey=true) const
derive agreed value from your private keys and couterparty's public keys, return false in case of fai...
bool RunTestDataFile(const char *filename, const NameValuePairs &overrideParameters, bool thorough)
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Interface for domains of authenticated key agreement protocols.
Elliptical Curve Point over GF(2^n)
const Field & GetField() const
GroupParameters & AccessGroupParameters()
Retrieves the group parameters for this domain.
const Field & GetField() const
Classes for Menezes–Qu–Vanstone (MQV) key agreement.
GroupParameters & AccessGroupParameters()
Retrieves the group parameters for this domain.
#define CRYPTOPP_DATA_DIR
Classes for access to the operating system's random number generators.
UniValue stop(const JSONRPCRequest &jsonRequest)
the value is positive or 0
unsigned int MaxElementBitLength() const
unsigned int StaticPublicKeyLength() const
return length of static public keys in this domain
virtual DecodingResult Decrypt(RandomNumberGenerator &rng, const byte *ciphertext, size_t ciphertextLength, byte *plaintext, const NameValuePairs ¶meters=g_nullNameValuePairs) const =0
Decrypt a byte string.
Template implementing constructors for public key algorithm classes.