2
0

rsa_test.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "test.h"
  2. #define RSA_MSGSIZE 78
  3. int rsa_test(void)
  4. {
  5. unsigned char in[1024], out[1024], tmp[1024];
  6. rsa_key key;
  7. int hash_idx, prng_idx, stat, stat2;
  8. unsigned long rsa_msgsize, len, len2;
  9. static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 };
  10. hash_idx = find_hash("sha1");
  11. prng_idx = find_prng("yarrow");
  12. if (hash_idx == -1 || prng_idx == -1) {
  13. printf("rsa_test requires SHA1 and yarrow");
  14. return 1;
  15. }
  16. /* make a random key */
  17. DO(rsa_make_key(&test_yarrow, prng_idx, 1024/8, 65537, &key));
  18. /* test PKCS #1 v1.5 */
  19. for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) {
  20. /* make a random key/msg */
  21. yarrow_read(in, rsa_msgsize, &test_yarrow);
  22. len = sizeof(out);
  23. len2 = rsa_msgsize;
  24. /* encrypt */
  25. DO(rsa_v15_encrypt_key(in, rsa_msgsize, out, &len, &test_yarrow, prng_idx, &key));
  26. DO(rsa_v15_decrypt_key(out, len, tmp, rsa_msgsize, &test_yarrow, prng_idx, &stat, &key));
  27. if (stat != 1 || memcmp(tmp, in, rsa_msgsize)) {
  28. printf("PKCS #1 v1.5 encrypt/decrypt failure (rsa_msgsize: %lu, stat: %d)\n", rsa_msgsize, stat);
  29. return 1;
  30. }
  31. }
  32. /* signature */
  33. len = sizeof(out);
  34. DO(rsa_v15_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, &key));
  35. in[1] ^= 1;
  36. DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat, &key));
  37. in[1] ^= 1;
  38. DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  39. if (!(stat == 0 && stat2 == 1)) {
  40. printf("PKCS #1 v1.5 sign/verify failure (stat %d, stat2 %d)\n", stat, stat2);
  41. return 1;
  42. }
  43. /* encrypt the key (without lparam) */
  44. for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
  45. /* make a random key/msg */
  46. yarrow_read(in, rsa_msgsize, &test_yarrow);
  47. len = sizeof(out);
  48. len2 = rsa_msgsize;
  49. DO(rsa_encrypt_key(in, rsa_msgsize, out, &len, NULL, 0, &test_yarrow, prng_idx, hash_idx, &key));
  50. /* change a byte */
  51. out[8] ^= 1;
  52. DO(rsa_decrypt_key(out, len, tmp, &len2, NULL, 0, &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  53. /* change a byte back */
  54. out[8] ^= 1;
  55. if (len2 != rsa_msgsize) {
  56. printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2);
  57. return 1;
  58. }
  59. len2 = rsa_msgsize;
  60. DO(rsa_decrypt_key(out, len, tmp, &len2, NULL, 0, &test_yarrow, prng_idx, hash_idx, &stat, &key));
  61. if (!(stat == 1 && stat2 == 0)) {
  62. printf("rsa_decrypt_key failed");
  63. return 1;
  64. }
  65. if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
  66. unsigned long x;
  67. printf("\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2);
  68. printf("Original contents: \n");
  69. for (x = 0; x < rsa_msgsize; ) {
  70. printf("%02x ", in[x]);
  71. if (!(++x % 16)) {
  72. printf("\n");
  73. }
  74. }
  75. printf("\n");
  76. printf("Output contents: \n");
  77. for (x = 0; x < rsa_msgsize; ) {
  78. printf("%02x ", out[x]);
  79. if (!(++x % 16)) {
  80. printf("\n");
  81. }
  82. }
  83. printf("\n");
  84. return 1;
  85. }
  86. }
  87. /* encrypt the key (with lparam) */
  88. for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
  89. len = sizeof(out);
  90. len2 = rsa_msgsize;
  91. DO(rsa_encrypt_key(in, rsa_msgsize, out, &len, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &key));
  92. /* change a byte */
  93. out[8] ^= 1;
  94. DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &stat2, &key));
  95. if (len2 != rsa_msgsize) {
  96. printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2);
  97. return 1;
  98. }
  99. /* change a byte back */
  100. out[8] ^= 1;
  101. len2 = rsa_msgsize;
  102. DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), &test_yarrow, prng_idx, hash_idx, &stat, &key));
  103. if (!(stat == 1 && stat2 == 0)) {
  104. printf("rsa_decrypt_key failed");
  105. return 1;
  106. }
  107. if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
  108. printf("rsa_decrypt_key mismatch len %lu", len2);
  109. return 1;
  110. }
  111. }
  112. /* sign a message (unsalted, lower cholestorol and Atkins approved) now */
  113. len = sizeof(out);
  114. DO(rsa_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, 0, &key));
  115. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat, &key));
  116. /* change a byte */
  117. in[0] ^= 1;
  118. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 0, &stat2, &key));
  119. if (!(stat == 1 && stat2 == 0)) {
  120. printf("rsa_verify_hash (unsalted) failed, %d, %d", stat, stat2);
  121. return 1;
  122. }
  123. /* sign a message (salted) now */
  124. len = sizeof(out);
  125. DO(rsa_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, 8, &key));
  126. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 8, &stat, &key));
  127. /* change a byte */
  128. in[0] ^= 1;
  129. DO(rsa_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, 8, &stat2, &key));
  130. if (!(stat == 1 && stat2 == 0)) {
  131. printf("rsa_verify_hash (salted) failed, %d, %d", stat, stat2);
  132. return 1;
  133. }
  134. /* free the key and return */
  135. rsa_free(&key);
  136. return 0;
  137. }