|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
#define TEST_NAME "metamorphic"
|
|
rdobuilder |
775784 |
#include "cmptest.h"
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
#define MAXLEN 512
|
|
rdobuilder |
775784 |
#define MAX_ITER 1000
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
static void
|
|
rdobuilder |
775784 |
mm_generichash(void)
|
|
rdobuilder |
775784 |
{
|
|
rdobuilder |
775784 |
crypto_generichash_state st;
|
|
rdobuilder |
775784 |
unsigned char *h, *h2;
|
|
rdobuilder |
775784 |
unsigned char *k;
|
|
rdobuilder |
775784 |
unsigned char *m;
|
|
rdobuilder |
775784 |
size_t hlen;
|
|
rdobuilder |
775784 |
size_t klen;
|
|
rdobuilder |
775784 |
size_t mlen;
|
|
rdobuilder |
775784 |
size_t l1, l2;
|
|
rdobuilder |
775784 |
int i;
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
for (i = 0; i < MAX_ITER; i++) {
|
|
rdobuilder |
775784 |
mlen = randombytes_uniform(MAXLEN);
|
|
rdobuilder |
775784 |
m = (unsigned char *) sodium_malloc(mlen);
|
|
rdobuilder |
775784 |
klen = randombytes_uniform(crypto_generichash_KEYBYTES_MAX -
|
|
rdobuilder |
775784 |
crypto_generichash_KEYBYTES_MIN + 1U)
|
|
rdobuilder |
775784 |
+ crypto_generichash_KEYBYTES_MIN;
|
|
rdobuilder |
775784 |
k = (unsigned char *) sodium_malloc(klen);
|
|
rdobuilder |
775784 |
hlen = randombytes_uniform(crypto_generichash_BYTES_MAX -
|
|
rdobuilder |
775784 |
crypto_generichash_BYTES_MIN + 1U)
|
|
rdobuilder |
775784 |
+ crypto_generichash_BYTES_MIN;
|
|
rdobuilder |
775784 |
h = (unsigned char *) sodium_malloc(hlen);
|
|
rdobuilder |
775784 |
h2 = (unsigned char *) sodium_malloc(hlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
randombytes_buf(k, klen);
|
|
rdobuilder |
775784 |
randombytes_buf(m, mlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_generichash_init(&st, k, klen, hlen);
|
|
rdobuilder |
775784 |
l1 = randombytes_uniform((uint32_t) mlen);
|
|
rdobuilder |
775784 |
l2 = randombytes_uniform((uint32_t) (mlen - l1));
|
|
rdobuilder |
775784 |
crypto_generichash_update(&st, m, l1);
|
|
rdobuilder |
775784 |
crypto_generichash_update(&st, m + l1, l2);
|
|
rdobuilder |
775784 |
crypto_generichash_update(&st, m + l1 + l2, mlen - l1 - l2);
|
|
rdobuilder |
775784 |
crypto_generichash_final(&st, h, hlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_generichash(h2, hlen, m, mlen, k, klen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
assert(memcmp(h, h2, hlen) == 0);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
sodium_free(h2);
|
|
rdobuilder |
775784 |
sodium_free(h);
|
|
rdobuilder |
775784 |
sodium_free(k);
|
|
rdobuilder |
775784 |
sodium_free(m);
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
static void
|
|
rdobuilder |
775784 |
mm_onetimeauth(void)
|
|
rdobuilder |
775784 |
{
|
|
rdobuilder |
775784 |
crypto_onetimeauth_state st;
|
|
rdobuilder |
775784 |
unsigned char *h, *h2;
|
|
rdobuilder |
775784 |
unsigned char *k;
|
|
rdobuilder |
775784 |
unsigned char *m;
|
|
rdobuilder |
775784 |
size_t mlen;
|
|
rdobuilder |
775784 |
size_t l1, l2;
|
|
rdobuilder |
775784 |
int i;
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
for (i = 0; i < MAX_ITER; i++) {
|
|
rdobuilder |
775784 |
mlen = randombytes_uniform(MAXLEN);
|
|
rdobuilder |
775784 |
m = (unsigned char *) sodium_malloc(mlen);
|
|
rdobuilder |
775784 |
k = (unsigned char *) sodium_malloc(crypto_onetimeauth_KEYBYTES);
|
|
rdobuilder |
775784 |
h = (unsigned char *) sodium_malloc(crypto_onetimeauth_BYTES);
|
|
rdobuilder |
775784 |
h2 = (unsigned char *) sodium_malloc(crypto_onetimeauth_BYTES);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_onetimeauth_keygen(k);
|
|
rdobuilder |
775784 |
randombytes_buf(m, mlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_onetimeauth_init(&st, k);
|
|
rdobuilder |
775784 |
l1 = randombytes_uniform((uint32_t) mlen);
|
|
rdobuilder |
775784 |
l2 = randombytes_uniform((uint32_t) (mlen - l1));
|
|
rdobuilder |
775784 |
crypto_onetimeauth_update(&st, m, l1);
|
|
rdobuilder |
775784 |
crypto_onetimeauth_update(&st, m + l1, l2);
|
|
rdobuilder |
775784 |
crypto_onetimeauth_update(&st, m + l1 + l2, mlen - l1 - l2);
|
|
rdobuilder |
775784 |
crypto_onetimeauth_final(&st, h);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_onetimeauth(h2, m, mlen, k);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
assert(memcmp(h, h2, crypto_onetimeauth_BYTES) == 0);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
sodium_free(h2);
|
|
rdobuilder |
775784 |
sodium_free(h);
|
|
rdobuilder |
775784 |
sodium_free(k);
|
|
rdobuilder |
775784 |
sodium_free(m);
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
static void
|
|
rdobuilder |
775784 |
mm_hmacsha256(void)
|
|
rdobuilder |
775784 |
{
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_state st;
|
|
rdobuilder |
775784 |
unsigned char *h, *h2;
|
|
rdobuilder |
775784 |
unsigned char *k;
|
|
rdobuilder |
775784 |
unsigned char *m;
|
|
rdobuilder |
775784 |
size_t mlen;
|
|
rdobuilder |
775784 |
size_t l1, l2;
|
|
rdobuilder |
775784 |
int i;
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
for (i = 0; i < MAX_ITER; i++) {
|
|
rdobuilder |
775784 |
mlen = randombytes_uniform(MAXLEN);
|
|
rdobuilder |
775784 |
m = (unsigned char *) sodium_malloc(mlen);
|
|
rdobuilder |
775784 |
k = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_KEYBYTES);
|
|
rdobuilder |
775784 |
h = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_BYTES);
|
|
rdobuilder |
775784 |
h2 = (unsigned char *) sodium_malloc(crypto_auth_hmacsha256_BYTES);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_keygen(k);
|
|
rdobuilder |
775784 |
randombytes_buf(m, mlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_init(&st, k, crypto_auth_hmacsha256_KEYBYTES);
|
|
rdobuilder |
775784 |
l1 = randombytes_uniform((uint32_t) mlen);
|
|
rdobuilder |
775784 |
l2 = randombytes_uniform((uint32_t) (mlen - l1));
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_update(&st, m, l1);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_update(&st, m + l1, l2);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_update(&st, m + l1 + l2, mlen - l1 - l2);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256_final(&st, h);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha256(h2, m, mlen, k);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
assert(memcmp(h, h2, crypto_auth_hmacsha256_BYTES) == 0);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
sodium_free(h2);
|
|
rdobuilder |
775784 |
sodium_free(h);
|
|
rdobuilder |
775784 |
sodium_free(k);
|
|
rdobuilder |
775784 |
sodium_free(m);
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
static void
|
|
rdobuilder |
775784 |
mm_hmacsha512(void)
|
|
rdobuilder |
775784 |
{
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_state st;
|
|
rdobuilder |
775784 |
unsigned char *h, *h2;
|
|
rdobuilder |
775784 |
unsigned char *k;
|
|
rdobuilder |
775784 |
unsigned char *m;
|
|
rdobuilder |
775784 |
size_t mlen;
|
|
rdobuilder |
775784 |
size_t l1, l2;
|
|
rdobuilder |
775784 |
int i;
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
for (i = 0; i < MAX_ITER; i++) {
|
|
rdobuilder |
775784 |
mlen = randombytes_uniform(MAXLEN);
|
|
rdobuilder |
775784 |
m = (unsigned char *) sodium_malloc(mlen);
|
|
rdobuilder |
775784 |
k = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_KEYBYTES);
|
|
rdobuilder |
775784 |
h = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_BYTES);
|
|
rdobuilder |
775784 |
h2 = (unsigned char *) sodium_malloc(crypto_auth_hmacsha512_BYTES);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_keygen(k);
|
|
rdobuilder |
775784 |
randombytes_buf(m, mlen);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_init(&st, k, crypto_auth_hmacsha512_KEYBYTES);
|
|
rdobuilder |
775784 |
l1 = randombytes_uniform((uint32_t) mlen);
|
|
rdobuilder |
775784 |
l2 = randombytes_uniform((uint32_t) (mlen - l1));
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_update(&st, m, l1);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_update(&st, m + l1, l2);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_update(&st, m + l1 + l2, mlen - l1 - l2);
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512_final(&st, h);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
crypto_auth_hmacsha512(h2, m, mlen, k);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
assert(memcmp(h, h2, crypto_auth_hmacsha512_BYTES) == 0);
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
sodium_free(h2);
|
|
rdobuilder |
775784 |
sodium_free(h);
|
|
rdobuilder |
775784 |
sodium_free(k);
|
|
rdobuilder |
775784 |
sodium_free(m);
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
}
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
int
|
|
rdobuilder |
775784 |
main(void)
|
|
rdobuilder |
775784 |
{
|
|
rdobuilder |
775784 |
mm_generichash();
|
|
rdobuilder |
775784 |
mm_onetimeauth();
|
|
rdobuilder |
775784 |
mm_hmacsha256();
|
|
rdobuilder |
775784 |
mm_hmacsha512();
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
printf("OK\n");
|
|
rdobuilder |
775784 |
|
|
rdobuilder |
775784 |
return 0;
|
|
rdobuilder |
775784 |
}
|