metamorphic.c 5.4 KB

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