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