rsa_test.c 6.7 KB

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