test_suite_nist_kw.function 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/nist_kw.h"
  3. /* END_HEADER */
  4. /* BEGIN_DEPENDENCIES
  5. * depends_on:MBEDTLS_NIST_KW_C
  6. * END_DEPENDENCIES
  7. */
  8. /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */
  9. void mbedtls_nist_kw_self_test( )
  10. {
  11. TEST_ASSERT( mbedtls_nist_kw_self_test( 1 ) == 0 );
  12. }
  13. /* END_CASE */
  14. /* BEGIN_CASE depends_on:MBEDTLS_AES_C */
  15. void mbedtls_nist_kw_mix_contexts( )
  16. {
  17. mbedtls_nist_kw_context ctx1, ctx2;
  18. unsigned char key[16];
  19. unsigned char plaintext[32];
  20. unsigned char ciphertext1[40];
  21. unsigned char ciphertext2[40];
  22. size_t output_len, i;
  23. memset( plaintext, 0, sizeof( plaintext ) );
  24. memset( ciphertext1, 0, sizeof( ciphertext1 ) );
  25. memset( ciphertext2, 0, sizeof( ciphertext2 ) );
  26. memset( key, 0, sizeof( key ) );
  27. /*
  28. * 1. Check wrap and unwrap with two separate contexts
  29. */
  30. mbedtls_nist_kw_init( &ctx1 );
  31. mbedtls_nist_kw_init( &ctx2 );
  32. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx1,
  33. MBEDTLS_CIPHER_ID_AES,
  34. key, sizeof( key ) * 8,
  35. 1 ) == 0 );
  36. TEST_ASSERT( mbedtls_nist_kw_wrap( &ctx1, MBEDTLS_KW_MODE_KW,
  37. plaintext, sizeof( plaintext ),
  38. ciphertext1, &output_len,
  39. sizeof( ciphertext1 ) ) == 0 );
  40. TEST_ASSERT( output_len == sizeof( ciphertext1 ) );
  41. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx2,
  42. MBEDTLS_CIPHER_ID_AES,
  43. key, sizeof( key ) * 8,
  44. 0 ) == 0 );
  45. TEST_ASSERT( mbedtls_nist_kw_unwrap( &ctx2, MBEDTLS_KW_MODE_KW,
  46. ciphertext1, output_len,
  47. plaintext, &output_len,
  48. sizeof( plaintext ) ) == 0 );
  49. TEST_ASSERT( output_len == sizeof( plaintext ) );
  50. for( i = 0; i < sizeof( plaintext ); i++ )
  51. {
  52. TEST_ASSERT( plaintext[i] == 0 );
  53. }
  54. mbedtls_nist_kw_free( &ctx1 );
  55. mbedtls_nist_kw_free( &ctx2 );
  56. /*
  57. * 2. Check wrapping with two modes, on same context
  58. */
  59. mbedtls_nist_kw_init( &ctx1 );
  60. mbedtls_nist_kw_init( &ctx2 );
  61. output_len = sizeof( ciphertext1 );
  62. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx1,
  63. MBEDTLS_CIPHER_ID_AES,
  64. key, sizeof( key ) * 8,
  65. 1 ) == 0 );
  66. TEST_ASSERT( mbedtls_nist_kw_wrap( &ctx1, MBEDTLS_KW_MODE_KW,
  67. plaintext, sizeof( plaintext ),
  68. ciphertext1, &output_len,
  69. sizeof( ciphertext1 ) ) == 0 );
  70. TEST_ASSERT( output_len == sizeof( ciphertext1 ) );
  71. TEST_ASSERT( mbedtls_nist_kw_wrap( &ctx1, MBEDTLS_KW_MODE_KWP,
  72. plaintext, sizeof( plaintext ),
  73. ciphertext2, &output_len,
  74. sizeof( ciphertext2 ) ) == 0 );
  75. TEST_ASSERT( output_len == sizeof( ciphertext2 ) );
  76. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx2,
  77. MBEDTLS_CIPHER_ID_AES,
  78. key, sizeof( key ) * 8,
  79. 0 ) == 0 );
  80. TEST_ASSERT( mbedtls_nist_kw_unwrap( &ctx2, MBEDTLS_KW_MODE_KW,
  81. ciphertext1, sizeof( ciphertext1 ),
  82. plaintext, &output_len,
  83. sizeof( plaintext ) ) == 0 );
  84. TEST_ASSERT( output_len == sizeof( plaintext ) );
  85. for( i = 0; i < sizeof( plaintext ); i++ )
  86. {
  87. TEST_ASSERT( plaintext[i] == 0 );
  88. }
  89. TEST_ASSERT( mbedtls_nist_kw_unwrap( &ctx2, MBEDTLS_KW_MODE_KWP,
  90. ciphertext2, sizeof( ciphertext2 ),
  91. plaintext, &output_len,
  92. sizeof( plaintext ) ) == 0 );
  93. TEST_ASSERT( output_len == sizeof( plaintext ) );
  94. for( i = 0; i < sizeof( plaintext ); i++ )
  95. {
  96. TEST_ASSERT( plaintext[i] == 0 );
  97. }
  98. exit:
  99. mbedtls_nist_kw_free( &ctx1 );
  100. mbedtls_nist_kw_free( &ctx2 );
  101. }
  102. /* END_CASE */
  103. /* BEGIN_CASE */
  104. void mbedtls_nist_kw_setkey( int cipher_id, int key_size,
  105. int is_wrap, int result )
  106. {
  107. mbedtls_nist_kw_context ctx;
  108. unsigned char key[32];
  109. int ret;
  110. mbedtls_nist_kw_init( &ctx );
  111. memset( key, 0x2A, sizeof( key ) );
  112. TEST_ASSERT( (unsigned) key_size <= 8 * sizeof( key ) );
  113. ret = mbedtls_nist_kw_setkey( &ctx, cipher_id, key, key_size, is_wrap );
  114. TEST_ASSERT( ret == result );
  115. exit:
  116. mbedtls_nist_kw_free( &ctx );
  117. }
  118. /* END_CASE */
  119. /* BEGIN_CASE depends_on:MBEDTLS_AES_C */
  120. void nist_kw_plaintext_lengths( int in_len, int out_len, int mode, int res )
  121. {
  122. mbedtls_nist_kw_context ctx;
  123. unsigned char key[16];
  124. unsigned char *plaintext = NULL;
  125. unsigned char *ciphertext = NULL;
  126. size_t output_len = out_len;
  127. mbedtls_nist_kw_init( &ctx );
  128. memset( key, 0, sizeof( key ) );
  129. if( in_len != 0 )
  130. {
  131. plaintext = mbedtls_calloc( 1, in_len );
  132. TEST_ASSERT( plaintext != NULL );
  133. }
  134. if( out_len != 0 )
  135. {
  136. ciphertext = mbedtls_calloc( 1, output_len );
  137. TEST_ASSERT( ciphertext != NULL );
  138. }
  139. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES,
  140. key, 8 * sizeof( key ), 1 ) == 0 );
  141. TEST_ASSERT( mbedtls_nist_kw_wrap( &ctx, mode, plaintext, in_len,
  142. ciphertext, &output_len,
  143. output_len ) == res );
  144. if( res == 0 )
  145. {
  146. if( mode == MBEDTLS_KW_MODE_KWP )
  147. TEST_ASSERT( output_len == (size_t) in_len + 8 -
  148. ( in_len % 8 ) + 8 );
  149. else
  150. TEST_ASSERT( output_len == (size_t) in_len + 8 );
  151. }
  152. else
  153. {
  154. TEST_ASSERT( output_len == 0 );
  155. }
  156. exit:
  157. mbedtls_free( ciphertext );
  158. mbedtls_free( plaintext );
  159. mbedtls_nist_kw_free( &ctx );
  160. }
  161. /* END_CASE */
  162. /* BEGIN_CASE depends_on:MBEDTLS_AES_C */
  163. void nist_kw_ciphertext_lengths( int in_len, int out_len, int mode, int res )
  164. {
  165. mbedtls_nist_kw_context ctx;
  166. unsigned char key[16];
  167. unsigned char *plaintext = NULL;
  168. unsigned char *ciphertext = NULL;
  169. int unwrap_ret;
  170. size_t output_len = out_len;
  171. mbedtls_nist_kw_init( &ctx );
  172. memset( key, 0, sizeof( key ) );
  173. if( out_len != 0 )
  174. {
  175. plaintext = mbedtls_calloc( 1, output_len );
  176. TEST_ASSERT( plaintext != NULL );
  177. }
  178. if( in_len != 0 )
  179. {
  180. ciphertext = mbedtls_calloc( 1, in_len );
  181. TEST_ASSERT( ciphertext != NULL );
  182. }
  183. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES,
  184. key, 8 * sizeof( key ), 0 ) == 0 );
  185. unwrap_ret = mbedtls_nist_kw_unwrap( &ctx, mode, ciphertext, in_len,
  186. plaintext, &output_len,
  187. output_len );
  188. if( res == 0 )
  189. TEST_ASSERT( unwrap_ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
  190. else
  191. TEST_ASSERT( unwrap_ret == res );
  192. TEST_ASSERT( output_len == 0 );
  193. exit:
  194. mbedtls_free( ciphertext );
  195. mbedtls_free( plaintext );
  196. mbedtls_nist_kw_free( &ctx );
  197. }
  198. /* END_CASE */
  199. /* BEGIN_CASE */
  200. void mbedtls_nist_kw_wrap( int cipher_id, int mode, data_t *key, data_t *msg,
  201. data_t *expected_result )
  202. {
  203. unsigned char result[528];
  204. mbedtls_nist_kw_context ctx;
  205. size_t result_len, i, padlen;
  206. mbedtls_nist_kw_init( &ctx );
  207. memset( result, '+', sizeof( result ) );
  208. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx, cipher_id,
  209. key->x, key->len * 8, 1 ) == 0 );
  210. /* Test with input == output */
  211. TEST_ASSERT( mbedtls_nist_kw_wrap( &ctx, mode, msg->x, msg->len,
  212. result, &result_len, sizeof( result ) ) == 0 );
  213. TEST_ASSERT( result_len == expected_result->len );
  214. TEST_ASSERT( memcmp( expected_result->x, result, result_len ) == 0 );
  215. padlen = ( msg->len % 8 != 0 ) ? 8 - (msg->len % 8 ) : 0;
  216. /* Check that the function didn't write beyond the end of the buffer. */
  217. for( i = msg->len + 8 + padlen; i < sizeof( result ); i++ )
  218. {
  219. TEST_ASSERT( result[i] == '+' );
  220. }
  221. exit:
  222. mbedtls_nist_kw_free( &ctx );
  223. }
  224. /* END_CASE */
  225. /* BEGIN_CASE */
  226. void mbedtls_nist_kw_unwrap( int cipher_id, int mode, data_t *key, data_t *msg,
  227. data_t *expected_result, int expected_ret )
  228. {
  229. unsigned char result[528];
  230. mbedtls_nist_kw_context ctx;
  231. size_t result_len, i;
  232. mbedtls_nist_kw_init( &ctx );
  233. memset( result, '+', sizeof( result ) );
  234. TEST_ASSERT( mbedtls_nist_kw_setkey( &ctx, cipher_id,
  235. key->x, key->len * 8, 0 ) == 0 );
  236. /* Test with input == output */
  237. TEST_ASSERT( mbedtls_nist_kw_unwrap( &ctx, mode, msg->x, msg->len,
  238. result, &result_len, sizeof( result ) ) == expected_ret );
  239. if( expected_ret == 0 )
  240. {
  241. TEST_ASSERT( result_len == expected_result->len );
  242. TEST_ASSERT( memcmp( expected_result->x, result, result_len ) == 0 );
  243. }
  244. else
  245. {
  246. TEST_ASSERT( result_len == 0 );
  247. }
  248. /* Check that the function didn't write beyond the end of the buffer. */
  249. for( i = msg->len - 8; i < sizeof( result ); i++ )
  250. {
  251. TEST_ASSERT( result[i] == '+' );
  252. }
  253. exit:
  254. mbedtls_nist_kw_free( &ctx );
  255. }
  256. /* END_CASE */