Home | History | Annotate | Download | only in demos
      1 #include <tomcrypt.h>
      2 
      3 void reg_algs(void)
      4 {
      5   int err;
      6 
      7 #ifdef RIJNDAEL
      8   register_cipher (&aes_desc);
      9 #endif
     10 #ifdef BLOWFISH
     11   register_cipher (&blowfish_desc);
     12 #endif
     13 #ifdef XTEA
     14   register_cipher (&xtea_desc);
     15 #endif
     16 #ifdef RC5
     17   register_cipher (&rc5_desc);
     18 #endif
     19 #ifdef RC6
     20   register_cipher (&rc6_desc);
     21 #endif
     22 #ifdef SAFERP
     23   register_cipher (&saferp_desc);
     24 #endif
     25 #ifdef TWOFISH
     26   register_cipher (&twofish_desc);
     27 #endif
     28 #ifdef SAFER
     29   register_cipher (&safer_k64_desc);
     30   register_cipher (&safer_sk64_desc);
     31   register_cipher (&safer_k128_desc);
     32   register_cipher (&safer_sk128_desc);
     33 #endif
     34 #ifdef RC2
     35   register_cipher (&rc2_desc);
     36 #endif
     37 #ifdef DES
     38   register_cipher (&des_desc);
     39   register_cipher (&des3_desc);
     40 #endif
     41 #ifdef CAST5
     42   register_cipher (&cast5_desc);
     43 #endif
     44 #ifdef NOEKEON
     45   register_cipher (&noekeon_desc);
     46 #endif
     47 #ifdef SKIPJACK
     48   register_cipher (&skipjack_desc);
     49 #endif
     50 #ifdef ANUBIS
     51   register_cipher (&anubis_desc);
     52 #endif
     53 #ifdef KHAZAD
     54   register_cipher (&khazad_desc);
     55 #endif
     56 
     57 #ifdef TIGER
     58   register_hash (&tiger_desc);
     59 #endif
     60 #ifdef MD2
     61   register_hash (&md2_desc);
     62 #endif
     63 #ifdef MD4
     64   register_hash (&md4_desc);
     65 #endif
     66 #ifdef MD5
     67   register_hash (&md5_desc);
     68 #endif
     69 #ifdef SHA1
     70   register_hash (&sha1_desc);
     71 #endif
     72 #ifdef SHA224
     73   register_hash (&sha224_desc);
     74 #endif
     75 #ifdef SHA256
     76   register_hash (&sha256_desc);
     77 #endif
     78 #ifdef SHA384
     79   register_hash (&sha384_desc);
     80 #endif
     81 #ifdef SHA512
     82   register_hash (&sha512_desc);
     83 #endif
     84 #ifdef RIPEMD128
     85   register_hash (&rmd128_desc);
     86 #endif
     87 #ifdef RIPEMD160
     88   register_hash (&rmd160_desc);
     89 #endif
     90 #ifdef WHIRLPOOL
     91   register_hash (&whirlpool_desc);
     92 #endif
     93 #ifdef CHC_HASH
     94   register_hash(&chc_desc);
     95   if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) {
     96      printf("chc_register error: %s\n", error_to_string(err));
     97      exit(EXIT_FAILURE);
     98   }
     99 #endif
    100 
    101 #ifdef USE_LTM
    102    ltc_mp = ltm_desc;
    103 #elif defined(USE_TFM)
    104    ltc_mp = tfm_desc;
    105 #elif defined(USE_GMP)
    106    ltc_mp = gmp_desc;
    107 #else
    108    extern ltc_math_descriptor EXT_MATH_LIB;
    109    ltc_mp = EXT_MATH_LIB;
    110 #endif
    111 
    112 
    113 }
    114 
    115 void hash_gen(void)
    116 {
    117    unsigned char md[MAXBLOCKSIZE], *buf;
    118    unsigned long outlen, x, y, z;
    119    FILE *out;
    120    int   err;
    121 
    122    out = fopen("hash_tv.txt", "w");
    123    if (out == NULL) {
    124       perror("can't open hash_tv");
    125    }
    126 
    127    fprintf(out, "Hash Test Vectors:\n\nThese are the hashes of nn bytes '00 01 02 03 .. (nn-1)'\n\n");
    128    for (x = 0; hash_descriptor[x].name != NULL; x++) {
    129       buf = XMALLOC(2 * hash_descriptor[x].blocksize + 1);
    130       if (buf == NULL) {
    131          perror("can't alloc mem");
    132          exit(EXIT_FAILURE);
    133       }
    134       fprintf(out, "Hash: %s\n", hash_descriptor[x].name);
    135       for (y = 0; y <= (hash_descriptor[x].blocksize * 2); y++) {
    136          for (z = 0; z < y; z++) {
    137             buf[z] = (unsigned char)(z & 255);
    138          }
    139          outlen = sizeof(md);
    140          if ((err = hash_memory(x, buf, y, md, &outlen)) != CRYPT_OK) {
    141             printf("hash_memory error: %s\n", error_to_string(err));
    142             exit(EXIT_FAILURE);
    143          }
    144          fprintf(out, "%3lu: ", y);
    145          for (z = 0; z < outlen; z++) {
    146             fprintf(out, "%02X", md[z]);
    147          }
    148          fprintf(out, "\n");
    149       }
    150       fprintf(out, "\n");
    151       XFREE(buf);
    152    }
    153    fclose(out);
    154 }
    155 
    156 void cipher_gen(void)
    157 {
    158    unsigned char *key, pt[MAXBLOCKSIZE];
    159    unsigned long x, y, z, w;
    160    int err, kl, lastkl;
    161    FILE *out;
    162    symmetric_key skey;
    163 
    164    out = fopen("cipher_tv.txt", "w");
    165 
    166    fprintf(out,
    167 "Cipher Test Vectors\n\nThese are test encryptions with key of nn bytes '00 01 02 03 .. (nn-1)' and original PT of the same style.\n"
    168 "The output of step N is used as the key and plaintext for step N+1 (key bytes repeated as required to fill the key)\n\n");
    169 
    170    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    171       fprintf(out, "Cipher: %s\n", cipher_descriptor[x].name);
    172 
    173       /* three modes, smallest, medium, large keys */
    174       lastkl = 10000;
    175       for (y = 0; y < 3; y++) {
    176          switch (y) {
    177             case 0: kl = cipher_descriptor[x].min_key_length; break;
    178             case 1: kl = (cipher_descriptor[x].min_key_length + cipher_descriptor[x].max_key_length)/2; break;
    179             case 2: kl = cipher_descriptor[x].max_key_length; break;
    180          }
    181          if ((err = cipher_descriptor[x].keysize(&kl)) != CRYPT_OK) {
    182             printf("keysize error: %s\n", error_to_string(err));
    183             exit(EXIT_FAILURE);
    184          }
    185          if (kl == lastkl) break;
    186          lastkl = kl;
    187          fprintf(out, "Key Size: %d bytes\n", kl);
    188 
    189          key = XMALLOC(kl);
    190          if (key == NULL) {
    191             perror("can't malloc memory");
    192             exit(EXIT_FAILURE);
    193          }
    194 
    195          for (z = 0; (int)z < kl; z++) {
    196              key[z] = (unsigned char)z;
    197          }
    198          if ((err = cipher_descriptor[x].setup(key, kl, 0, &skey)) != CRYPT_OK) {
    199             printf("setup error: %s\n", error_to_string(err));
    200             exit(EXIT_FAILURE);
    201          }
    202 
    203          for (z = 0; (int)z < cipher_descriptor[x].block_length; z++) {
    204             pt[z] = (unsigned char)z;
    205          }
    206          for (w = 0; w < 50; w++) {
    207              cipher_descriptor[x].ecb_encrypt(pt, pt, &skey);
    208              fprintf(out, "%2lu: ", w);
    209              for (z = 0; (int)z < cipher_descriptor[x].block_length; z++) {
    210                 fprintf(out, "%02X", pt[z]);
    211              }
    212              fprintf(out, "\n");
    213 
    214              /* reschedule a new key */
    215              for (z = 0; z < (unsigned long)kl; z++) {
    216                  key[z] = pt[z % cipher_descriptor[x].block_length];
    217              }
    218              if ((err = cipher_descriptor[x].setup(key, kl, 0, &skey)) != CRYPT_OK) {
    219                 printf("cipher setup2 error: %s\n", error_to_string(err));
    220                 exit(EXIT_FAILURE);
    221              }
    222          }
    223          fprintf(out, "\n");
    224          XFREE(key);
    225      }
    226      fprintf(out, "\n");
    227   }
    228   fclose(out);
    229 }
    230 
    231 void hmac_gen(void)
    232 {
    233    unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], *input;
    234    int x, y, z, err;
    235    FILE *out;
    236    unsigned long len;
    237 
    238    out = fopen("hmac_tv.txt", "w");
    239 
    240    fprintf(out,
    241 "HMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are HMACed.  The initial key is\n"
    242 "of the same format (the same length as the HASH output size).  The HMAC key in step N+1 is the HMAC output of\n"
    243 "step N.\n\n");
    244 
    245    for (x = 0; hash_descriptor[x].name != NULL; x++) {
    246       fprintf(out, "HMAC-%s\n", hash_descriptor[x].name);
    247 
    248       /* initial key */
    249       for (y = 0; y < (int)hash_descriptor[x].hashsize; y++) {
    250           key[y] = (y&255);
    251       }
    252 
    253       input = XMALLOC(hash_descriptor[x].blocksize * 2 + 1);
    254       if (input == NULL) {
    255          perror("Can't malloc memory");
    256          exit(EXIT_FAILURE);
    257       }
    258 
    259       for (y = 0; y <= (int)(hash_descriptor[x].blocksize * 2); y++) {
    260          for (z = 0; z < y; z++) {
    261             input[z] = (unsigned char)(z & 255);
    262          }
    263          len = sizeof(output);
    264          if ((err = hmac_memory(x, key, hash_descriptor[x].hashsize, input, y, output, &len)) != CRYPT_OK) {
    265             printf("Error hmacing: %s\n", error_to_string(err));
    266             exit(EXIT_FAILURE);
    267          }
    268          fprintf(out, "%3d: ", y);
    269          for (z = 0; z <(int) len; z++) {
    270             fprintf(out, "%02X", output[z]);
    271          }
    272          fprintf(out, "\n");
    273 
    274          /* forward the key */
    275          memcpy(key, output, hash_descriptor[x].hashsize);
    276       }
    277       XFREE(input);
    278       fprintf(out, "\n");
    279    }
    280    fclose(out);
    281 }
    282 
    283 void omac_gen(void)
    284 {
    285    unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], input[MAXBLOCKSIZE*2+2];
    286    int err, x, y, z, kl;
    287    FILE *out;
    288    unsigned long len;
    289 
    290    out = fopen("omac_tv.txt", "w");
    291 
    292    fprintf(out,
    293 "OMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are OMAC'ed.  The initial key is\n"
    294 "of the same format (length specified per cipher).  The OMAC key in step N+1 is the OMAC output of\n"
    295 "step N (repeated as required to fill the array).\n\n");
    296 
    297    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    298       kl = cipher_descriptor[x].block_length;
    299 
    300       /* skip ciphers which do not have 64 or 128 bit block sizes */
    301       if (kl != 8 && kl != 16) continue;
    302 
    303       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    304          kl = cipher_descriptor[x].max_key_length;
    305       }
    306       fprintf(out, "OMAC-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    307 
    308       /* initial key/block */
    309       for (y = 0; y < kl; y++) {
    310           key[y] = (y & 255);
    311       }
    312 
    313       for (y = 0; y <= (int)(cipher_descriptor[x].block_length*2); y++) {
    314          for (z = 0; z < y; z++) {
    315             input[z] = (unsigned char)(z & 255);
    316          }
    317          len = sizeof(output);
    318          if ((err = omac_memory(x, key, kl, input, y, output, &len)) != CRYPT_OK) {
    319             printf("Error omacing: %s\n", error_to_string(err));
    320             exit(EXIT_FAILURE);
    321          }
    322          fprintf(out, "%3d: ", y);
    323          for (z = 0; z <(int)len; z++) {
    324             fprintf(out, "%02X", output[z]);
    325          }
    326          fprintf(out, "\n");
    327 
    328          /* forward the key */
    329          for (z = 0; z < kl; z++) {
    330              key[z] = output[z % len];
    331          }
    332       }
    333       fprintf(out, "\n");
    334    }
    335    fclose(out);
    336 }
    337 
    338 void pmac_gen(void)
    339 {
    340    unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], input[MAXBLOCKSIZE*2+2];
    341    int err, x, y, z, kl;
    342    FILE *out;
    343    unsigned long len;
    344 
    345    out = fopen("pmac_tv.txt", "w");
    346 
    347    fprintf(out,
    348 "PMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are OMAC'ed.  The initial key is\n"
    349 "of the same format (length specified per cipher).  The OMAC key in step N+1 is the OMAC output of\n"
    350 "step N (repeated as required to fill the array).\n\n");
    351 
    352    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    353       kl = cipher_descriptor[x].block_length;
    354 
    355       /* skip ciphers which do not have 64 or 128 bit block sizes */
    356       if (kl != 8 && kl != 16) continue;
    357 
    358       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    359          kl = cipher_descriptor[x].max_key_length;
    360       }
    361       fprintf(out, "PMAC-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    362 
    363       /* initial key/block */
    364       for (y = 0; y < kl; y++) {
    365           key[y] = (y & 255);
    366       }
    367 
    368       for (y = 0; y <= (int)(cipher_descriptor[x].block_length*2); y++) {
    369          for (z = 0; z < y; z++) {
    370             input[z] = (unsigned char)(z & 255);
    371          }
    372          len = sizeof(output);
    373          if ((err = pmac_memory(x, key, kl, input, y, output, &len)) != CRYPT_OK) {
    374             printf("Error omacing: %s\n", error_to_string(err));
    375             exit(EXIT_FAILURE);
    376          }
    377          fprintf(out, "%3d: ", y);
    378          for (z = 0; z <(int)len; z++) {
    379             fprintf(out, "%02X", output[z]);
    380          }
    381          fprintf(out, "\n");
    382 
    383          /* forward the key */
    384          for (z = 0; z < kl; z++) {
    385              key[z] = output[z % len];
    386          }
    387       }
    388       fprintf(out, "\n");
    389    }
    390    fclose(out);
    391 }
    392 
    393 void eax_gen(void)
    394 {
    395    int err, kl, x, y1, z;
    396    FILE *out;
    397    unsigned char key[MAXBLOCKSIZE], nonce[MAXBLOCKSIZE*2], header[MAXBLOCKSIZE*2],
    398                  plaintext[MAXBLOCKSIZE*2], tag[MAXBLOCKSIZE];
    399    unsigned long len;
    400 
    401    out = fopen("eax_tv.txt", "w");
    402    fprintf(out, "EAX Test Vectors.  Uses the 00010203...NN-1 pattern for header/nonce/plaintext/key.  The outputs\n"
    403                 "are of the form ciphertext,tag for a given NN.  The key for step N>1 is the tag of the previous\n"
    404                 "step repeated sufficiently.\n\n");
    405 
    406    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    407       kl = cipher_descriptor[x].block_length;
    408 
    409       /* skip ciphers which do not have 64 or 128 bit block sizes */
    410       if (kl != 8 && kl != 16) continue;
    411 
    412       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    413          kl = cipher_descriptor[x].max_key_length;
    414       }
    415       fprintf(out, "EAX-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    416 
    417       /* the key */
    418       for (z = 0; z < kl; z++) {
    419           key[z] = (z & 255);
    420       }
    421 
    422       for (y1 = 0; y1 <= (int)(cipher_descriptor[x].block_length*2); y1++){
    423          for (z = 0; z < y1; z++) {
    424             plaintext[z] = (unsigned char)(z & 255);
    425             nonce[z]     = (unsigned char)(z & 255);
    426             header[z]    = (unsigned char)(z & 255);
    427          }
    428          len = sizeof(tag);
    429          if ((err = eax_encrypt_authenticate_memory(x, key, kl, nonce, y1, header, y1, plaintext, y1, plaintext, tag, &len)) != CRYPT_OK) {
    430             printf("Error EAX'ing: %s\n", error_to_string(err));
    431             exit(EXIT_FAILURE);
    432          }
    433          fprintf(out, "%3d: ", y1);
    434          for (z = 0; z < y1; z++) {
    435             fprintf(out, "%02X", plaintext[z]);
    436          }
    437          fprintf(out, ", ");
    438          for (z = 0; z <(int)len; z++) {
    439             fprintf(out, "%02X", tag[z]);
    440          }
    441          fprintf(out, "\n");
    442 
    443          /* forward the key */
    444          for (z = 0; z < kl; z++) {
    445              key[z] = tag[z % len];
    446          }
    447       }
    448       fprintf(out, "\n");
    449    }
    450    fclose(out);
    451 }
    452 
    453 void ocb_gen(void)
    454 {
    455    int err, kl, x, y1, z;
    456    FILE *out;
    457    unsigned char key[MAXBLOCKSIZE], nonce[MAXBLOCKSIZE*2],
    458                  plaintext[MAXBLOCKSIZE*2], tag[MAXBLOCKSIZE];
    459    unsigned long len;
    460 
    461    out = fopen("ocb_tv.txt", "w");
    462    fprintf(out, "OCB Test Vectors.  Uses the 00010203...NN-1 pattern for nonce/plaintext/key.  The outputs\n"
    463                 "are of the form ciphertext,tag for a given NN.  The key for step N>1 is the tag of the previous\n"
    464                 "step repeated sufficiently.  The nonce is fixed throughout.\n\n");
    465 
    466    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    467       kl = cipher_descriptor[x].block_length;
    468 
    469       /* skip ciphers which do not have 64 or 128 bit block sizes */
    470       if (kl != 8 && kl != 16) continue;
    471 
    472       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    473          kl = cipher_descriptor[x].max_key_length;
    474       }
    475       fprintf(out, "OCB-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    476 
    477       /* the key */
    478       for (z = 0; z < kl; z++) {
    479           key[z] = (z & 255);
    480       }
    481 
    482       /* fixed nonce */
    483       for (z = 0; z < cipher_descriptor[x].block_length; z++) {
    484           nonce[z] = z;
    485       }
    486 
    487       for (y1 = 0; y1 <= (int)(cipher_descriptor[x].block_length*2); y1++){
    488          for (z = 0; z < y1; z++) {
    489             plaintext[z] = (unsigned char)(z & 255);
    490          }
    491          len = sizeof(tag);
    492          if ((err = ocb_encrypt_authenticate_memory(x, key, kl, nonce, plaintext, y1, plaintext, tag, &len)) != CRYPT_OK) {
    493             printf("Error OCB'ing: %s\n", error_to_string(err));
    494             exit(EXIT_FAILURE);
    495          }
    496          fprintf(out, "%3d: ", y1);
    497          for (z = 0; z < y1; z++) {
    498             fprintf(out, "%02X", plaintext[z]);
    499          }
    500          fprintf(out, ", ");
    501          for (z = 0; z <(int)len; z++) {
    502             fprintf(out, "%02X", tag[z]);
    503          }
    504          fprintf(out, "\n");
    505 
    506          /* forward the key */
    507          for (z = 0; z < kl; z++) {
    508              key[z] = tag[z % len];
    509          }
    510       }
    511       fprintf(out, "\n");
    512    }
    513    fclose(out);
    514 }
    515 
    516 
    517 void ccm_gen(void)
    518 {
    519    int err, kl, x, y1, z;
    520    FILE *out;
    521    unsigned char key[MAXBLOCKSIZE], nonce[MAXBLOCKSIZE*2],
    522                  plaintext[MAXBLOCKSIZE*2], tag[MAXBLOCKSIZE];
    523    unsigned long len;
    524 
    525    out = fopen("ccm_tv.txt", "w");
    526    fprintf(out, "CCM Test Vectors.  Uses the 00010203...NN-1 pattern for nonce/header/plaintext/key.  The outputs\n"
    527                 "are of the form ciphertext,tag for a given NN.  The key for step N>1 is the tag of the previous\n"
    528                 "step repeated sufficiently.  The nonce is fixed throughout at 13 bytes 000102...\n\n");
    529 
    530    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    531       kl = cipher_descriptor[x].block_length;
    532 
    533       /* skip ciphers which do not have 128 bit block sizes */
    534       if (kl != 16) continue;
    535 
    536       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    537          kl = cipher_descriptor[x].max_key_length;
    538       }
    539       fprintf(out, "CCM-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    540 
    541       /* the key */
    542       for (z = 0; z < kl; z++) {
    543           key[z] = (z & 255);
    544       }
    545 
    546       /* fixed nonce */
    547       for (z = 0; z < cipher_descriptor[x].block_length; z++) {
    548           nonce[z] = z;
    549       }
    550 
    551       for (y1 = 0; y1 <= (int)(cipher_descriptor[x].block_length*2); y1++){
    552          for (z = 0; z < y1; z++) {
    553             plaintext[z] = (unsigned char)(z & 255);
    554          }
    555          len = sizeof(tag);
    556          if ((err = ccm_memory(x, key, kl, NULL, nonce, 13, plaintext, y1, plaintext, y1, plaintext, tag, &len, CCM_ENCRYPT)) != CRYPT_OK) {
    557             printf("Error CCM'ing: %s\n", error_to_string(err));
    558             exit(EXIT_FAILURE);
    559          }
    560          fprintf(out, "%3d: ", y1);
    561          for (z = 0; z < y1; z++) {
    562             fprintf(out, "%02X", plaintext[z]);
    563          }
    564          fprintf(out, ", ");
    565          for (z = 0; z <(int)len; z++) {
    566             fprintf(out, "%02X", tag[z]);
    567          }
    568          fprintf(out, "\n");
    569 
    570          /* forward the key */
    571          for (z = 0; z < kl; z++) {
    572              key[z] = tag[z % len];
    573          }
    574       }
    575       fprintf(out, "\n");
    576    }
    577    fclose(out);
    578 }
    579 
    580 void gcm_gen(void)
    581 {
    582    int err, kl, x, y1, z;
    583    FILE *out;
    584    unsigned char key[MAXBLOCKSIZE], plaintext[MAXBLOCKSIZE*2], tag[MAXBLOCKSIZE];
    585    unsigned long len;
    586 
    587    out = fopen("gcm_tv.txt", "w");
    588    fprintf(out, "GCM Test Vectors.  Uses the 00010203...NN-1 pattern for nonce/header/plaintext/key.  The outputs\n"
    589                 "are of the form ciphertext,tag for a given NN.  The key for step N>1 is the tag of the previous\n"
    590                 "step repeated sufficiently.  The nonce is fixed throughout at 13 bytes 000102...\n\n");
    591 
    592    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
    593       kl = cipher_descriptor[x].block_length;
    594 
    595       /* skip ciphers which do not have 128 bit block sizes */
    596       if (kl != 16) continue;
    597 
    598       if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
    599          kl = cipher_descriptor[x].max_key_length;
    600       }
    601       fprintf(out, "GCM-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
    602 
    603       /* the key */
    604       for (z = 0; z < kl; z++) {
    605           key[z] = (z & 255);
    606       }
    607 
    608       for (y1 = 0; y1 <= (int)(cipher_descriptor[x].block_length*2); y1++){
    609          for (z = 0; z < y1; z++) {
    610             plaintext[z] = (unsigned char)(z & 255);
    611          }
    612          len = sizeof(tag);
    613          if ((err = gcm_memory(x, key, kl, plaintext, y1, plaintext, y1, plaintext, y1, plaintext, tag, &len, GCM_ENCRYPT)) != CRYPT_OK) {
    614             printf("Error GCM'ing: %s\n", error_to_string(err));
    615             exit(EXIT_FAILURE);
    616          }
    617          fprintf(out, "%3d: ", y1);
    618          for (z = 0; z < y1; z++) {
    619             fprintf(out, "%02X", plaintext[z]);
    620          }
    621          fprintf(out, ", ");
    622          for (z = 0; z <(int)len; z++) {
    623             fprintf(out, "%02X", tag[z]);
    624          }
    625          fprintf(out, "\n");
    626 
    627          /* forward the key */
    628          for (z = 0; z < kl; z++) {
    629              key[z] = tag[z % len];
    630          }
    631       }
    632       fprintf(out, "\n");
    633    }
    634    fclose(out);
    635 }
    636 
    637 void base64_gen(void)
    638 {
    639    FILE *out;
    640    unsigned char dst[256], src[32];
    641    unsigned long x, y, len;
    642 
    643    out = fopen("base64_tv.txt", "w");
    644    fprintf(out, "Base64 vectors.  These are the base64 encodings of the strings 00,01,02...NN-1\n\n");
    645    for (x = 0; x <= 32; x++) {
    646        for (y = 0; y < x; y++) {
    647            src[y] = y;
    648        }
    649        len = sizeof(dst);
    650        base64_encode(src, x, dst, &len);
    651        fprintf(out, "%2lu: %s\n", x, dst);
    652    }
    653    fclose(out);
    654 }
    655 
    656 void math_gen(void)
    657 {
    658 }
    659 
    660 void ecc_gen(void)
    661 {
    662    FILE         *out;
    663    unsigned char str[512];
    664    void          *k, *order, *modulus;
    665    ecc_point    *G, *R;
    666    int           x;
    667 
    668    out = fopen("ecc_tv.txt", "w");
    669    fprintf(out, "ecc vectors.  These are for kG for k=1,3,9,27,...,3**n until k > order of the curve outputs are <k,x,y> triplets\n\n");
    670    G = ltc_ecc_new_point();
    671    R = ltc_ecc_new_point();
    672    mp_init(&k);
    673    mp_init(&order);
    674    mp_init(&modulus);
    675 
    676    for (x = 0; ltc_ecc_sets[x].size != 0; x++) {
    677         fprintf(out, "ECC-%d\n", ltc_ecc_sets[x].size*8);
    678         mp_set(k, 1);
    679 
    680         mp_read_radix(order,   (char *)ltc_ecc_sets[x].order, 16);
    681         mp_read_radix(modulus, (char *)ltc_ecc_sets[x].prime, 16);
    682         mp_read_radix(G->x,    (char *)ltc_ecc_sets[x].Gx,    16);
    683         mp_read_radix(G->y,    (char *)ltc_ecc_sets[x].Gy,    16);
    684         mp_set(G->z, 1);
    685 
    686         while (mp_cmp(k, order) == LTC_MP_LT) {
    687             ltc_mp.ecc_ptmul(k, G, R, modulus, 1);
    688             mp_tohex(k,    (char*)str); fprintf(out, "%s, ", (char*)str);
    689             mp_tohex(R->x, (char*)str); fprintf(out, "%s, ", (char*)str);
    690             mp_tohex(R->y, (char*)str); fprintf(out, "%s\n", (char*)str);
    691             mp_mul_d(k, 3, k);
    692         }
    693    }
    694    mp_clear_multi(k, order, modulus, NULL);
    695    ltc_ecc_del_point(G);
    696    ltc_ecc_del_point(R);
    697    fclose(out);
    698 }
    699 
    700 void lrw_gen(void)
    701 {
    702    FILE *out;
    703    unsigned char tweak[16], key[16], iv[16], buf[1024];
    704    int x, y, err;
    705    symmetric_LRW lrw;
    706 
    707    /* initialize default key and tweak */
    708    for (x = 0; x < 16; x++) {
    709       tweak[x] = key[x] = iv[x] = x;
    710    }
    711 
    712    out = fopen("lrw_tv.txt", "w");
    713    for (x = 16; x < (int)(sizeof(buf)); x += 16) {
    714        if ((err = lrw_start(find_cipher("aes"), iv, key, 16, tweak, 0, &lrw)) != CRYPT_OK) {
    715           fprintf(stderr, "Error starting LRW-AES: %s\n", error_to_string(err));
    716           exit(EXIT_FAILURE);
    717        }
    718 
    719        /* encrypt incremental */
    720        for (y = 0; y < x; y++) {
    721            buf[y] = y & 255;
    722        }
    723 
    724        if ((err = lrw_encrypt(buf, buf, x, &lrw)) != CRYPT_OK) {
    725           fprintf(stderr, "Error encrypting with LRW-AES: %s\n", error_to_string(err));
    726           exit(EXIT_FAILURE);
    727        }
    728 
    729        /* display it */
    730        fprintf(out, "%d:", x);
    731        for (y = 0; y < x; y++) {
    732           fprintf(out, "%02x", buf[y]);
    733        }
    734        fprintf(out, "\n");
    735 
    736        /* reset IV */
    737        if ((err = lrw_setiv(iv, 16, &lrw)) != CRYPT_OK) {
    738           fprintf(stderr, "Error setting IV: %s\n", error_to_string(err));
    739           exit(EXIT_FAILURE);
    740        }
    741 
    742        /* copy new tweak, iv and key */
    743        for (y = 0; y < 16; y++) {
    744           key[y]   = buf[y];
    745           iv[y]    = buf[(y+16)%x];
    746           tweak[y] = buf[(y+32)%x];
    747        }
    748 
    749        if ((err = lrw_decrypt(buf, buf, x, &lrw)) != CRYPT_OK) {
    750           fprintf(stderr, "Error decrypting with LRW-AES: %s\n", error_to_string(err));
    751           exit(EXIT_FAILURE);
    752        }
    753 
    754        /* display it */
    755        fprintf(out, "%d:", x);
    756        for (y = 0; y < x; y++) {
    757           fprintf(out, "%02x", buf[y]);
    758        }
    759        fprintf(out, "\n");
    760        lrw_done(&lrw);
    761    }
    762    fclose(out);
    763 }
    764 
    765 int main(void)
    766 {
    767    reg_algs();
    768    printf("Generating hash   vectors..."); fflush(stdout); hash_gen();   printf("done\n");
    769    printf("Generating cipher vectors..."); fflush(stdout); cipher_gen(); printf("done\n");
    770    printf("Generating HMAC   vectors..."); fflush(stdout); hmac_gen();   printf("done\n");
    771    printf("Generating OMAC   vectors..."); fflush(stdout); omac_gen();   printf("done\n");
    772    printf("Generating PMAC   vectors..."); fflush(stdout); pmac_gen();   printf("done\n");
    773    printf("Generating EAX    vectors..."); fflush(stdout); eax_gen();    printf("done\n");
    774    printf("Generating OCB    vectors..."); fflush(stdout); ocb_gen();    printf("done\n");
    775    printf("Generating CCM    vectors..."); fflush(stdout); ccm_gen();    printf("done\n");
    776    printf("Generating GCM    vectors..."); fflush(stdout); gcm_gen();    printf("done\n");
    777    printf("Generating BASE64 vectors..."); fflush(stdout); base64_gen(); printf("done\n");
    778    printf("Generating MATH   vectors..."); fflush(stdout); math_gen();   printf("done\n");
    779    printf("Generating ECC    vectors..."); fflush(stdout); ecc_gen();    printf("done\n");
    780    printf("Generating LRW    vectors..."); fflush(stdout); lrw_gen();    printf("done\n");
    781    return 0;
    782 }
    783 
    784 /* $Source: /cvs/libtom/libtomcrypt/demos/tv_gen.c,v $ */
    785 /* $Revision: 1.15 $ */
    786 /* $Date: 2006/06/09 22:10:27 $ */
    787