katja_test.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis
  2. *
  3. * LibTomCrypt is a library that provides various cryptographic
  4. * algorithms in a highly modular and flexible manner.
  5. *
  6. * The library is free for all purposes without any express
  7. * guarantee it works.
  8. */
  9. #include <tomcrypt_test.h>
  10. #if defined(LTC_MKAT)
  11. int katja_test(void)
  12. {
  13. unsigned char in[1024], out[1024], tmp[1024];
  14. katja_key key, privKey, pubKey;
  15. int hash_idx, prng_idx, stat, stat2, size;
  16. unsigned long kat_msgsize, len, len2, cnt;
  17. static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 };
  18. if (ltc_mp.name == NULL) return CRYPT_NOP;
  19. hash_idx = find_hash("sha1");
  20. prng_idx = find_prng("yarrow");
  21. if (hash_idx == -1 || prng_idx == -1) {
  22. fprintf(stderr, "katja_test requires LTC_SHA1 and yarrow");
  23. return 1;
  24. }
  25. for (size = 1024; size <= 2048; size += 256) {
  26. /* make 10 random key */
  27. for (cnt = 0; cnt < 10; cnt++) {
  28. DO(katja_make_key(&yarrow_prng, prng_idx, size/8, &key));
  29. if (mp_count_bits(key.N) < size - 7) {
  30. fprintf(stderr, "katja_%d key modulus has %d bits\n", size, mp_count_bits(key.N));
  31. len = mp_unsigned_bin_size(key.N);
  32. mp_to_unsigned_bin(key.N, tmp);
  33. fprintf(stderr, "N == \n");
  34. for (cnt = 0; cnt < len; ) {
  35. fprintf(stderr, "%02x ", tmp[cnt]);
  36. if (!(++cnt & 15)) fprintf(stderr, "\n");
  37. }
  38. len = mp_unsigned_bin_size(key.p);
  39. mp_to_unsigned_bin(key.p, tmp);
  40. fprintf(stderr, "p == \n");
  41. for (cnt = 0; cnt < len; ) {
  42. fprintf(stderr, "%02x ", tmp[cnt]);
  43. if (!(++cnt & 15)) fprintf(stderr, "\n");
  44. }
  45. len = mp_unsigned_bin_size(key.q);
  46. mp_to_unsigned_bin(key.q, tmp);
  47. fprintf(stderr, "\nq == \n");
  48. for (cnt = 0; cnt < len; ) {
  49. fprintf(stderr, "%02x ", tmp[cnt]);
  50. if (!(++cnt & 15)) fprintf(stderr, "\n");
  51. }
  52. fprintf(stderr, "\n");
  53. return 1;
  54. }
  55. if (cnt != 9) {
  56. katja_free(&key);
  57. }
  58. }
  59. /* encrypt the key (without lparam) */
  60. for (cnt = 0; cnt < 4; cnt++) {
  61. for (kat_msgsize = 1; kat_msgsize <= 42; kat_msgsize++) {
  62. /* make a random key/msg */
  63. yarrow_read(in, kat_msgsize, &yarrow_prng);
  64. len = sizeof(out);
  65. len2 = kat_msgsize;
  66. DO(katja_encrypt_key(in, kat_msgsize, out, &len, NULL, 0, &yarrow_prng, prng_idx, hash_idx, &key));
  67. /* change a byte */
  68. out[8] ^= 1;
  69. DO(katja_decrypt_key(out, len, tmp, &len2, NULL, 0, hash_idx, &stat2, &key));
  70. /* change a byte back */
  71. out[8] ^= 1;
  72. if (len2 != kat_msgsize) {
  73. fprintf(stderr, "\nkatja_decrypt_key mismatch len %lu (first decrypt)", len2);
  74. return 1;
  75. }
  76. len2 = kat_msgsize;
  77. DO(katja_decrypt_key(out, len, tmp, &len2, NULL, 0, hash_idx, &stat, &key));
  78. if (!(stat == 1 && stat2 == 0)) {
  79. fprintf(stderr, "katja_decrypt_key failed");
  80. return 1;
  81. }
  82. if (len2 != kat_msgsize || memcmp(tmp, in, kat_msgsize)) {
  83. unsigned long x;
  84. fprintf(stderr, "\nkatja_decrypt_key mismatch, len %lu (second decrypt)\n", len2);
  85. fprintf(stderr, "Original contents: \n");
  86. for (x = 0; x < kat_msgsize; ) {
  87. fprintf(stderr, "%02x ", in[x]);
  88. if (!(++x % 16)) {
  89. fprintf(stderr, "\n");
  90. }
  91. }
  92. fprintf(stderr, "\n");
  93. fprintf(stderr, "Output contents: \n");
  94. for (x = 0; x < kat_msgsize; ) {
  95. fprintf(stderr, "%02x ", out[x]);
  96. if (!(++x % 16)) {
  97. fprintf(stderr, "\n");
  98. }
  99. }
  100. fprintf(stderr, "\n");
  101. return 1;
  102. }
  103. }
  104. }
  105. /* encrypt the key (with lparam) */
  106. for (kat_msgsize = 1; kat_msgsize <= 42; kat_msgsize++) {
  107. len = sizeof(out);
  108. len2 = kat_msgsize;
  109. DO(katja_encrypt_key(in, kat_msgsize, out, &len, lparam, sizeof(lparam), &yarrow_prng, prng_idx, hash_idx, &key));
  110. /* change a byte */
  111. out[8] ^= 1;
  112. DO(katja_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat2, &key));
  113. if (len2 != kat_msgsize) {
  114. fprintf(stderr, "\nkatja_decrypt_key mismatch len %lu (first decrypt)", len2);
  115. return 1;
  116. }
  117. /* change a byte back */
  118. out[8] ^= 1;
  119. len2 = kat_msgsize;
  120. DO(katja_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat, &key));
  121. if (!(stat == 1 && stat2 == 0)) {
  122. fprintf(stderr, "katja_decrypt_key failed");
  123. return 1;
  124. }
  125. if (len2 != kat_msgsize || memcmp(tmp, in, kat_msgsize)) {
  126. fprintf(stderr, "katja_decrypt_key mismatch len %lu", len2);
  127. return 1;
  128. }
  129. }
  130. #if 0
  131. /* sign a message (unsalted, lower cholestorol and Atkins approved) now */
  132. len = sizeof(out);
  133. DO(katja_sign_hash(in, 20, out, &len, &yarrow_prng, prng_idx, hash_idx, 0, &key));
  134. /* export key and import as both private and public */
  135. len2 = sizeof(tmp);
  136. DO(katja_export(tmp, &len2, PK_PRIVATE, &key));
  137. DO(katja_import(tmp, len2, &privKey));
  138. len2 = sizeof(tmp);
  139. DO(katja_export(tmp, &len2, PK_PUBLIC, &key));
  140. DO(katja_import(tmp, len2, &pubKey));
  141. /* verify with original */
  142. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &key));
  143. /* change a byte */
  144. in[0] ^= 1;
  145. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &key));
  146. if (!(stat == 1 && stat2 == 0)) {
  147. fprintf(stderr, "katja_verify_hash (unsalted, origKey) failed, %d, %d", stat, stat2);
  148. katja_free(&key);
  149. katja_free(&pubKey);
  150. katja_free(&privKey);
  151. return 1;
  152. }
  153. /* verify with privKey */
  154. /* change a byte */
  155. in[0] ^= 1;
  156. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &privKey));
  157. /* change a byte */
  158. in[0] ^= 1;
  159. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &privKey));
  160. if (!(stat == 1 && stat2 == 0)) {
  161. fprintf(stderr, "katja_verify_hash (unsalted, privKey) failed, %d, %d", stat, stat2);
  162. katja_free(&key);
  163. katja_free(&pubKey);
  164. katja_free(&privKey);
  165. return 1;
  166. }
  167. /* verify with pubKey */
  168. /* change a byte */
  169. in[0] ^= 1;
  170. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &pubKey));
  171. /* change a byte */
  172. in[0] ^= 1;
  173. DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &pubKey));
  174. if (!(stat == 1 && stat2 == 0)) {
  175. fprintf(stderr, "katja_verify_hash (unsalted, pubkey) failed, %d, %d", stat, stat2);
  176. katja_free(&key);
  177. katja_free(&pubKey);
  178. katja_free(&privKey);
  179. return 1;
  180. }
  181. /* sign a message (salted) now (use privKey to make, pubKey to verify) */
  182. len = sizeof(out);
  183. DO(katja_sign_hash(in, 20, out, &len, &yarrow_prng, prng_idx, hash_idx, 8, &privKey));
  184. DO(katja_verify_hash(out, len, in, 20, hash_idx, 8, &stat, &pubKey));
  185. /* change a byte */
  186. in[0] ^= 1;
  187. DO(katja_verify_hash(out, len, in, 20, hash_idx, 8, &stat2, &pubKey));
  188. if (!(stat == 1 && stat2 == 0)) {
  189. fprintf(stderr, "katja_verify_hash (salted) failed, %d, %d", stat, stat2);
  190. katja_free(&key);
  191. katja_free(&pubKey);
  192. katja_free(&privKey);
  193. return 1;
  194. }
  195. #endif
  196. katja_free(&key);
  197. katja_free(&pubKey);
  198. katja_free(&privKey);
  199. }
  200. /* free the key and return */
  201. return 0;
  202. }
  203. #else
  204. int katja_test(void)
  205. {
  206. return CRYPT_NOP;
  207. }
  208. #endif
  209. /* ref: $Format:%D$ */
  210. /* git commit: $Format:%H$ */
  211. /* commit time: $Format:%ai$ */