#include #include "ecrypt-sync.h" void generate_testvector (void); void test_vec_sub (u8 *key, u8 *iv, u32 keysize, u32 ivsize, FILE *fp); void test_vec_sub (u8 *key, u8 *iv, u32 keysize, u32 ivsize, FILE *fp) { ECRYPT_ctx state; u8 text[256]; u32 i; fprintf (fp, "%3i-bit key: ", keysize); for (i = 20; i != keysize/8; ) { i--; fprintf (fp, " "); if (i == 4*(i/4)) fprintf (fp, " "); } for (i = keysize/8; i != 0; ) { i--; fprintf (fp, "%.2x", key[i]); if (i == 4*(i/4)) fprintf (fp, " "); } fprintf (fp, "\n"); fprintf (fp, "%3i-bit iv : ", ivsize); for (i = 20; i != ivsize/8; ) { i--; fprintf (fp, " "); if (i == 4*(i/4)) fprintf (fp, " "); } for (i = ivsize/8; i != 0; ) { i--; fprintf (fp, "%.2x", iv[i]); if (i == 4*(i/4)) fprintf (fp, " "); } fprintf (fp, "\n"); fprintf (fp, " keystream :\n"); ECRYPT_keysetup (&state, key, keysize, ivsize); ECRYPT_ivsetup (&state, iv); ECRYPT_keystream_blocks (&state, text, 64); for (i = 0; i < 256; i++) { fprintf (fp, "%.2x ", text[i]); if ((i+1) == 4*((i+1)/4)) fprintf (fp, " "); if ((i+1) == 16*((i+1)/16)) fprintf (fp, "\n"); } for (i = 0; i < 0x100000; i++) { ECRYPT_keystream_blocks (&state, text, 1); if (i == ((i>>18)<<18)) printf ("."); } fprintf (fp, " ..... 4 x 2^20 bytes omitted .....\n"); ECRYPT_keystream_blocks (&state, text, 16); for (i = 0; i < 64; i++) { fprintf (fp, "%.2x ", text[i]); if ((i+1) == 4*((i+1)/4)) fprintf (fp, " "); if ((i+1) == 16*((i+1)/16)) fprintf (fp, "\n"); } fprintf (fp, "\n\n"); return; } void generate_testvector (void) { FILE *fp; u8 key[20], iv[20]; u32 keysize, ivsize, i; fp = fopen ("testvec.txt", "w"); fprintf (fp, "\n" "All numbers are in hexadecimal notation.\n" "Key and IV are written with MSB to the left and LSB to the right.\n" "Keystream is written as byte sequence, extending from left to right.\n\n\n" ); printf ( "Test vectors are being created.\n" "Results are stored in the file \"testvec.txt\"\n" ); /**************/ keysize = 160; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = 0; for (i = 0; i < ivsize/8; i++) iv[i] = 0; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 160; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = i; for (i = 0; i < ivsize/8; i++) iv[i] = 0; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 160; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = (u8) ( 7*i+3); for (i = 0; i < ivsize/8; i++) iv[i] = 0; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 128; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = i; for (i = 0; i < ivsize/8; i++) iv[i] = 0; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 128; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = 0; for (i = 0; i < ivsize/8; i++) iv[i] = i; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 128; ivsize = 32; for (i = 0; i < keysize/8; i++) key[i] = (u8) ( 7*i+13); for (i = 0; i < ivsize/8; i++) iv[i] = (u8) (13*i+ 3); test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 96; ivsize = 64; for (i = 0; i < keysize/8; i++) key[i] = 0; for (i = 0; i < ivsize/8; i++) iv[i] = i; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 96; ivsize = 64; for (i = 0; i < keysize/8; i++) key[i] = i; for (i = 0; i < ivsize/8; i++) iv[i] = 0; test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 96; ivsize = 64; for (i = 0; i < keysize/8; i++) key[i] = (u8) ( 7*i+ 3); for (i = 0; i < ivsize/8; i++) iv[i] = (u8) (13*i+17); test_vec_sub (key, iv, keysize, ivsize, fp); /**************/ fprintf (fp, "===========================================================\n\n" "160-bit IVs do not conform to cipher specification.\n" "But the following vectors are provided, as they could be useful.\n\n" ); keysize = 160; ivsize = 160; for (i = 0; i < keysize/8; i++) key[i] = (u8) (13*i+ 5); for (i = 0; i < ivsize/8; i++) iv[i] = (u8) (11*i+17); test_vec_sub (key, iv, keysize, ivsize, fp); keysize = 160; ivsize = 160; for (i = 0; i < keysize/8; i++) key[i] = (u8) (21*i+5); for (i = 0; i < ivsize/8; i++) iv[i] = (u8) ( 7*i+3); test_vec_sub (key, iv, keysize, ivsize, fp); /**************/ fclose (fp); printf ("\n"); return; }