test_suite_lmots.function 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /* BEGIN_HEADER */
  2. #include "lmots.h"
  3. #include "mbedtls/lms.h"
  4. #if defined(MBEDTLS_TEST_HOOKS)
  5. int check_lmots_private_key_for_leak(unsigned char *sig)
  6. {
  7. size_t idx;
  8. for (idx = MBEDTLS_LMOTS_SIG_SIGNATURE_OFFSET(MBEDTLS_LMOTS_SHA256_N32_W8);
  9. idx < MBEDTLS_LMOTS_SIG_LEN(MBEDTLS_LMOTS_SHA256_N32_W8);
  10. idx++) {
  11. TEST_EQUAL(sig[idx], 0x7E);
  12. }
  13. return 0;
  14. exit:
  15. return -1;
  16. }
  17. #endif /* defined(MBEDTLS_TEST_HOOKS) */
  18. /* END_HEADER */
  19. /* BEGIN_DEPENDENCIES
  20. * depends_on:MBEDTLS_LMS_C
  21. * END_DEPENDENCIES
  22. */
  23. /* BEGIN_CASE depends_on:MBEDTLS_LMS_PRIVATE */
  24. void lmots_sign_verify_test(data_t *msg, data_t *key_id, int leaf_id,
  25. data_t *seed)
  26. {
  27. mbedtls_lmots_public_t pub_ctx;
  28. mbedtls_lmots_private_t priv_ctx;
  29. unsigned char sig[MBEDTLS_LMOTS_SIG_LEN(MBEDTLS_LMOTS_SHA256_N32_W8)];
  30. mbedtls_lmots_public_init(&pub_ctx);
  31. mbedtls_lmots_private_init(&priv_ctx);
  32. TEST_EQUAL(mbedtls_lmots_generate_private_key(&priv_ctx, MBEDTLS_LMOTS_SHA256_N32_W8,
  33. key_id->x, leaf_id, seed->x, seed->len), 0);
  34. TEST_EQUAL(mbedtls_lmots_calculate_public_key(&pub_ctx, &priv_ctx), 0);
  35. TEST_EQUAL(mbedtls_lmots_sign(&priv_ctx, &mbedtls_test_rnd_std_rand, NULL,
  36. msg->x, msg->len, sig, sizeof(sig), NULL), 0);
  37. TEST_EQUAL(mbedtls_lmots_verify(&pub_ctx, msg->x, msg->len, sig, sizeof(sig)), 0);
  38. exit:
  39. mbedtls_lmots_public_free(&pub_ctx);
  40. mbedtls_lmots_private_free(&priv_ctx);
  41. }
  42. /* END_CASE */
  43. /* BEGIN_CASE depends_on:MBEDTLS_LMS_PRIVATE */
  44. void lmots_sign_verify_null_msg_test(data_t *key_id, int leaf_id, data_t *seed)
  45. {
  46. mbedtls_lmots_public_t pub_ctx;
  47. mbedtls_lmots_private_t priv_ctx;
  48. unsigned char sig[MBEDTLS_LMOTS_SIG_LEN(MBEDTLS_LMOTS_SHA256_N32_W8)];
  49. mbedtls_lmots_public_init(&pub_ctx);
  50. mbedtls_lmots_private_init(&priv_ctx);
  51. TEST_EQUAL(mbedtls_lmots_generate_private_key(&priv_ctx, MBEDTLS_LMOTS_SHA256_N32_W8,
  52. key_id->x, leaf_id, seed->x, seed->len), 0);
  53. TEST_EQUAL(mbedtls_lmots_calculate_public_key(&pub_ctx, &priv_ctx), 0);
  54. TEST_EQUAL(mbedtls_lmots_sign(&priv_ctx, &mbedtls_test_rnd_std_rand, NULL,
  55. NULL, 0, sig, sizeof(sig), NULL), 0);
  56. TEST_EQUAL(mbedtls_lmots_verify(&pub_ctx, NULL, 0, sig, sizeof(sig)), 0);
  57. exit:
  58. mbedtls_lmots_public_free(&pub_ctx);
  59. mbedtls_lmots_private_free(&priv_ctx);
  60. }
  61. /* END_CASE */
  62. /* BEGIN_CASE */
  63. void lmots_verify_test(data_t *msg, data_t *sig, data_t *pub_key,
  64. int expected_rc)
  65. {
  66. mbedtls_lmots_public_t ctx;
  67. unsigned int size;
  68. unsigned char *tmp_sig = NULL;
  69. mbedtls_lmots_public_init(&ctx);
  70. TEST_EQUAL(mbedtls_lmots_import_public_key(&ctx, pub_key->x, pub_key->len), 0);
  71. TEST_EQUAL(mbedtls_lmots_verify(&ctx, msg->x, msg->len, sig->x, sig->len), expected_rc);
  72. /* Test negative cases if the input data is valid */
  73. if (expected_rc == 0) {
  74. if (msg->len >= 1) {
  75. /* Altering first message byte must cause verification failure */
  76. msg->x[0] ^= 1;
  77. TEST_EQUAL(mbedtls_lmots_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  78. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  79. msg->x[0] ^= 1;
  80. /* Altering last message byte must cause verification failure */
  81. msg->x[msg->len - 1] ^= 1;
  82. TEST_EQUAL(mbedtls_lmots_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  83. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  84. msg->x[msg->len - 1] ^= 1;
  85. }
  86. /* Altering first signature byte must cause verification failure */
  87. sig->x[0] ^= 1;
  88. TEST_EQUAL(mbedtls_lmots_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  89. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  90. sig->x[0] ^= 1;
  91. /* Altering last signature byte must cause verification failure */
  92. sig->x[sig->len - 1] ^= 1;
  93. TEST_EQUAL(mbedtls_lmots_verify(&ctx, msg->x, msg->len, sig->x, sig->len),
  94. MBEDTLS_ERR_LMS_VERIFY_FAILED);
  95. sig->x[sig->len - 1] ^= 1;
  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_lmots_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_lmots_public_free(&ctx);
  114. }
  115. /* END_CASE */
  116. /* BEGIN_CASE */
  117. void lmots_import_export_test(data_t *pub_key, int expected_import_rc)
  118. {
  119. mbedtls_lmots_public_t ctx;
  120. unsigned char *exported_pub_key = NULL;
  121. size_t exported_pub_key_buf_size;
  122. size_t exported_pub_key_size;
  123. mbedtls_lmots_public_init(&ctx);
  124. TEST_EQUAL(mbedtls_lmots_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_LMOTS_PUBLIC_KEY_LEN(MBEDTLS_LMOTS_SHA256_N32_W8);
  128. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  129. TEST_EQUAL(mbedtls_lmots_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_LMOTS_PUBLIC_KEY_LEN(MBEDTLS_LMOTS_SHA256_N32_W8));
  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_LMOTS_PUBLIC_KEY_LEN(MBEDTLS_LMOTS_SHA256_N32_W8) - 1;
  140. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  141. TEST_EQUAL(mbedtls_lmots_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_LMOTS_PUBLIC_KEY_LEN(MBEDTLS_LMOTS_SHA256_N32_W8) + 1;
  148. ASSERT_ALLOC(exported_pub_key, exported_pub_key_buf_size);
  149. TEST_EQUAL(mbedtls_lmots_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_lmots_public_free(&ctx);
  160. mbedtls_free(exported_pub_key);
  161. }
  162. /* END_CASE */
  163. /* BEGIN_CASE depends_on:MBEDTLS_LMS_PRIVATE */
  164. void lmots_reuse_test(data_t *msg, data_t *key_id, int leaf_id, data_t *seed)
  165. {
  166. mbedtls_lmots_private_t ctx;
  167. unsigned char sig[MBEDTLS_LMOTS_SIG_LEN(MBEDTLS_LMOTS_SHA256_N32_W8)];
  168. mbedtls_lmots_private_init(&ctx);
  169. TEST_EQUAL(mbedtls_lmots_generate_private_key(&ctx, MBEDTLS_LMOTS_SHA256_N32_W8,
  170. key_id->x, leaf_id, seed->x,
  171. seed->len), 0);
  172. TEST_EQUAL(mbedtls_lmots_sign(&ctx, mbedtls_test_rnd_std_rand, NULL,
  173. msg->x, msg->len, sig, sizeof(sig), NULL), 0);
  174. /* Running another sign operation should fail, since the key should now have
  175. * been erased.
  176. */
  177. TEST_EQUAL(mbedtls_lmots_sign(&ctx, mbedtls_test_rnd_std_rand, NULL,
  178. msg->x, msg->len, sig, sizeof(sig), NULL),
  179. MBEDTLS_ERR_LMS_BAD_INPUT_DATA);
  180. exit:
  181. mbedtls_lmots_private_free(&ctx);
  182. }
  183. /* END_CASE */
  184. /* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_LMS_PRIVATE */
  185. void lmots_signature_leak_test(data_t *msg, data_t *key_id, int leaf_id,
  186. data_t *seed)
  187. {
  188. mbedtls_lmots_private_t ctx;
  189. unsigned char sig[MBEDTLS_LMOTS_SIG_LEN(MBEDTLS_LMOTS_SHA256_N32_W8)];
  190. mbedtls_lmots_sign_private_key_invalidated_hook = &check_lmots_private_key_for_leak;
  191. /* Fill with recognisable pattern */
  192. memset(sig, 0x7E, sizeof(sig));
  193. mbedtls_lmots_private_init(&ctx);
  194. TEST_EQUAL(mbedtls_lmots_generate_private_key(&ctx, MBEDTLS_LMOTS_SHA256_N32_W8,
  195. key_id->x, leaf_id, seed->x,
  196. seed->len), 0);
  197. TEST_EQUAL(mbedtls_lmots_sign(&ctx, mbedtls_test_rnd_std_rand, NULL,
  198. msg->x, msg->len, sig, sizeof(sig), NULL), 0);
  199. exit:
  200. mbedtls_lmots_private_free(&ctx);
  201. mbedtls_lmots_sign_private_key_invalidated_hook = NULL;
  202. }
  203. /* END_CASE */