blob: 74b745862ff5e4e34d68158b86d80b5910fb5460 [file] [log] [blame]
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +02001/* BEGIN_HEADER */
2#include <polarssl/ccm.h>
3/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
6 * depends_on:POLARSSL_CCM_C
7 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST:POLARSSL_AES_C */
11void ccm_self_test( )
12{
13 TEST_ASSERT( ccm_self_test( 0 ) == 0 );
14}
15/* END_CASE */
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020016
17/* BEGIN_CASE */
18void ccm_init( int cipher_id, int key_size, int result )
19{
20 ccm_context ctx;
21 unsigned char key[32];
22 int ret;
23
24 memset( key, 0x2A, sizeof( key ) );
25 TEST_ASSERT( (unsigned) key_size <= 8 * sizeof( key ) );
26
27 ret = ccm_init( &ctx, cipher_id, key, key_size );
28 TEST_ASSERT( ret == result );
29
30 ccm_free( &ctx );
31}
32/* END_CASE */
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +020033
34/* BEGIN_CASE */
35void ccm_encrypt_and_tag( int cipher_id,
36 char *key_hex, char *msg_hex,
37 char *iv_hex, char *add_hex,
38 char *result_hex )
39{
40 unsigned char key[128];
41 unsigned char msg[128];
42 unsigned char iv[128];
43 unsigned char add[128];
44 unsigned char output[144];
45 unsigned char result[144];
46 ccm_context ctx;
47 size_t key_len, msg_len, iv_len, add_len, tag_len, result_len;
48
49 memset( key, 0x00, sizeof( key ) );
50 memset( msg, 0x00, sizeof( msg ) );
51 memset( iv, 0x00, sizeof( iv ) );
52 memset( add, 0x00, sizeof( add ) );
53 memset( output, 0x00, sizeof( output ) );
54 memset( result, 0x00, sizeof( result ) );
55
56 key_len = unhexify( key, key_hex );
57 msg_len = unhexify( msg, msg_hex );
58 iv_len = unhexify( iv, iv_hex );
59 add_len = unhexify( add, add_hex );
60 result_len = unhexify( result, result_hex );
61 tag_len = result_len - msg_len;
62
63 TEST_ASSERT( ccm_init( &ctx, cipher_id, key, key_len * 8 ) == 0 );
64
Manuel Pégourié-Gonnard00232332014-05-06 15:56:07 +020065 TEST_ASSERT( ccm_encrypt_and_tag( &ctx, msg_len, iv, iv_len, add, add_len,
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +020066 msg, output, output + msg_len, tag_len ) == 0 );
67
68 TEST_ASSERT( memcmp( output, result, result_len ) == 0 );
69
70 /* Check we didn't write past the end */
71 TEST_ASSERT( output[result_len] == 0 && output[result_len + 1] == 0 );
72
73 ccm_free( &ctx );
74}
75/* END_CASE */
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +020076
77/* BEGIN_CASE */
78void ccm_auth_decrypt( int cipher_id,
79 char *key_hex, char *msg_hex,
80 char *iv_hex, char *add_hex,
81 int tag_len, char *result_hex )
82{
83 unsigned char key[128];
84 unsigned char msg[128];
85 unsigned char iv[128];
86 unsigned char add[128];
87 unsigned char output[144];
88 unsigned char result[144];
89 ccm_context ctx;
90 size_t key_len, msg_len, iv_len, add_len, result_len;
91 int ret;
92
93 memset( key, 0x00, sizeof( key ) );
94 memset( msg, 0x00, sizeof( msg ) );
95 memset( iv, 0x00, sizeof( iv ) );
96 memset( add, 0x00, sizeof( add ) );
97 memset( output, 0xFF, sizeof( output ) );
98 memset( result, 0x00, sizeof( result ) );
99
100 key_len = unhexify( key, key_hex );
101 msg_len = unhexify( msg, msg_hex );
102 iv_len = unhexify( iv, iv_hex );
103 add_len = unhexify( add, add_hex );
104 msg_len -= tag_len;
105
106 if( strcmp( "FAIL", result_hex ) == 0 )
107 {
108 ret = POLARSSL_ERR_CCM_AUTH_FAILED;
109 }
110 else
111 {
112 ret = 0;
113 result_len = unhexify( result, result_hex );
114 }
115
116 TEST_ASSERT( ccm_init( &ctx, cipher_id, key, key_len * 8 ) == 0 );
117
118 TEST_ASSERT( ccm_auth_decrypt( &ctx, msg_len, iv, iv_len, add, add_len,
119 msg, output, msg + msg_len, tag_len ) == ret );
120
121 if( ret == 0 )
122 {
123 TEST_ASSERT( memcmp( output, result, result_len ) == 0 );
124 }
125 else
126 {
127 size_t i;
128
129 for( i = 0; i < msg_len; i++ )
130 TEST_ASSERT( output[i] == 0 );
131 }
132
133 /* Check we didn't write past the end */
134 TEST_ASSERT( output[msg_len] == 0xFF && output[msg_len + 1] == 0xFF );
135
136 ccm_free( &ctx );
137}
138/* END_CASE */