test_suite_lms.function 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/lms.h"
  3. /* END_HEADER */
  4. /* BEGIN_DEPENDENCIES
  5. * depends_on:MBEDTLS_LMS_C
  6. * END_DEPENDENCIES
  7. */
  8. /* BEGIN_CASE depends_on:MBEDTLS_LMS_PRIVATE */
  9. void lms_sign_verify_test(data_t *msg, data_t *seed)
  10. {
  11. mbedtls_lms_public_t pub_ctx;
  12. mbedtls_lms_private_t priv_ctx;
  13. unsigned char sig[MBEDTLS_LMS_SIG_LEN(MBEDTLS_LMS_SHA256_M32_H10, MBEDTLS_LMOTS_SHA256_N32_W8)];
  14. mbedtls_lms_public_init(&pub_ctx);
  15. mbedtls_lms_private_init(&priv_ctx);
  16. /* Allocation failure isn't a test failure, since it likely just means
  17. * there's not enough memory to run the test.
  18. */
  19. TEST_EQUAL(mbedtls_lms_generate_private_key(&priv_ctx, MBEDTLS_LMS_SHA256_M32_H10,
  20. MBEDTLS_LMOTS_SHA256_N32_W8,
  21. mbedtls_test_rnd_std_rand, NULL,
  22. seed->x, seed->len), 0);
  23. TEST_EQUAL(mbedtls_lms_calculate_public_key(&pub_ctx, &priv_ctx), 0);
  24. TEST_EQUAL(mbedtls_lms_sign(&priv_ctx, mbedtls_test_rnd_std_rand, NULL,
  25. msg->x, msg->len, sig, sizeof(sig),
  26. NULL), 0);
  27. TEST_EQUAL(mbedtls_lms_verify(&pub_ctx, msg->x, msg->len, sig,
  28. sizeof(sig)), 0);
  29. exit:
  30. mbedtls_lms_public_free(&pub_ctx);
  31. mbedtls_lms_private_free(&priv_ctx);
  32. }
  33. /* END_CASE */
  34. /* BEGIN_CASE depends_on:MBEDTLS_LMS_PRIVATE */
  35. void lms_sign_verify_null_msg_test(data_t *seed)
  36. {
  37. mbedtls_lms_public_t pub_ctx;
  38. mbedtls_lms_private_t priv_ctx;
  39. unsigned char sig[MBEDTLS_LMS_SIG_LEN(MBEDTLS_LMS_SHA256_M32_H10, MBEDTLS_LMOTS_SHA256_N32_W8)];
  40. mbedtls_lms_public_init(&pub_ctx);
  41. mbedtls_lms_private_init(&priv_ctx);
  42. /* Allocation failure isn't a test failure, since it likely just means
  43. * there's not enough memory to run the test.
  44. */
  45. TEST_EQUAL(mbedtls_lms_generate_private_key(&priv_ctx, MBEDTLS_LMS_SHA256_M32_H10,
  46. MBEDTLS_LMOTS_SHA256_N32_W8,
  47. mbedtls_test_rnd_std_rand, NULL,
  48. seed->x, seed->len), 0);
  49. TEST_EQUAL(mbedtls_lms_calculate_public_key(&pub_ctx, &priv_ctx), 0);
  50. TEST_EQUAL(mbedtls_lms_sign(&priv_ctx, mbedtls_test_rnd_std_rand, NULL,
  51. NULL, 0, sig, sizeof(sig),
  52. NULL), 0);
  53. TEST_EQUAL(mbedtls_lms_verify(&pub_ctx, NULL, 0, sig,
  54. sizeof(sig)), 0);
  55. exit:
  56. mbedtls_lms_public_free(&pub_ctx);
  57. mbedtls_lms_private_free(&priv_ctx);
  58. }
  59. /* END_CASE */
  60. /* BEGIN_CASE */
  61. void lms_verify_test(data_t *msg, data_t *sig, data_t *pub_key,
  62. int expected_rc)
  63. {
  64. mbedtls_lms_public_t ctx;
  65. unsigned int size;
  66. unsigned char *tmp_sig = NULL;
  67. mbedtls_lms_public_init(&ctx);
  68. TEST_EQUAL(mbedtls_lms_import_public_key(&ctx, pub_key->x, pub_key->len), 0);
  69. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, sig->x, sig->len), expected_rc);
  70. /* Test negative cases if the input data is valid */
  71. if (expected_rc == 0) {
  72. if (msg->len >= 1) {
  73. /* Altering first message byte must cause verification failure */
  74. msg->x[0] ^= 1;
  75. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  76. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  77. msg->x[0] ^= 1;
  78. /* Altering last message byte must cause verification failure */
  79. msg->x[msg->len - 1] ^= 1;
  80. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  81. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  82. msg->x[msg->len - 1] ^= 1;
  83. }
  84. if (sig->len >= 1) {
  85. /* Altering first signature byte must cause verification failure */
  86. sig->x[0] ^= 1;
  87. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  88. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  89. sig->x[0] ^= 1;
  90. /* Altering last signature byte must cause verification failure */
  91. sig->x[sig->len - 1] ^= 1;
  92. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  93. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  94. sig->x[sig->len - 1] ^= 1;
  95. }
  96. /* Signatures of all sizes must not verify, whether shorter or longer */
  97. for (size = 0; size < sig->len; size++) {
  98. if (size == sig->len) {
  99. continue;
  100. }
  101. ASSERT_ALLOC(tmp_sig, size);
  102. if (tmp_sig != NULL) {
  103. memcpy(tmp_sig, sig->x, MIN(size, sig->len));
  104. }
  105. TEST_EQUAL(mbedtls_lms_verify(&ctx, msg->x, msg->len, tmp_sig, size),
  106. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  107. mbedtls_free(tmp_sig);
  108. tmp_sig = NULL;
  109. }
  110. }
  111. exit:
  112. mbedtls_free(tmp_sig);
  113. mbedtls_lms_public_free(&ctx);
  114. }
  115. /* END_CASE */
  116. /* BEGIN_CASE */
  117. void lms_import_export_test(data_t *pub_key, int expected_import_rc)
  118. {
  119. mbedtls_lms_public_t ctx;
  120. size_t exported_pub_key_buf_size = 0;
  121. size_t exported_pub_key_size = 0;
  122. unsigned char *exported_pub_key = NULL;
  123. mbedtls_lms_public_init(&ctx);
  124. TEST_EQUAL(mbedtls_lms_import_public_key(&ctx, pub_key->x, pub_key->len),
  125. expected_import_rc);
  126. if (expected_import_rc == 0) {
  127. exported_pub_key_buf_size = MBEDTLS_LMS_PUBLIC_KEY_LEN(MBEDTLS_LMS_SHA256_M32_H10);
  128. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  129. TEST_EQUAL(mbedtls_lms_export_public_key(&ctx, exported_pub_key,
  130. exported_pub_key_buf_size,
  131. &exported_pub_key_size), 0);
  132. TEST_EQUAL(exported_pub_key_size,
  133. MBEDTLS_LMS_PUBLIC_KEY_LEN(MBEDTLS_LMS_SHA256_M32_H10));
  134. ASSERT_COMPARE(pub_key->x, pub_key->len,
  135. exported_pub_key, exported_pub_key_size);
  136. mbedtls_free(exported_pub_key);
  137. exported_pub_key = NULL;
  138. /* Export into too-small buffer should fail */
  139. exported_pub_key_buf_size = MBEDTLS_LMS_PUBLIC_KEY_LEN(MBEDTLS_LMS_SHA256_M32_H10) - 1;
  140. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  141. TEST_EQUAL(mbedtls_lms_export_public_key(&ctx, exported_pub_key,
  142. exported_pub_key_buf_size, NULL),
  143. MBEDTLS_ERR_LMS_BUFFER_TOO_SMALL);
  144. mbedtls_free(exported_pub_key);
  145. exported_pub_key = NULL;
  146. /* Export into too-large buffer should succeed */
  147. exported_pub_key_buf_size = MBEDTLS_LMS_PUBLIC_KEY_LEN(MBEDTLS_LMS_SHA256_M32_H10) + 1;
  148. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  149. TEST_EQUAL(mbedtls_lms_export_public_key(&ctx, exported_pub_key,
  150. exported_pub_key_buf_size,
  151. &exported_pub_key_size),
  152. 0);
  153. ASSERT_COMPARE(pub_key->x, pub_key->len,
  154. exported_pub_key, exported_pub_key_size);
  155. mbedtls_free(exported_pub_key);
  156. exported_pub_key = NULL;
  157. }
  158. exit:
  159. mbedtls_free(exported_pub_key);
  160. mbedtls_lms_public_free(&ctx);
  161. }
  162. /* END_CASE */