I2C toy code
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

243 rindas
7.2 KiB

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