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