Fabcoin Core  0.16.2
P2P Digital Currency
validat1.cpp
Go to the documentation of this file.
1 // validat1.cpp - written and placed in the public domain by Wei Dai
2 
3 #include "pch.h"
4 
5 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
6 
7 #include "cryptlib.h"
8 #include "pubkey.h"
9 #include "gfpcrypt.h"
10 #include "eccrypto.h"
11 #include "filters.h"
12 #include "files.h"
13 #include "hex.h"
14 #include "base32.h"
15 #include "base64.h"
16 #include "modes.h"
17 #include "cbcmac.h"
18 #include "dmac.h"
19 #include "idea.h"
20 #include "des.h"
21 #include "rc2.h"
22 #include "arc4.h"
23 #include "rc5.h"
24 #include "blowfish.h"
25 #include "3way.h"
26 #include "safer.h"
27 #include "gost.h"
28 #include "shark.h"
29 #include "cast.h"
30 #include "square.h"
31 #include "seal.h"
32 #include "rc6.h"
33 #include "mars.h"
34 #include "aes.h"
35 #include "cpu.h"
36 #include "rng.h"
37 #include "rijndael.h"
38 #include "twofish.h"
39 #include "serpent.h"
40 #include "skipjack.h"
41 #include "shacal2.h"
42 #include "camellia.h"
43 #include "osrng.h"
44 #include "drbg.h"
45 #include "rdrand.h"
46 #include "zdeflate.h"
47 #include "smartptr.h"
48 #include "channels.h"
49 #include "misc.h"
50 
51 #include <time.h>
52 #include <memory>
53 #include <iostream>
54 #include <iomanip>
55 
56 #include "validate.h"
57 
58 // Aggressive stack checking with VS2005 SP1 and above.
59 #if (CRYPTOPP_MSC_VERSION >= 1410)
60 # pragma strict_gs_check (on)
61 #endif
62 
63 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
64 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
65 #endif
66 
69 
70 bool ValidateAll(bool thorough)
71 {
72  bool pass=TestSettings();
73  pass=TestOS_RNG() && pass;
74  pass=TestAutoSeeded() && pass;
75  pass=TestAutoSeededX917() && pass;
76  pass=TestNIST_DRBG() && pass;
77 
78 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
79  pass=TestRDRAND() && pass;
80  pass=TestRDSEED() && pass;
81 #endif
82 
83 #if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_IMPORTS)
84  // http://github.com/weidai11/cryptopp/issues/92
85  pass=TestSecBlock() && pass;
86  // http://github.com/weidai11/cryptopp/issues/336
87  pass=TestIntegerBitops() && pass;
88  // http://github.com/weidai11/cryptopp/issues/64
89  pass=TestPolynomialMod2() && pass;
90  // http://github.com/weidai11/cryptopp/issues/242
91  pass=TestHuffmanCodes() && pass;
92  // http://github.com/weidai11/cryptopp/issues/346
93  pass=TestASN1Parse() && pass;
94 #endif
95 
96  pass=ValidateCRC32() && pass;
97  pass=ValidateCRC32C() && pass;
98  pass=ValidateAdler32() && pass;
99  pass=ValidateMD2() && pass;
100  pass=ValidateMD5() && pass;
101  pass=ValidateSHA() && pass;
102 
103  pass=RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/keccak.txt") && pass;
104  pass=RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/sha3_fips_202.txt") && pass;
105 
106  pass=ValidateTiger() && pass;
107  pass=ValidateRIPEMD() && pass;
108  pass=ValidatePanama() && pass;
109  pass=ValidateWhirlpool() && pass;
110 
111  pass=ValidateBLAKE2s() && pass;
112  pass=ValidateBLAKE2b() && pass;
113  pass=ValidatePoly1305() && pass;
114  pass=ValidateSipHash() && pass;
115 
116  pass=ValidateHMAC() && pass;
117  pass=ValidateTTMAC() && pass;
118 
119  pass=ValidatePBKDF() && pass;
120  pass=ValidateHKDF() && pass;
121 
122  pass=ValidateDES() && pass;
123  pass=ValidateCipherModes() && pass;
124  pass=ValidateIDEA() && pass;
125  pass=ValidateSAFER() && pass;
126  pass=ValidateRC2() && pass;
127  pass=ValidateARC4() && pass;
128  pass=ValidateRC5() && pass;
129  pass=ValidateBlowfish() && pass;
130  pass=ValidateThreeWay() && pass;
131  pass=ValidateGOST() && pass;
132  pass=ValidateSHARK() && pass;
133  pass=ValidateCAST() && pass;
134  pass=ValidateSquare() && pass;
135  pass=ValidateSKIPJACK() && pass;
136  pass=ValidateSEAL() && pass;
137  pass=ValidateRC6() && pass;
138  pass=ValidateMARS() && pass;
139  pass=ValidateRijndael() && pass;
140  pass=ValidateTwofish() && pass;
141  pass=ValidateSerpent() && pass;
142  pass=ValidateSHACAL2() && pass;
143  pass=ValidateCamellia() && pass;
144  pass=ValidateSalsa() && pass;
145  pass=ValidateSosemanuk() && pass;
146  pass=ValidateVMAC() && pass;
147  pass=ValidateCCM() && pass;
148  pass=ValidateGCM() && pass;
149  pass=ValidateCMAC() && pass;
150  pass=RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/eax.txt") && pass;
151  pass=RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/seed.txt") && pass;
152 
153  pass=ValidateBBS() && pass;
154  pass=ValidateDH() && pass;
155  pass=ValidateMQV() && pass;
156  pass=ValidateHMQV() && pass;
157  pass=ValidateFHMQV() && pass;
158  pass=ValidateRSA() && pass;
159  pass=ValidateElGamal() && pass;
160  pass=ValidateDLIES() && pass;
161  pass=ValidateNR() && pass;
162  pass=ValidateDSA(thorough) && pass;
163  pass=ValidateLUC() && pass;
164  pass=ValidateLUC_DH() && pass;
165  pass=ValidateLUC_DL() && pass;
166  pass=ValidateXTR_DH() && pass;
167  pass=ValidateRabin() && pass;
168  pass=ValidateRW() && pass;
169 // pass=ValidateBlumGoldwasser() && pass;
170  pass=ValidateECP() && pass;
171  pass=ValidateEC2N() && pass;
172  pass=ValidateECDSA() && pass;
173  pass=ValidateECGDSA() && pass;
174  pass=ValidateESIGN() && pass;
175 
176  if (pass)
177  cout << "\nAll tests passed!\n";
178  else
179  cout << "\nOops! Not all tests passed.\n";
180 
181  return pass;
182 }
183 
185 {
186  bool pass = true;
187 
188  cout << "\nTesting Settings...\n\n";
189 
190  word32 w;
191  const byte s[] = "\x01\x02\x03\x04";
192 
193 #if (CRYPTOPP_MSC_VERSION >= 1400)
194  std::copy(s, s+4,
195  stdext::make_checked_array_iterator(reinterpret_cast<byte*>(&w), sizeof(w)));
196 #else
197  std::copy(s, s+4, reinterpret_cast<byte*>(&w));
198 #endif
199 
200  if (w == 0x04030201L)
201  {
202 #ifdef IS_LITTLE_ENDIAN
203  cout << "passed: ";
204 #else
205  cout << "FAILED: ";
206  pass = false;
207 #endif
208  cout << "Your machine is little endian.\n";
209  }
210  else if (w == 0x01020304L)
211  {
212 #ifndef IS_LITTLE_ENDIAN
213  cout << "passed: ";
214 #else
215  cout << "FAILED: ";
216  pass = false;
217 #endif
218  cout << "Your machine is big endian.\n";
219  }
220  else
221  {
222  cout << "FAILED: Your machine is neither big endian nor little endian.\n";
223  pass = false;
224  }
225 
226 #ifdef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS
227  // Don't assert the alignment of testvals. That's what this test is for.
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";
231  else
232  {
233  cout << "FAILED: Unaligned data access gave incorrect results.\n";
234  pass = false;
235  }
236 #else
237  cout << "passed: CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS is not defined. Will restrict to aligned data access.\n";
238 #endif
239 
240  if (sizeof(byte) == 1)
241  cout << "passed: ";
242  else
243  {
244  cout << "FAILED: ";
245  pass = false;
246  }
247  cout << "sizeof(byte) == " << sizeof(byte) << endl;
248 
249  if (sizeof(word16) == 2)
250  cout << "passed: ";
251  else
252  {
253  cout << "FAILED: ";
254  pass = false;
255  }
256  cout << "sizeof(word16) == " << sizeof(word16) << endl;
257 
258  if (sizeof(word32) == 4)
259  cout << "passed: ";
260  else
261  {
262  cout << "FAILED: ";
263  pass = false;
264  }
265  cout << "sizeof(word32) == " << sizeof(word32) << endl;
266 
267  if (sizeof(word64) == 8)
268  cout << "passed: ";
269  else
270  {
271  cout << "FAILED: ";
272  pass = false;
273  }
274  cout << "sizeof(word64) == " << sizeof(word64) << endl;
275 
276 #ifdef CRYPTOPP_WORD128_AVAILABLE
277  if (sizeof(word128) == 16)
278  cout << "passed: ";
279  else
280  {
281  cout << "FAILED: ";
282  pass = false;
283  }
284  cout << "sizeof(word128) == " << sizeof(word128) << endl;
285 #endif
286 
287  if (sizeof(word) == 2*sizeof(hword)
289  && sizeof(dword) == 2*sizeof(word)
290 #endif
291  )
292  cout << "passed: ";
293  else
294  {
295  cout << "FAILED: ";
296  pass = false;
297  }
298  cout << "sizeof(hword) == " << sizeof(hword) << ", sizeof(word) == " << sizeof(word);
299 #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE
300  cout << ", sizeof(dword) == " << sizeof(dword);
301 #endif
302  cout << endl;
303 
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();
310  bool isP4 = IsP4();
311  int cacheLineSize = GetCacheLineSize();
312 
313  if ((isP4 && (!hasMMX || !hasSSE2)) || (hasSSE2 && !hasMMX) || (cacheLineSize < 16 || cacheLineSize > 256 || !IsPowerOf2(cacheLineSize)))
314  {
315  cout << "FAILED: ";
316  pass = false;
317  }
318  else
319  cout << "passed: ";
320 
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;
324 
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();
332 
333  cout << "passed: ";
334  cout << "hasNEON == " << hasNEON << ", hasPMULL == " << hasPMULL << ", hasCRC32 == " << hasCRC32 << ", hasAES == " << hasAES << ", hasSHA1 == " << hasSHA1 << ", hasSHA2 == " << hasSHA2 << endl;
335 #endif
336 
337  if (!pass)
338  {
339  cout << "Some critical setting in config.h is in error. Please fix it and recompile." << endl;
340  abort();
341  }
342  return pass;
343 }
344 
346 {
347  bool pass = true;
348 
350 
351 #ifdef BLOCKING_RNG_AVAILABLE
352  try {rng.reset(new BlockingRng);}
353  catch (OS_RNG_Err &) {}
354 #endif
355 
356  if (rng.get())
357  {
358  cout << "\nTesting operating system provided blocking random number generator...\n\n";
359 
360  MeterFilter meter(new Redirector(TheBitBucket()));
361  RandomNumberSource test(*rng, UINT_MAX, false, new Deflator(new Redirector(meter)));
362  unsigned long total=0, length=0;
363  time_t t = time(NULL), t1 = 0;
364  CRYPTOPP_UNUSED(length);
365 
366  // check that it doesn't take too long to generate a reasonable amount of randomness
367  while (total < 16 && (t1 < 10 || total*8 > (unsigned long)t1))
368  {
369  test.Pump(1);
370  total += 1;
371  t1 = time(NULL) - t;
372  }
373 
374  if (total < 16)
375  {
376  cout << "FAILED:";
377  pass = false;
378  }
379  else
380  cout << "passed:";
381  cout << " it took " << long(t1) << " seconds to generate " << total << " bytes" << endl;
382 
383 #if 0 // disable this part. it's causing an unpredictable pause during the validation testing
384  if (t1 < 2)
385  {
386  // that was fast, are we really blocking?
387  // first exhaust the extropy reserve
388  t = time(NULL);
389  while (time(NULL) - t < 2)
390  {
391  test.Pump(1);
392  total += 1;
393  }
394 
395  // if it generates too many bytes in a certain amount of time,
396  // something's probably wrong
397  t = time(NULL);
398  while (time(NULL) - t < 2)
399  {
400  test.Pump(1);
401  total += 1;
402  length += 1;
403  }
404  if (length > 1024)
405  {
406  cout << "FAILED:";
407  pass = false;
408  }
409  else
410  cout << "passed:";
411  cout << " it generated " << length << " bytes in " << long(time(NULL) - t) << " seconds" << endl;
412  }
413 #endif
414 
416 
417  if (meter.GetTotalBytes() < total)
418  {
419  cout << "FAILED:";
420  pass = false;
421  }
422  else
423  cout << "passed:";
424  cout << " " << total << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE" << endl;
425  }
426  else
427  cout << "\nNo operating system provided blocking random number generator, skipping test." << endl;
428 
429  rng.reset(NULL);
430 #ifdef NONBLOCKING_RNG_AVAILABLE
431  try {rng.reset(new NonblockingRng);}
432  catch (OS_RNG_Err &) {}
433 #endif
434 
435  if (rng.get())
436  {
437  cout << "\nTesting operating system provided nonblocking random number generator...\n\n";
438 
439  MeterFilter meter(new Redirector(TheBitBucket()));
440  RandomNumberSource test(*rng, 100000, true, new Deflator(new Redirector(meter)));
441 
442  if (meter.GetTotalBytes() < 100000)
443  {
444  cout << "FAILED:";
445  pass = false;
446  }
447  else
448  cout << "passed:";
449  cout << " 100000 generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE" << endl;
450  }
451  else
452  cout << "\nNo operating system provided nonblocking random number generator, skipping test." << endl;
453 
454  return pass;
455 }
456 
457 #if defined(NO_OS_DEPENDENCE) || !defined(OS_RNG_AVAILABLE)
459 {
460  return true;
461 }
463 {
464  return true;
465 }
466 #else
467 bool TestAutoSeeded()
468 {
469  // This tests Auto-Seeding and GenerateIntoBufferedTransformation.
470  cout << "\nTesting AutoSeeded generator...\n\n";
471 
472  AutoSeededRandomPool prng;
473  static const unsigned int ENTROPY_SIZE = 32;
474  bool generate = true, discard = true, incorporate = false;
475 
476  MeterFilter meter(new Redirector(TheBitBucket()));
477  RandomNumberSource test(prng, 100000, true, new Deflator(new Redirector(meter)));
478 
479  if (meter.GetTotalBytes() < 100000)
480  {
481  cout << "FAILED:";
482  generate = false;
483  }
484  else
485  cout << "passed:";
486  cout << " 100000 generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE" << endl;
487 
488  try
489  {
490  prng.DiscardBytes(100000);
491  }
492  catch(const Exception&)
493  {
494  discard = false;
495  }
496 
497  if (!discard)
498  cout << "FAILED:";
499  else
500  cout << "passed:";
501  cout << " discarded 10000 bytes" << endl;
502 
503  try
504  {
505  if(prng.CanIncorporateEntropy())
506  {
507  SecByteBlock entropy(ENTROPY_SIZE);
508  OS_GenerateRandomBlock(false, entropy, entropy.SizeInBytes());
509 
510  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
511  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
512  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
513  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
514 
515  incorporate = true;
516  }
517  }
518  catch(const Exception& /*ex*/)
519  {
520  }
521 
522  if (!incorporate)
523  cout << "FAILED:";
524  else
525  cout << "passed:";
526  cout << " IncorporateEntropy with " << 4*ENTROPY_SIZE << " bytes" << endl;
527 
528  return generate && discard && incorporate;
529 }
530 
531 bool TestAutoSeededX917()
532 {
533  // This tests Auto-Seeding and GenerateIntoBufferedTransformation.
534  cout << "\nTesting AutoSeeded X917 generator...\n\n";
535 
536  AutoSeededX917RNG<AES> prng;
537  static const unsigned int ENTROPY_SIZE = 32;
538  bool generate = true, discard = true, incorporate = false;
539 
540  MeterFilter meter(new Redirector(TheBitBucket()));
541  RandomNumberSource test(prng, 100000, true, new Deflator(new Redirector(meter)));
542 
543  if (meter.GetTotalBytes() < 100000)
544  {
545  cout << "FAILED:";
546  generate = false;
547  }
548  else
549  cout << "passed:";
550  cout << " 100000 generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE" << endl;
551 
552  try
553  {
554  prng.DiscardBytes(100000);
555  }
556  catch(const Exception&)
557  {
558  discard = false;
559  }
560 
561  if (!discard)
562  cout << "FAILED:";
563  else
564  cout << "passed:";
565  cout << " discarded 10000 bytes" << endl;
566 
567  try
568  {
569  if(prng.CanIncorporateEntropy())
570  {
571  SecByteBlock entropy(ENTROPY_SIZE);
572  OS_GenerateRandomBlock(false, entropy, entropy.SizeInBytes());
573 
574  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
575  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
576  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
577  prng.IncorporateEntropy(entropy, entropy.SizeInBytes());
578 
579  incorporate = true;
580  }
581  }
582  catch(const Exception& /*ex*/)
583  {
584  }
585 
586  if (!incorporate)
587  cout << "FAILED:";
588  else
589  cout << "passed:";
590  cout << " IncorporateEntropy with " << 4*ENTROPY_SIZE << " bytes" << endl;
591 
592  return generate && discard && incorporate;
593 }
594 #endif // NO_OS_DEPENDENCE
595 
596 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
597 bool TestRDRAND()
598 {
599  // Testing on 6th generation i7 shows RDRAND needs less than 8 retries for 10K bytes.
600  RDRAND rdrand;
601  bool entropy = true, compress = true, discard = true;
602  static const unsigned int SIZE = 10000;
603 
604  if (HasRDRAND())
605  {
606  cout << "\nTesting RDRAND generator...\n\n";
607 
608  MeterFilter meter(new Redirector(TheBitBucket()));
609  Deflator deflator(new Redirector(meter));
610  MaurerRandomnessTest maurer;
611 
612  ChannelSwitch chsw;
613  chsw.AddDefaultRoute(deflator);
614  chsw.AddDefaultRoute(maurer);
615 
616  RandomNumberSource rns(rdrand, SIZE, true, new Redirector(chsw));
617  deflator.Flush(true);
618 
619  CRYPTOPP_ASSERT(0 == maurer.BytesNeeded());
620  const double mv = maurer.GetTestValue();
621  if (mv < 0.98f)
622  {
623  cout << "FAILED:";
624  entropy = false;
625  }
626  else
627  cout << "passed:";
628 
629  // Coverity finding, also see http://stackoverflow.com/a/34509163/608639.
630  StreamState ss(cout);
631  cout << std::setiosflags(std::ios::fixed) << std::setprecision(6);
632  cout << " Maurer Randomness Test returned value " << mv << endl;
633 
634  if (meter.GetTotalBytes() < SIZE)
635  {
636  cout << "FAILED:";
637  compress = false;
638  }
639  else
640  cout << "passed:";
641  cout << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n";
642 
643  try
644  {
645  rdrand.DiscardBytes(SIZE);
646  }
647  catch(const Exception&)
648  {
649  discard = false;
650  }
651 
652  if (!discard)
653  cout << "FAILED:";
654  else
655  cout << "passed:";
656  cout << " discarded " << SIZE << " bytes\n";
657  }
658  else
659  cout << "\nRDRAND generator not available, skipping test.\n";
660 
661  // Squash code coverage warnings on unused functions
662  (void)rdrand.AlgorithmName();
663  (void)rdrand.CanIncorporateEntropy();
664  rdrand.SetRetries(rdrand.GetRetries());
665  rdrand.IncorporateEntropy(NULL, 0);
666 
667  if (!(entropy && compress && discard))
668  cout.flush();
669 
670  return entropy && compress && discard;
671 }
672 #endif
673 
674 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
675 bool TestRDSEED()
676 {
677  // Testing on 5th generation i5 shows RDSEED needs about 128 retries for 10K bytes
678  // on 64-bit/amd64 VM, and it needs more for an 32-bit/i686 VM.
679  RDSEED rdseed(256);
680  bool entropy = true, compress = true, discard = true;
681  static const unsigned int SIZE = 10000;
682 
683  if (HasRDSEED())
684  {
685  cout << "\nTesting RDSEED generator...\n\n";
686 
687  MeterFilter meter(new Redirector(TheBitBucket()));
688  Deflator deflator(new Redirector(meter));
689  MaurerRandomnessTest maurer;
690 
691  ChannelSwitch chsw;
692  chsw.AddDefaultRoute(deflator);
693  chsw.AddDefaultRoute(maurer);
694 
695  RandomNumberSource rns(rdseed, SIZE, true, new Redirector(chsw));
696  deflator.Flush(true);
697 
698  CRYPTOPP_ASSERT(0 == maurer.BytesNeeded());
699  const double mv = maurer.GetTestValue();
700  if (mv < 0.98f)
701  {
702  cout << "FAILED:";
703  entropy = false;
704  }
705  else
706  cout << "passed:";
707 
708  // Coverity finding, also see http://stackoverflow.com/a/34509163/608639.
709  StreamState ss(cout);
710  cout << std::setiosflags(std::ios::fixed) << std::setprecision(6);
711  cout << " Maurer Randomness Test returned value " << mv << endl;
712 
713  if (meter.GetTotalBytes() < SIZE)
714  {
715  cout << "FAILED:";
716  compress = false;
717  }
718  else
719  cout << "passed:";
720  cout << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n";
721 
722  try
723  {
724  rdseed.DiscardBytes(SIZE);
725  }
726  catch(const Exception&)
727  {
728  discard = false;
729  }
730 
731  if (!discard)
732  cout << "FAILED:";
733  else
734  cout << "passed:";
735  cout << " discarded " << SIZE << " bytes\n";
736  }
737  else
738  cout << "\nRDSEED generator not available, skipping test.\n";
739 
740  // Squash code coverage warnings on unused functions
741  (void)rdseed.AlgorithmName();
742  (void)rdseed.CanIncorporateEntropy();
743  rdseed.SetRetries(rdseed.GetRetries());
744  rdseed.IncorporateEntropy(NULL, 0);
745 
746  if (!(entropy && compress && discard))
747  cout.flush();
748 
749  return entropy && compress && discard;
750 }
751 #endif
752 
754 {
755  cout << "\nTesting NIST DRBG generators...\n\n";
756  bool pass=true, fail;
757 
758  // # CAVS 14.3
759  // # DRBG800-90A information for "drbg_pr"
760  // # Generated on Tue Apr 02 15:32:09 2013
761 
762  {
763  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
764  // [PersonalizationStringLen = 0], [AdditionalInputLen = 0], [ReturnedBitsLen = 640]
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";
768 
769  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8);
770  drbg.IncorporateEntropy(entropy2, 16);
771 
772  SecByteBlock result(80);
773  drbg.GenerateBlock(result, result.size());
774  drbg.GenerateBlock(result, result.size());
775 
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";
780 
781  fail = !!memcmp(result, expected, 640/8);
782  pass = !fail && pass;
783 
784  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (COUNT=0, E=16, N=8)" << endl;
785  }
786 
787  {
788  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
789  // [PersonalizationStringLen = 0], [AdditionalInputLen = 0], [ReturnedBitsLen = 640]
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";
793 
794  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8);
795  drbg.IncorporateEntropy(entropy2, 16);
796 
797  SecByteBlock result(80);
798  drbg.GenerateBlock(result, result.size());
799  drbg.GenerateBlock(result, result.size());
800 
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";
805 
806  fail = !!memcmp(result, expected, 640/8);
807  pass = !fail && pass;
808 
809  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (COUNT=1, E=16, N=8)" << endl;
810  }
811 
812  {
813  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
814  // [PersonalizationStringLen = 0], [AdditionalInputLen = 128], [ReturnedBitsLen = 640]
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";
821 
822  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8);
823  drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
824 
825  SecByteBlock result(80);
826  drbg.GenerateBlock(additional2, 16, result, result.size());
827  drbg.GenerateBlock(additional3, 16, result, result.size());
828 
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";
833 
834  fail = !!memcmp(result, expected, 640/8);
835  pass = !fail && pass;
836 
837  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=16)" << endl;
838  }
839 
840  {
841  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
842  // [PersonalizationStringLen = 0], [AdditionalInputLen = 128], [ReturnedBitsLen = 640]
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";
849 
850  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8);
851  drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
852 
853  SecByteBlock result(80);
854  drbg.GenerateBlock(additional2, 16, result, result.size());
855  drbg.GenerateBlock(additional3, 16, result, result.size());
856 
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";
861 
862  fail = !!memcmp(result, expected, 640/8);
863  pass = !fail && pass;
864 
865  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=16)" << endl;
866  }
867 
868  {
869  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
870  // [PersonalizationStringLen = 128], [AdditionalInputLen = 0], [ReturnedBitsLen = 640]
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";
875 
876  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
877  drbg.IncorporateEntropy(entropy2, 16);
878 
879  SecByteBlock result(80);
880  drbg.GenerateBlock(result, result.size());
881  drbg.GenerateBlock(result, result.size());
882 
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";
887 
888  fail = !!memcmp(result, expected, 640/8);
889  pass = !fail && pass;
890 
891  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=0, P=16)" << endl;
892  }
893 
894  {
895  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
896  // [PersonalizationStringLen = 128], [AdditionalInputLen = 0], [ReturnedBitsLen = 640]
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";
901 
902  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
903  drbg.IncorporateEntropy(entropy2, 16);
904 
905  SecByteBlock result(80);
906  drbg.GenerateBlock(result, result.size());
907  drbg.GenerateBlock(result, result.size());
908 
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";
913 
914  fail = !!memcmp(result, expected, 640/8);
915  pass = !fail && pass;
916 
917  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=0, P=16)" << endl;
918  }
919 
920  {
921  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
922  // [PersonalizationStringLen = 128], [AdditionalInputLen = 16], [ReturnedBitsLen = 640]
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";
930 
931  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
932  drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
933 
934  SecByteBlock result(80);
935  drbg.GenerateBlock(additional2, 16, result, result.size());
936  drbg.GenerateBlock(additional3, 16, result, result.size());
937 
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";
942 
943  fail = !!memcmp(result, expected, 640/8);
944  pass = !fail && pass;
945 
946  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=0, E=16, N=8, A=16, P=16)" << endl;
947  }
948 
949  {
950  // [SHA-1], [PredictionResistance = False], [EntropyInputLen = 128], [NonceLen = 64]
951  // [PersonalizationStringLen = 128], [AdditionalInputLen = 16], [ReturnedBitsLen = 640]
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";
959 
960  Hash_DRBG<SHA1, 128/8, 440/8> drbg(entropy1, 16, nonce, 8, personalization, 16);
961  drbg.IncorporateEntropy(entropy2, 16, additional1, 16);
962 
963  SecByteBlock result(80);
964  drbg.GenerateBlock(additional2, 16, result, result.size());
965  drbg.GenerateBlock(additional3, 16, result, result.size());
966 
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";
971 
972  fail = !!memcmp(result, expected, 640/8);
973  pass = !fail && pass;
974 
975  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA1/128/440 (C0UNT=1, E=16, N=8, A=16, P=16)" << endl;
976  }
977 
978  {
979  // [SHA-256], [PredictionResistance = False], [EntropyInputLen = 256], [NonceLen = 128]
980  // [PersonalizationStringLen = 256], [AdditionalInputLen = 256], [ReturnedBitsLen = 1024]
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";
988 
989  Hash_DRBG<SHA256, 128/8, 440/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
990  drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
991 
992  SecByteBlock result(128);
993  drbg.GenerateBlock(additional2, 32, result, result.size());
994  drbg.GenerateBlock(additional3, 32, result, result.size());
995 
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";
1003 
1004  fail = !!memcmp(result, expected, 1024/8);
1005  pass = !fail && pass;
1006 
1007  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA256/128/440 (C0UNT=0, E=32, N=16, A=32, P=32)" << endl;
1008  }
1009 
1010  {
1011  // [SHA-256], [PredictionResistance = False], [EntropyInputLen = 256], [NonceLen = 128]
1012  // [PersonalizationStringLen = 256], [AdditionalInputLen = 256], [ReturnedBitsLen = 1024]
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";
1020 
1021  Hash_DRBG<SHA256, 128/8, 440/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1022  drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1023 
1024  SecByteBlock result(128);
1025  drbg.GenerateBlock(additional2, 32, result, result.size());
1026  drbg.GenerateBlock(additional3, 32, result, result.size());
1027 
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";
1035 
1036  fail = !!memcmp(result, expected, 1024/8);
1037  pass = !fail && pass;
1038 
1039  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA256/128/440 (C0UNT=1, E=32, N=16, A=32, P=32)" << endl;
1040  }
1041 
1042  {
1043  // [SHA-512], [PredictionResistance = False], [EntropyInputLen = 256], [NonceLen = 128]
1044  // [PersonalizationStringLen = 256], [AdditionalInputLen = 256], [ReturnedBitsLen = 2048]
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";
1052 
1053  Hash_DRBG<SHA512, 256/8, 888/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1054  drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1055 
1056  SecByteBlock result(256);
1057  drbg.GenerateBlock(additional2, 32, result, result.size());
1058  drbg.GenerateBlock(additional3, 32, result, result.size());
1059 
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";
1073 
1074  fail = !!memcmp(result, expected, 2048/8);
1075  pass = !fail && pass;
1076 
1077  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA512/256/888 (C0UNT=0, E=32, N=16, A=32, P=32)" << endl;
1078  }
1079 
1080  {
1081  // [SHA-512], [PredictionResistance = False], [EntropyInputLen = 256], [NonceLen = 128]
1082  // [PersonalizationStringLen = 256], [AdditionalInputLen = 256], [ReturnedBitsLen = 2048]
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";
1090 
1091  Hash_DRBG<SHA512, 256/8, 888/8> drbg(entropy1, 32, nonce, 16, personalization, 32);
1092  drbg.IncorporateEntropy(entropy2, 32, additional1, 32);
1093 
1094  SecByteBlock result(256);
1095  drbg.GenerateBlock(additional2, 32, result, result.size());
1096  drbg.GenerateBlock(additional3, 32, result, result.size());
1097 
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";
1111 
1112  fail = !!memcmp(result, expected, 2048/8);
1113  pass = !fail && pass;
1114 
1115  cout << (fail ? "FAILED " : "passed ") << "Hash_DRBG SHA512/256/888 (C0UNT=1, E=32, N=16, A=32, P=32)" << endl;
1116  }
1117 
1118  return pass;
1119 }
1120 
1122 {
1123 public:
1124  virtual unsigned int BlockSize() const =0;
1125  virtual unsigned int KeyLength() const =0;
1126 
1127  virtual BlockTransformation* NewEncryption(const byte *keyStr) const =0;
1128  virtual BlockTransformation* NewDecryption(const byte *keyStr) const =0;
1129 };
1130 
1131 template <class E, class D> class FixedRoundsCipherFactory : public CipherFactory
1132 {
1133 public:
1134  FixedRoundsCipherFactory(unsigned int keylen=0) : m_keylen(keylen?keylen:E::DEFAULT_KEYLENGTH) {}
1135  unsigned int BlockSize() const {return E::BLOCKSIZE;}
1136  unsigned int KeyLength() const {return m_keylen;}
1137 
1139  {return new E(keyStr, m_keylen);}
1141  {return new D(keyStr, m_keylen);}
1142 
1143  unsigned int m_keylen;
1144 };
1145 
1146 template <class E, class D> class VariableRoundsCipherFactory : public CipherFactory
1147 {
1148 public:
1149  VariableRoundsCipherFactory(unsigned int keylen=0, unsigned int rounds=0)
1150  : m_keylen(keylen ? keylen : E::DEFAULT_KEYLENGTH), m_rounds(rounds ? rounds : E::DEFAULT_ROUNDS) {}
1151  unsigned int BlockSize() const {return E::BLOCKSIZE;}
1152  unsigned int KeyLength() const {return m_keylen;}
1153 
1155  {return new E(keyStr, m_keylen, m_rounds);}
1157  {return new D(keyStr, m_keylen, m_rounds);}
1158 
1159  unsigned int m_keylen, m_rounds;
1160 };
1161 
1162 bool BlockTransformationTest(const CipherFactory &cg, BufferedTransformation &valdata, unsigned int tuples = 0xffff)
1163 {
1164  HexEncoder output(new FileSink(cout));
1165  SecByteBlock plain(cg.BlockSize()), cipher(cg.BlockSize()), out(cg.BlockSize()), outplain(cg.BlockSize());
1166  SecByteBlock key(cg.KeyLength());
1167  bool pass=true, fail;
1168 
1169  while (valdata.MaxRetrievable() && tuples--)
1170  {
1171  valdata.Get(key, cg.KeyLength());
1172  valdata.Get(plain, cg.BlockSize());
1173  valdata.Get(cipher, cg.BlockSize());
1174 
1176  transE->ProcessBlock(plain, out);
1177  fail = memcmp(out, cipher, cg.BlockSize()) != 0;
1178 
1180  transD->ProcessBlock(out, outplain);
1181  fail=fail || memcmp(outplain, plain, cg.BlockSize());
1182 
1183  pass = pass && !fail;
1184 
1185  cout << (fail ? "FAILED " : "passed ");
1186  output.Put(key, cg.KeyLength());
1187  cout << " ";
1188  output.Put(outplain, cg.BlockSize());
1189  cout << " ";
1190  output.Put(out, cg.BlockSize());
1191  cout << endl;
1192  }
1193  return pass;
1194 }
1195 
1196 class FilterTester : public Unflushable<Sink>
1197 {
1198 public:
1199  FilterTester(const byte *validOutput, size_t outputLen)
1200  : validOutput(validOutput), outputLen(outputLen), counter(0), fail(false) {}
1201  void PutByte(byte inByte)
1202  {
1203  if (counter >= outputLen || validOutput[counter] != inByte)
1204  {
1205  std::cerr << "incorrect output " << counter << ", " << (word16)validOutput[counter] << ", " << (word16)inByte << "\n";
1206  fail = true;
1207  CRYPTOPP_ASSERT(false);
1208  }
1209  counter++;
1210  }
1211  size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking)
1212  {
1213  CRYPTOPP_UNUSED(messageEnd), CRYPTOPP_UNUSED(blocking);
1214 
1215  while (length--)
1216  FilterTester::PutByte(*inString++);
1217 
1218  if (messageEnd)
1219  if (counter != outputLen)
1220  {
1221  fail = true;
1222  CRYPTOPP_ASSERT(false);
1223  }
1224 
1225  return 0;
1226  }
1227  bool GetResult()
1228  {
1229  return !fail;
1230  }
1231 
1233  size_t outputLen, counter;
1234  bool fail;
1235 };
1236 
1237 bool TestFilter(BufferedTransformation &bt, const byte *in, size_t inLen, const byte *out, size_t outLen)
1238 {
1239  FilterTester *ft;
1240  bt.Attach(ft = new FilterTester(out, outLen));
1241 
1242  while (inLen)
1243  {
1244  size_t randomLen = GlobalRNG().GenerateWord32(0, (word32)inLen);
1245  bt.Put(in, randomLen);
1246  in += randomLen;
1247  inLen -= randomLen;
1248  }
1249  bt.MessageEnd();
1250  return ft->GetResult();
1251 }
1252 
1254 {
1255  cout << "\nDES validation suite running...\n\n";
1256 
1257  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/descert.dat", true, new HexDecoder);
1259 
1260  cout << "\nTesting EDE2, EDE3, and XEX3 variants...\n\n";
1261 
1262  FileSource valdata1(CRYPTOPP_DATA_DIR "TestData/3desval.dat", true, new HexDecoder);
1266 
1267  return pass;
1268 }
1269 
1271 {
1272  SecByteBlock lastIV, iv(e.IVSize());
1274 
1275  // vector_ptr<byte> due to Enterprise Analysis finding on the stack based array.
1276  vector_ptr<byte> plaintext(20480);
1277 
1278  for (unsigned int i=1; i<20480; i*=2)
1279  {
1280  e.GetNextIV(GlobalRNG(), iv);
1281  if (iv == lastIV)
1282  return false;
1283  else
1284  lastIV = iv;
1285 
1286  e.Resynchronize(iv);
1287  d.Resynchronize(iv);
1288 
1289  unsigned int length = STDMAX(GlobalRNG().GenerateWord32(0, i), (word32)e.MinLastBlockSize());
1290  GlobalRNG().GenerateBlock(plaintext, length);
1291 
1292  if (!TestFilter(filter, plaintext, length, plaintext, length))
1293  return false;
1294  }
1295 
1296  return true;
1297 }
1298 
1300 {
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[] = { // "Now is the time for all " without tailing 0
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};
1308  DESEncryption desE(key);
1309  DESDecryption desD(key);
1310  bool pass=true, fail;
1311 
1312  {
1313  // from FIPS 81
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};
1318 
1321  plain, sizeof(plain), encrypted, sizeof(encrypted));
1322  pass = pass && !fail;
1323  cout << (fail ? "FAILED " : "passed ") << "ECB encryption" << endl;
1324 
1327  encrypted, sizeof(encrypted), plain, sizeof(plain));
1328  pass = pass && !fail;
1329  cout << (fail ? "FAILED " : "passed ") << "ECB decryption" << endl;
1330  }
1331  {
1332  // from FIPS 81
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};
1337 
1338  CBC_Mode_ExternalCipher::Encryption modeE(desE, iv);
1340  plain, sizeof(plain), encrypted, sizeof(encrypted));
1341  pass = pass && !fail;
1342  cout << (fail ? "FAILED " : "passed ") << "CBC encryption with no padding" << endl;
1343 
1344  CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
1346  encrypted, sizeof(encrypted), plain, sizeof(plain));
1347  pass = pass && !fail;
1348  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with no padding" << endl;
1349 
1350  fail = !TestModeIV(modeE, modeD);
1351  pass = pass && !fail;
1352  cout << (fail ? "FAILED " : "passed ") << "CBC mode IV generation" << endl;
1353  }
1354  {
1355  // generated with Crypto++, matches FIPS 81
1356  // but has extra 8 bytes as result of padding
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};
1362 
1363  CBC_Mode_ExternalCipher::Encryption modeE(desE, iv);
1364  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1365  plain, sizeof(plain), encrypted, sizeof(encrypted));
1366  pass = pass && !fail;
1367  cout << (fail ? "FAILED " : "passed ") << "CBC encryption with PKCS #7 padding" << endl;
1368 
1369  CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
1370  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1371  encrypted, sizeof(encrypted), plain, sizeof(plain));
1372  pass = pass && !fail;
1373  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with PKCS #7 padding" << endl;
1374  }
1375  {
1376  // generated with Crypto++ 5.2, matches FIPS 81
1377  // but has extra 8 bytes as result of padding
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};
1383 
1384  CBC_Mode_ExternalCipher::Encryption modeE(desE, iv);
1386  plain, sizeof(plain), encrypted, sizeof(encrypted));
1387  pass = pass && !fail;
1388  cout << (fail ? "FAILED " : "passed ") << "CBC encryption with one-and-zeros padding" << endl;
1389 
1390  CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
1392  encrypted, sizeof(encrypted), plain, sizeof(plain));
1393  pass = pass && !fail;
1394  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with one-and-zeros padding" << endl;
1395  }
1396  {
1397  const byte plain_1[] = {'a', 0, 0, 0, 0, 0, 0, 0};
1398  // generated with Crypto++
1399  const byte encrypted[] = {
1400  0x9B, 0x47, 0x57, 0x59, 0xD6, 0x9C, 0xF6, 0xD0};
1401 
1402  CBC_Mode_ExternalCipher::Encryption modeE(desE, iv);
1404  plain_1, 1, encrypted, sizeof(encrypted));
1405  pass = pass && !fail;
1406  cout << (fail ? "FAILED " : "passed ") << "CBC encryption with zeros padding" << endl;
1407 
1408  CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
1410  encrypted, sizeof(encrypted), plain_1, sizeof(plain_1));
1411  pass = pass && !fail;
1412  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with zeros padding" << endl;
1413  }
1414  {
1415  // generated with Crypto++, matches FIPS 81
1416  // but with last two blocks swapped as result of CTS
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};
1421 
1423  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1424  plain, sizeof(plain), encrypted, sizeof(encrypted));
1425  pass = pass && !fail;
1426  cout << (fail ? "FAILED " : "passed ") << "CBC encryption with ciphertext stealing (CTS)" << endl;
1427 
1429  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1430  encrypted, sizeof(encrypted), plain, sizeof(plain));
1431  pass = pass && !fail;
1432  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with ciphertext stealing (CTS)" << endl;
1433 
1434  fail = !TestModeIV(modeE, modeD);
1435  pass = pass && !fail;
1436  cout << (fail ? "FAILED " : "passed ") << "CBC CTS IV generation" << endl;
1437  }
1438  {
1439  // generated with Crypto++
1440  const byte decryptionIV[] = {0x4D, 0xD0, 0xAC, 0x8F, 0x47, 0xCF, 0x79, 0xCE};
1441  const byte encrypted[] = {0x12, 0x34, 0x56};
1442 
1443  byte stolenIV[8];
1444 
1446  modeE.SetStolenIV(stolenIV);
1447  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
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;
1452 
1453  CBC_CTS_Mode_ExternalCipher::Decryption modeD(desD, stolenIV);
1454  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1455  encrypted, sizeof(encrypted), plain, 3);
1456  pass = pass && !fail;
1457  cout << (fail ? "FAILED " : "passed ") << "CBC decryption with ciphertext and IV stealing" << endl;
1458  }
1459  {
1460  const byte encrypted[] = { // from FIPS 81
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};
1464 
1465  CFB_Mode_ExternalCipher::Encryption modeE(desE, iv);
1466  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1467  plain, sizeof(plain), encrypted, sizeof(encrypted));
1468  pass = pass && !fail;
1469  cout << (fail ? "FAILED " : "passed ") << "CFB encryption" << endl;
1470 
1471  CFB_Mode_ExternalCipher::Decryption modeD(desE, iv);
1472  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1473  encrypted, sizeof(encrypted), plain, sizeof(plain));
1474  pass = pass && !fail;
1475  cout << (fail ? "FAILED " : "passed ") << "CFB decryption" << endl;
1476 
1477  fail = !TestModeIV(modeE, modeD);
1478  pass = pass && !fail;
1479  cout << (fail ? "FAILED " : "passed ") << "CFB mode IV generation" << endl;
1480  }
1481  {
1482  const byte plain_2[] = { // "Now is the." without tailing 0
1483  0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,0x68,0x65};
1484  const byte encrypted[] = { // from FIPS 81
1485  0xf3,0x1f,0xda,0x07,0x01,0x14,0x62,0xee,0x18,0x7f};
1486 
1487  CFB_Mode_ExternalCipher::Encryption modeE(desE, iv, 1);
1488  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1489  plain_2, sizeof(plain_2), encrypted, sizeof(encrypted));
1490  pass = pass && !fail;
1491  cout << (fail ? "FAILED " : "passed ") << "CFB (8-bit feedback) encryption" << endl;
1492 
1493  CFB_Mode_ExternalCipher::Decryption modeD(desE, iv, 1);
1494  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1495  encrypted, sizeof(encrypted), plain_2, sizeof(plain_2));
1496  pass = pass && !fail;
1497  cout << (fail ? "FAILED " : "passed ") << "CFB (8-bit feedback) decryption" << endl;
1498 
1499  fail = !TestModeIV(modeE, modeD);
1500  pass = pass && !fail;
1501  cout << (fail ? "FAILED " : "passed ") << "CFB (8-bit feedback) IV generation" << endl;
1502  }
1503  {
1504  const byte encrypted[] = { // from Eric Young's libdes
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};
1508 
1509  OFB_Mode_ExternalCipher::Encryption modeE(desE, iv);
1510  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1511  plain, sizeof(plain), encrypted, sizeof(encrypted));
1512  pass = pass && !fail;
1513  cout << (fail ? "FAILED " : "passed ") << "OFB encryption" << endl;
1514 
1515  OFB_Mode_ExternalCipher::Decryption modeD(desE, iv);
1516  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1517  encrypted, sizeof(encrypted), plain, sizeof(plain));
1518  pass = pass && !fail;
1519  cout << (fail ? "FAILED " : "passed ") << "OFB decryption" << endl;
1520 
1521  fail = !TestModeIV(modeE, modeD);
1522  pass = pass && !fail;
1523  cout << (fail ? "FAILED " : "passed ") << "OFB IV generation" << endl;
1524  }
1525  {
1526  const byte encrypted[] = { // generated with Crypto++
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};
1530 
1531  CTR_Mode_ExternalCipher::Encryption modeE(desE, iv);
1532  fail = !TestFilter(StreamTransformationFilter(modeE).Ref(),
1533  plain, sizeof(plain), encrypted, sizeof(encrypted));
1534  pass = pass && !fail;
1535  cout << (fail ? "FAILED " : "passed ") << "Counter Mode encryption" << endl;
1536 
1537  CTR_Mode_ExternalCipher::Decryption modeD(desE, iv);
1538  fail = !TestFilter(StreamTransformationFilter(modeD).Ref(),
1539  encrypted, sizeof(encrypted), plain, sizeof(plain));
1540  pass = pass && !fail;
1541  cout << (fail ? "FAILED " : "passed ") << "Counter Mode decryption" << endl;
1542 
1543  fail = !TestModeIV(modeE, modeD);
1544  pass = pass && !fail;
1545  cout << (fail ? "FAILED " : "passed ") << "Counter Mode IV generation" << endl;
1546  }
1547  {
1548  const byte plain_3[] = { // "7654321 Now is the time for "
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[] = { // from FIPS 113
1554  0xf1, 0xd3, 0x0f, 0x68, 0x49, 0x31, 0x2c, 0xa4};
1555  const byte mac2[] = { // generated with Crypto++
1556  0x35, 0x80, 0xC5, 0xC4, 0x6B, 0x81, 0x24, 0xE2};
1557 
1558  CBC_MAC<DES> cbcmac(key);
1559  HashFilter cbcmacFilter(cbcmac);
1560  fail = !TestFilter(cbcmacFilter, plain_3, sizeof(plain_3), mac1, sizeof(mac1));
1561  pass = pass && !fail;
1562  cout << (fail ? "FAILED " : "passed ") << "CBC MAC" << endl;
1563 
1564  DMAC<DES> dmac(key);
1565  HashFilter dmacFilter(dmac);
1566  fail = !TestFilter(dmacFilter, plain_3, sizeof(plain_3), mac2, sizeof(mac2));
1567  pass = pass && !fail;
1568  cout << (fail ? "FAILED " : "passed ") << "DMAC" << endl;
1569  }
1570  {
1571  CTR_Mode<AES>::Encryption modeE(plain, 16, plain);
1572  CTR_Mode<AES>::Decryption modeD(plain, 16, plain);
1573  fail = !TestModeIV(modeE, modeD);
1574  pass = pass && !fail;
1575  cout << (fail ? "FAILED " : "passed ") << "AES CTR Mode" << endl;
1576  }
1577  {
1578  OFB_Mode<AES>::Encryption modeE(plain, 16, plain);
1579  OFB_Mode<AES>::Decryption modeD(plain, 16, plain);
1580  fail = !TestModeIV(modeE, modeD);
1581  pass = pass && !fail;
1582  cout << (fail ? "FAILED " : "passed ") << "AES OFB Mode" << endl;
1583  }
1584  {
1585  CFB_Mode<AES>::Encryption modeE(plain, 16, plain);
1586  CFB_Mode<AES>::Decryption modeD(plain, 16, plain);
1587  fail = !TestModeIV(modeE, modeD);
1588  pass = pass && !fail;
1589  cout << (fail ? "FAILED " : "passed ") << "AES CFB Mode" << endl;
1590  }
1591  {
1592  CBC_Mode<AES>::Encryption modeE(plain, 16, plain);
1593  CBC_Mode<AES>::Decryption modeD(plain, 16, plain);
1594  fail = !TestModeIV(modeE, modeD);
1595  pass = pass && !fail;
1596  cout << (fail ? "FAILED " : "passed ") << "AES CBC Mode" << endl;
1597  }
1598 
1599  return pass;
1600 }
1601 
1603 {
1604  cout << "\nIDEA validation suite running...\n\n";
1605 
1606  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/ideaval.dat", true, new HexDecoder);
1608 }
1609 
1611 {
1612  cout << "\nSAFER validation suite running...\n\n";
1613 
1614  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/saferval.dat", true, new HexDecoder);
1615  bool pass = true;
1620  return pass;
1621 }
1622 
1624 {
1625  cout << "\nRC2 validation suite running...\n\n";
1626 
1627  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/rc2val.dat", true, new HexDecoder);
1628  HexEncoder output(new FileSink(cout));
1629  SecByteBlock plain(RC2Encryption::BLOCKSIZE), cipher(RC2Encryption::BLOCKSIZE), out(RC2Encryption::BLOCKSIZE), outplain(RC2Encryption::BLOCKSIZE);
1630  SecByteBlock key(128);
1631  bool pass=true, fail;
1632 
1633  while (valdata.MaxRetrievable())
1634  {
1635  byte keyLen, effectiveLen;
1636 
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);
1642 
1643  member_ptr<BlockTransformation> transE(new RC2Encryption(key, keyLen, effectiveLen));
1644  transE->ProcessBlock(plain, out);
1645  fail = memcmp(out, cipher, RC2Encryption::BLOCKSIZE) != 0;
1646 
1647  member_ptr<BlockTransformation> transD(new RC2Decryption(key, keyLen, effectiveLen));
1648  transD->ProcessBlock(out, outplain);
1649  fail=fail || memcmp(outplain, plain, RC2Encryption::BLOCKSIZE);
1650 
1651  pass = pass && !fail;
1652 
1653  cout << (fail ? "FAILED " : "passed ");
1654  output.Put(key, keyLen);
1655  cout << " ";
1656  output.Put(outplain, RC2Encryption::BLOCKSIZE);
1657  cout << " ";
1658  output.Put(out, RC2Encryption::BLOCKSIZE);
1659  cout << endl;
1660  }
1661  return pass;
1662 }
1663 
1665 {
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};
1669 
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};
1673 
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};
1677 
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};
1681 
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,
1735  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,
1788  0xc0};
1789 
1791  bool pass=true, fail;
1792  unsigned int i;
1793 
1794  cout << "\nARC4 validation suite running...\n\n";
1795 
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;
1801 
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;
1807 
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])
1811  fail = true;
1812  cout << (fail ? "FAILED" : "passed") << " Test 2" << endl;
1813  pass = pass && !fail;
1814 
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])
1818  fail = true;
1819  cout << (fail ? "FAILED" : "passed") << " Test 3" << endl;
1820  pass = pass && !fail;
1821 
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])
1825  fail = true;
1826  cout << (fail ? "FAILED" : "passed") << " Test 4" << endl;
1827  pass = pass && !fail;
1828 
1829  return pass;
1830 }
1831 
1833 {
1834  cout << "\nRC5 validation suite running...\n\n";
1835  bool pass1 = true, pass2 = true;
1836 
1837  RC5Encryption enc; // 0 to 2040-bits (255-bytes)
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;
1845 
1846  RC5Decryption dec;
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";
1855 
1856  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/rc5val.dat", true, new HexDecoder);
1858 }
1859 
1861 {
1862  cout << "\nRC6 validation suite running...\n\n";
1863  bool pass1 = true, pass2 = true, pass3 = true;
1864 
1865  RC6Encryption enc;
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;
1874 
1875  RC6Decryption dec;
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";
1885 
1886  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/rc6val.dat", true, new HexDecoder);
1890  return pass1 && pass2 && pass3;
1891 }
1892 
1894 {
1895  cout << "\nMARS validation suite running...\n\n";
1896  bool pass1 = true, pass2 = true, pass3 = true;
1897 
1898  MARSEncryption enc;
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;
1907 
1908  MARSDecryption dec;
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";
1918 
1919  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/marsval.dat", true, new HexDecoder);
1923  return pass1 && pass2 && pass3;
1924 }
1925 
1927 {
1928  cout << "\nRijndael (AES) validation suite running...\n\n";
1929  bool pass1 = true, pass2 = true, pass3 = true;
1930 
1931  RijndaelEncryption enc;
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;
1940 
1941  RijndaelDecryption dec;
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";
1951 
1952  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/rijndael.dat", true, new HexDecoder);
1956  pass3 = RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/aes.txt") && pass3;
1957  return pass1 && pass2 && pass3;
1958 }
1959 
1961 {
1962  cout << "\nTwofish validation suite running...\n\n";
1963  bool pass1 = true, pass2 = true, pass3 = true;
1964 
1965  TwofishEncryption enc;
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;
1972 
1973  TwofishDecryption dec;
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";
1981 
1982  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/twofishv.dat", true, new HexDecoder);
1986  return pass1 && pass2 && pass3;
1987 }
1988 
1990 {
1991  cout << "\nSerpent validation suite running...\n\n";
1992  bool pass1 = true, pass2 = true, pass3 = true;
1993 
1994  SerpentEncryption enc;
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;
2001 
2002  SerpentDecryption dec;
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";
2010 
2011  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/serpentv.dat", true, new HexDecoder);
2012  bool pass = true;
2016  return pass1 && pass2 && pass3;
2017 }
2018 
2020 {
2021  cout << "\nBlowfish validation suite running...\n\n";
2022  bool pass1 = true, pass2 = true, pass3 = true, fail;
2023 
2024  BlowfishEncryption enc1; // 32 to 448-bits (4 to 56-bytes)
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;
2037 
2038  BlowfishDecryption dec1; // 32 to 448-bits (4 to 56-bytes)
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";
2052 
2053  HexEncoder output(new FileSink(cout));
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];
2058 
2059  for (int i=0; i<2; i++)
2060  {
2061  ECB_Mode<Blowfish>::Encryption enc2((byte *)key[i], strlen(key[i]));
2062  enc2.ProcessData(out, plain[i], 8);
2063  fail = memcmp(out, cipher[i], 8) != 0;
2064 
2065  ECB_Mode<Blowfish>::Decryption dec2((byte *)key[i], strlen(key[i]));
2066  dec2.ProcessData(outplain, cipher[i], 8);
2067  fail = fail || memcmp(outplain, plain[i], 8);
2068  pass3 = pass3 && !fail;
2069 
2070  cout << (fail ? "FAILED " : "passed ");
2071  cout << '\"' << key[i] << '\"';
2072  for (int j=0; j<(signed int)(30-strlen(key[i])); j++)
2073  cout << ' ';
2074  output.Put(outplain, 8);
2075  cout << " ";
2076  output.Put(out, 8);
2077  cout << endl;
2078  }
2079  return pass1 && pass2 && pass3;
2080 }
2081 
2083 {
2084  cout << "\n3-WAY validation suite running...\n\n";
2085  bool pass1 = true, pass2 = true;
2086 
2087  ThreeWayEncryption enc; // 96-bit only
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;
2092 
2093  ThreeWayDecryption dec; // 96-bit only
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";
2099 
2100  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/3wayval.dat", true, new HexDecoder);
2102 }
2103 
2105 {
2106  cout << "\nGOST validation suite running...\n\n";
2107  bool pass1 = true, pass2 = true;
2108 
2109  GOSTEncryption enc; // 256-bit only
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;
2116 
2117  GOSTDecryption dec; // 256-bit only
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";
2125 
2126  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/gostval.dat", true, new HexDecoder);
2128 }
2129 
2131 {
2132  cout << "\nSHARK validation suite running...\n\n";
2133  bool pass1 = true, pass2 = true;
2134 
2135  SHARKEncryption enc; // 128-bit only
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;
2142 
2143  SHARKDecryption dec; // 128-bit only
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";
2151 
2152  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/sharkval.dat", true, new HexDecoder);
2154 }
2155 
2157 {
2158  cout << "\nCAST-128 validation suite running...\n\n";
2159  bool pass1 = true, pass2 = true, pass3 = true;
2160 
2161  CAST128Encryption enc1; // 40 to 128-bits (5 to 16-bytes)
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;
2168 
2169  CAST128Decryption dec1; // 40 to 128-bits (5 to 16-bytes)
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";
2177 
2178  FileSource val128(CRYPTOPP_DATA_DIR "TestData/cast128v.dat", true, new HexDecoder);
2182 
2183  cout << "\nCAST-256 validation suite running...\n\n";
2184  bool pass4 = true, pass5 = true, pass6 = true;
2185 
2186  CAST256Encryption enc2; // 128, 160, 192, 224, or 256-bits (16 to 32-bytes, step 4)
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;
2197 
2198  CAST256Decryption dec2; // 128, 160, 192, 224, or 256-bits (16 to 32-bytes, step 4)
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";
2210 
2211  FileSource val256(CRYPTOPP_DATA_DIR "TestData/cast256v.dat", true, new HexDecoder);
2215 
2216  return pass1 && pass2 && pass3 && pass4 && pass5 && pass6;
2217 }
2218 
2220 {
2221  cout << "\nSquare validation suite running...\n\n";
2222  bool pass1 = true, pass2 = true;
2223 
2224  SquareEncryption enc; // 128-bits only
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;
2229 
2230  SquareDecryption dec; // 128-bits only
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";
2236 
2237  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/squareva.dat", true, new HexDecoder);
2239 }
2240 
2242 {
2243  cout << "\nSKIPJACK validation suite running...\n\n";
2244  bool pass1 = true, pass2 = true;
2245 
2246  SKIPJACKEncryption enc; // 80-bits only
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;
2251 
2252  SKIPJACKDecryption dec; // 80-bits only
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";
2258 
2259  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/skipjack.dat", true, new HexDecoder);
2261 }
2262 
2264 {
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};
2268  byte output[32];
2269 
2270  cout << "\nSEAL validation suite running...\n\n";
2271 
2272  SEAL<>::Encryption seal(key, sizeof(key), iv);
2273  unsigned int size = sizeof(input);
2274  bool pass = true;
2275 
2276  memset(output, 1, size);
2277  seal.ProcessString(output, input, size);
2278  for (unsigned int i=0; i<size; i++)
2279  if (output[i] != 0)
2280  pass = false;
2281 
2282  seal.Seek(1);
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;
2286 
2287  cout << (pass ? "passed" : "FAILED") << endl;
2288  return pass;
2289 }
2290 
2292 {
2293  bool pass = true, fail;
2294  byte data[255];
2295  for (unsigned int i=0; i<255; i++)
2296  data[i] = byte(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"
2311 "9M7939R8";
2312  const char *base64AndHexEncoded =
2313 "41414543417751464267634943516F4C4441304F4478415245684D554652595847426B6147787764"
2314 "486838674953496A4A43556D4A7967704B6973734C5334764D4445794D7A51310A4E6A63344F546F"
2315 "375044302B50304242516B4E4552555A4853456C4B5330784E546B395155564A5456465657563168"
2316 "5A576C746358563566594746695932526C5A6D646F615770720A6247317562334278636E4E306458"
2317 "5A3365486C3665337839666E2B4167594B44684957476834694A696F754D6A5936506B4A47536B35"
2318 "53566C7065596D5A71626E4A32656E3643680A6F714F6B7061616E714B6D717136797472712B7773"
2319 "624B7A744C573274376935757275387662362F774D484377385446787366497963724C7A4D334F7A"
2320 "39445230745055316462580A324E6E6132397A6433742F6734654C6A354F586D352B6A7036757673"
2321 "3765377638504879382F5431397666342B6672372F50332B0A";
2322 
2323  cout << "\nBase64, base32 and hex coding validation suite running...\n\n";
2324 
2325  fail = !TestFilter(HexEncoder().Ref(), data, 255, (const byte *)hexEncoded, strlen(hexEncoded));
2326  cout << (fail ? "FAILED " : "passed ");
2327  cout << "Hex Encoding\n";
2328  pass = pass && !fail;
2329 
2330  fail = !TestFilter(HexDecoder().Ref(), (const byte *)hexEncoded, strlen(hexEncoded), data, 255);
2331  cout << (fail ? "FAILED " : "passed ");
2332  cout << "Hex Decoding\n";
2333  pass = pass && !fail;
2334 
2335  fail = !TestFilter(Base32Encoder().Ref(), data, 255, (const byte *)base32Encoded, strlen(base32Encoded));
2336  cout << (fail ? "FAILED " : "passed ");
2337  cout << "Base32 Encoding\n";
2338  pass = pass && !fail;
2339 
2340  fail = !TestFilter(Base32Decoder().Ref(), (const byte *)base32Encoded, strlen(base32Encoded), data, 255);
2341  cout << (fail ? "FAILED " : "passed ");
2342  cout << "Base32 Decoding\n";
2343  pass = pass && !fail;
2344 
2345  fail = !TestFilter(Base64Encoder(new HexEncoder).Ref(), data, 255, (const byte *)base64AndHexEncoded, strlen(base64AndHexEncoded));
2346  cout << (fail ? "FAILED " : "passed ");
2347  cout << "Base64 Encoding\n";
2348  pass = pass && !fail;
2349 
2350  fail = !TestFilter(HexDecoder(new Base64Decoder).Ref(), (const byte *)base64AndHexEncoded, strlen(base64AndHexEncoded), data, 255);
2351  cout << (fail ? "FAILED " : "passed ");
2352  cout << "Base64 Decoding\n";
2353  pass = pass && !fail;
2354 
2355  return pass;
2356 }
2357 
2359 {
2360  cout << "\nSHACAL-2 validation suite running...\n\n";
2361  bool pass1 = true, pass2 = true, pass3 = true;
2362 
2363  SHACAL2Encryption enc; // 128 to 512-bits (16 to 64-bytes)
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;
2372 
2373  SHACAL2Decryption dec; // 128 to 512-bits (16 to 64-bytes)
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";
2383 
2384  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/shacal2v.dat", true, new HexDecoder);
2387  return pass1 && pass2 && pass3;
2388 }
2389 
2391 {
2392  cout << "\nCamellia validation suite running...\n\n";
2393  bool pass1 = true, pass2 = true, pass3 = true;
2394 
2395  CamelliaEncryption enc;
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;
2404 
2405  CamelliaDecryption dec;
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";
2415 
2416  FileSource valdata(CRYPTOPP_DATA_DIR "TestData/camellia.dat", true, new HexDecoder);
2420  return pass1 && pass2 && pass3;
2421 }
2422 
2424 {
2425  cout << "\nSalsa validation suite running...\n";
2426 
2427  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/salsa.txt");
2428 }
2429 
2431 {
2432  cout << "\nSosemanuk validation suite running...\n";
2433  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/sosemanuk.txt");
2434 }
2435 
2437 {
2438  cout << "\nVMAC validation suite running...\n";
2439  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/vmac.txt");
2440 }
2441 
2443 {
2444  cout << "\nAES/CCM validation suite running...\n";
2445  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/ccm.txt");
2446 }
2447 
2449 {
2450  cout << "\nAES/GCM validation suite running...\n";
2451  cout << "\n2K tables:";
2452  bool pass = RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/gcm.txt", MakeParameters(Name::TableSize(), (int)2048));
2453  cout << "\n64K tables:";
2454  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/gcm.txt", MakeParameters(Name::TableSize(), (int)64*1024)) && pass;
2455 }
2456 
2458 {
2459  cout << "\nCMAC validation suite running...\n";
2460  return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/cmac.txt");
2461 }
Base class for all exceptions thrown by the library.
Definition: cryptlib.h:140
Base32 encodes data.
Definition: base32.h:17
bool ValidateRW()
Definition: validat2.cpp:775
bool ValidateTwofish()
Definition: validat1.cpp:1960
bool ValidateRijndael()
Definition: validat1.cpp:1926
unsigned int BlockSize() const
Definition: validat1.cpp:1151
bool ValidateRC6()
Definition: validat1.cpp:1860
bool ValidateIDEA()
Definition: validat1.cpp:1602
bool ValidateTTMAC()
Definition: validat3.cpp:514
bool ValidatePoly1305()
Definition: validat3.cpp:782
bool ValidateRC5()
Definition: validat1.cpp:1832
uint8_t byte
Definition: Common.h:57
BlockTransformation * NewEncryption(const byte *keyStr) const
Definition: validat1.cpp:1138
void PutByte(byte inByte)
Definition: validat1.cpp:1201
bool ValidateCipherModes()
Definition: validat1.cpp:1299
word16 hword
Definition: config.h:307
Utility functions for the Crypto++ library.
Classes for NIST DRBGs from SP 800-90A.
SHA-256 message digest.
Definition: sha.h:39
unsigned int BytesNeeded() const
Provides the number of bytes of input is needed by the test.
Definition: rng.h:96
bool ValidateSHACAL2()
Definition: validat1.cpp:2358
size_t outputLen
Definition: validat1.cpp:1233
unsigned short word16
Definition: config.h:230
Class file for modes of operation.
RC2::Decryption RC2Decryption
Definition: rc2.h:90
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
Definition: cryptlib.cpp:326
BlockTransformation * NewDecryption(const byte *keyStr) const
Definition: validat1.cpp:1156
bool ValidateDSA(bool thorough)
Definition: validat2.cpp:701
DMAC message authentication code.
Definition: dmac.h:48
Hardware generated random numbers using RDRAND instruction.
Definition: rdrand.h:39
virtual void IncorporateEntropy(const byte *input, size_t length)
Update RNG state with additional unpredictable values.
Definition: rdrand.h:186
Implementation of Store interface.
Definition: files.h:80
Converts given data to base 16.
Definition: hex.h:16
word64 dword
Definition: config.h:309
bool TestModeIV(SymmetricCipher &e, SymmetricCipher &d)
Definition: validat1.cpp:1270
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.
Definition: cryptlib.cpp:298
bool ValidateWhirlpool()
Definition: validat3.cpp:370
Base64 decodes data.
Definition: base64.h:59
virtual unsigned int BlockSize() const =0
BlockTransformation * NewEncryption(const byte *keyStr) const
Definition: validat1.cpp:1154
bool BlockTransformationTest(const CipherFactory &cg, BufferedTransformation &valdata, unsigned int tuples=0xffff)
Definition: validat1.cpp:1162
Decode base 16 data back to bytes.
Definition: hex.h:36
Abstract base classes that provide a uniform interface to this library.
BlockTransformation * NewDecryption(const byte *keyStr) const
Definition: validat1.cpp:1140
Classes for the RC2 block cipher.
bool ValidateHKDF()
Definition: validat3.cpp:688
void AddDefaultRoute(BufferedTransformation &destination)
Definition: channels.cpp:262
Manages resources for an array of objects.
Definition: smartptr.h:229
size_type size() const
Provides the count of elements in the SecBlock.
Definition: secblock.h:524
bool ValidateCRC32()
Definition: validat3.cpp:95
RandomNumberGenerator & GlobalRNG()
Definition: test.cpp:123
bool ValidateSosemanuk()
Definition: validat1.cpp:2430
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking)
Input multiple bytes for processing.
Definition: validat1.cpp:1211
bool ValidateThreeWay()
Definition: validat1.cpp:2082
Classes for automatic resource management.
DEFLATE compressor (RFC 1951)
Definition: zdeflate.h:78
virtual bool CanIncorporateEntropy() const
Determines if a generator can accept additional entropy.
Definition: cryptlib.h:1209
bool ValidateECGDSA()
Definition: validat2.cpp:1062
Classes for the GIST block cipher.
bool ValidateSAFER()
Definition: validat1.cpp:1610
std::hash for asio::adress
Definition: Common.h:323
Classes for the Cameliia block cipher.
Classes for RDRAND and RDSEED.
int GetCacheLineSize()
Definition: cpu.h:424
#define CRYPTOPP_NATIVE_DWORD_AVAILABLE
Definition: config.h:288
virtual void IncorporateEntropy(const byte *input, size_t length)
Update RNG state with additional unpredictable values.
Definition: rdrand.h:102
Classes for Base32Encoder and Base32Decoder.
bool ValidateBLAKE2s()
Definition: validat3.cpp:1080
Interface for buffered transformations.
Definition: cryptlib.h:1352
Classes for CBC MAC.
Classes for the RC6 block cipher.
bool ValidateElGamal()
Definition: validat2.cpp:638
DEFLATE compression and decompression (RFC 1951)
void SetRetries(unsigned int retries)
Set the number of retries used by the generator.
Definition: rdrand.h:151
Route input to different and/or multiple channels based on channel ID.
Definition: channels.h:92
Classes for multiple named channels.
BufferedTransformation & TheBitBucket()
An input discarding BufferedTransformation.
Definition: cryptlib.cpp:79
bool TestFilter(BufferedTransformation &bt, const byte *in, size_t inLen, const byte *out, size_t outLen)
Definition: validat1.cpp:1237
bool ValidateCCM()
Definition: validat1.cpp:2442
bool ValidateRC2()
Definition: validat1.cpp:1623
bool ValidateMQV()
Definition: validat2.cpp:377
bool ValidatePanama()
Definition: validat3.cpp:365
Pointer that overloads operator ->
Definition: smartptr.h:39
Classes for the Twofish block cipher.
1 and 0&#39;s padding added to a block
Definition: filters.h:482
Base64 encodes data.
Definition: base64.h:17
const byte * validOutput
Definition: validat1.cpp:1232
bool MessageEnd(int propagation=-1, bool blocking=true)
Signals the end of messages to the object.
Definition: cryptlib.h:1434
Classes for the Blowfish block cipher.
bool TestOS_RNG()
Definition: validat1.cpp:345
bool ValidateESIGN()
Definition: validat2.cpp:1404
Classes for the MARS block cipher (IBM AES submission)
bool ValidateBLAKE2b()
Definition: validat3.cpp:1475
bool ValidateARC4()
Definition: validat1.cpp:1664
FixedRoundsCipherFactory(unsigned int keylen=0)
Definition: validat1.cpp:1134
virtual unsigned int KeyLength() const =0
bool ValidateVMAC()
Definition: validat1.cpp:2436
Classes for the SKIPJACK block cipher.
virtual void Attach(BufferedTransformation *newAttachment)
Add newAttachment to the end of attachment chain.
Definition: cryptlib.cpp:772
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
Definition: rdrand.h:176
Filter wrapper for HashTransformation.
Definition: filters.h:521
size_t Put(byte inByte, bool blocking=true)
Input a byte for processing.
Definition: cryptlib.h:1376
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
Definition: algparam.h:498
bool ValidateDH()
Definition: validat2.cpp:368
Block cipher mode of operation aggregate.
Definition: modes.h:285
void ProcessBlock(const byte *inBlock, byte *outBlock) const
Encrypt or decrypt a block.
Definition: cryptlib.h:758
bool TestAutoSeeded()
Definition: validat1.cpp:458
virtual void Resynchronize(const byte *iv, int ivLength=-1)
Resynchronize with an IV.
Definition: cryptlib.h:662
Classes for HexEncoder and HexDecoder.
Maurer&#39;s Universal Statistical Test for Random Bit Generators.
Definition: rng.h:84
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
Definition: rdrand.h:92
bool TestAutoSeededX917()
Definition: validat1.cpp:462
BufferedTransformation * AttachedTransformation()
Retrieve attached transformation.
Definition: filters.cpp:36
SHA-512 message digest.
Definition: sha.h:69
bool ValidatePBKDF()
Definition: validat3.cpp:602
Class file for the AES cipher (Rijndael)
bool GetResult()
Definition: validat1.cpp:1227
bool ValidateAll(bool thorough)
Definition: validat1.cpp:70
#define W64LIT(x)
Definition: config.h:241
Classes for the CAST-128 and CAST-256 block ciphers.
Interface for one direction (encryption or decryption) of a stream cipher or cipher mode...
Definition: cryptlib.h:1103
Provides class member functions to key a block cipher.
Definition: seckey.h:324
bool ValidateEC2N()
Definition: validat2.cpp:962
bool ValidateFHMQV()
Definition: validat2.cpp:503
SHA-1 message digest.
Definition: sha.h:25
bool ValidateSEAL()
Definition: validat1.cpp:2263
unsigned int GetRetries() const
Retrieve the number of retries used by the generator.
Definition: rdrand.h:144
Classes for DMAC message authentication code.
bool ValidateCAST()
Definition: validat1.cpp:2156
#define t1
lword Pump(lword pumpMax=(size_t) SIZE_MAX)
Pump data to attached transformation.
Definition: filters.h:1258
unsigned long long word64
Definition: config.h:240
bool ValidateGCM()
Definition: validat1.cpp:2448
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.
Definition: misc.h:818
bool ValidateCMAC()
Definition: validat1.cpp:2457
bool ValidateSipHash()
Definition: validat3.cpp:900
bool ValidateSquare()
Definition: validat1.cpp:2219
virtual BlockTransformation * NewDecryption(const byte *keyStr) const =0
bool ValidateSerpent()
Definition: validat1.cpp:1989
Miscellaneous classes for RNGs.
bool TestNIST_DRBG()
Definition: validat1.cpp:753
lword GetTotalBytes() const
Definition: filters.h:257
const T * get() const
Definition: smartptr.h:52
bool ValidateBaseCode()
Definition: validat1.cpp:2291
bool ValidateRSA()
Definition: validat2.cpp:281
#define CRYPTOPP_ASSERT(exp)
Definition: trap.h:92
Classes for SEAL stream cipher.
Redirect input to another BufferedTransformation without owning it.
Definition: filters.h:808
Classes for Rijndael encryption algorithm.
bool ValidateHMAC()
Definition: validat3.cpp:440
Functions for CPU features and intrinsics.
Classes for DES, 2-key Triple-DES, 3-key Triple-DES and DESX.
bool ValidateBlowfish()
Definition: validat1.cpp:2019
bool ValidateLUC_DL()
Definition: validat2.cpp:737
std::string AlgorithmName() const
Provides the name of this algorithm.
Definition: rdrand.h:42
bool ValidateSHARK()
Definition: validat1.cpp:2130
bool ValidateCamellia()
Definition: validat1.cpp:2390
Implementation of BufferedTransformation&#39;s attachment interface.
bool ValidateSKIPJACK()
Definition: validat1.cpp:2241
#define f(x)
Definition: gost.cpp:57
bool TestSettings()
Definition: validat1.cpp:184
Hardware generated random numbers using RDSEED instruction.
Definition: rdrand.h:126
#define USING_NAMESPACE(x)
Definition: config.h:206
Classes for the Base64Encoder, Base64Decoder, Base64URLEncoder and Base64URLDecoder.
Filter wrapper for StreamTransformation.
Definition: filters.h:491
bool ValidateECP()
Definition: validat2.cpp:913
bool ValidateMD5()
Definition: validat3.cpp:192
Hash_DRBG from SP 800-90A Rev 1 (June 2015)
Definition: drbg.h:156
#define pass(a, b, c, mul, X)
Classes for the SAFER and SAFER-K block ciphers.
Base class for unflushable filters.
Definition: simple.h:94
bool ValidateAdler32()
Definition: validat3.cpp:135
bool ValidateDLIES()
Definition: validat2.cpp:656
uint8_t const size_t const size
Definition: sha3.h:20
#define CRYPTOPP_UNUSED(x)
Definition: config.h:741
FilterTester(const byte *validOutput, size_t outputLen)
Definition: validat1.cpp:1199
0&#39;s padding added to a block
Definition: filters.h:478
uint8_t byte
Definition: Common.h:10
bool ValidateLUC()
Definition: validat2.cpp:718
bool ValidateGOST()
Definition: validat1.cpp:2104
Measure how many bytes and messages pass through the filter.
Definition: filters.h:220
bool ValidateHMQV()
Definition: validat2.cpp:386
bool ValidateTiger()
Definition: validat3.cpp:223
bool ValidateNR()
Definition: validat2.cpp:679
virtual lword MaxRetrievable() const
Provides the number of bytes ready for retrieval.
Definition: cryptlib.cpp:496
const T & STDMAX(const T &a, const T &b)
Replacement function for std::max.
Definition: misc.h:487
Classes providing file-based library services.
Base32 decodes data.
Definition: base32.h:61
Classes for the 3-Way block cipher.
RC2::Encryption RC2Encryption
Definition: rc2.h:89
#define e(i)
Definition: sha.cpp:733
bool ValidateSHA()
Definition: validat3.cpp:211
bool ValidateBBS()
Definition: validat2.cpp:74
void SetRetries(unsigned int retries)
Set the number of retries used by the generator.
Definition: rdrand.h:67
No padding added to a block.
Definition: filters.h:476
Classes and functions for Elliptic Curves over prime and binary fields.
bool ValidateSalsa()
Definition: validat1.cpp:2423
bool ValidateRIPEMD()
Definition: validat3.cpp:245
virtual size_t Get(byte &outByte)
Retrieve a 8-bit byte.
Definition: cryptlib.cpp:515
Classes for the Serpent block cipher.
bool RunTestDataFile(const char *filename, const NameValuePairs &overrideParameters, bool thorough)
Definition: datatest.cpp:841
bool ValidateLUC_DH()
Definition: validat2.cpp:620
Interface for the data processing part of block ciphers.
Definition: cryptlib.h:734
SymmetricCipher implementation.
Definition: strciphr.h:584
bool ValidateECDSA()
Definition: validat2.cpp:1011
#define d(i)
Definition: sha.cpp:732
double GetTestValue() const
Definition: rng.cpp:152
RNG-based implementation of Source interface.
Definition: filters.h:1382
unsigned int GetRetries() const
Retrieve the number of retries used by the generator.
Definition: rdrand.h:60
std::string AlgorithmName() const
Provides the name of this algorithm.
Definition: rdrand.h:129
VariableRoundsCipherFactory(unsigned int keylen=0, unsigned int rounds=0)
Definition: validat1.cpp:1149
unsigned int KeyLength() const
Definition: validat1.cpp:1136
size_type SizeInBytes() const
Provides the number of bytes in the SecBlock.
Definition: secblock.h:538
unsigned int word32
Definition: config.h:231
Classes for the SHARK block cipher.
virtual BlockTransformation * NewEncryption(const byte *keyStr) const =0
Implementation of Store interface.
Definition: files.h:125
CBC-MAC
Definition: cbcmac.h:40
bool ValidateCRC32C()
Definition: validat3.cpp:115
bool ValidateDES()
Definition: validat1.cpp:1253
bool ValidateXTR_DH()
Definition: validat2.cpp:629
unsigned int KeyLength() const
Definition: validat1.cpp:1152
Classes for the Square block cipher.
virtual void GetNextIV(RandomNumberGenerator &rng, byte *iv)
Retrieves a secure IV for the next message.
Definition: cryptlib.cpp:173
#define CRYPTOPP_DATA_DIR
Definition: config.h:72
void reset(T *p=0)
Definition: smartptr.h:72
uint8_t const * data
Definition: sha3.h:19
bool Flush(bool hardFlush, int propagation=-1, bool blocking=true)
Flush buffered input and/or output, with signal propagation.
Definition: filters.cpp:78
Classes for ARC4 cipher.
virtual unsigned int IVSize() const
Returns length of the IV accepted by this object.
Definition: cryptlib.h:640
virtual unsigned int MinLastBlockSize() const
Provides the size of the last block.
Definition: cryptlib.h:871
word32 word
Definition: config.h:308
bool ValidateMD2()
Definition: validat3.cpp:154
bool ValidateMARS()
Definition: validat1.cpp:1893
unsigned int BlockSize() const
Definition: validat1.cpp:1135
Classes for access to the operating system&#39;s random number generators.
bool ValidateRabin()
Definition: validat2.cpp:756
Classes for the IDEA block cipher.
#define SIZE_MAX
Definition: misc.h:113
Classes for the SHACAL-2 block cipher.