Merge pull request #18 from wruppelx/master
[asdcplib.git] / src / fips-186-rng-test.cpp
index 887345a4c0196a05084f96ab96aeab47077708a3..08a166597afad49bf32f4d54cb6ab29629b59520 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2007, John Hurst
+Copyright (c) 2007-2009, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -39,47 +39,52 @@ using namespace Kumu;
 int
 main(int argc, const char** argv)
 {
-  if ( argc != 3 )
+  if ( argc != 5 )
     {
-      fprintf(stderr, "USAGE: fips-186-test <XKey-hex> <X-hex>\n");
+      fprintf(stderr, "USAGE: fips-186-test <rounds> <b> <XKey-hex> <X-hex>\n");
       return 2;
     }
 
-  byte_t XKey_buf[SHA_DIGEST_LENGTH];
-  byte_t X_test_buf[SHA_DIGEST_LENGTH*2];
-  byte_t X_buf[SHA_DIGEST_LENGTH*2];
+  ui32_t const X_buf_len = 1024;
+  byte_t XKey_buf[X_buf_len];
+  byte_t X_test_buf[X_buf_len];
   ui32_t char_count;
 
-  if ( hex2bin(argv[1], XKey_buf, SHA_DIGEST_LENGTH, &char_count) != 0 )
+  char* end = 0;
+  ui32_t rounds = strtol(argv[1], &end, 10);
+  ui32_t B = strtol(argv[2], &end, 10) / 8;
+
+  if ( hex2bin(argv[3], XKey_buf, X_buf_len, &char_count) != 0 )
     {
       fprintf(stderr, "Error parsing <XKey-hex> value\n");
       return 3;
     }
 
-  if ( char_count != SHA_DIGEST_LENGTH )
+  if ( char_count != B )
     {
-      fprintf(stderr, "Incorrect length for <XKey-hex> value (expecting 40 hexadecimal characters)\n");
+      fprintf(stderr, "Incorrect length for <XKey-hex> value (expecting %d decoded bytes)\n", B);
       return 3;
     }
 
-  if ( hex2bin(argv[2], X_test_buf, SHA_DIGEST_LENGTH*2, &char_count) != 0 )
+  if ( hex2bin(argv[4], X_test_buf, X_buf_len, &char_count) != 0 )
     {
-      fprintf(stderr, "Error parsing <XKey-hex> value\n");
+      fprintf(stderr, "Error parsing <X-hex> value\n");
       return 3;
     }
 
-  if ( char_count != (SHA_DIGEST_LENGTH * 2) )
-    {
-      fprintf(stderr, "Incorrect length for <X-hex> value (expecting 80 hexadecimal characters)\n");
-      return 3;
-    }
+  ui32_t const meg = 1024*1024;
+  ui32_t out_size = char_count;
+  byte_t X_buf[meg];
+  ui32_t fill_size = rounds * 20;
+  assert(fill_size < meg);
+  Gen_FIPS_186_Value(XKey_buf, B, X_buf, fill_size);
 
-  Gen_FIPS_186_Value(XKey_buf, SHA_DIGEST_LENGTH, X_buf, SHA_DIGEST_LENGTH*2);
+  byte_t* test_key = &X_buf[fill_size - out_size];
 
-  if ( memcmp(X_buf, X_test_buf, SHA_DIGEST_LENGTH*2) != 0 )
+  if ( memcmp(test_key, X_test_buf, char_count) != 0 )
     {
       fprintf(stderr, "Test vector value does not match:\n");
-      hexdump(X_buf, SHA_DIGEST_LENGTH*2);
+      hexdump(test_key, char_count);
       return 4;
     }