2
0

rsa_test.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "test.h"
  2. #ifdef MRSA
  3. #define RSA_MSGSIZE 78
  4. int rsa_test(void)
  5. {
  6. unsigned char in[1024], out[1024], tmp[1024];
  7. rsa_key key, privKey, pubKey;
  8. int hash_idx, prng_idx, stat, stat2;
  9. unsigned long rsa_msgsize, len, len2;
  10. static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 };
  11. hash_idx = find_hash("sha1");
  12. prng_idx = find_prng("yarrow");
  13. if (hash_idx == -1 || prng_idx == -1) {
  14. printf("rsa_test requires SHA1 and yarrow");
  15. return 1;
  16. }
  17. /* make a random key */
  18. DO(rsa_make_key(&test_yarrow, prng_idx, 1024/8, 65537, &key));
  19. /* test PKCS #1 v1.5 */
  20. for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) {
  21. /* make a random key/msg */
  22. yarrow_read(in, rsa_msgsize, &test_yarrow);
  23. len = sizeof(out);
  24. len2 = rsa_msgsize;
  25. /* encrypt */
  26. DO(rsa_v15_encrypt_key(in, rsa_msgsize, out, &len, &test_yarrow, prng_idx, &key));
  27. DO(rsa_v15_decrypt_key(out, len, tmp, rsa_msgsize, &test_yarrow, prng_idx, &stat, &key));
  28. if (stat != 1 || memcmp(tmp, in, rsa_msgsize)) {
  29. printf("PKCS #1 v1.5 encrypt/decrypt failure (rsa_msgsize: %lu, stat: %d)\n", rsa_msgsize, stat);
  30. return 1;
  31. }
  32. }
  33. /* signature */
  34. len = sizeof(out);
  35. DO(rsa_v15_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, &key));
  36. in[1] ^= 1;
  37. DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat, &key));
  38. in[1] ^= 1;
  39. DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  40. if (!(stat == 0 && stat2 == 1)) {
  41. printf("PKCS #1 v1.5 sign/verify failure (stat %d, stat2 %d)\n", stat, stat2);
  42. return 1;
  43. }
  44. /* encrypt the key (without lparam) */
  45. for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
  46. /* make a random key/msg */
  47. yarrow_read(in, rsa_msgsize, &test_yarrow);
  48. len = sizeof(out);
  49. len2 = rsa_msgsize;
  50. DO(rsa_encrypt_key(in, rsa_msgsize, out, &len, NULL, 0, &test_yarrow, prng_idx, hash_idx, &key));
  51. /* change a byte */
  52. out[8] ^= 1;
  53. DO(rsa_decrypt_key(out, len, tmp, &len2, NULL, 0, &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  54. /* change a byte back */
  55. out[8] ^= 1;
  56. if (len2 != rsa_msgsize) {
  57. printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2);
  58. return 1;
  59. }
  60. len2 = rsa_msgsize;
  61. DO(rsa_decrypt_key(out, len, tmp, &len2, NULL, 0, &test_yarrow, prng_idx, hash_idx, &stat, &key));
  62. if (!(stat == 1 && stat2 == 0)) {
  63. printf("rsa_decrypt_key failed");
  64. return 1;
  65. }
  66. if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
  67. unsigned long x;
  68. printf("\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2);
  69. printf("Original contents: \n");
  70. for (x = 0; x < rsa_msgsize; ) {
  71. printf("%02x ", in[x]);
  72. if (!(++x % 16)) {
  73. printf("\n");
  74. }
  75. }
  76. printf("\n");
  77. printf("Output contents: \n");
  78. for (x = 0; x < rsa_msgsize; ) {
  79. printf("%02x ", out[x]);
  80. if (!(++x % 16)) {
  81. printf("\n");
  82. }
  83. }
  84. printf("\n");
  85. return 1;
  86. }
  87. }
  88. /* encrypt the key (with lparam) */
  89. for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
  90. len = sizeof(out);
  91. len2 = rsa_msgsize;
  92. DO(rsa_encrypt_key(in, rsa_msgsize, out, &len, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &key));
  93. /* change a byte */
  94. out[8] ^= 1;
  95. DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  96. if (len2 != rsa_msgsize) {
  97. printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2);
  98. return 1;
  99. }
  100. /* change a byte back */
  101. out[8] ^= 1;
  102. len2 = rsa_msgsize;
  103. DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &stat, &key));
  104. if (!(stat == 1 && stat2 == 0)) {
  105. printf("rsa_decrypt_key failed");
  106. return 1;
  107. }
  108. if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
  109. printf("rsa_decrypt_key mismatch len %lu", len2);
  110. return 1;
  111. }
  112. }
  113. /* sign a message (unsalted, lower cholestorol and Atkins approved) now */
  114. len = sizeof(out);
  115. DO(rsa_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, 0, &key));
  116. /* export key and import as both private and public */
  117. len2 = sizeof(tmp);
  118. DO(rsa_export(tmp, &len2, PK_PRIVATE, &key));
  119. DO(rsa_import(tmp, len2, &privKey));
  120. len2 = sizeof(tmp);
  121. DO(rsa_export(tmp, &len2, PK_PUBLIC, &key));
  122. DO(rsa_import(tmp, len2, &pubKey));
  123. /* verify with original */
  124. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat, &key));
  125. /* change a byte */
  126. in[0] ^= 1;
  127. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat2, &key));
  128. if (!(stat == 1 && stat2 == 0)) {
  129. printf("rsa_verify_hash (unsalted, origKey) failed, %d, %d", stat, stat2);
  130. rsa_free(&key);
  131. rsa_free(&pubKey);
  132. rsa_free(&privKey);
  133. return 1;
  134. }
  135. /* verify with privKey */
  136. /* change a byte */
  137. in[0] ^= 1;
  138. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat, &privKey));
  139. /* change a byte */
  140. in[0] ^= 1;
  141. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat2, &privKey));
  142. if (!(stat == 1 && stat2 == 0)) {
  143. printf("rsa_verify_hash (unsalted, privKey) failed, %d, %d", stat, stat2);
  144. rsa_free(&key);
  145. rsa_free(&pubKey);
  146. rsa_free(&privKey);
  147. return 1;
  148. }
  149. /* verify with pubKey */
  150. /* change a byte */
  151. in[0] ^= 1;
  152. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat, &pubKey));
  153. /* change a byte */
  154. in[0] ^= 1;
  155. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat2, &pubKey));
  156. if (!(stat == 1 && stat2 == 0)) {
  157. printf("rsa_verify_hash (unsalted, pubkey) failed, %d, %d", stat, stat2);
  158. rsa_free(&key);
  159. rsa_free(&pubKey);
  160. rsa_free(&privKey);
  161. return 1;
  162. }
  163. /* sign a message (salted) now (use privKey to make, pubKey to verify) */
  164. len = sizeof(out);
  165. DO(rsa_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, 8, &privKey));
  166. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 8, &stat, &pubKey));
  167. /* change a byte */
  168. in[0] ^= 1;
  169. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 8, &stat2, &pubKey));
  170. if (!(stat == 1 && stat2 == 0)) {
  171. printf("rsa_verify_hash (salted) failed, %d, %d", stat, stat2);
  172. rsa_free(&key);
  173. rsa_free(&pubKey);
  174. rsa_free(&privKey);
  175. return 1;
  176. }
  177. /* free the key and return */
  178. rsa_free(&key);
  179. rsa_free(&pubKey);
  180. rsa_free(&privKey);
  181. return 0;
  182. }
  183. #else
  184. int rsa_test(void)
  185. {
  186. printf("NOP");
  187. return 0;
  188. }
  189. #endif