ytest.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* -*- Mode: C; c-file-style: "bsd" -*- */
  2. /*
  3.  * Yarrow - Cryptographic Pseudo-Random Number Generator
  4.  * Copyright (c) 2000 Zero-Knowledge Systems, Inc.
  5.  *
  6.  * See the accompanying LICENSE file for license information.
  7.  */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include "yarrow.h"
  13. #include "yexcep.h"
  14. #include "ystate.h"
  15. void hex_print( FILE* f, const char* var, void* data, size_t size );
  16. void dump_yarrow_state( FILE* f, Yarrow_CTX* y );
  17. #define YARROW_SEED_FILE "seed"
  18. static void print_yarrow_status( Yarrow_CTX *y )
  19. {
  20.     int sid, pool;
  21.     Source* source;
  22.     for ( pool = 0; pool < 2; pool++ )
  23.     {
  24. printf( " %s: ", pool == YARROW_SLOW_POOL ? "slow" : "fast" );
  25. for ( sid = 0; sid < y->num_sources; sid++ )
  26. {
  27.     source = &y->source[ sid ];
  28.     printf( "#%d=%d/%d, ", sid, source->entropy[pool], 
  29.     pool == YARROW_SLOW_POOL ? 
  30.     y->slow_thresh : y->fast_thresh );
  31. }
  32.     }
  33.     printf( "n" );
  34. }
  35. int yarrow_verbose = 0;
  36. #define VERBOSE( x ) if ( yarrow_verbose ) { x }
  37. int Instrumented_Yarrow_Input( Yarrow_CTX* y, int sid, void* sample,
  38.        size_t size, int entropy )
  39. {
  40.     int ret;
  41.     VERBOSE( printf( "Yarrow_Input( #%d, %d bits, %s ) = [", sid, entropy, 
  42.      y->source[sid].pool == 
  43.      YARROW_SLOW_POOL ? "slow" : "fast" ); );
  44.     ret = Yarrow_Input( y, sid, sample, size, entropy );
  45.     VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  46.     VERBOSE( print_yarrow_status( y ); );
  47.     return (ret);
  48. }
  49. typedef int (*test_fn)( void );
  50. int test_1( void );
  51. int test_2( void );
  52. int test_3( void );
  53. int test_4( void );
  54. int test_5( void );
  55. test_fn test_func[] =
  56. {
  57.     test_1, test_2, test_3, test_4, test_5
  58. };
  59. #define num_tests ( sizeof(test_func) / sizeof(test_fn) )
  60. int do_test( int t )
  61. {
  62.     EXCEP_DECL;
  63.     int ret;
  64.     printf( "doing test %d ... ", t ); fflush( stdout );
  65.     ret = test_func[ t-1 ]();
  66.     VERBOSE( printf( "ndone test %d ", t ); );
  67.     printf( "[%s]n", Yarrow_Str_Error( ret ) ); fflush( stdout );
  68.     THROW( ret );
  69.  CATCH:
  70.     THROW( EXCEP_BOOL );
  71.     EXCEP_RET;
  72. }
  73. int main( int argc, char* argv[] )
  74. {
  75.     EXCEP_DECL;
  76.     int test = 0;
  77.     char** argvp;
  78.     char* arg;
  79.     char* conv_ok = NULL;
  80.     int ok = YARROW_OK;
  81.     int done_some_tests = 0;
  82.     int i;
  83.     int ret;
  84. #if defined(__MWERKS__) && defined(macintosh)
  85.     argc = ccommand(&argv);
  86. #endif
  87.     
  88.     for ( argvp = argv+1, i = 1; i < argc; i++, argvp++ )
  89.     {
  90. arg = *argvp;
  91. if ( arg[0] == '-' ) 
  92. {
  93.     switch ( arg[1] )
  94.     {
  95.     case 'v': yarrow_verbose = 1; continue; 
  96.     default: fprintf( stderr, "usage: test [-v] [[test] ... ]n" );
  97. THROW( YARROW_FAIL );
  98.     }
  99. }
  100. conv_ok = NULL;
  101. test = strtoul( arg, &conv_ok, 10 );
  102. if ( !conv_ok || test < 1 || test > num_tests )
  103. {
  104.     fprintf( stderr, "usage: test [-v] [[test] ... ]n" );
  105.     THROW( YARROW_FAIL );
  106. }
  107. else
  108. {
  109.     ret = do_test( test );
  110.     if ( ok ) { ok = ret; }
  111.     done_some_tests = 1;
  112. }
  113.     }
  114.     if ( !done_some_tests )
  115.     {
  116. for ( i = 1; i <= num_tests; i++ )
  117. {
  118.     ret = do_test( i );
  119.     if ( ok ) { ok = ret; }
  120. }
  121.     }
  122.     THROW( ok );
  123.  CATCH:
  124.     switch (EXCEPTION)
  125.     {
  126.     case YARROW_OK:
  127. exit( EXIT_SUCCESS );
  128.     default:
  129. exit( EXIT_FAILURE );
  130.     }
  131. }
  132. int printhex( FILE* f, byte* bin, int size )
  133. {
  134.     int i;
  135.     for ( i = 0; i < size; i++ )
  136.     {
  137. if ( fprintf( f, "%02x", bin[i] ) != 2 ) { return YARROW_FAIL; }
  138.     }
  139.     return YARROW_OK;
  140. }
  141. int hex2bin( byte* bin, const char* hex, int size )
  142. {
  143.     int i, d;
  144.     char pair[3];
  145.     if ( strlen( hex ) != size * 2 ) { return YARROW_FAIL; }
  146.     pair[2]='';
  147.     for ( i = 0; i < size; i++ )
  148.     {
  149. pair[0] = hex[i*2];
  150. pair[1] = hex[i*2+1];
  151. if ( sscanf( pair, "%x", &d ) < 1 ) { return YARROW_FAIL; }
  152. bin[i] = (byte)d;
  153.     }
  154.     return YARROW_OK;
  155. }
  156. typedef struct 
  157. {
  158.     char* string;
  159.     int reps;
  160.     char* result;
  161. } Hash_Test;
  162. int test_1( void )
  163. {
  164.     EXCEP_DECL;
  165.     byte digest[ HASH_DIGEST_SIZE ];
  166.     byte expected_digest[ HASH_DIGEST_SIZE ];
  167.     HASH_CTX hash;
  168.     int i, j;
  169. #if defined(YARROW_HASH_SHA1)
  170.     /* test vectors from FIPS-180-1 */
  171.     Hash_Test hash_test[] = 
  172.     {
  173. { "abc", 1, 
  174.   "A9993E364706816ABA3E25717850C26C9CD0D89D" } ,
  175. { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1,
  176.   "84983E441C3BD26EBAAE4AA1F95129E5E54670F1" },
  177. { "aaaaaaaaaa", 100000, 
  178.   "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F" }
  179.     };
  180.     VERBOSE( printf( "nsha1 testnn" ); );
  181. #elif defined(YARROW_HASH_MD5)
  182.     /* test vectors from RFC1321 */
  183.     Hash_Test hash_test[] = 
  184.     {
  185. { "", 1, "d41d8cd98f00b204e9800998ecf8427e" },
  186. { "a", 1, "0cc175b9c0f1b6a831c399e269772661" },
  187. { "abc", 1, "900150983cd24fb0d6963f7d28e17f72" },
  188. { "message digest", 1, "f96b697d7cb7938d525a2f31aaf161d0" },
  189. { "abcdefghijklmnopqrstuvwxyz", 1, 
  190.   "c3fcd3d76192e4007dfb496cca67e13b" },
  191. { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 1,
  192.   "d174ab98d277d9f5a5611c2c9f419d9f" },
  193. { "123456789012345678901234567890123456789012345678901234567890123456"
  194.   "78901234567890", 1, 
  195.   "57edf4a22be3c955ac49da2e2107b67a" }
  196.     };
  197.     VERBOSE( printf( "nmd5 testnn" ); );
  198. #else
  199.     VERBOSE( printf( "nunknown hash functionnn" ); );
  200.     THROW( YARROW_NOT_IMPL );
  201. #endif
  202. #define hash_test_num_tests ( sizeof( hash_test ) / sizeof( Hash_Test ) )
  203.     for ( i = 0; i < hash_test_num_tests; i++ )
  204.     {
  205. TRY( hex2bin( expected_digest, hash_test[ i ].result, 
  206.       HASH_DIGEST_SIZE ) );
  207. VERBOSE( printf( "test %cn", 'a'+i );
  208.  printf( "HASH( "%s" ", hash_test[ i ].string );
  209.  if ( hash_test[ i ].reps > 1 ) 
  210.          { 
  211.      printf( "x%d ", hash_test[ i ].reps );
  212.  }
  213.  printf( ")n" ); 
  214.  printf( "expected = " );
  215.  printhex( stdout, expected_digest, HASH_DIGEST_SIZE );
  216.  printf( "n" ); );
  217. HASH_Init( &hash );
  218. for ( j = 0; j < hash_test[ i ].reps; j++ )
  219. {
  220.     HASH_Update( &hash, hash_test[ i ].string, 
  221.  strlen( hash_test[ i ].string ) );
  222. }
  223. HASH_Final( &hash, digest );
  224. VERBOSE( printf( "result   = " );
  225.  printhex( stdout, digest, HASH_DIGEST_SIZE );
  226.  printf( "n" ); );
  227. if ( memcmp( digest, expected_digest, HASH_DIGEST_SIZE ) != 0 )
  228. {
  229.     THROW( YARROW_FAIL );
  230. }
  231.     }
  232.  CATCH:
  233.     EXCEP_RET;
  234. }
  235. int test_2( void )
  236. {
  237.     EXCEP_DECL;
  238. #if defined(YARROW_CIPHER_3DES)
  239.     VERBOSE( printf( "n3des testnn" ); );
  240.     THROW( YARROW_NOT_IMPL );
  241. #elif defined(YARROW_CIPHER_BLOWFISH)
  242.     VERBOSE( printf( "nblowfish testnn" ); );
  243.     THROW( YARROW_NOT_IMPL );
  244. #elif defined(YARROW_CIPHER_IDEA)
  245.     VERBOSE( printf( "nidea testnn" ); );
  246.     THROW( YARROW_NOT_IMPL );
  247. #else
  248.     VERBOSE( printf( "nunknown encryption functionnn" ); );
  249.     THROW( YARROW_NOT_IMPL );
  250. #endif
  251.  CATCH:
  252.     EXCEP_RET;
  253. }
  254. int test_3( void )
  255. {
  256.     EXCEP_DECL;
  257. #if !defined(YARROW_CIPHER_3DES) || !defined(YARROW_HASH_SHA1)
  258.     VERBOSE( printf( "nnot Yarrow-SHA1-3DES (aka Yarrow-160)nn" ); );
  259.     THROW( YARROW_NOT_IMPL );
  260. #endif
  261.     VERBOSE( printf( "nYarrow_Stretchnn" ); );
  262.     THROW( YARROW_NOT_IMPL );
  263.     
  264.  CATCH:
  265.     EXCEP_RET;
  266. }
  267. int test_4( void )
  268. {
  269.     EXCEP_DECL;
  270. #if defined( YARROW_SAVE_STATE )
  271.     if ( unlink( YARROW_SEED_FILE ) != 0 && errno != ENOENT ) 
  272.     { 
  273. THROW( YARROW_STATE_ERROR );
  274.     }
  275. #endif
  276.     TRY( test_general() );
  277.  CATCH:
  278.     EXCEP_RET;
  279. }
  280. int state_to_load = 0;
  281. int test_5( void )
  282. {
  283.     EXCEP_DECL;
  284.     Yarrow_STATE state;
  285.     byte* state_b = (byte*) &state;
  286.     int i;
  287. #if !defined( YARROW_SAVE_STATE )
  288.     VERBOSE( print( "state saving off, so test not relevantn" ); );
  289.     THROW( YARROW_OK );
  290. #endif
  291.     
  292.     for ( i = 0; i < sizeof( state ); i++ )
  293.     {
  294. state_b[ i ] = i % 256;
  295.     }
  296.     TRY( STATE_Save( YARROW_SEED_FILE, &state ) );
  297.     state_to_load = 1;
  298.     TRY( test_general() );
  299.  CATCH:
  300.     state_to_load = 0;
  301.     EXCEP_RET;
  302. }
  303. int test_general( void )
  304. {
  305.     EXCEP_DECL;
  306.     Yarrow_CTX yarrow;
  307.     int initialized = 0;
  308.     unsigned user, mouse, keyboard;
  309.     int i, ret;
  310.     byte user_sample[ 20 ];
  311.     byte mouse_sample[ 4 ];
  312.     byte keyboard_sample[ 2 ];
  313.     byte random[ 30 ];
  314.     byte expected_random[ 30 ];
  315.     byte junk[ 48 ];
  316.     Yarrow_STATE state;
  317.     const char* expected_random_no_load_str = 
  318. "0573f728da11381cfc7db5d386ad9a2f30e75c7df0411f307ed3c1000fdb";
  319.     const char* expected_random_with_load_str = 
  320. "a02c2492cca9ac5f1244eb05cbccc9bc17cfd095f35307927ef7e2c5f881";
  321.     TRY( hex2bin( expected_random, 
  322.   state_to_load ? expected_random_with_load_str :
  323.   expected_random_no_load_str, 
  324.   sizeof( expected_random ) ) );
  325.     memset( user_sample,     3, sizeof( user_sample ) );
  326.     memset( mouse_sample,    1, sizeof( mouse_sample ) );
  327.     memset( keyboard_sample, 2, sizeof( keyboard_sample ) );
  328.     VERBOSE( printf( "nGeneral workout test" ); 
  329.      if ( state_to_load ) { printf( " with state to load" ); }
  330.      printf( "nn" ); );
  331.     if ( !state_to_load )
  332.     {
  333. ret = STATE_Load( YARROW_SEED_FILE, &state );
  334. if ( ret == YARROW_OK )
  335. {
  336.     VERBOSE( printf( "found state where there should be nonen" ); );
  337.     THROW( YARROW_STATE_ERROR );
  338. }
  339.     }
  340.     VERBOSE( printf( "Yarrow_Init() = [" ); );
  341.     ret = Yarrow_Init( &yarrow, YARROW_SEED_FILE );
  342.     VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  343.     if ( ret != YARROW_OK && ret != YARROW_NOT_SEEDED ) { THROW( ret ); }
  344.     initialized = 1;
  345. #if defined( YARROW_DEBUG )
  346.     dump_yarrow_state( stdout, &yarrow );
  347. #endif
  348.     ret = Yarrow_New_Source( &yarrow, &user );
  349.     VERBOSE( printf( "Yarrow_New_Source() = [%s]n",
  350.      Yarrow_Str_Error( ret ) ); );
  351.     if ( ret != YARROW_OK ) { THROW( ret ); }
  352.   
  353.     VERBOSE( printf( "Yarrow_Poll( #%d ) = [", user ); );
  354.     ret = Yarrow_Poll( &yarrow, user );
  355.     VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  356.     ret = Yarrow_New_Source( &yarrow, &mouse );
  357.     VERBOSE( printf( "Yarrow_New_Source() = [%s]n", 
  358.      Yarrow_Str_Error( ret ) ); );
  359.     if ( ret != YARROW_OK ) { THROW( ret ); }
  360.     ret = Yarrow_New_Source( &yarrow, &keyboard );
  361.     VERBOSE( printf( "Yarrow_New_Source() = [%s]n", 
  362.      Yarrow_Str_Error( ret ) ); );
  363.     if ( ret != YARROW_OK ) { THROW( ret ); }
  364. /*  prematurely try to draw output, to check failure when no
  365.  *  seed file, or state saving turned off
  366.  */
  367.     VERBOSE( printf( "Yarrow_Output( %d ) = [", (int)sizeof( random ) ); );
  368.     ret = Yarrow_Output( &yarrow, random, sizeof( random ) );
  369.     VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  370. /*   do it twice so that we some slow samples 
  371.  *   (first sample goes to fast pool, and then samples alternate)
  372.  */
  373.     for ( i = 0; i < 2; i++ )
  374.     {
  375. TRY( Instrumented_Yarrow_Input( &yarrow, mouse, mouse_sample, 
  376. sizeof( mouse_sample ), 2 ) );
  377. TRY( Instrumented_Yarrow_Input( &yarrow, keyboard, keyboard_sample, 
  378. sizeof( keyboard_sample ), 2 ) );
  379. TRY( Instrumented_Yarrow_Input( &yarrow, user, user_sample, 
  380. sizeof( user_sample ), 2 ) );
  381.     }
  382. #if defined( YARROW_DEBUG )
  383.     dump_yarrow_state( stdout, &yarrow );
  384. #endif
  385.     VERBOSE( printf( "nInduce user source (#%d) to reach "
  386.      "slow thresholdnn", user ); );
  387.     /* induce fast reseed */
  388.     for ( i = 0; i < 7; i++ )
  389.     {
  390. TRY( Instrumented_Yarrow_Input( &yarrow, user, user_sample, 
  391. sizeof( user_sample ), 
  392. sizeof( user_sample ) * 3 ) );
  393.     }
  394.     VERBOSE( printf( "nInduce mouse source (#%d) to reach "
  395.      "slow threshold reseednn", mouse ); );
  396.     /* induce slow reseed, by triggering a second source to reach it's
  397.        threshold */
  398.     for ( i = 0; i < 40; i++ )
  399.     {
  400. TRY( Instrumented_Yarrow_Input( &yarrow, mouse, mouse_sample, 
  401. sizeof( mouse_sample ), 
  402. sizeof( mouse_sample )*2 ) );
  403.     }
  404.     VERBOSE( printf( "nProduce some outputnn" ); );
  405.     for ( i = 0; i < 30; i++ )
  406.     {
  407. VERBOSE( printf( "Yarrow_Output( %d ) = [", (int)sizeof( junk ) ); );
  408. ret = Yarrow_Output( &yarrow, junk, sizeof( junk ) );
  409. VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  410. if ( ret != YARROW_OK ) { THROW( ret ); }
  411.     }
  412.     memset( junk, 0, sizeof( junk ) );
  413.     VERBOSE( printf( "nTrigger some fast and slow reseedsnn" ); );
  414.     for ( i = 0; i < 30; i++ )
  415.     {
  416. /* odd input to a different source so there are some slow reseeds */
  417. if ( i % 16 == 0 )
  418. {
  419.     TRY( Instrumented_Yarrow_Input( &yarrow, mouse, junk, 
  420.     sizeof( junk ), 
  421.     sizeof( junk ) * 3 ) );
  422. }
  423. else
  424. {
  425.     TRY( Instrumented_Yarrow_Input( &yarrow, user, junk, 
  426.     sizeof( junk ), 
  427.     sizeof( junk ) * 3 ) );
  428. }
  429.     }
  430.     VERBOSE( printf( "nPrint some random outputnn" ); );
  431.     
  432.     VERBOSE( hex_print( stdout, "expected random", expected_random,
  433. sizeof( expected_random ) ); );
  434.     VERBOSE( printf( "Yarrow_Output( %d ) = [", (int)sizeof( random ) ); );
  435.     ret = Yarrow_Output( &yarrow, random, sizeof( random ) );
  436.     VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  437.     VERBOSE( hex_print( stdout, "result   random", random,
  438. sizeof( random ) ); );
  439.     if ( ret != YARROW_OK )
  440.     {
  441. THROW( ret );
  442.     }
  443.     VERBOSE( printf( "nClose down Yarrownn" ); );
  444.  CATCH:
  445.     if ( initialized )
  446.     {
  447. VERBOSE( printf( "Yarrow_Final() = [" ); );
  448. ret = Yarrow_Final( &yarrow );
  449. VERBOSE( printf( "%s]n", Yarrow_Str_Error( ret ) ); );
  450. THROW( ret );
  451.     }
  452.     EXCEP_RET;
  453. }
  454. void hex_print( FILE* f, const char* var, void* data, size_t size )
  455. {
  456.     const char* conv = "0123456789abcdef";
  457.     size_t i;
  458.     char* p = (char*) data;
  459.     char c, d;
  460.     
  461.     fprintf( f, var );
  462.     fprintf( f, " = " );
  463.     for ( i = 0; i < size; i++ )
  464.     {
  465. c = conv[ (p[ i ] >> 4) & 0xf ];
  466. d = conv[ p[ i ] & 0xf ];
  467. fprintf( f, "%c%c", c, d );
  468.     }
  469.     fprintf( f, "n" );
  470. }
  471. void dump_yarrow_state( FILE* f, Yarrow_CTX* y )
  472. {
  473.     fprintf( f, "===Yarrow State===n" );
  474.     hex_print( f, "C", y->C, sizeof( y->C ) );
  475.     hex_print( f, "K", y->K, sizeof( y->K ) );
  476. }