test_suite_chachapoly.function 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/chachapoly.h"
  3. /* END_HEADER */
  4. /* BEGIN_DEPENDENCIES
  5. * depends_on:MBEDTLS_CHACHAPOLY_C
  6. * END_DEPENDENCIES
  7. */
  8. /* BEGIN_CASE */
  9. void mbedtls_chachapoly_enc(data_t *key_str,
  10. data_t *nonce_str,
  11. data_t *aad_str,
  12. data_t *input_str,
  13. data_t *output_str,
  14. data_t *mac_str)
  15. {
  16. unsigned char output[265];
  17. unsigned char mac[16]; /* size set by the standard */
  18. mbedtls_chachapoly_context ctx;
  19. TEST_ASSERT(key_str->len == 32);
  20. TEST_ASSERT(nonce_str->len == 12);
  21. TEST_ASSERT(mac_str->len == 16);
  22. mbedtls_chachapoly_init(&ctx);
  23. TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0);
  24. TEST_ASSERT(mbedtls_chachapoly_encrypt_and_tag(&ctx,
  25. input_str->len, nonce_str->x,
  26. aad_str->x, aad_str->len,
  27. input_str->x, output, mac) == 0);
  28. TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0);
  29. TEST_ASSERT(memcmp(mac_str->x, mac, 16U) == 0);
  30. exit:
  31. mbedtls_chachapoly_free(&ctx);
  32. }
  33. /* END_CASE */
  34. /* BEGIN_CASE */
  35. void mbedtls_chachapoly_dec(data_t *key_str,
  36. data_t *nonce_str,
  37. data_t *aad_str,
  38. data_t *input_str,
  39. data_t *output_str,
  40. data_t *mac_str,
  41. int ret_exp)
  42. {
  43. unsigned char output[265];
  44. int ret;
  45. mbedtls_chachapoly_context ctx;
  46. TEST_ASSERT(key_str->len == 32);
  47. TEST_ASSERT(nonce_str->len == 12);
  48. TEST_ASSERT(mac_str->len == 16);
  49. mbedtls_chachapoly_init(&ctx);
  50. TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0);
  51. ret = mbedtls_chachapoly_auth_decrypt(&ctx,
  52. input_str->len, nonce_str->x,
  53. aad_str->x, aad_str->len,
  54. mac_str->x, input_str->x, output);
  55. TEST_ASSERT(ret == ret_exp);
  56. if (ret_exp == 0) {
  57. TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0);
  58. }
  59. exit:
  60. mbedtls_chachapoly_free(&ctx);
  61. }
  62. /* END_CASE */
  63. /* BEGIN_CASE */
  64. void chachapoly_state()
  65. {
  66. unsigned char key[32];
  67. unsigned char nonce[12];
  68. unsigned char aad[1];
  69. unsigned char input[1];
  70. unsigned char output[1];
  71. unsigned char mac[16];
  72. size_t input_len = sizeof(input);
  73. size_t aad_len = sizeof(aad);
  74. mbedtls_chachapoly_context ctx;
  75. memset(key, 0x00, sizeof(key));
  76. memset(nonce, 0x00, sizeof(nonce));
  77. memset(aad, 0x00, sizeof(aad));
  78. memset(input, 0x00, sizeof(input));
  79. memset(output, 0x00, sizeof(output));
  80. memset(mac, 0x00, sizeof(mac));
  81. /* Initial state: finish, update, update_aad forbidden */
  82. mbedtls_chachapoly_init(&ctx);
  83. TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
  84. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  85. TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
  86. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  87. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  88. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  89. /* Still initial state: finish, update, update_aad forbidden */
  90. TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key)
  91. == 0);
  92. TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
  93. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  94. TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
  95. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  96. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  97. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  98. /* Starts -> finish OK */
  99. TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
  100. == 0);
  101. TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
  102. == 0);
  103. /* After finish: update, update_aad forbidden */
  104. TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
  105. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  106. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  107. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  108. /* Starts -> update* OK */
  109. TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
  110. == 0);
  111. TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
  112. == 0);
  113. TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
  114. == 0);
  115. /* After update: update_aad forbidden */
  116. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  117. == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
  118. /* Starts -> update_aad* -> finish OK */
  119. TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
  120. == 0);
  121. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  122. == 0);
  123. TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
  124. == 0);
  125. TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
  126. == 0);
  127. exit:
  128. mbedtls_chachapoly_free(&ctx);
  129. }
  130. /* END_CASE */
  131. /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
  132. void chachapoly_selftest()
  133. {
  134. TEST_ASSERT(mbedtls_chachapoly_self_test(1) == 0);
  135. }
  136. /* END_CASE */