5 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 59 #if (CRYPTOPP_MSC_VERSION >= 1410) 60 # pragma strict_gs_check (on) 63 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 64 # pragma GCC diagnostic ignored "-Wdeprecated-declarations" 78 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 79 pass=TestRDRAND() &&
pass;
80 pass=TestRDSEED() &&
pass;
83 #if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_IMPORTS) 85 pass=TestSecBlock() &&
pass;
87 pass=TestIntegerBitops() &&
pass;
89 pass=TestPolynomialMod2() &&
pass;
91 pass=TestHuffmanCodes() &&
pass;
93 pass=TestASN1Parse() &&
pass;
177 cout <<
"\nAll tests passed!\n";
179 cout <<
"\nOops! Not all tests passed.\n";
188 cout <<
"\nTesting Settings...\n\n";
191 const byte s[] =
"\x01\x02\x03\x04";
193 #if (CRYPTOPP_MSC_VERSION >= 1400) 195 stdext::make_checked_array_iterator(reinterpret_cast<byte*>(&w),
sizeof(w)));
197 std::copy(s, s+4, reinterpret_cast<byte*>(&w));
200 if (w == 0x04030201L)
202 #ifdef IS_LITTLE_ENDIAN 208 cout <<
"Your machine is little endian.\n";
210 else if (w == 0x01020304L)
212 #ifndef IS_LITTLE_ENDIAN 218 cout <<
"Your machine is big endian.\n";
222 cout <<
"FAILED: Your machine is neither big endian nor little endian.\n";
226 #ifdef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS 228 byte testvals[10] = {1,2,2,3,3,3,3,2,2,1};
229 if (*(
word32 *)(
void *)(testvals+3) == 0x03030303 && *(
word64 *)(
void *)(testvals+1) ==
W64LIT(0x0202030303030202))
230 cout <<
"passed: Your machine allows unaligned data access.\n";
233 cout <<
"FAILED: Unaligned data access gave incorrect results.\n";
237 cout <<
"passed: CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS is not defined. Will restrict to aligned data access.\n";
240 if (
sizeof(
byte) == 1)
247 cout <<
"sizeof(byte) == " <<
sizeof(
byte) << endl;
256 cout <<
"sizeof(word16) == " <<
sizeof(
word16) << endl;
265 cout <<
"sizeof(word32) == " <<
sizeof(
word32) << endl;
274 cout <<
"sizeof(word64) == " <<
sizeof(
word64) << endl;
276 #ifdef CRYPTOPP_WORD128_AVAILABLE 277 if (
sizeof(word128) == 16)
284 cout <<
"sizeof(word128) == " <<
sizeof(word128) << endl;
298 cout <<
"sizeof(hword) == " <<
sizeof(
hword) <<
", sizeof(word) == " <<
sizeof(
word);
299 #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE 300 cout <<
", sizeof(dword) == " <<
sizeof(
dword);
304 #ifdef CRYPTOPP_CPUID_AVAILABLE 305 bool hasMMX = HasMMX();
306 bool hasISSE = HasISSE();
307 bool hasSSE2 = HasSSE2();
308 bool hasSSSE3 = HasSSSE3();
309 bool hasSSE4 = HasSSE4();
313 if ((isP4 && (!hasMMX || !hasSSE2)) || (hasSSE2 && !hasMMX) || (cacheLineSize < 16 || cacheLineSize > 256 || !
IsPowerOf2(cacheLineSize)))
321 cout <<
"hasMMX == " << hasMMX <<
", hasISSE == " << hasISSE <<
", hasSSE2 == " << hasSSE2 <<
", hasSSSE3 == " << hasSSSE3 <<
", hasSSE4 == " << hasSSE4;
322 cout <<
", hasAESNI == " << HasAESNI() <<
", hasCLMUL == " << HasCLMUL() <<
", hasRDRAND == " << HasRDRAND() <<
", hasRDSEED == " << HasRDSEED();
323 cout <<
", hasSHA == " << HasSHA() <<
", isP4 == " << isP4 <<
", cacheLineSize == " << cacheLineSize << endl;
325 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) 326 bool hasNEON = HasNEON();
327 bool hasPMULL = HasPMULL();
328 bool hasCRC32 = HasCRC32();
329 bool hasAES = HasAES();
330 bool hasSHA1 = HasSHA1();
331 bool hasSHA2 = HasSHA2();
334 cout <<
"hasNEON == " << hasNEON <<
", hasPMULL == " << hasPMULL <<
", hasCRC32 == " << hasCRC32 <<
", hasAES == " << hasAES <<
", hasSHA1 == " << hasSHA1 <<
", hasSHA2 == " << hasSHA2 << endl;
339 cout <<
"Some critical setting in config.h is in error. Please fix it and recompile." << endl;
351 #ifdef BLOCKING_RNG_AVAILABLE 352 try {rng.
reset(
new BlockingRng);}
353 catch (OS_RNG_Err &) {}
358 cout <<
"\nTesting operating system provided blocking random number generator...\n\n";
362 unsigned long total=0, length=0;
363 time_t t = time(NULL),
t1 = 0;
367 while (total < 16 && (t1 < 10 || total*8 > (
unsigned long)
t1))
381 cout <<
" it took " << long(t1) <<
" seconds to generate " << total <<
" bytes" << endl;
383 #if 0 // disable this part. it's causing an unpredictable pause during the validation testing 389 while (time(NULL) - t < 2)
398 while (time(NULL) - t < 2)
411 cout <<
" it generated " << length <<
" bytes in " << long(time(NULL) - t) <<
" seconds" << endl;
424 cout <<
" " << total <<
" generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE" << endl;
427 cout <<
"\nNo operating system provided blocking random number generator, skipping test." << endl;
430 #ifdef NONBLOCKING_RNG_AVAILABLE 431 try {rng.
reset(
new NonblockingRng);}
432 catch (OS_RNG_Err &) {}
437 cout <<
"\nTesting operating system provided nonblocking random number generator...\n\n";
449 cout <<
" 100000 generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE" << endl;
452 cout <<
"\nNo operating system provided nonblocking random number generator, skipping test." << endl;
457 #if defined(NO_OS_DEPENDENCE) || !defined(OS_RNG_AVAILABLE) 470 cout <<
"\nTesting AutoSeeded generator...\n\n";
472 AutoSeededRandomPool prng;
473 static const unsigned int ENTROPY_SIZE = 32;
474 bool generate =
true, discard =
true, incorporate =
false;
486 cout <<
" 100000 generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE" << endl;
490 prng.DiscardBytes(100000);
501 cout <<
" discarded 10000 bytes" << endl;
505 if(prng.CanIncorporateEntropy())
508 OS_GenerateRandomBlock(
false, entropy, entropy.
SizeInBytes());
510 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
511 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
512 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
513 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
526 cout <<
" IncorporateEntropy with " << 4*ENTROPY_SIZE <<
" bytes" << endl;
528 return generate && discard && incorporate;
534 cout <<
"\nTesting AutoSeeded X917 generator...\n\n";
536 AutoSeededX917RNG<AES> prng;
537 static const unsigned int ENTROPY_SIZE = 32;
538 bool generate =
true, discard =
true, incorporate =
false;
550 cout <<
" 100000 generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE" << endl;
554 prng.DiscardBytes(100000);
565 cout <<
" discarded 10000 bytes" << endl;
569 if(prng.CanIncorporateEntropy())
572 OS_GenerateRandomBlock(
false, entropy, entropy.
SizeInBytes());
574 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
575 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
576 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
577 prng.IncorporateEntropy(entropy, entropy.
SizeInBytes());
590 cout <<
" IncorporateEntropy with " << 4*ENTROPY_SIZE <<
" bytes" << endl;
592 return generate && discard && incorporate;
594 #endif // NO_OS_DEPENDENCE 596 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 601 bool entropy =
true, compress =
true, discard =
true;
602 static const unsigned int SIZE = 10000;
606 cout <<
"\nTesting RDRAND generator...\n\n";
617 deflator.
Flush(
true);
631 cout << std::setiosflags(std::ios::fixed) << std::setprecision(6);
632 cout <<
" Maurer Randomness Test returned value " << mv << endl;
641 cout <<
" " << SIZE <<
" generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE\n";
656 cout <<
" discarded " << SIZE <<
" bytes\n";
659 cout <<
"\nRDRAND generator not available, skipping test.\n";
667 if (!(entropy && compress && discard))
670 return entropy && compress && discard;
674 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 680 bool entropy =
true, compress =
true, discard =
true;
681 static const unsigned int SIZE = 10000;
685 cout <<
"\nTesting RDSEED generator...\n\n";
696 deflator.
Flush(
true);
710 cout << std::setiosflags(std::ios::fixed) << std::setprecision(6);
711 cout <<
" Maurer Randomness Test returned value " << mv << endl;
720 cout <<
" " << SIZE <<
" generated bytes compressed to " << meter.
GetTotalBytes() <<
" bytes by DEFLATE\n";
735 cout <<
" discarded " << SIZE <<
" bytes\n";
738 cout <<
"\nRDSEED generator not available, skipping test.\n";
746 if (!(entropy && compress && discard))
749 return entropy && compress && discard;
755 cout <<
"\nTesting NIST DRBG generators...\n\n";
756 bool pass=
true, fail;
765 const byte entropy1[] =
"\x16\x10\xb8\x28\xcc\xd2\x7d\xe0\x8c\xee\xa0\x32\xa2\x0e\x92\x08";
766 const byte entropy2[] =
"\x72\xd2\x8c\x90\x8e\xda\xf9\xa4\xd1\xe5\x26\xd8\xf2\xde\xd5\x44";
767 const byte nonce[] =
"\x49\x2c\xf1\x70\x92\x42\xf6\xb5";
770 drbg.IncorporateEntropy(entropy2, 16);
773 drbg.GenerateBlock(result, result.
size());
774 drbg.GenerateBlock(result, result.
size());
776 const byte expected[] =
"\x56\xF3\x3D\x4F\xDB\xB9\xA5\xB6\x4D\x26\x23\x44\x97\xE9\xDC\xB8\x77\x98\xC6\x8D" 777 "\x08\xF7\xC4\x11\x99\xD4\xBD\xDF\x97\xEB\xBF\x6C\xB5\x55\x0E\x5D\x14\x9F\xF4\xD5" 778 "\xBD\x0F\x05\xF2\x5A\x69\x88\xC1\x74\x36\x39\x62\x27\x18\x4A\xF8\x4A\x56\x43\x35" 779 "\x65\x8E\x2F\x85\x72\xBE\xA3\x33\xEE\xE2\xAB\xFF\x22\xFF\xA6\xDE\x3E\x22\xAC\xA2";
781 fail = !!memcmp(result, expected, 640/8);
782 pass = !fail &&
pass;
784 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (COUNT=0, E=16, N=8)" << endl;
790 const byte entropy1[] =
"\x55\x08\x75\xb7\x4e\xc1\x1f\x90\x67\x78\xa3\x1a\x37\xa3\x29\xfd";
791 const byte entropy2[] =
"\x96\xc6\x39\xec\x14\x9f\x6b\x28\xe2\x79\x3b\xb9\x37\x9e\x60\x67";
792 const byte nonce[] =
"\x08\xdd\x8c\xd3\x5b\xfa\x00\x94";
795 drbg.IncorporateEntropy(entropy2, 16);
798 drbg.GenerateBlock(result, result.
size());
799 drbg.GenerateBlock(result, result.
size());
801 const byte expected[] =
"\xEE\x44\xC6\xCF\x2C\x0C\x73\xA8\xAC\x4C\xA5\x6C\x0E\x71\x2C\xA5\x50\x9A\x19\x5D" 802 "\xE4\x5B\x8D\x2B\xC9\x40\xA7\xDB\x66\xC3\xEB\x2A\xA1\xBD\xB4\xDD\x76\x85\x12\x45" 803 "\x80\x2E\x68\x05\x4A\xAB\xA8\x7C\xD6\x3A\xD3\xE5\xC9\x7C\x06\xE7\xA3\x9F\xF6\xF9" 804 "\x8E\xB3\xD9\x72\xD4\x11\x35\xE5\xE7\x46\x1B\x49\x9C\x56\x45\x6A\xBE\x7F\x77\xD4";
806 fail = !!memcmp(result, expected, 640/8);
807 pass = !fail &&
pass;
809 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (COUNT=1, E=16, N=8)" << endl;
815 const byte entropy1[] =
"\xd9\xba\xb5\xce\xdc\xa9\x6f\x61\x78\xd6\x45\x09\xa0\xdf\xdc\x5e";
816 const byte entropy2[] =
"\xc6\xba\xd0\x74\xc5\x90\x67\x86\xf5\xe1\xf3\x20\x99\xf5\xb4\x91";
817 const byte nonce[] =
"\xda\xd8\x98\x94\x14\x45\x0e\x01";
818 const byte additional1[] =
"\x3e\x6b\xf4\x6f\x4d\xaa\x38\x25\xd7\x19\x4e\x69\x4e\x77\x52\xf7";
819 const byte additional2[] =
"\x04\xfa\x28\x95\xaa\x5a\x6f\x8c\x57\x43\x34\x3b\x80\x5e\x5e\xa4";
820 const byte additional3[] =
"\xdf\x5d\xc4\x59\xdf\xf0\x2a\xa2\xf0\x52\xd7\x21\xec\x60\x72\x30";
823 drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
826 drbg.GenerateBlock(additional2, 16, result, result.
size());
827 drbg.GenerateBlock(additional3, 16, result, result.
size());
829 const byte expected[] =
"\xC4\x8B\x89\xF9\xDA\x3F\x74\x82\x45\x55\x5D\x5D\x03\x3B\x69\x3D\xD7\x1A\x4D\xF5" 830 "\x69\x02\x05\xCE\xFC\xD7\x20\x11\x3C\xC2\x4E\x09\x89\x36\xFF\x5E\x77\xB5\x41\x53" 831 "\x58\x70\xB3\x39\x46\x8C\xDD\x8D\x6F\xAF\x8C\x56\x16\x3A\x70\x0A\x75\xB2\x3E\x59" 832 "\x9B\x5A\xEC\xF1\x6F\x3B\xAF\x6D\x5F\x24\x19\x97\x1F\x24\xF4\x46\x72\x0F\xEA\xBE";
834 fail = !!memcmp(result, expected, 640/8);
835 pass = !fail &&
pass;
837 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=16)" << endl;
843 const byte entropy1[] =
"\x28\x00\x0f\xbf\xf0\x57\x22\xc8\x89\x93\x06\xc2\x9b\x50\x78\x0a";
844 const byte entropy2[] =
"\xd9\x95\x8e\x8c\x08\xaf\x5a\x41\x0e\x91\x9b\xdf\x40\x8e\x5a\x0a";
845 const byte nonce[] =
"\x11\x2f\x6e\x20\xc0\x29\xed\x3f";
846 const byte additional1[] =
"\x91\x1d\x96\x5b\x6e\x77\xa9\x6c\xfe\x3f\xf2\xd2\xe3\x0e\x2a\x86";
847 const byte additional2[] =
"\xcd\x44\xd9\x96\xab\x05\xef\xe8\x27\xd3\x65\x83\xf1\x43\x18\x2c";
848 const byte additional3[] =
"\x9f\x6a\x31\x82\x12\x18\x4e\x70\xaf\x5d\x00\x14\x1f\x42\x82\xf6";
851 drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
854 drbg.GenerateBlock(additional2, 16, result, result.
size());
855 drbg.GenerateBlock(additional3, 16, result, result.
size());
857 const byte expected[] =
"\x54\x61\x65\x92\x1E\x71\x4A\xD1\x39\x02\x2F\x97\xD2\x65\x3F\x0D\x47\x69\xB1\x4A" 858 "\x3E\x6E\xEF\xA1\xA0\x16\xD6\x9E\xA9\x7F\x51\xD5\x81\xDC\xAA\xCF\x66\xF9\xB1\xE8" 859 "\x06\x94\x41\xD6\xB5\xC5\x44\x60\x54\x07\xE8\xE7\xDC\x1C\xD8\xE4\x70\xAD\x84\x77" 860 "\x5A\x65\x31\xBE\xE0\xFC\x81\x36\xE2\x8F\x0B\xFE\xEB\xE1\x98\x62\x7E\x98\xE0\xC1";
862 fail = !!memcmp(result, expected, 640/8);
863 pass = !fail &&
pass;
865 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=16)" << endl;
871 const byte entropy1[] =
"\x0e\xd5\x4c\xef\x44\x5c\x61\x7d\x58\x86\xe0\x34\xc0\x97\x36\xd4";
872 const byte entropy2[] =
"\x0b\x90\x27\xb8\x01\xe7\xf7\x2e\xe6\xec\x50\x2b\x8b\x6b\xd7\x11";
873 const byte nonce[] =
"\x2c\x8b\x07\x13\x55\x6c\x91\x6f";
874 const byte personalization[] =
"\xf3\x37\x8e\xa1\x45\x34\x30\x41\x12\xe0\xee\x57\xe9\xb3\x4a\x4b";
876 Hash_DRBG<
SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
877 drbg.IncorporateEntropy(entropy2, 16);
880 drbg.GenerateBlock(result, result.
size());
881 drbg.GenerateBlock(result, result.
size());
883 const byte expected[] =
"\x55\x37\x0E\xD4\xB7\xCA\xA4\xBB\x67\x3A\x0F\x58\x40\xB3\x9F\x76\x4E\xDA\xD2\x85" 884 "\xD5\x6F\x01\x8F\x2D\xA7\x54\x4B\x0E\x66\x39\x62\x35\x96\x1D\xB7\xF6\xDA\xFB\x30" 885 "\xB6\xC5\x68\xD8\x40\x6E\x2B\xD4\x3D\x23\xEB\x0F\x10\xBA\x5F\x24\x9C\xC9\xE9\x4A" 886 "\xD3\xA5\xF1\xDF\xA4\xF2\xB4\x80\x40\x91\xED\x8C\xD6\x6D\xE7\xB7\x53\xB2\x09\xD5";
888 fail = !!memcmp(result, expected, 640/8);
889 pass = !fail &&
pass;
891 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=0, P=16)" << endl;
897 const byte entropy1[] =
"\x8f\x2a\x33\x9f\x5f\x45\x21\x30\xa4\x57\xa9\x6f\xcb\xe2\xe6\x36";
898 const byte entropy2[] =
"\x1f\xff\x9e\x4f\x4d\x66\x3a\x1f\x9e\x85\x4a\x15\x7d\xad\x97\xe0";
899 const byte nonce[] =
"\x0e\xd0\xe9\xa5\xa4\x54\x8a\xd0";
900 const byte personalization[] =
"\x45\xe4\xb3\xe2\x63\x87\x62\x57\x2c\x99\xe4\x03\x45\xd6\x32\x6f";
902 Hash_DRBG<
SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
903 drbg.IncorporateEntropy(entropy2, 16);
906 drbg.GenerateBlock(result, result.
size());
907 drbg.GenerateBlock(result, result.
size());
909 const byte expected[] =
"\x4F\xE8\x96\x41\xF8\xD3\x95\xC4\x43\x6E\xFB\xF8\x05\x75\xA7\x69\x74\x6E\x0C\x5F" 910 "\x54\x14\x35\xB4\xE6\xA6\xB3\x40\x7C\xA2\xC4\x42\xA2\x2F\x66\x28\x28\xCF\x4A\xA8" 911 "\xDC\x16\xBC\x5F\x69\xE5\xBB\x05\xD1\x43\x8F\x80\xAB\xC5\x8F\x9C\x3F\x75\x57\xEB" 912 "\x44\x0D\xF5\x0C\xF4\x95\x23\x94\x67\x11\x55\x98\x14\x43\xFF\x13\x14\x85\x5A\xBC";
914 fail = !!memcmp(result, expected, 640/8);
915 pass = !fail &&
pass;
917 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=0, P=16)" << endl;
923 const byte entropy1[] =
"\x48\xa1\xa9\x7c\xcc\x49\xd7\xcc\xf6\xe3\x78\xa2\xf1\x6b\x0f\xcd";
924 const byte entropy2[] =
"\xba\x5d\xa6\x79\x12\x37\x24\x3f\xea\x60\x50\xf5\xb9\x9e\xcd\xf5";
925 const byte nonce[] =
"\xb0\x91\xd2\xec\x12\xa8\x39\xfe";
926 const byte personalization[] =
"\x3d\xc1\x6c\x1a\xdd\x9c\xac\x4e\xbb\xb0\xb8\x89\xe4\x3b\x9e\x12";
927 const byte additional1[] =
"\xd1\x23\xe3\x8e\x4c\x97\xe8\x29\x94\xa9\x71\x7a\xc6\xf1\x7c\x08";
928 const byte additional2[] =
"\x80\x0b\xed\x97\x29\xcf\xad\xe6\x68\x0d\xfe\x53\xba\x0c\x1e\x28";
929 const byte additional3[] =
"\x25\x1e\x66\xb9\xe3\x85\xac\x1c\x17\xfb\x77\x1b\x5d\xc7\x6c\xf2";
931 Hash_DRBG<
SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
932 drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
935 drbg.GenerateBlock(additional2, 16, result, result.
size());
936 drbg.GenerateBlock(additional3, 16, result, result.
size());
938 const byte expected[] =
"\xA1\xB2\xEE\x86\xA0\xF1\xDA\xB7\x93\x83\x13\x3A\x62\x27\x99\x08\x95\x3A\x1C\x9A" 939 "\x98\x77\x60\x12\x11\x19\xCC\x78\xB8\x51\x2B\xD5\x37\xA1\x9D\xB9\x73\xCA\x39\x7A" 940 "\xDD\x92\x33\x78\x6D\x5D\x41\xFF\xFA\xE9\x80\x59\x04\x85\x21\xE2\x52\x84\xBC\x6F" 941 "\xDB\x97\xF3\x4E\x6A\x12\x7A\xCD\x41\x0F\x50\x68\x28\x46\xBE\x56\x9E\x9A\x6B\xC8";
943 fail = !!memcmp(result, expected, 640/8);
944 pass = !fail &&
pass;
946 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=16, P=16)" << endl;
952 const byte entropy1[] =
"\x3b\xcb\xa8\x3b\x6d\xfb\x06\x79\x80\xef\xc3\x1e\xd2\x9e\x68\x57";
953 const byte entropy2[] =
"\x2f\xc9\x87\x49\x19\xcb\x52\x4a\x5b\xac\xf0\xcd\x96\x4e\xf8\x6e";
954 const byte nonce[] =
"\x23\xfe\x20\x9f\xac\x70\x45\xde";
955 const byte personalization[] =
"\xf2\x25\xf4\xd9\x6b\x9c\xab\x49\x1e\xab\x18\x14\xb2\x5e\x78\xef";
956 const byte additional1[] =
"\x57\x5b\x9a\x11\x32\x7a\xab\x89\x08\xfe\x46\x11\x9a\xed\x14\x5d";
957 const byte additional2[] =
"\x5d\x19\xcd\xed\xb7\xe3\x44\x66\x8e\x11\x42\x96\xa0\x38\xb1\x7f";
958 const byte additional3[] =
"\x2b\xaf\xa0\x15\xed\xdd\x5c\x76\x32\x75\x34\x35\xd1\x37\x72\xfb";
960 Hash_DRBG<
SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
961 drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
964 drbg.GenerateBlock(additional2, 16, result, result.
size());
965 drbg.GenerateBlock(additional3, 16, result, result.
size());
967 const byte expected[] =
"\x1D\x12\xEB\x6D\x42\x60\xBD\xFB\xA7\x99\xB8\x53\xCC\x6F\x19\xB1\x64\xFE\x2F\x55" 968 "\xBA\xA2\x1C\x89\xD4\xD0\xE9\xB4\xBA\xD4\xE5\xF8\xC5\x30\x06\x41\xBA\xC4\x3D\x2B" 969 "\x73\x91\x27\xE9\x31\xC0\x55\x55\x11\xE8\xB6\x57\x02\x0D\xCE\x90\xAC\x31\xB9\x00" 970 "\x31\xC1\xD4\x4F\xE7\x12\x3B\xCC\x85\x16\x2F\x12\x8F\xB2\xDF\x84\x4E\xF7\x06\xBE";
972 fail = !!memcmp(result, expected, 640/8);
973 pass = !fail &&
pass;
975 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=16, P=16)" << endl;
981 const byte entropy1[] =
"\xf0\x5b\xab\x56\xc7\xac\x6e\xeb\x31\xa0\xcf\x8a\x8a\x06\x2a\x49\x17\x9a\xcf\x3c\x5b\x20\x4d\x60\xdd\x7a\x3e\xb7\x8f\x5d\x8e\x3b";
982 const byte entropy2[] =
"\x72\xd4\x02\xa2\x59\x7b\x98\xa3\xb8\xf5\x0b\x71\x6c\x63\xc6\xdb\xa7\x3a\x07\xe6\x54\x89\x06\x3f\x02\xc5\x32\xf5\xda\xc4\xd4\x18";
983 const byte nonce[] =
"\xa1\x45\x08\x53\x41\x68\xb6\x88\xf0\x5f\x1e\x41\x9c\x88\xcc\x30";
984 const byte personalization[] =
"\xa0\x34\x72\xf4\x04\x59\xe2\x87\xea\xcb\x21\x32\xc0\xb6\x54\x02\x7d\xa3\xe6\x69\x25\xb4\x21\x25\x54\xc4\x48\x18\x8c\x0e\x86\x01";
985 const byte additional1[] =
"\xb3\x0d\x28\xaf\xa4\x11\x6b\xbc\x13\x6e\x65\x09\xb5\x82\xa6\x93\xbc\x91\x71\x40\x46\xaa\x3c\x66\xb6\x77\xb3\xef\xf9\xad\xfd\x49";
986 const byte additional2[] =
"\x77\xfd\x1d\x68\xd6\xa4\xdd\xd5\xf3\x27\x25\x2d\x3f\x6b\xdf\xee\x8c\x35\xce\xd3\x83\xbe\xaf\xc9\x32\x77\xef\xf2\x1b\x6f\xf4\x1b";
987 const byte additional3[] =
"\x59\xa0\x1f\xf8\x6a\x58\x72\x1e\x85\xd2\xf8\x3f\x73\x99\xf1\x96\x4e\x27\xf8\x7f\xcd\x1b\xf5\xc1\xeb\xf3\x37\x10\x9b\x13\xbd\x24";
989 Hash_DRBG<
SHA256, 128/8, 440/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
990 drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
993 drbg.GenerateBlock(additional2, 32, result, result.
size());
994 drbg.GenerateBlock(additional3, 32, result, result.
size());
996 const byte expected[] =
"\xFF\x27\x96\x38\x5C\x32\xBF\x84\x3D\xFA\xBB\xF0\x3E\x70\x5A\x39\xCB\xA3\x4C\xF1" 997 "\x4F\xAE\xC3\x05\x63\xDF\x5A\xDD\xBD\x2D\x35\x83\xF5\x7E\x05\xF9\x40\x30\x56\x18" 998 "\xF2\x00\x88\x14\x03\xC2\xD9\x81\x36\x39\xE6\x67\x55\xDC\xFC\x4E\x88\xEA\x71\xDD" 999 "\xB2\x25\x2E\x09\x91\x49\x40\xEB\xE2\x3D\x63\x44\xA0\xF4\xDB\x5E\xE8\x39\xE6\x70" 1000 "\xEC\x47\x24\x3F\xA0\xFC\xF5\x13\x61\xCE\x53\x98\xAA\xBF\xB4\x19\x1B\xFE\xD5\x00" 1001 "\xE1\x03\x3A\x76\x54\xFF\xD7\x24\x70\x5E\x8C\xB2\x41\x7D\x92\x0A\x2F\x4F\x27\xB8" 1002 "\x45\x13\x7F\xFB\x87\x90\xA9\x49";
1004 fail = !!memcmp(result, expected, 1024/8);
1005 pass = !fail &&
pass;
1007 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA256/128/440 (C0UNT=0, E=32, N=16, A=32, P=32)" << endl;
1013 const byte entropy1[] =
"\xfe\x61\x50\x79\xf1\xad\x2a\x71\xea\x7f\x0f\x5a\x14\x34\xee\xc8\x46\x35\x54\x4a\x95\x6a\x4f\xbd\x64\xff\xba\xf6\x1d\x34\x61\x83";
1014 const byte entropy2[] =
"\x18\x89\x7b\xd8\x3e\xff\x38\xab\xb5\x6e\x82\xa8\x1b\x8c\x5e\x59\x3c\x3d\x85\x62\x2a\xe2\x88\xe5\xb2\xc6\xc5\xd2\xad\x7d\xc9\x45";
1015 const byte nonce[] =
"\x9d\xa7\x87\x56\xb7\x49\x17\x02\x4c\xd2\x00\x65\x11\x9b\xe8\x7e";
1016 const byte personalization[] =
"\x77\x5d\xbf\x32\xf3\x5c\xf3\x51\xf4\xb8\x1c\xd3\xfa\x7f\x65\x0b\xcf\x31\x88\xa1\x25\x57\x0c\xdd\xac\xaa\xfe\xa1\x7b\x3b\x29\xbc";
1017 const byte additional1[] =
"\xef\x96\xc7\x9c\xb1\x73\x1d\x82\x85\x0a\x6b\xca\x9b\x5c\x34\x39\xba\xd3\x4e\x4d\x82\x6f\x35\x9f\x61\x5c\xf6\xf2\xa3\x3e\x91\x05";
1018 const byte additional2[] =
"\xaf\x25\xc4\x6e\x21\xfc\xc3\xaf\x1f\xbb\xf8\x76\xb4\x57\xab\x1a\x94\x0a\x85\x16\x47\x81\xa4\xab\xda\xc8\xab\xca\xd0\x84\xda\xae";
1019 const byte additional3[] =
"\x59\x5b\x44\x94\x38\x86\x36\xff\x8e\x45\x1a\x0c\x42\xc8\xcc\x21\x06\x38\x3a\xc5\xa6\x30\x96\xb9\x14\x81\xb3\xa1\x2b\xc8\xcd\xf6";
1021 Hash_DRBG<
SHA256, 128/8, 440/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1022 drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1025 drbg.GenerateBlock(additional2, 32, result, result.
size());
1026 drbg.GenerateBlock(additional3, 32, result, result.
size());
1028 const byte expected[] =
"\x8B\x1C\x9C\x76\xC4\x9B\x3B\xAE\xFD\x6E\xEB\x6C\xFF\xA3\xA1\x03\x3A\x8C\xAF\x09" 1029 "\xFE\xBD\x44\x00\xFC\x0F\xD3\xA8\x26\x9C\xEE\x01\xAC\xE3\x73\x0E\xBE\xDA\x9A\xC6" 1030 "\x23\x44\x6D\xA1\x56\x94\x29\xEC\x4B\xCD\x01\x84\x32\x25\xEF\x00\x91\x0B\xCC\xF3" 1031 "\x06\x3B\x80\xF5\x46\xAC\xD2\xED\x5F\x70\x2B\x56\x2F\x21\x0A\xE9\x80\x87\x38\xAD" 1032 "\xB0\x2A\xEB\x27\xF2\xD9\x20\x2A\x66\x0E\xF5\xC9\x20\x4A\xB4\x3C\xCE\xD6\x24\x97" 1033 "\xDB\xB1\xED\x94\x12\x6A\x2F\x03\x98\x4A\xD4\xD1\x72\xF3\x7A\x66\x74\x7E\x2A\x5B" 1034 "\xDE\xEF\x43\xBC\xB9\x8C\x49\x01";
1036 fail = !!memcmp(result, expected, 1024/8);
1037 pass = !fail &&
pass;
1039 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA256/128/440 (C0UNT=1, E=32, N=16, A=32, P=32)" << endl;
1045 const byte entropy1[] =
"\x55\x4e\x8f\xfd\xc4\x9a\xd8\xf9\x9a\xe5\xd5\xf8\x1a\xf5\xda\xfb\x7f\x75\x53\xd7\xcb\x56\x8e\xa7\x3c\xc0\x82\xdd\x80\x76\x25\xc0";
1046 const byte entropy2[] =
"\x78\x07\x3e\x86\x79\x4b\x10\x95\x88\xf4\x22\xf9\xbd\x04\x7e\xc0\xce\xab\xd6\x78\x6b\xdf\xe2\x89\xb3\x16\x43\x9c\x32\x2d\xb2\x59";
1047 const byte nonce[] =
"\xf0\x89\x78\xde\x2d\xc2\xcd\xd9\xc0\xfd\x3d\x84\xd9\x8b\x8e\x8e";
1048 const byte personalization[] =
"\x3e\x52\x7a\xb5\x81\x2b\x0c\x0e\x98\x2a\x95\x78\x93\x98\xd9\xeb\xf1\xb9\xeb\xd6\x1d\x02\x05\xed\x42\x21\x2d\x24\xb8\x37\xf8\x41";
1049 const byte additional1[] =
"\xf2\x6b\xb1\xef\x30\xca\x8f\x97\xc0\x19\xd0\x79\xe5\xc6\x5e\xae\xd1\xa3\x9a\x52\xaf\x12\xe8\x28\xde\x03\x70\x79\x9a\x70\x11\x8b";
1050 const byte additional2[] =
"\xb0\x9d\xb5\xa8\x45\xec\x79\x7a\x4b\x60\x7e\xe4\xd5\x58\x56\x70\x35\x20\x9b\xd8\xe5\x01\x6c\x78\xff\x1f\x6b\x93\xbf\x7c\x34\xca";
1051 const byte additional3[] =
"\x45\x92\x2f\xb3\x5a\xd0\x6a\x84\x5f\xc9\xca\x16\x4a\x42\xbb\x59\x84\xb4\x38\x57\xa9\x16\x23\x48\xf0\x2f\x51\x61\x24\x35\xb8\x62";
1053 Hash_DRBG<
SHA512, 256/8, 888/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1054 drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1057 drbg.GenerateBlock(additional2, 32, result, result.
size());
1058 drbg.GenerateBlock(additional3, 32, result, result.
size());
1060 const byte expected[] =
"\x1F\x20\x83\x9E\x22\x55\x3B\x1E\x6C\xD4\xF6\x3A\x47\xC3\x99\x54\x0F\x69\xA3\xBB" 1061 "\x37\x47\xA0\x2A\x12\xAC\xC7\x00\x85\xC5\xCC\xF4\x7B\x12\x5A\x4A\xEA\xED\x2F\xE5" 1062 "\x31\x51\x0D\xC1\x8E\x50\x29\xE2\xA6\xCB\x8F\x34\xBA\xDA\x8B\x47\x32\x33\x81\xF1" 1063 "\x2D\xF6\x8B\x73\x8C\xFF\x15\xC8\x8E\x8C\x31\x48\xFA\xC3\xC4\x9F\x52\x81\x23\xC2" 1064 "\x2A\x83\xBD\xF1\x44\xEF\x15\x49\x93\x44\x83\x6B\x37\x5D\xBB\xFF\x72\xD2\x86\x96" 1065 "\x62\xF8\x4D\x12\x3B\x16\xCB\xAC\xA1\x00\x12\x1F\x94\xA8\xD5\xAE\x9A\x9E\xDA\xC8" 1066 "\xD7\x6D\x59\x33\xFD\x55\xC9\xCC\x5B\xAD\x39\x73\xB5\x13\x8B\x96\xDF\xDB\xF5\x90" 1067 "\x81\xDF\x68\x6A\x30\x72\x42\xF2\x74\xAE\x7F\x1F\x7F\xFE\x8B\x3D\x49\x38\x98\x34" 1068 "\x7C\x63\x46\x6E\xAF\xFA\xCB\x06\x06\x08\xE6\xC8\x35\x3C\x68\xB8\xCC\x9D\x5C\xDF" 1069 "\xDB\xC0\x41\x44\x48\xE6\x11\xD4\x78\x50\x81\x91\xED\x1D\x75\xF3\xBD\x79\xFF\x1E" 1070 "\x37\xAF\xC6\x5D\x49\xD6\x5C\xAC\x5B\xCB\xD6\x91\x37\x51\xFA\x98\x70\xFC\x32\xB3" 1071 "\xF2\x86\xE4\xED\x74\xF2\x5D\x8B\x6C\x4D\xB8\xDE\xD8\x4A\xD6\x5E\xD6\x6D\xAE\xB1" 1072 "\x1B\xA2\x94\x52\x54\xAD\x3C\x3D\x25\xBD\x12\x46\x3C\xA0\x45\x9D";
1074 fail = !!memcmp(result, expected, 2048/8);
1075 pass = !fail &&
pass;
1077 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA512/256/888 (C0UNT=0, E=32, N=16, A=32, P=32)" << endl;
1083 const byte entropy1[] =
"\x0c\x9f\xcd\x06\x21\x3c\xb2\xf6\x3c\xdf\x79\x76\x4b\x46\x74\xfc\xdf\x68\xb0\xff\xae\xc7\x21\x8a\xa2\xaf\x4e\x4c\xb9\xe6\x60\x78";
1084 const byte entropy2[] =
"\x75\xb8\x49\x54\xdf\x30\x10\x16\x2c\x06\x8c\x12\xeb\x6c\x1d\x03\x64\x5c\xad\x10\x5c\xc3\x17\x69\xb2\x5a\xc1\x7c\xb8\x33\x5b\x45";
1085 const byte nonce[] =
"\x43\x1c\x4d\x65\x93\x96\xad\xdc\xc1\x6d\x17\x9f\x7f\x57\x24\x4d";
1086 const byte personalization[] =
"\x7e\x54\xbd\x87\xd2\x0a\x95\xd7\xc4\x0c\x3b\x1b\x32\x15\x26\xd2\x06\x67\xa4\xac\xc1\xaa\xfb\x55\x91\x68\x2c\xb5\xc9\xcd\x66\x05";
1087 const byte additional1[] =
"\xd5\x74\x9e\x56\xfb\x5f\xf3\xf8\x2c\x73\x2b\x7a\x83\xe0\xde\x06\x85\x0b\xf0\x57\x50\xc8\x55\x60\x4a\x41\x4f\x86\xb1\x68\x14\x03";
1088 const byte additional2[] =
"\x9a\x83\xbb\x06\xdf\x4d\x53\x89\xf5\x3f\x24\xff\xf7\xcd\x0c\xcf\x4f\xbe\x46\x79\x8e\xce\x82\xa8\xc4\x6b\x5f\x8e\x58\x32\x62\x23";
1089 const byte additional3[] =
"\x48\x13\xc4\x95\x10\x99\xdd\x7f\xd4\x77\x3c\x9b\x8a\xa4\x1c\x3d\xb0\x93\x92\x50\xba\x23\x98\xef\x4b\x1b\xd2\x53\xc1\x61\xda\xc6";
1091 Hash_DRBG<
SHA512, 256/8, 888/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1092 drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1095 drbg.GenerateBlock(additional2, 32, result, result.
size());
1096 drbg.GenerateBlock(additional3, 32, result, result.
size());
1098 const byte expected[] =
"\xE1\x7E\x4B\xEE\xD1\x65\x4F\xB2\xFC\xC8\xE8\xD7\xC6\x72\x7D\xD2\xE3\x15\x73\xC0" 1099 "\x23\xC8\x55\x5D\x2B\xD8\x28\xD8\x31\xE4\xC9\x87\x42\x51\x87\x66\x43\x1F\x2C\xA4" 1100 "\x73\xED\x4E\x50\x12\xC4\x50\x0E\x4C\xDD\x14\x73\xA2\xFB\xB3\x07\x0C\x66\x97\x4D" 1101 "\x89\xDE\x35\x1C\x93\xE7\xE6\x8F\x20\x3D\x84\xE6\x73\x46\x0F\x7C\xF4\x3B\x6C\x02" 1102 "\x23\x7C\x79\x6C\x86\xD9\x48\x80\x9C\x34\xCB\xA1\x23\xE7\xF7\x8A\x2E\x4B\x9D\x39" 1103 "\xA5\x86\x1A\x73\x58\x28\x5A\x1D\x8D\x4A\xBD\x42\xD5\x49\x2B\xDF\x53\x1D\xE7\x4A" 1104 "\x5F\x74\x09\x7F\xDC\x29\x7D\x58\x9C\x4B\xC5\x2F\x3B\x8F\xBF\x56\xCA\x48\x0A\x74" 1105 "\xAE\xFF\xDD\x12\xE4\xF6\xAB\x83\x26\x4F\x52\x8A\x19\xBB\x91\x32\xA4\x42\xEC\x4F" 1106 "\x3C\x76\xED\x9F\x03\xAA\x5E\x53\x79\x4C\xD0\x06\xD2\x1A\x42\x9D\xB1\xA7\xEC\xF7" 1107 "\x5B\xD4\x03\x70\x1E\xF2\x47\x26\x48\xAC\x35\xEE\xD0\x58\x40\x94\x8C\x11\xD0\xEB" 1108 "\x77\x39\x5A\xA3\xD5\xD0\xD3\xC3\x68\xE1\x75\xAA\xC0\x44\xEA\xD8\xDD\x13\x3F\xF9" 1109 "\x7D\x21\x14\x34\xA5\x87\x43\xA4\x0A\x96\x77\x00\xCC\xCA\xB1\xDA\xC4\x39\xE0\x66" 1110 "\x37\x05\x6E\xAC\xF2\xE6\xC6\xC5\x4F\x79\xD3\xE5\x6A\x3D\x36\x3F";
1112 fail = !!memcmp(result, expected, 2048/8);
1113 pass = !fail &&
pass;
1115 cout << (fail ?
"FAILED " :
"passed ") <<
"Hash_DRBG SHA512/256/888 (C0UNT=1, E=32, N=16, A=32, P=32)" << endl;
1124 virtual unsigned int BlockSize()
const =0;
1125 virtual unsigned int KeyLength()
const =0;
1139 {
return new E(keyStr, m_keylen);}
1141 {
return new D(keyStr, m_keylen);}
1150 : m_keylen(keylen ? keylen : E::DEFAULT_KEYLENGTH), m_rounds(rounds ? rounds : E::DEFAULT_ROUNDS) {}
1155 {
return new E(keyStr, m_keylen, m_rounds);}
1157 {
return new D(keyStr, m_keylen, m_rounds);}
1167 bool pass=
true, fail;
1177 fail = memcmp(out, cipher, cg.
BlockSize()) != 0;
1181 fail=fail || memcmp(outplain, plain, cg.
BlockSize());
1183 pass = pass && !fail;
1185 cout << (fail ?
"FAILED " :
"passed ");
1200 : validOutput(validOutput), outputLen(outputLen), counter(0), fail(false) {}
1203 if (counter >= outputLen || validOutput[counter] != inByte)
1205 std::cerr <<
"incorrect output " << counter <<
", " << (
word16)validOutput[counter] <<
", " << (
word16)inByte <<
"\n";
1211 size_t Put2(
const byte *inString,
size_t length,
int messageEnd,
bool blocking)
1219 if (counter != outputLen)
1245 bt.
Put(in, randomLen);
1255 cout <<
"\nDES validation suite running...\n\n";
1260 cout <<
"\nTesting EDE2, EDE3, and XEX3 variants...\n\n";
1278 for (
unsigned int i=1; i<20480; i*=2)
1292 if (!
TestFilter(filter, plaintext, length, plaintext, length))
1301 cout <<
"\nTesting DES modes...\n\n";
1302 const byte key[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
1303 const byte iv[] = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
1304 const byte plain[] = {
1305 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,
1306 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20,
1307 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20};
1310 bool pass=
true, fail;
1314 const byte encrypted[] = {
1315 0x3f, 0xa4, 0x0e, 0x8a, 0x98, 0x4d, 0x48, 0x15,
1316 0x6a, 0x27, 0x17, 0x87, 0xab, 0x88, 0x83, 0xf9,
1317 0x89, 0x3d, 0x51, 0xec, 0x4b, 0x56, 0x3b, 0x53};
1321 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1322 pass = pass && !fail;
1323 cout << (fail ?
"FAILED " :
"passed ") <<
"ECB encryption" << endl;
1327 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1328 pass = pass && !fail;
1329 cout << (fail ?
"FAILED " :
"passed ") <<
"ECB decryption" << endl;
1333 const byte encrypted[] = {
1334 0xE5, 0xC7, 0xCD, 0xDE, 0x87, 0x2B, 0xF2, 0x7C,
1335 0x43, 0xE9, 0x34, 0x00, 0x8C, 0x38, 0x9C, 0x0F,
1336 0x68, 0x37, 0x88, 0x49, 0x9A, 0x7C, 0x05, 0xF6};
1340 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1341 pass = pass && !fail;
1342 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with no padding" << endl;
1346 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1347 pass = pass && !fail;
1348 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with no padding" << endl;
1351 pass = pass && !fail;
1352 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC mode IV generation" << endl;
1357 const byte encrypted[] = {
1358 0xE5, 0xC7, 0xCD, 0xDE, 0x87, 0x2B, 0xF2, 0x7C,
1359 0x43, 0xE9, 0x34, 0x00, 0x8C, 0x38, 0x9C, 0x0F,
1360 0x68, 0x37, 0x88, 0x49, 0x9A, 0x7C, 0x05, 0xF6,
1361 0x62, 0xC1, 0x6A, 0x27, 0xE4, 0xFC, 0xF2, 0x77};
1365 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1366 pass = pass && !fail;
1367 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with PKCS #7 padding" << endl;
1371 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1372 pass = pass && !fail;
1373 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with PKCS #7 padding" << endl;
1378 const byte encrypted[] = {
1379 0xE5, 0xC7, 0xCD, 0xDE, 0x87, 0x2B, 0xF2, 0x7C,
1380 0x43, 0xE9, 0x34, 0x00, 0x8C, 0x38, 0x9C, 0x0F,
1381 0x68, 0x37, 0x88, 0x49, 0x9A, 0x7C, 0x05, 0xF6,
1382 0xcf, 0xb7, 0xc7, 0x64, 0x0e, 0x7c, 0xd9, 0xa7};
1386 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1387 pass = pass && !fail;
1388 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with one-and-zeros padding" << endl;
1392 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1393 pass = pass && !fail;
1394 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with one-and-zeros padding" << endl;
1397 const byte plain_1[] = {
'a', 0, 0, 0, 0, 0, 0, 0};
1399 const byte encrypted[] = {
1400 0x9B, 0x47, 0x57, 0x59, 0xD6, 0x9C, 0xF6, 0xD0};
1404 plain_1, 1, encrypted,
sizeof(encrypted));
1405 pass = pass && !fail;
1406 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with zeros padding" << endl;
1410 encrypted,
sizeof(encrypted), plain_1,
sizeof(plain_1));
1411 pass = pass && !fail;
1412 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with zeros padding" << endl;
1417 const byte encrypted[] = {
1418 0xE5, 0xC7, 0xCD, 0xDE, 0x87, 0x2B, 0xF2, 0x7C,
1419 0x68, 0x37, 0x88, 0x49, 0x9A, 0x7C, 0x05, 0xF6,
1420 0x43, 0xE9, 0x34, 0x00, 0x8C, 0x38, 0x9C, 0x0F};
1424 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1425 pass = pass && !fail;
1426 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with ciphertext stealing (CTS)" << endl;
1430 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1431 pass = pass && !fail;
1432 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with ciphertext stealing (CTS)" << endl;
1435 pass = pass && !fail;
1436 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC CTS IV generation" << endl;
1440 const byte decryptionIV[] = {0x4D, 0xD0, 0xAC, 0x8F, 0x47, 0xCF, 0x79, 0xCE};
1441 const byte encrypted[] = {0x12, 0x34, 0x56};
1446 modeE.SetStolenIV(stolenIV);
1448 plain, 3, encrypted,
sizeof(encrypted));
1449 fail = memcmp(stolenIV, decryptionIV, 8) != 0 || fail;
1450 pass = pass && !fail;
1451 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC encryption with ciphertext and IV stealing" << endl;
1455 encrypted,
sizeof(encrypted), plain, 3);
1456 pass = pass && !fail;
1457 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC decryption with ciphertext and IV stealing" << endl;
1460 const byte encrypted[] = {
1461 0xF3,0x09,0x62,0x49,0xC7,0xF4,0x6E,0x51,
1462 0xA6,0x9E,0x83,0x9B,0x1A,0x92,0xF7,0x84,
1463 0x03,0x46,0x71,0x33,0x89,0x8E,0xA6,0x22};
1467 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1468 pass = pass && !fail;
1469 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB encryption" << endl;
1473 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1474 pass = pass && !fail;
1475 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB decryption" << endl;
1478 pass = pass && !fail;
1479 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB mode IV generation" << endl;
1482 const byte plain_2[] = {
1483 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,0x68,0x65};
1484 const byte encrypted[] = {
1485 0xf3,0x1f,0xda,0x07,0x01,0x14,0x62,0xee,0x18,0x7f};
1489 plain_2,
sizeof(plain_2), encrypted,
sizeof(encrypted));
1490 pass = pass && !fail;
1491 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB (8-bit feedback) encryption" << endl;
1495 encrypted,
sizeof(encrypted), plain_2,
sizeof(plain_2));
1496 pass = pass && !fail;
1497 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB (8-bit feedback) decryption" << endl;
1500 pass = pass && !fail;
1501 cout << (fail ?
"FAILED " :
"passed ") <<
"CFB (8-bit feedback) IV generation" << endl;
1504 const byte encrypted[] = {
1505 0xf3,0x09,0x62,0x49,0xc7,0xf4,0x6e,0x51,
1506 0x35,0xf2,0x4a,0x24,0x2e,0xeb,0x3d,0x3f,
1507 0x3d,0x6d,0x5b,0xe3,0x25,0x5a,0xf8,0xc3};
1511 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1512 pass = pass && !fail;
1513 cout << (fail ?
"FAILED " :
"passed ") <<
"OFB encryption" << endl;
1517 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1518 pass = pass && !fail;
1519 cout << (fail ?
"FAILED " :
"passed ") <<
"OFB decryption" << endl;
1522 pass = pass && !fail;
1523 cout << (fail ?
"FAILED " :
"passed ") <<
"OFB IV generation" << endl;
1526 const byte encrypted[] = {
1527 0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51,
1528 0x16, 0x3A, 0x8C, 0xA0, 0xFF, 0xC9, 0x4C, 0x27,
1529 0xFA, 0x2F, 0x80, 0xF4, 0x80, 0xB8, 0x6F, 0x75};
1533 plain,
sizeof(plain), encrypted,
sizeof(encrypted));
1534 pass = pass && !fail;
1535 cout << (fail ?
"FAILED " :
"passed ") <<
"Counter Mode encryption" << endl;
1539 encrypted,
sizeof(encrypted), plain,
sizeof(plain));
1540 pass = pass && !fail;
1541 cout << (fail ?
"FAILED " :
"passed ") <<
"Counter Mode decryption" << endl;
1544 pass = pass && !fail;
1545 cout << (fail ?
"FAILED " :
"passed ") <<
"Counter Mode IV generation" << endl;
1548 const byte plain_3[] = {
1549 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
1550 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
1551 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
1552 0x66, 0x6f, 0x72, 0x20};
1553 const byte mac1[] = {
1554 0xf1, 0xd3, 0x0f, 0x68, 0x49, 0x31, 0x2c, 0xa4};
1555 const byte mac2[] = {
1556 0x35, 0x80, 0xC5, 0xC4, 0x6B, 0x81, 0x24, 0xE2};
1560 fail = !
TestFilter(cbcmacFilter, plain_3,
sizeof(plain_3), mac1,
sizeof(mac1));
1561 pass = pass && !fail;
1562 cout << (fail ?
"FAILED " :
"passed ") <<
"CBC MAC" << endl;
1566 fail = !
TestFilter(dmacFilter, plain_3,
sizeof(plain_3), mac2,
sizeof(mac2));
1567 pass = pass && !fail;
1568 cout << (fail ?
"FAILED " :
"passed ") <<
"DMAC" << endl;
1574 pass = pass && !fail;
1575 cout << (fail ?
"FAILED " :
"passed ") <<
"AES CTR Mode" << endl;
1581 pass = pass && !fail;
1582 cout << (fail ?
"FAILED " :
"passed ") <<
"AES OFB Mode" << endl;
1588 pass = pass && !fail;
1589 cout << (fail ?
"FAILED " :
"passed ") <<
"AES CFB Mode" << endl;
1595 pass = pass && !fail;
1596 cout << (fail ?
"FAILED " :
"passed ") <<
"AES CBC Mode" << endl;
1604 cout <<
"\nIDEA validation suite running...\n\n";
1612 cout <<
"\nSAFER validation suite running...\n\n";
1625 cout <<
"\nRC2 validation suite running...\n\n";
1629 SecByteBlock plain(RC2Encryption::BLOCKSIZE), cipher(RC2Encryption::BLOCKSIZE), out(RC2Encryption::BLOCKSIZE), outplain(RC2Encryption::BLOCKSIZE);
1631 bool pass=
true, fail;
1635 byte keyLen, effectiveLen;
1637 valdata.
Get(keyLen);
1638 valdata.
Get(effectiveLen);
1639 valdata.
Get(key, keyLen);
1640 valdata.
Get(plain, RC2Encryption::BLOCKSIZE);
1641 valdata.
Get(cipher, RC2Encryption::BLOCKSIZE);
1645 fail = memcmp(out, cipher, RC2Encryption::BLOCKSIZE) != 0;
1649 fail=fail || memcmp(outplain, plain, RC2Encryption::BLOCKSIZE);
1651 pass = pass && !fail;
1653 cout << (fail ?
"FAILED " :
"passed ");
1654 output.
Put(key, keyLen);
1656 output.
Put(outplain, RC2Encryption::BLOCKSIZE);
1658 output.
Put(out, RC2Encryption::BLOCKSIZE);
1666 unsigned char Key0[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef };
1667 unsigned char Input0[]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
1668 unsigned char Output0[] = {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96};
1670 unsigned char Key1[]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
1671 unsigned char Input1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
1672 unsigned char Output1[]={0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79};
1674 unsigned char Key2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
1675 unsigned char Input2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
1676 unsigned char Output2[]={0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a};
1678 unsigned char Key3[]={0xef,0x01,0x23,0x45};
1679 unsigned char Input3[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
1680 unsigned char Output3[]={0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61};
1682 unsigned char Key4[]={ 0x01,0x23,0x45,0x67,0x89,0xab, 0xcd,0xef };
1683 unsigned char Input4[] =
1684 {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1685 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1686 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1687 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1688 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1689 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1690 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1691 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1692 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1693 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1694 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1695 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1696 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1697 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1698 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1699 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1700 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1701 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1702 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1703 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1704 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1705 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1706 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1707 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1708 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1709 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1710 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1711 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1712 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1713 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1714 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1715 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1716 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1717 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1718 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1719 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1720 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1721 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1722 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1723 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1724 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1725 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1726 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1727 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1728 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1729 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1730 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1731 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1732 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1733 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1734 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
1736 unsigned char Output4[]= {
1737 0x75,0x95,0xc3,0xe6,0x11,0x4a,0x09,0x78,0x0c,0x4a,0xd4,
1738 0x52,0x33,0x8e,0x1f,0xfd,0x9a,0x1b,0xe9,0x49,0x8f,
1739 0x81,0x3d,0x76,0x53,0x34,0x49,0xb6,0x77,0x8d,0xca,
1740 0xd8,0xc7,0x8a,0x8d,0x2b,0xa9,0xac,0x66,0x08,0x5d,
1741 0x0e,0x53,0xd5,0x9c,0x26,0xc2,0xd1,0xc4,0x90,0xc1,
1742 0xeb,0xbe,0x0c,0xe6,0x6d,0x1b,0x6b,0x1b,0x13,0xb6,
1743 0xb9,0x19,0xb8,0x47,0xc2,0x5a,0x91,0x44,0x7a,0x95,
1744 0xe7,0x5e,0x4e,0xf1,0x67,0x79,0xcd,0xe8,0xbf,0x0a,
1745 0x95,0x85,0x0e,0x32,0xaf,0x96,0x89,0x44,0x4f,0xd3,
1746 0x77,0x10,0x8f,0x98,0xfd,0xcb,0xd4,0xe7,0x26,0x56,
1747 0x75,0x00,0x99,0x0b,0xcc,0x7e,0x0c,0xa3,0xc4,0xaa,
1748 0xa3,0x04,0xa3,0x87,0xd2,0x0f,0x3b,0x8f,0xbb,0xcd,
1749 0x42,0xa1,0xbd,0x31,0x1d,0x7a,0x43,0x03,0xdd,0xa5,
1750 0xab,0x07,0x88,0x96,0xae,0x80,0xc1,0x8b,0x0a,0xf6,
1751 0x6d,0xff,0x31,0x96,0x16,0xeb,0x78,0x4e,0x49,0x5a,
1752 0xd2,0xce,0x90,0xd7,0xf7,0x72,0xa8,0x17,0x47,0xb6,
1753 0x5f,0x62,0x09,0x3b,0x1e,0x0d,0xb9,0xe5,0xba,0x53,
1754 0x2f,0xaf,0xec,0x47,0x50,0x83,0x23,0xe6,0x71,0x32,
1755 0x7d,0xf9,0x44,0x44,0x32,0xcb,0x73,0x67,0xce,0xc8,
1756 0x2f,0x5d,0x44,0xc0,0xd0,0x0b,0x67,0xd6,0x50,0xa0,
1757 0x75,0xcd,0x4b,0x70,0xde,0xdd,0x77,0xeb,0x9b,0x10,
1758 0x23,0x1b,0x6b,0x5b,0x74,0x13,0x47,0x39,0x6d,0x62,
1759 0x89,0x74,0x21,0xd4,0x3d,0xf9,0xb4,0x2e,0x44,0x6e,
1760 0x35,0x8e,0x9c,0x11,0xa9,0xb2,0x18,0x4e,0xcb,0xef,
1761 0x0c,0xd8,0xe7,0xa8,0x77,0xef,0x96,0x8f,0x13,0x90,
1762 0xec,0x9b,0x3d,0x35,0xa5,0x58,0x5c,0xb0,0x09,0x29,
1763 0x0e,0x2f,0xcd,0xe7,0xb5,0xec,0x66,0xd9,0x08,0x4b,
1764 0xe4,0x40,0x55,0xa6,0x19,0xd9,0xdd,0x7f,0xc3,0x16,
1765 0x6f,0x94,0x87,0xf7,0xcb,0x27,0x29,0x12,0x42,0x64,
1766 0x45,0x99,0x85,0x14,0xc1,0x5d,0x53,0xa1,0x8c,0x86,
1767 0x4c,0xe3,0xa2,0xb7,0x55,0x57,0x93,0x98,0x81,0x26,
1768 0x52,0x0e,0xac,0xf2,0xe3,0x06,0x6e,0x23,0x0c,0x91,
1769 0xbe,0xe4,0xdd,0x53,0x04,0xf5,0xfd,0x04,0x05,0xb3,
1770 0x5b,0xd9,0x9c,0x73,0x13,0x5d,0x3d,0x9b,0xc3,0x35,
1771 0xee,0x04,0x9e,0xf6,0x9b,0x38,0x67,0xbf,0x2d,0x7b,
1772 0xd1,0xea,0xa5,0x95,0xd8,0xbf,0xc0,0x06,0x6f,0xf8,
1773 0xd3,0x15,0x09,0xeb,0x0c,0x6c,0xaa,0x00,0x6c,0x80,
1774 0x7a,0x62,0x3e,0xf8,0x4c,0x3d,0x33,0xc1,0x95,0xd2,
1775 0x3e,0xe3,0x20,0xc4,0x0d,0xe0,0x55,0x81,0x57,0xc8,
1776 0x22,0xd4,0xb8,0xc5,0x69,0xd8,0x49,0xae,0xd5,0x9d,
1777 0x4e,0x0f,0xd7,0xf3,0x79,0x58,0x6b,0x4b,0x7f,0xf6,
1778 0x84,0xed,0x6a,0x18,0x9f,0x74,0x86,0xd4,0x9b,0x9c,
1779 0x4b,0xad,0x9b,0xa2,0x4b,0x96,0xab,0xf9,0x24,0x37,
1780 0x2c,0x8a,0x8f,0xff,0xb1,0x0d,0x55,0x35,0x49,0x00,
1781 0xa7,0x7a,0x3d,0xb5,0xf2,0x05,0xe1,0xb9,0x9f,0xcd,
1782 0x86,0x60,0x86,0x3a,0x15,0x9a,0xd4,0xab,0xe4,0x0f,
1783 0xa4,0x89,0x34,0x16,0x3d,0xdd,0xe5,0x42,0xa6,0x58,
1784 0x55,0x40,0xfd,0x68,0x3c,0xbf,0xd8,0xc0,0x0f,0x12,
1785 0x12,0x9a,0x28,0x4d,0xea,0xcc,0x4c,0xde,0xfe,0x58,
1786 0xbe,0x71,0x37,0x54,0x1c,0x04,0x71,0x26,0xc8,0xd4,
1787 0x9e,0x27,0x55,0xab,0x18,0x1a,0xb7,0xe9,0x40,0xb0,
1791 bool pass=
true, fail;
1794 cout <<
"\nARC4 validation suite running...\n\n";
1796 arc4.
reset(
new Weak::ARC4(Key0,
sizeof(Key0)));
1797 arc4->ProcessString(Input0,
sizeof(Input0));
1798 fail = memcmp(Input0, Output0,
sizeof(Input0)) != 0;
1799 cout << (fail ?
"FAILED" :
"passed") <<
" Test 0" << endl;
1800 pass = pass && !fail;
1802 arc4.
reset(
new Weak::ARC4(Key1,
sizeof(Key1)));
1803 arc4->ProcessString(Key1, Input1,
sizeof(Key1));
1804 fail = memcmp(Output1, Key1,
sizeof(Key1)) != 0;
1805 cout << (fail ?
"FAILED" :
"passed") <<
" Test 1" << endl;
1806 pass = pass && !fail;
1808 arc4.
reset(
new Weak::ARC4(Key2,
sizeof(Key2)));
1809 for (i=0, fail=
false; i<
sizeof(Input2); i++)
1810 if (arc4->ProcessByte(Input2[i]) != Output2[i])
1812 cout << (fail ?
"FAILED" :
"passed") <<
" Test 2" << endl;
1813 pass = pass && !fail;
1815 arc4.
reset(
new Weak::ARC4(Key3,
sizeof(Key3)));
1816 for (i=0, fail=
false; i<
sizeof(Input3); i++)
1817 if (arc4->ProcessByte(Input3[i]) != Output3[i])
1819 cout << (fail ?
"FAILED" :
"passed") <<
" Test 3" << endl;
1820 pass = pass && !fail;
1822 arc4.
reset(
new Weak::ARC4(Key4,
sizeof(Key4)));
1823 for (i=0, fail=
false; i<
sizeof(Input4); i++)
1824 if (arc4->ProcessByte(Input4[i]) != Output4[i])
1826 cout << (fail ?
"FAILED" :
"passed") <<
" Test 4" << endl;
1827 pass = pass && !fail;
1834 cout <<
"\nRC5 validation suite running...\n\n";
1835 bool pass1 =
true, pass2 =
true;
1838 pass1 = RC5Encryption::DEFAULT_KEYLENGTH == 16 && pass1;
1839 pass1 = enc.StaticGetValidKeyLength(0) == 0 && pass1;
1840 pass1 = enc.StaticGetValidKeyLength(254) == 254 && pass1;
1841 pass1 = enc.StaticGetValidKeyLength(255) == 255 && pass1;
1842 pass1 = enc.StaticGetValidKeyLength(256) == 255 && pass1;
1843 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
1844 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
1847 pass2 = RC5Decryption::DEFAULT_KEYLENGTH == 16 && pass2;
1848 pass2 = dec.StaticGetValidKeyLength(0) == 0 && pass2;
1849 pass2 = dec.StaticGetValidKeyLength(254) == 254 && pass2;
1850 pass2 = dec.StaticGetValidKeyLength(255) == 255 && pass2;
1851 pass2 = dec.StaticGetValidKeyLength(256) == 255 && pass2;
1852 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
1853 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
1854 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
1862 cout <<
"\nRC6 validation suite running...\n\n";
1863 bool pass1 =
true, pass2 =
true, pass3 =
true;
1866 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
1867 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
1868 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
1869 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
1870 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
1871 pass1 = enc.StaticGetValidKeyLength(128) == 32 && pass1;
1872 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
1873 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
1876 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
1877 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
1878 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
1879 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
1880 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
1881 pass2 = dec.StaticGetValidKeyLength(128) == 32 && pass2;
1882 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
1883 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
1884 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
1890 return pass1 && pass2 && pass3;
1895 cout <<
"\nMARS validation suite running...\n\n";
1896 bool pass1 =
true, pass2 =
true, pass3 =
true;
1899 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
1900 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
1901 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
1902 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
1903 pass1 = enc.StaticGetValidKeyLength(64) == 56 && pass1;
1904 pass1 = enc.StaticGetValidKeyLength(128) == 56 && pass1;
1905 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
1906 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
1909 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
1910 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
1911 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
1912 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
1913 pass2 = dec.StaticGetValidKeyLength(64) == 56 && pass2;
1914 pass2 = dec.StaticGetValidKeyLength(128) == 56 && pass2;
1915 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
1916 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
1917 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
1923 return pass1 && pass2 && pass3;
1928 cout <<
"\nRijndael (AES) validation suite running...\n\n";
1929 bool pass1 =
true, pass2 =
true, pass3 =
true;
1932 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
1933 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
1934 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
1935 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
1936 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
1937 pass1 = enc.StaticGetValidKeyLength(128) == 32 && pass1;
1938 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
1939 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
1942 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
1943 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
1944 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
1945 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
1946 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
1947 pass2 = dec.StaticGetValidKeyLength(128) == 32 && pass2;
1948 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
1949 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
1950 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
1957 return pass1 && pass2 && pass3;
1962 cout <<
"\nTwofish validation suite running...\n\n";
1963 bool pass1 =
true, pass2 =
true, pass3 =
true;
1966 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
1967 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
1968 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
1969 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
1970 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
1971 pass1 = enc.StaticGetValidKeyLength(128) == 32 && pass1;
1974 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
1975 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
1976 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
1977 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
1978 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
1979 pass2 = dec.StaticGetValidKeyLength(128) == 32 && pass2;
1980 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
1986 return pass1 && pass2 && pass3;
1991 cout <<
"\nSerpent validation suite running...\n\n";
1992 bool pass1 =
true, pass2 =
true, pass3 =
true;
1995 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
1996 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
1997 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
1998 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
1999 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
2000 pass1 = enc.StaticGetValidKeyLength(128) == 32 && pass1;
2003 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
2004 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
2005 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
2006 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
2007 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
2008 pass2 = dec.StaticGetValidKeyLength(128) == 32 && pass2;
2009 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2016 return pass1 && pass2 && pass3;
2021 cout <<
"\nBlowfish validation suite running...\n\n";
2022 bool pass1 =
true, pass2 =
true, pass3 =
true, fail;
2025 pass1 = enc1.StaticGetValidKeyLength(3) == 4 && pass1;
2026 pass1 = enc1.StaticGetValidKeyLength(4) == 4 && pass1;
2027 pass1 = enc1.StaticGetValidKeyLength(5) == 5 && pass1;
2028 pass1 = enc1.StaticGetValidKeyLength(8) == 8 && pass1;
2029 pass1 = enc1.StaticGetValidKeyLength(16) == 16 && pass1;
2030 pass1 = enc1.StaticGetValidKeyLength(24) == 24 && pass1;
2031 pass1 = enc1.StaticGetValidKeyLength(32) == 32 && pass1;
2032 pass1 = enc1.StaticGetValidKeyLength(56) == 56 && pass1;
2033 pass1 = enc1.StaticGetValidKeyLength(57) == 56 && pass1;
2034 pass1 = enc1.StaticGetValidKeyLength(60) == 56 && pass1;
2035 pass1 = enc1.StaticGetValidKeyLength(64) == 56 && pass1;
2036 pass1 = enc1.StaticGetValidKeyLength(128) == 56 && pass1;
2039 pass2 = dec1.StaticGetValidKeyLength(3) == 4 && pass2;
2040 pass2 = dec1.StaticGetValidKeyLength(4) == 4 && pass2;
2041 pass2 = dec1.StaticGetValidKeyLength(5) == 5 && pass2;
2042 pass2 = dec1.StaticGetValidKeyLength(8) == 8 && pass2;
2043 pass2 = dec1.StaticGetValidKeyLength(16) == 16 && pass2;
2044 pass2 = dec1.StaticGetValidKeyLength(24) == 24 && pass2;
2045 pass2 = dec1.StaticGetValidKeyLength(32) == 32 && pass2;
2046 pass2 = dec1.StaticGetValidKeyLength(56) == 56 && pass2;
2047 pass2 = dec1.StaticGetValidKeyLength(57) == 56 && pass2;
2048 pass2 = dec1.StaticGetValidKeyLength(60) == 56 && pass2;
2049 pass2 = dec1.StaticGetValidKeyLength(64) == 56 && pass2;
2050 pass2 = dec1.StaticGetValidKeyLength(128) == 56 && pass2;
2051 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2054 const char *key[]={
"abcdefghijklmnopqrstuvwxyz",
"Who is John Galt?"};
2055 byte *plain[]={(
byte *)
"BLOWFISH", (
byte *)
"\xfe\xdc\xba\x98\x76\x54\x32\x10"};
2056 byte *cipher[]={(
byte *)
"\x32\x4e\xd0\xfe\xf4\x13\xa2\x03", (
byte *)
"\xcc\x91\x73\x2b\x80\x22\xf6\x84"};
2057 byte out[8], outplain[8];
2059 for (
int i=0; i<2; i++)
2062 enc2.ProcessData(out, plain[i], 8);
2063 fail = memcmp(out, cipher[i], 8) != 0;
2066 dec2.ProcessData(outplain, cipher[i], 8);
2067 fail = fail || memcmp(outplain, plain[i], 8);
2068 pass3 = pass3 && !fail;
2070 cout << (fail ?
"FAILED " :
"passed ");
2071 cout <<
'\"' << key[i] <<
'\"';
2072 for (
int j=0; j<(
signed int)(30-strlen(key[i])); j++)
2074 output.Put(outplain, 8);
2079 return pass1 && pass2 && pass3;
2084 cout <<
"\n3-WAY validation suite running...\n\n";
2085 bool pass1 =
true, pass2 =
true;
2088 pass1 = ThreeWayEncryption::KEYLENGTH == 12 && pass1;
2089 pass1 = enc.StaticGetValidKeyLength(8) == 12 && pass1;
2090 pass1 = enc.StaticGetValidKeyLength(12) == 12 && pass1;
2091 pass1 = enc.StaticGetValidKeyLength(16) == 12 && pass1;
2094 pass2 = ThreeWayDecryption::KEYLENGTH == 12 && pass2;
2095 pass2 = dec.StaticGetValidKeyLength(8) == 12 && pass2;
2096 pass2 = dec.StaticGetValidKeyLength(12) == 12 && pass2;
2097 pass2 = dec.StaticGetValidKeyLength(16) == 12 && pass2;
2098 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2106 cout <<
"\nGOST validation suite running...\n\n";
2107 bool pass1 =
true, pass2 =
true;
2110 pass1 = GOSTEncryption::KEYLENGTH == 32 && pass1;
2111 pass1 = enc.StaticGetValidKeyLength(16) == 32 && pass1;
2112 pass1 = enc.StaticGetValidKeyLength(24) == 32 && pass1;
2113 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
2114 pass1 = enc.StaticGetValidKeyLength(40) == 32 && pass1;
2115 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
2118 pass2 = GOSTDecryption::KEYLENGTH == 32 && pass2;
2119 pass2 = dec.StaticGetValidKeyLength(16) == 32 && pass2;
2120 pass2 = dec.StaticGetValidKeyLength(24) == 32 && pass2;
2121 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
2122 pass2 = dec.StaticGetValidKeyLength(40) == 32 && pass2;
2123 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
2124 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2132 cout <<
"\nSHARK validation suite running...\n\n";
2133 bool pass1 =
true, pass2 =
true;
2136 pass1 = SHARKEncryption::KEYLENGTH == 16 && pass1;
2137 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
2138 pass1 = enc.StaticGetValidKeyLength(15) == 16 && pass1;
2139 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
2140 pass1 = enc.StaticGetValidKeyLength(17) == 16 && pass1;
2141 pass1 = enc.StaticGetValidKeyLength(32) == 16 && pass1;
2144 pass2 = SHARKDecryption::KEYLENGTH == 16 && pass2;
2145 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
2146 pass2 = dec.StaticGetValidKeyLength(15) == 16 && pass2;
2147 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
2148 pass2 = dec.StaticGetValidKeyLength(17) == 16 && pass2;
2149 pass2 = dec.StaticGetValidKeyLength(32) == 16 && pass2;
2150 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2158 cout <<
"\nCAST-128 validation suite running...\n\n";
2159 bool pass1 =
true, pass2 =
true, pass3 =
true;
2162 pass1 = CAST128Encryption::DEFAULT_KEYLENGTH == 16 && pass1;
2163 pass1 = enc1.StaticGetValidKeyLength(4) == 5 && pass1;
2164 pass1 = enc1.StaticGetValidKeyLength(5) == 5 && pass1;
2165 pass1 = enc1.StaticGetValidKeyLength(15) == 15 && pass1;
2166 pass1 = enc1.StaticGetValidKeyLength(16) == 16 && pass1;
2167 pass1 = enc1.StaticGetValidKeyLength(17) == 16 && pass1;
2170 pass2 = CAST128Decryption::DEFAULT_KEYLENGTH == 16 && pass2;
2171 pass2 = dec1.StaticGetValidKeyLength(4) == 5 && pass2;
2172 pass2 = dec1.StaticGetValidKeyLength(5) == 5 && pass2;
2173 pass2 = dec1.StaticGetValidKeyLength(15) == 15 && pass2;
2174 pass2 = dec1.StaticGetValidKeyLength(16) == 16 && pass2;
2175 pass2 = dec1.StaticGetValidKeyLength(17) == 16 && pass2;
2176 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2183 cout <<
"\nCAST-256 validation suite running...\n\n";
2184 bool pass4 =
true, pass5 =
true, pass6 =
true;
2187 pass1 = CAST128Encryption::DEFAULT_KEYLENGTH == 16 && pass1;
2188 pass4 = enc2.StaticGetValidKeyLength(15) == 16 && pass4;
2189 pass4 = enc2.StaticGetValidKeyLength(16) == 16 && pass4;
2190 pass4 = enc2.StaticGetValidKeyLength(17) == 20 && pass4;
2191 pass4 = enc2.StaticGetValidKeyLength(20) == 20 && pass4;
2192 pass4 = enc2.StaticGetValidKeyLength(24) == 24 && pass4;
2193 pass4 = enc2.StaticGetValidKeyLength(28) == 28 && pass4;
2194 pass4 = enc2.StaticGetValidKeyLength(31) == 32 && pass4;
2195 pass4 = enc2.StaticGetValidKeyLength(32) == 32 && pass4;
2196 pass4 = enc2.StaticGetValidKeyLength(33) == 32 && pass4;
2199 pass2 = CAST256Decryption::DEFAULT_KEYLENGTH == 16 && pass2;
2200 pass5 = dec2.StaticGetValidKeyLength(15) == 16 && pass5;
2201 pass5 = dec2.StaticGetValidKeyLength(16) == 16 && pass5;
2202 pass5 = dec2.StaticGetValidKeyLength(17) == 20 && pass5;
2203 pass5 = dec2.StaticGetValidKeyLength(20) == 20 && pass5;
2204 pass5 = dec2.StaticGetValidKeyLength(24) == 24 && pass5;
2205 pass5 = dec2.StaticGetValidKeyLength(28) == 28 && pass5;
2206 pass5 = dec2.StaticGetValidKeyLength(31) == 32 && pass5;
2207 pass5 = dec2.StaticGetValidKeyLength(32) == 32 && pass5;
2208 pass5 = dec2.StaticGetValidKeyLength(33) == 32 && pass5;
2209 cout << (pass4 && pass5 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2216 return pass1 && pass2 && pass3 && pass4 && pass5 && pass6;
2221 cout <<
"\nSquare validation suite running...\n\n";
2222 bool pass1 =
true, pass2 =
true;
2225 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
2226 pass1 = enc.StaticGetValidKeyLength(15) == 16 && pass1;
2227 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
2228 pass1 = enc.StaticGetValidKeyLength(17) == 16 && pass1;
2231 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
2232 pass2 = dec.StaticGetValidKeyLength(15) == 16 && pass2;
2233 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
2234 pass2 = dec.StaticGetValidKeyLength(17) == 16 && pass2;
2235 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2243 cout <<
"\nSKIPJACK validation suite running...\n\n";
2244 bool pass1 =
true, pass2 =
true;
2247 pass1 = enc.StaticGetValidKeyLength(8) == 10 && pass1;
2248 pass1 = enc.StaticGetValidKeyLength(9) == 10 && pass1;
2249 pass1 = enc.StaticGetValidKeyLength(10) == 10 && pass1;
2250 pass1 = enc.StaticGetValidKeyLength(16) == 10 && pass1;
2253 pass2 = dec.StaticGetValidKeyLength(8) == 10 && pass2;
2254 pass2 = dec.StaticGetValidKeyLength(9) == 10 && pass2;
2255 pass2 = dec.StaticGetValidKeyLength(10) == 10 && pass2;
2256 pass2 = dec.StaticGetValidKeyLength(16) == 10 && pass2;
2257 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2265 static const byte input[] = {0x37,0xa0,0x05,0x95,0x9b,0x84,0xc4,0x9c,0xa4,0xbe,0x1e,0x05,0x06,0x73,0x53,0x0f,0x5f,0xb0,0x97,0xfd,0xf6,0xa1,0x3f,0xbd,0x6c,0x2c,0xde,0xcd,0x81,0xfd,0xee,0x7c};
2266 static const byte key[] = {0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, 0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0};
2267 static const byte iv[] = {0x01, 0x35, 0x77, 0xaf};
2270 cout <<
"\nSEAL validation suite running...\n\n";
2273 unsigned int size =
sizeof(input);
2276 memset(output, 1, size);
2277 seal.ProcessString(output, input, size);
2278 for (
unsigned int i=0; i<
size; i++)
2283 output[1] = seal.ProcessByte(output[1]);
2284 seal.ProcessString(output+2, size-2);
2285 pass = pass && memcmp(output+1, input+1, size-1) == 0;
2287 cout << (pass ?
"passed" :
"FAILED") << endl;
2293 bool pass =
true, fail;
2295 for (
unsigned int i=0; i<255; i++)
2297 static const char hexEncoded[] =
2298 "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627" 2299 "28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F" 2300 "505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677" 2301 "78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" 2302 "A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7" 2303 "C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF" 2304 "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFE";
2305 static const char base32Encoded[] =
2306 "AAASEA2EAWDAQCAJBIFS2DIQB6IBCESVCSKTNF22DEPBYHA7D2RUAIJCENUCKJTHFAWUWK3NFWZC8NBT" 2307 "GI3VIPJYG66DUQT5HS8V6R4AIFBEGTCFI3DWSUKKJPGE4VURKBIXEW4WKXMFQYC3MJPX2ZK8M7SGC2VD" 2308 "NTUYN35IPFXGY5DPP3ZZA6MUQP4HK7VZRB6ZW856RX9H9AEBSKB2JBNGS8EIVCWMTUG27D6SUGJJHFEX" 2309 "U4M3TGN4VQQJ5HW9WCS4FI7EWYVKRKFJXKX43MPQX82MDNXVYU45PP72ZG7MZRF7Z496BSQC2RCNMTYH" 2310 "3DE6XU8N3ZHN9WGT4MJ7JXQY49NPVYY55VQ77Z9A6HTQH3HF65V8T4RK7RYQ55ZR8D29F69W8Z5RR8H3" 2312 const char *base64AndHexEncoded =
2313 "41414543417751464267634943516F4C4441304F4478415245684D554652595847426B6147787764" 2314 "486838674953496A4A43556D4A7967704B6973734C5334764D4445794D7A51310A4E6A63344F546F" 2315 "375044302B50304242516B4E4552555A4853456C4B5330784E546B395155564A5456465657563168" 2316 "5A576C746358563566594746695932526C5A6D646F615770720A6247317562334278636E4E306458" 2317 "5A3365486C3665337839666E2B4167594B44684957476834694A696F754D6A5936506B4A47536B35" 2318 "53566C7065596D5A71626E4A32656E3643680A6F714F6B7061616E714B6D717136797472712B7773" 2319 "624B7A744C573274376935757275387662362F774D484377385446787366497963724C7A4D334F7A" 2320 "39445230745055316462580A324E6E6132397A6433742F6734654C6A354F586D352B6A7036757673" 2321 "3765377638504879382F5431397666342B6672372F50332B0A";
2323 cout <<
"\nBase64, base32 and hex coding validation suite running...\n\n";
2326 cout << (fail ?
"FAILED " :
"passed ");
2327 cout <<
"Hex Encoding\n";
2328 pass = pass && !fail;
2331 cout << (fail ?
"FAILED " :
"passed ");
2332 cout <<
"Hex Decoding\n";
2333 pass = pass && !fail;
2336 cout << (fail ?
"FAILED " :
"passed ");
2337 cout <<
"Base32 Encoding\n";
2338 pass = pass && !fail;
2341 cout << (fail ?
"FAILED " :
"passed ");
2342 cout <<
"Base32 Decoding\n";
2343 pass = pass && !fail;
2346 cout << (fail ?
"FAILED " :
"passed ");
2347 cout <<
"Base64 Encoding\n";
2348 pass = pass && !fail;
2351 cout << (fail ?
"FAILED " :
"passed ");
2352 cout <<
"Base64 Decoding\n";
2353 pass = pass && !fail;
2360 cout <<
"\nSHACAL-2 validation suite running...\n\n";
2361 bool pass1 =
true, pass2 =
true, pass3 =
true;
2364 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
2365 pass1 = enc.StaticGetValidKeyLength(15) == 16 && pass1;
2366 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
2367 pass1 = enc.StaticGetValidKeyLength(64) == 64 && pass1;
2368 pass1 = enc.StaticGetValidKeyLength(65) == 64 && pass1;
2369 pass1 = enc.StaticGetValidKeyLength(128) == 64 && pass1;
2370 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
2371 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
2374 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
2375 pass2 = dec.StaticGetValidKeyLength(15) == 16 && pass2;
2376 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
2377 pass2 = dec.StaticGetValidKeyLength(64) == 64 && pass2;
2378 pass2 = dec.StaticGetValidKeyLength(65) == 64 && pass2;
2379 pass2 = dec.StaticGetValidKeyLength(128) == 64 && pass2;
2380 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
2381 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
2382 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2387 return pass1 && pass2 && pass3;
2392 cout <<
"\nCamellia validation suite running...\n\n";
2393 bool pass1 =
true, pass2 =
true, pass3 =
true;
2396 pass1 = enc.StaticGetValidKeyLength(8) == 16 && pass1;
2397 pass1 = enc.StaticGetValidKeyLength(16) == 16 && pass1;
2398 pass1 = enc.StaticGetValidKeyLength(24) == 24 && pass1;
2399 pass1 = enc.StaticGetValidKeyLength(32) == 32 && pass1;
2400 pass1 = enc.StaticGetValidKeyLength(64) == 32 && pass1;
2401 pass1 = enc.StaticGetValidKeyLength(128) == 32 && pass1;
2402 pass1 = enc.StaticGetValidKeyLength(0) == enc.MinKeyLength() && pass1;
2403 pass1 = enc.StaticGetValidKeyLength(
SIZE_MAX) == enc.MaxKeyLength() && pass1;
2406 pass2 = dec.StaticGetValidKeyLength(8) == 16 && pass2;
2407 pass2 = dec.StaticGetValidKeyLength(16) == 16 && pass2;
2408 pass2 = dec.StaticGetValidKeyLength(24) == 24 && pass2;
2409 pass2 = dec.StaticGetValidKeyLength(32) == 32 && pass2;
2410 pass2 = dec.StaticGetValidKeyLength(64) == 32 && pass2;
2411 pass2 = dec.StaticGetValidKeyLength(128) == 32 && pass2;
2412 pass2 = dec.StaticGetValidKeyLength(0) == dec.MinKeyLength() && pass2;
2413 pass2 = dec.StaticGetValidKeyLength(
SIZE_MAX) == dec.MaxKeyLength() && pass2;
2414 cout << (pass1 && pass2 ?
"passed:" :
"FAILED:") <<
" Algorithm key lengths\n";
2420 return pass1 && pass2 && pass3;
2425 cout <<
"\nSalsa validation suite running...\n";
2432 cout <<
"\nSosemanuk validation suite running...\n";
2438 cout <<
"\nVMAC validation suite running...\n";
2444 cout <<
"\nAES/CCM validation suite running...\n";
2450 cout <<
"\nAES/GCM validation suite running...\n";
2451 cout <<
"\n2K tables:";
2453 cout <<
"\n64K tables:";
2459 cout <<
"\nCMAC validation suite running...\n";
Base class for all exceptions thrown by the library.
unsigned int BlockSize() const
BlockTransformation * NewEncryption(const byte *keyStr) const
void PutByte(byte inByte)
bool ValidateCipherModes()
Utility functions for the Crypto++ library.
Classes for NIST DRBGs from SP 800-90A.
unsigned int BytesNeeded() const
Provides the number of bytes of input is needed by the test.
Class file for modes of operation.
RC2::Decryption RC2Decryption
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
BlockTransformation * NewDecryption(const byte *keyStr) const
bool ValidateDSA(bool thorough)
DMAC message authentication code.
Hardware generated random numbers using RDRAND instruction.
virtual void IncorporateEntropy(const byte *input, size_t length)
Update RNG state with additional unpredictable values.
Implementation of Store interface.
Converts given data to base 16.
bool TestModeIV(SymmetricCipher &e, SymmetricCipher &d)
Classes for the RC5 block cipher.
virtual word32 GenerateWord32(word32 min=0, word32 max=0xffffffffUL)
Generate a random 32 bit word in the range min to max, inclusive.
virtual unsigned int BlockSize() const =0
BlockTransformation * NewEncryption(const byte *keyStr) const
bool BlockTransformationTest(const CipherFactory &cg, BufferedTransformation &valdata, unsigned int tuples=0xffff)
Decode base 16 data back to bytes.
Abstract base classes that provide a uniform interface to this library.
BlockTransformation * NewDecryption(const byte *keyStr) const
Classes for the RC2 block cipher.
void AddDefaultRoute(BufferedTransformation &destination)
Manages resources for an array of objects.
size_type size() const
Provides the count of elements in the SecBlock.
RandomNumberGenerator & GlobalRNG()
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking)
Input multiple bytes for processing.
Classes for automatic resource management.
DEFLATE compressor (RFC 1951)
virtual bool CanIncorporateEntropy() const
Determines if a generator can accept additional entropy.
Classes for the GIST block cipher.
std::hash for asio::adress
Classes for the Cameliia block cipher.
Classes for RDRAND and RDSEED.
#define CRYPTOPP_NATIVE_DWORD_AVAILABLE
virtual void IncorporateEntropy(const byte *input, size_t length)
Update RNG state with additional unpredictable values.
Classes for Base32Encoder and Base32Decoder.
Classes for the RC6 block cipher.
DEFLATE compression and decompression (RFC 1951)
void SetRetries(unsigned int retries)
Set the number of retries used by the generator.
Route input to different and/or multiple channels based on channel ID.
Classes for multiple named channels.
BufferedTransformation & TheBitBucket()
An input discarding BufferedTransformation.
bool TestFilter(BufferedTransformation &bt, const byte *in, size_t inLen, const byte *out, size_t outLen)
Pointer that overloads operator ->
Classes for the Twofish block cipher.
1 and 0's padding added to a block
Classes for the Blowfish block cipher.
Classes for the MARS block cipher (IBM AES submission)
FixedRoundsCipherFactory(unsigned int keylen=0)
virtual unsigned int KeyLength() const =0
Classes for the SKIPJACK block cipher.
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
Filter wrapper for HashTransformation.
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
Block cipher mode of operation aggregate.
virtual void Resynchronize(const byte *iv, int ivLength=-1)
Resynchronize with an IV.
Classes for HexEncoder and HexDecoder.
Maurer's Universal Statistical Test for Random Bit Generators.
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
bool TestAutoSeededX917()
BufferedTransformation * AttachedTransformation()
Retrieve attached transformation.
Class file for the AES cipher (Rijndael)
bool ValidateAll(bool thorough)
Classes for the CAST-128 and CAST-256 block ciphers.
Interface for one direction (encryption or decryption) of a stream cipher or cipher mode...
Provides class member functions to key a block cipher.
unsigned int GetRetries() const
Retrieve the number of retries used by the generator.
Classes for DMAC message authentication code.
lword Pump(lword pumpMax=(size_t) SIZE_MAX)
Pump data to attached transformation.
unsigned long long word64
Classes and functions for schemes based on Discrete Logs (DL) over GF(p)
bool IsPowerOf2(const T &value)
Tests whether a value is a power of 2.
virtual BlockTransformation * NewDecryption(const byte *keyStr) const =0
Miscellaneous classes for RNGs.
lword GetTotalBytes() const
#define CRYPTOPP_ASSERT(exp)
Classes for SEAL stream cipher.
Redirect input to another BufferedTransformation without owning it.
Classes for Rijndael encryption algorithm.
Functions for CPU features and intrinsics.
Classes for DES, 2-key Triple-DES, 3-key Triple-DES and DESX.
std::string AlgorithmName() const
Provides the name of this algorithm.
Implementation of BufferedTransformation's attachment interface.
Hardware generated random numbers using RDSEED instruction.
#define USING_NAMESPACE(x)
Classes for the Base64Encoder, Base64Decoder, Base64URLEncoder and Base64URLDecoder.
Hash_DRBG from SP 800-90A Rev 1 (June 2015)
#define pass(a, b, c, mul, X)
Classes for the SAFER and SAFER-K block ciphers.
Base class for unflushable filters.
uint8_t const size_t const size
#define CRYPTOPP_UNUSED(x)
FilterTester(const byte *validOutput, size_t outputLen)
0's padding added to a block
Measure how many bytes and messages pass through the filter.
const T & STDMAX(const T &a, const T &b)
Replacement function for std::max.
Classes providing file-based library services.
Classes for the 3-Way block cipher.
RC2::Encryption RC2Encryption
void SetRetries(unsigned int retries)
Set the number of retries used by the generator.
No padding added to a block.
Classes and functions for Elliptic Curves over prime and binary fields.
Classes for the Serpent block cipher.
bool RunTestDataFile(const char *filename, const NameValuePairs &overrideParameters, bool thorough)
SymmetricCipher implementation.
double GetTestValue() const
RNG-based implementation of Source interface.
unsigned int GetRetries() const
Retrieve the number of retries used by the generator.
std::string AlgorithmName() const
Provides the name of this algorithm.
VariableRoundsCipherFactory(unsigned int keylen=0, unsigned int rounds=0)
unsigned int KeyLength() const
size_type SizeInBytes() const
Provides the number of bytes in the SecBlock.
Classes for the SHARK block cipher.
virtual BlockTransformation * NewEncryption(const byte *keyStr) const =0
Implementation of Store interface.
unsigned int KeyLength() const
Classes for the Square block cipher.
virtual void GetNextIV(RandomNumberGenerator &rng, byte *iv)
Retrieves a secure IV for the next message.
#define CRYPTOPP_DATA_DIR
bool Flush(bool hardFlush, int propagation=-1, bool blocking=true)
Flush buffered input and/or output, with signal propagation.
virtual unsigned int IVSize() const
Returns length of the IV accepted by this object.
unsigned int BlockSize() const
Classes for access to the operating system's random number generators.
Classes for the IDEA block cipher.
Classes for the SHACAL-2 block cipher.