test_suite_ccm.function 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/ccm.h"
  3. /* END_HEADER */
  4. /* BEGIN_DEPENDENCIES
  5. * depends_on:MBEDTLS_CCM_C
  6. * END_DEPENDENCIES
  7. */
  8. /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */
  9. void mbedtls_ccm_self_test( )
  10. {
  11. TEST_ASSERT( mbedtls_ccm_self_test( 1 ) == 0 );
  12. }
  13. /* END_CASE */
  14. /* BEGIN_CASE */
  15. void mbedtls_ccm_setkey( int cipher_id, int key_size, int result )
  16. {
  17. mbedtls_ccm_context ctx;
  18. unsigned char key[32];
  19. int ret;
  20. mbedtls_ccm_init( &ctx );
  21. memset( key, 0x2A, sizeof( key ) );
  22. TEST_ASSERT( (unsigned) key_size <= 8 * sizeof( key ) );
  23. ret = mbedtls_ccm_setkey( &ctx, cipher_id, key, key_size );
  24. TEST_ASSERT( ret == result );
  25. exit:
  26. mbedtls_ccm_free( &ctx );
  27. }
  28. /* END_CASE */
  29. /* BEGIN_CASE depends_on:MBEDTLS_AES_C */
  30. void ccm_lengths( int msg_len, int iv_len, int add_len, int tag_len, int res )
  31. {
  32. mbedtls_ccm_context ctx;
  33. unsigned char key[16];
  34. unsigned char msg[10];
  35. unsigned char iv[14];
  36. unsigned char add[10];
  37. unsigned char out[10];
  38. unsigned char tag[18];
  39. int decrypt_ret;
  40. mbedtls_ccm_init( &ctx );
  41. memset( key, 0, sizeof( key ) );
  42. memset( msg, 0, sizeof( msg ) );
  43. memset( iv, 0, sizeof( iv ) );
  44. memset( add, 0, sizeof( add ) );
  45. memset( out, 0, sizeof( out ) );
  46. memset( tag, 0, sizeof( tag ) );
  47. TEST_ASSERT( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES,
  48. key, 8 * sizeof( key ) ) == 0 );
  49. TEST_ASSERT( mbedtls_ccm_encrypt_and_tag( &ctx, msg_len, iv, iv_len, add, add_len,
  50. msg, out, tag, tag_len ) == res );
  51. decrypt_ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len, iv, iv_len, add, add_len,
  52. msg, out, tag, tag_len );
  53. if( res == 0 )
  54. TEST_ASSERT( decrypt_ret == MBEDTLS_ERR_CCM_AUTH_FAILED );
  55. else
  56. TEST_ASSERT( decrypt_ret == res );
  57. exit:
  58. mbedtls_ccm_free( &ctx );
  59. }
  60. /* END_CASE */
  61. /* BEGIN_CASE */
  62. void mbedtls_ccm_encrypt_and_tag( int cipher_id,
  63. char *key_hex, char *msg_hex,
  64. char *iv_hex, char *add_hex,
  65. char *result_hex )
  66. {
  67. unsigned char key[32];
  68. unsigned char msg[50];
  69. unsigned char iv[13];
  70. unsigned char add[32];
  71. unsigned char result[50];
  72. mbedtls_ccm_context ctx;
  73. size_t key_len, msg_len, iv_len, add_len, tag_len, result_len;
  74. mbedtls_ccm_init( &ctx );
  75. memset( key, 0x00, sizeof( key ) );
  76. memset( msg, 0x00, sizeof( msg ) );
  77. memset( iv, 0x00, sizeof( iv ) );
  78. memset( add, 0x00, sizeof( add ) );
  79. memset( result, 0x00, sizeof( result ) );
  80. key_len = unhexify( key, key_hex );
  81. msg_len = unhexify( msg, msg_hex );
  82. iv_len = unhexify( iv, iv_hex );
  83. add_len = unhexify( add, add_hex );
  84. result_len = unhexify( result, result_hex );
  85. tag_len = result_len - msg_len;
  86. TEST_ASSERT( mbedtls_ccm_setkey( &ctx, cipher_id, key, key_len * 8 ) == 0 );
  87. /* Test with input == output */
  88. TEST_ASSERT( mbedtls_ccm_encrypt_and_tag( &ctx, msg_len, iv, iv_len, add, add_len,
  89. msg, msg, msg + msg_len, tag_len ) == 0 );
  90. TEST_ASSERT( memcmp( msg, result, result_len ) == 0 );
  91. /* Check we didn't write past the end */
  92. TEST_ASSERT( msg[result_len] == 0 && msg[result_len + 1] == 0 );
  93. exit:
  94. mbedtls_ccm_free( &ctx );
  95. }
  96. /* END_CASE */
  97. /* BEGIN_CASE */
  98. void mbedtls_ccm_auth_decrypt( int cipher_id,
  99. char *key_hex, char *msg_hex,
  100. char *iv_hex, char *add_hex,
  101. int tag_len, char *result_hex )
  102. {
  103. unsigned char key[32];
  104. unsigned char msg[50];
  105. unsigned char iv[13];
  106. unsigned char add[32];
  107. unsigned char tag[16];
  108. unsigned char result[50];
  109. mbedtls_ccm_context ctx;
  110. size_t key_len, msg_len, iv_len, add_len, result_len;
  111. int ret;
  112. mbedtls_ccm_init( &ctx );
  113. memset( key, 0x00, sizeof( key ) );
  114. memset( msg, 0x00, sizeof( msg ) );
  115. memset( iv, 0x00, sizeof( iv ) );
  116. memset( add, 0x00, sizeof( add ) );
  117. memset( tag, 0x00, sizeof( tag ) );
  118. memset( result, 0x00, sizeof( result ) );
  119. key_len = unhexify( key, key_hex );
  120. msg_len = unhexify( msg, msg_hex );
  121. iv_len = unhexify( iv, iv_hex );
  122. add_len = unhexify( add, add_hex );
  123. msg_len -= tag_len;
  124. memcpy( tag, msg + msg_len, tag_len );
  125. if( strcmp( "FAIL", result_hex ) == 0 )
  126. {
  127. ret = MBEDTLS_ERR_CCM_AUTH_FAILED;
  128. result_len = -1;
  129. }
  130. else
  131. {
  132. ret = 0;
  133. result_len = unhexify( result, result_hex );
  134. }
  135. TEST_ASSERT( mbedtls_ccm_setkey( &ctx, cipher_id, key, key_len * 8 ) == 0 );
  136. /* Test with input == output */
  137. TEST_ASSERT( mbedtls_ccm_auth_decrypt( &ctx, msg_len, iv, iv_len, add, add_len,
  138. msg, msg, msg + msg_len, tag_len ) == ret );
  139. if( ret == 0 )
  140. {
  141. TEST_ASSERT( memcmp( msg, result, result_len ) == 0 );
  142. }
  143. else
  144. {
  145. size_t i;
  146. for( i = 0; i < msg_len; i++ )
  147. TEST_ASSERT( msg[i] == 0 );
  148. }
  149. /* Check we didn't write past the end (where the original tag is) */
  150. TEST_ASSERT( memcmp( msg + msg_len, tag, tag_len ) == 0 );
  151. exit:
  152. mbedtls_ccm_free( &ctx );
  153. }
  154. /* END_CASE */