Home | History | Annotate | Line # | Download | only in default
      1  1.1  riastrad 
      2  1.1  riastrad #define TEST_NAME "metamorphic"
      3  1.1  riastrad #include "cmptest.h"
      4  1.1  riastrad 
      5  1.1  riastrad #define MAXLEN 512
      6  1.1  riastrad #define MAX_ITER 1000
      7  1.1  riastrad 
      8  1.1  riastrad static void
      9  1.1  riastrad mm_generichash(void)
     10  1.1  riastrad {
     11  1.1  riastrad     crypto_generichash_state st;
     12  1.1  riastrad     unsigned char *h, *h2;
     13  1.1  riastrad     unsigned char *k;
     14  1.1  riastrad     unsigned char *m;
     15  1.1  riastrad     size_t         hlen;
     16  1.1  riastrad     size_t         klen;
     17  1.1  riastrad     size_t         mlen;
     18  1.1  riastrad     size_t         l1, l2;
     19  1.1  riastrad     int            i;
     20  1.1  riastrad 
     21  1.1  riastrad     for (i = 0; i < MAX_ITER; i++) {
     22  1.1  riastrad         mlen = randombytes_uniform(MAXLEN);
     23  1.1  riastrad         m = (unsigned char *) sodium_malloc(mlen);
     24  1.1  riastrad         klen = randombytes_uniform(crypto_generichash_KEYBYTES_MAX -
     25  1.1  riastrad                                    crypto_generichash_KEYBYTES_MIN + 1U)
     26  1.1  riastrad             + crypto_generichash_KEYBYTES_MIN;
     27  1.1  riastrad         k = (unsigned char *) sodium_malloc(klen);
     28  1.1  riastrad         hlen = randombytes_uniform(crypto_generichash_BYTES_MAX -
     29  1.1  riastrad                                    crypto_generichash_BYTES_MIN + 1U)
     30  1.1  riastrad             + crypto_generichash_BYTES_MIN;
     31  1.1  riastrad         h = (unsigned char *) sodium_malloc(hlen);
     32  1.1  riastrad         h2 = (unsigned char *) sodium_malloc(hlen);
     33  1.1  riastrad 
     34  1.1  riastrad         randombytes_buf(k, klen);
     35  1.1  riastrad         randombytes_buf(m, mlen);
     36  1.1  riastrad 
     37  1.1  riastrad         crypto_generichash_init(&st, k, klen, hlen);
     38  1.1  riastrad         l1 = randombytes_uniform((uint32_t) mlen);
     39  1.1  riastrad         l2 = randombytes_uniform((uint32_t) (mlen - l1));
     40  1.1  riastrad         crypto_generichash_update(&st, m, l1);
     41  1.1  riastrad         crypto_generichash_update(&st, m + l1, l2);
     42  1.1  riastrad         crypto_generichash_update(&st, m + l1 + l2, mlen - l1 - l2);
     43  1.1  riastrad         crypto_generichash_final(&st, h, hlen);
     44  1.1  riastrad 
     45  1.1  riastrad         crypto_generichash(h2, hlen, m, mlen, k, klen);
     46  1.1  riastrad 
     47  1.1  riastrad         assert(memcmp(h, h2, hlen) == 0);
     48  1.1  riastrad 
     49  1.1  riastrad         sodium_free(h2);
     50  1.1  riastrad         sodium_free(h);
     51  1.1  riastrad         sodium_free(k);
     52  1.1  riastrad         sodium_free(m);
     53  1.1  riastrad     }
     54  1.1  riastrad }
     55  1.1  riastrad 
     56  1.1  riastrad static void
     57  1.1  riastrad mm_onetimeauth(void)
     58  1.1  riastrad {
     59  1.1  riastrad     crypto_onetimeauth_state st;
     60  1.1  riastrad     unsigned char *h, *h2;
     61  1.1  riastrad     unsigned char *k;
     62  1.1  riastrad     unsigned char *m;
     63  1.1  riastrad     size_t         mlen;
     64  1.1  riastrad     size_t         l1, l2;
     65  1.1  riastrad     int            i;
     66  1.1  riastrad 
     67  1.1  riastrad     for (i = 0; i < MAX_ITER; i++) {
     68  1.1  riastrad         mlen = randombytes_uniform(MAXLEN);
     69  1.1  riastrad         m = (unsigned char *) sodium_malloc(mlen);
     70  1.1  riastrad         k = (unsigned char *) sodium_malloc(crypto_onetimeauth_KEYBYTES);
     71  1.1  riastrad         h = (unsigned char *) sodium_malloc(crypto_onetimeauth_BYTES);
     72  1.1  riastrad         h2 = (unsigned char *) sodium_malloc(crypto_onetimeauth_BYTES);
     73  1.1  riastrad 
     74  1.1  riastrad         crypto_onetimeauth_keygen(k);
     75  1.1  riastrad         randombytes_buf(m, mlen);
     76  1.1  riastrad 
     77  1.1  riastrad         crypto_onetimeauth_init(&st, k);
     78  1.1  riastrad         l1 = randombytes_uniform((uint32_t) mlen);
     79  1.1  riastrad         l2 = randombytes_uniform((uint32_t) (mlen - l1));
     80  1.1  riastrad         crypto_onetimeauth_update(&st, m, l1);
     81  1.1  riastrad         crypto_onetimeauth_update(&st, m + l1, l2);
     82  1.1  riastrad         crypto_onetimeauth_update(&st, m + l1 + l2, mlen - l1 - l2);
     83  1.1  riastrad         crypto_onetimeauth_final(&st, h);
     84  1.1  riastrad 
     85  1.1  riastrad         crypto_onetimeauth(h2, m, mlen, k);
     86  1.1  riastrad 
     87  1.1  riastrad         assert(memcmp(h, h2, crypto_onetimeauth_BYTES) == 0);
     88  1.1  riastrad 
     89  1.1  riastrad         sodium_free(h2);
     90  1.1  riastrad         sodium_free(h);
     91  1.1  riastrad         sodium_free(k);
     92  1.1  riastrad         sodium_free(m);
     93  1.1  riastrad     }
     94  1.1  riastrad }
     95  1.1  riastrad 
     96  1.1  riastrad static void
     97  1.1  riastrad mm_hmacsha256(void)
     98  1.1  riastrad {
     99  1.1  riastrad     crypto_auth_hmacsha256_state st;
    100  1.1  riastrad     unsigned char *h, *h2;
    101  1.1  riastrad     unsigned char *k;
    102  1.1  riastrad     unsigned char *m;
    103  1.1  riastrad     size_t         mlen;
    104  1.1  riastrad     size_t         l1, l2;
    105  1.1  riastrad     int            i;
    106  1.1  riastrad 
    107  1.1  riastrad     for (i = 0; i < MAX_ITER; i++) {
    108  1.1  riastrad         mlen = randombytes_uniform(MAXLEN);
    109  1.1  riastrad         m = (unsigned char *) sodium_malloc(mlen);
    110  1.1  riastrad         k = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_KEYBYTES);
    111  1.1  riastrad         h = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_BYTES);
    112  1.1  riastrad         h2 = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_BYTES);
    113  1.1  riastrad 
    114  1.1  riastrad         crypto_auth_hmacsha256_keygen(k);
    115  1.1  riastrad         randombytes_buf(m, mlen);
    116  1.1  riastrad 
    117  1.1  riastrad         crypto_auth_hmacsha256_init(&st, k, crypto_auth_hmacsha256_KEYBYTES);
    118  1.1  riastrad         l1 = randombytes_uniform((uint32_t) mlen);
    119  1.1  riastrad         l2 = randombytes_uniform((uint32_t) (mlen - l1));
    120  1.1  riastrad         crypto_auth_hmacsha256_update(&st, m, l1);
    121  1.1  riastrad         crypto_auth_hmacsha256_update(&st, m + l1, l2);
    122  1.1  riastrad         crypto_auth_hmacsha256_update(&st, m + l1 + l2, mlen - l1 - l2);
    123  1.1  riastrad         crypto_auth_hmacsha256_final(&st, h);
    124  1.1  riastrad 
    125  1.1  riastrad         crypto_auth_hmacsha256(h2, m, mlen, k);
    126  1.1  riastrad 
    127  1.1  riastrad         assert(memcmp(h, h2, crypto_auth_hmacsha256_BYTES) == 0);
    128  1.1  riastrad 
    129  1.1  riastrad         sodium_free(h2);
    130  1.1  riastrad         sodium_free(h);
    131  1.1  riastrad         sodium_free(k);
    132  1.1  riastrad         sodium_free(m);
    133  1.1  riastrad     }
    134  1.1  riastrad }
    135  1.1  riastrad 
    136  1.1  riastrad static void
    137  1.1  riastrad mm_hmacsha512(void)
    138  1.1  riastrad {
    139  1.1  riastrad     crypto_auth_hmacsha512_state st;
    140  1.1  riastrad     unsigned char *h, *h2;
    141  1.1  riastrad     unsigned char *k;
    142  1.1  riastrad     unsigned char *m;
    143  1.1  riastrad     size_t         mlen;
    144  1.1  riastrad     size_t         l1, l2;
    145  1.1  riastrad     int            i;
    146  1.1  riastrad 
    147  1.1  riastrad     for (i = 0; i < MAX_ITER; i++) {
    148  1.1  riastrad         mlen = randombytes_uniform(MAXLEN);
    149  1.1  riastrad         m = (unsigned char *) sodium_malloc(mlen);
    150  1.1  riastrad         k = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_KEYBYTES);
    151  1.1  riastrad         h = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_BYTES);
    152  1.1  riastrad         h2 = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_BYTES);
    153  1.1  riastrad 
    154  1.1  riastrad         crypto_auth_hmacsha512_keygen(k);
    155  1.1  riastrad         randombytes_buf(m, mlen);
    156  1.1  riastrad 
    157  1.1  riastrad         crypto_auth_hmacsha512_init(&st, k, crypto_auth_hmacsha512_KEYBYTES);
    158  1.1  riastrad         l1 = randombytes_uniform((uint32_t) mlen);
    159  1.1  riastrad         l2 = randombytes_uniform((uint32_t) (mlen - l1));
    160  1.1  riastrad         crypto_auth_hmacsha512_update(&st, m, l1);
    161  1.1  riastrad         crypto_auth_hmacsha512_update(&st, m + l1, l2);
    162  1.1  riastrad         crypto_auth_hmacsha512_update(&st, m + l1 + l2, mlen - l1 - l2);
    163  1.1  riastrad         crypto_auth_hmacsha512_final(&st, h);
    164  1.1  riastrad 
    165  1.1  riastrad         crypto_auth_hmacsha512(h2, m, mlen, k);
    166  1.1  riastrad 
    167  1.1  riastrad         assert(memcmp(h, h2, crypto_auth_hmacsha512_BYTES) == 0);
    168  1.1  riastrad 
    169  1.1  riastrad         sodium_free(h2);
    170  1.1  riastrad         sodium_free(h);
    171  1.1  riastrad         sodium_free(k);
    172  1.1  riastrad         sodium_free(m);
    173  1.1  riastrad     }
    174  1.1  riastrad }
    175  1.1  riastrad 
    176  1.1  riastrad int
    177  1.1  riastrad main(void)
    178  1.1  riastrad {
    179  1.1  riastrad     mm_generichash();
    180  1.1  riastrad     mm_onetimeauth();
    181  1.1  riastrad     mm_hmacsha256();
    182  1.1  riastrad     mm_hmacsha512();
    183  1.1  riastrad 
    184  1.1  riastrad     printf("OK\n");
    185  1.1  riastrad 
    186  1.1  riastrad     return 0;
    187  1.1  riastrad }
    188