multi_test.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
  2. /* SPDX-License-Identifier: Unlicense */
  3. /* test the multi helpers... */
  4. #include <tomcrypt_test.h>
  5. int multi_test(void)
  6. {
  7. unsigned char key[32] = { 0 };
  8. unsigned char buf[2][MAXBLOCKSIZE];
  9. unsigned long len, len2;
  10. /* register algos */
  11. register_hash(&sha256_desc);
  12. register_cipher(&aes_desc);
  13. /* HASH testing */
  14. len = sizeof(buf[0]);
  15. #if defined(ENDIAN_32BITWORD) || defined(_WIN32) || defined(ENDIAN_64BITWORD_ILP32)
  16. len2 = 0x80000000UL;
  17. #else
  18. /* Check against the max. input limit of SHA-1 as of RFC8017 */
  19. len2 = 0x1ULL << 61;
  20. #endif
  21. SHOULD_FAIL_WITH(hash_memory(find_hash("sha256"), buf[0], len2, buf[0], &len), CRYPT_HASH_OVERFLOW);
  22. len = sizeof(buf[0]);
  23. hash_memory(find_hash("sha256"), (unsigned char*)"hello", 5, buf[0], &len);
  24. len2 = sizeof(buf[0]);
  25. hash_memory_multi(find_hash("sha256"), buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  26. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  27. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  28. return CRYPT_FAIL_TESTVECTOR;
  29. }
  30. len2 = sizeof(buf[0]);
  31. hash_memory_multi(find_hash("sha256"), buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  32. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  33. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  34. return CRYPT_FAIL_TESTVECTOR;
  35. }
  36. len2 = sizeof(buf[0]);
  37. hash_memory_multi(find_hash("sha256"), buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  38. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  39. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  40. return CRYPT_FAIL_TESTVECTOR;
  41. }
  42. #ifdef LTC_HMAC
  43. len = sizeof(buf[0]);
  44. hmac_memory(find_hash("sha256"), key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  45. len2 = sizeof(buf[0]);
  46. hmac_memory_multi(find_hash("sha256"), key, 16, buf[1], &len2, (unsigned char*)"hello", 5UL, LTC_NULL);
  47. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  48. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  49. return CRYPT_FAIL_TESTVECTOR;
  50. }
  51. len2 = sizeof(buf[0]);
  52. hmac_memory_multi(find_hash("sha256"), key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  53. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  54. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  55. return CRYPT_FAIL_TESTVECTOR;
  56. }
  57. len2 = sizeof(buf[0]);
  58. hmac_memory_multi(find_hash("sha256"), key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  59. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  60. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  61. return CRYPT_FAIL_TESTVECTOR;
  62. }
  63. #endif
  64. #ifdef LTC_OMAC
  65. len = sizeof(buf[0]);
  66. omac_memory(find_cipher("aes"), key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  67. len2 = sizeof(buf[0]);
  68. omac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"hello", 5UL, LTC_NULL);
  69. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  70. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  71. return CRYPT_FAIL_TESTVECTOR;
  72. }
  73. len2 = sizeof(buf[0]);
  74. omac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  75. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  76. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  77. return CRYPT_FAIL_TESTVECTOR;
  78. }
  79. len2 = sizeof(buf[0]);
  80. omac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  81. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  82. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  83. return CRYPT_FAIL_TESTVECTOR;
  84. }
  85. #endif
  86. #ifdef LTC_PMAC
  87. len = sizeof(buf[0]);
  88. pmac_memory(find_cipher("aes"), key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  89. len2 = sizeof(buf[0]);
  90. pmac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  91. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  92. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  93. return CRYPT_FAIL_TESTVECTOR;
  94. }
  95. len2 = sizeof(buf[0]);
  96. pmac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  97. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  98. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  99. return CRYPT_FAIL_TESTVECTOR;
  100. }
  101. len2 = sizeof(buf[0]);
  102. pmac_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  103. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  104. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  105. return CRYPT_FAIL_TESTVECTOR;
  106. }
  107. #endif
  108. #ifdef LTC_XCBC
  109. len = sizeof(buf[0]);
  110. xcbc_memory(find_cipher("aes"), key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  111. len2 = sizeof(buf[0]);
  112. xcbc_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  113. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  114. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  115. return CRYPT_FAIL_TESTVECTOR;
  116. }
  117. len2 = sizeof(buf[0]);
  118. xcbc_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  119. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  120. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  121. return CRYPT_FAIL_TESTVECTOR;
  122. }
  123. len2 = sizeof(buf[0]);
  124. xcbc_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  125. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  126. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  127. return CRYPT_FAIL_TESTVECTOR;
  128. }
  129. #endif
  130. #ifdef LTC_F9
  131. len = sizeof(buf[0]);
  132. f9_memory(find_cipher("aes"), key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  133. len2 = sizeof(buf[0]);
  134. f9_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  135. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  136. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  137. return CRYPT_FAIL_TESTVECTOR;
  138. }
  139. len2 = sizeof(buf[0]);
  140. f9_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  141. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  142. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  143. return CRYPT_FAIL_TESTVECTOR;
  144. }
  145. len2 = sizeof(buf[0]);
  146. f9_memory_multi(find_cipher("aes"), key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  147. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  148. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  149. return CRYPT_FAIL_TESTVECTOR;
  150. }
  151. #endif
  152. #ifdef LTC_PELICAN
  153. /* TODO: there is no pelican_memory_multi(..) */
  154. #endif
  155. #ifdef LTC_POLY1305
  156. len = sizeof(buf[0]);
  157. poly1305_memory(key, 32, (unsigned char*)"hello", 5, buf[0], &len);
  158. len2 = sizeof(buf[0]);
  159. poly1305_memory_multi(key, 32, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  160. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  161. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  162. return CRYPT_FAIL_TESTVECTOR;
  163. }
  164. len2 = sizeof(buf[0]);
  165. poly1305_memory_multi(key, 32, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  166. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  167. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  168. return CRYPT_FAIL_TESTVECTOR;
  169. }
  170. len2 = sizeof(buf[0]);
  171. poly1305_memory_multi(key, 32, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  172. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  173. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  174. return CRYPT_FAIL_TESTVECTOR;
  175. }
  176. #endif
  177. #ifdef LTC_BLAKE2SMAC
  178. len = 32;
  179. blake2smac_memory(key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  180. len2 = 32;
  181. blake2smac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  182. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  183. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  184. return CRYPT_FAIL_TESTVECTOR;
  185. }
  186. len2 = 32;
  187. blake2smac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  188. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  189. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  190. return CRYPT_FAIL_TESTVECTOR;
  191. }
  192. len2 = 32;
  193. blake2smac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  194. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  195. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  196. return CRYPT_FAIL_TESTVECTOR;
  197. }
  198. #endif
  199. #ifdef LTC_BLAKE2BMAC
  200. len = 64;
  201. blake2bmac_memory(key, 16, (unsigned char*)"hello", 5, buf[0], &len);
  202. len2 = 64;
  203. blake2bmac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"hello", 5, LTC_NULL);
  204. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  205. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  206. return CRYPT_FAIL_TESTVECTOR;
  207. }
  208. len2 = 64;
  209. blake2bmac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"he", 2UL, "llo", 3UL, LTC_NULL);
  210. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  211. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  212. return CRYPT_FAIL_TESTVECTOR;
  213. }
  214. len2 = 64;
  215. blake2bmac_memory_multi(key, 16, buf[1], &len2, (unsigned char*)"h", 1UL, "e", 1UL, "l", 1UL, "l", 1UL, "o", 1UL, LTC_NULL);
  216. if (len != len2 || memcmp(buf[0], buf[1], len)) {
  217. printf("Failed: %d %lu %lu\n", __LINE__, len, len2);
  218. return CRYPT_FAIL_TESTVECTOR;
  219. }
  220. #endif
  221. return CRYPT_OK;
  222. }