• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* BEGIN_HEADER */
2#include "mbedtls/gcm.h"
3/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
6 * depends_on:MBEDTLS_GCM_C
7 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE */
11void gcm_bad_parameters(int cipher_id, int direction,
12                        data_t *key_str, data_t *src_str,
13                        data_t *iv_str, data_t *add_str,
14                        int tag_len_bits, int gcm_result)
15{
16    unsigned char output[128];
17    unsigned char tag_output[16];
18    mbedtls_gcm_context ctx;
19    size_t tag_len = tag_len_bits / 8;
20
21    mbedtls_gcm_init(&ctx);
22
23    memset(output, 0x00, sizeof(output));
24    memset(tag_output, 0x00, sizeof(tag_output));
25
26    TEST_ASSERT(mbedtls_gcm_setkey(&ctx, cipher_id, key_str->x, key_str->len * 8) == 0);
27    TEST_ASSERT(mbedtls_gcm_crypt_and_tag(&ctx, direction, src_str->len, iv_str->x, iv_str->len,
28                                          add_str->x, add_str->len, src_str->x, output, tag_len,
29                                          tag_output) == gcm_result);
30
31exit:
32    mbedtls_gcm_free(&ctx);
33}
34/* END_CASE */
35
36/* BEGIN_CASE */
37void gcm_encrypt_and_tag(int cipher_id, data_t *key_str,
38                         data_t *src_str, data_t *iv_str,
39                         data_t *add_str, data_t *dst,
40                         int tag_len_bits, data_t *tag,
41                         int init_result)
42{
43    unsigned char output[128];
44    unsigned char tag_output[16];
45    mbedtls_gcm_context ctx;
46    size_t tag_len = tag_len_bits / 8;
47
48    mbedtls_gcm_init(&ctx);
49
50    memset(output, 0x00, 128);
51    memset(tag_output, 0x00, 16);
52
53
54    TEST_ASSERT(mbedtls_gcm_setkey(&ctx, cipher_id, key_str->x, key_str->len * 8) == init_result);
55    if (init_result == 0) {
56        TEST_ASSERT(mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, src_str->len, iv_str->x,
57                                              iv_str->len, add_str->x, add_str->len, src_str->x,
58                                              output, tag_len, tag_output) == 0);
59
60        TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
61                                        src_str->len, dst->len) == 0);
62        TEST_ASSERT(mbedtls_test_hexcmp(tag_output, tag->x,
63                                        tag_len, tag->len) == 0);
64    }
65
66exit:
67    mbedtls_gcm_free(&ctx);
68}
69/* END_CASE */
70
71/* BEGIN_CASE */
72void gcm_decrypt_and_verify(int cipher_id, data_t *key_str,
73                            data_t *src_str, data_t *iv_str,
74                            data_t *add_str, int tag_len_bits,
75                            data_t *tag_str, char *result,
76                            data_t *pt_result, int init_result)
77{
78    unsigned char output[128];
79    mbedtls_gcm_context ctx;
80    int ret;
81    size_t tag_len = tag_len_bits / 8;
82
83    mbedtls_gcm_init(&ctx);
84
85    memset(output, 0x00, 128);
86
87
88    TEST_ASSERT(mbedtls_gcm_setkey(&ctx, cipher_id, key_str->x, key_str->len * 8) == init_result);
89    if (init_result == 0) {
90        ret = mbedtls_gcm_auth_decrypt(&ctx,
91                                       src_str->len,
92                                       iv_str->x,
93                                       iv_str->len,
94                                       add_str->x,
95                                       add_str->len,
96                                       tag_str->x,
97                                       tag_len,
98                                       src_str->x,
99                                       output);
100
101        if (strcmp("FAIL", result) == 0) {
102            TEST_ASSERT(ret == MBEDTLS_ERR_GCM_AUTH_FAILED);
103        } else {
104            TEST_ASSERT(ret == 0);
105
106            TEST_ASSERT(mbedtls_test_hexcmp(output, pt_result->x,
107                                            src_str->len,
108                                            pt_result->len) == 0);
109        }
110    }
111
112exit:
113    mbedtls_gcm_free(&ctx);
114}
115/* END_CASE */
116
117/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
118void gcm_invalid_param()
119{
120    mbedtls_gcm_context ctx;
121    unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
122    mbedtls_cipher_id_t valid_cipher = MBEDTLS_CIPHER_ID_AES;
123    int valid_mode = MBEDTLS_GCM_ENCRYPT;
124    int valid_len = sizeof(valid_buffer);
125    int valid_bitlen = 128, invalid_bitlen = 1;
126
127    mbedtls_gcm_init(&ctx);
128
129    /* mbedtls_gcm_init() */
130    TEST_INVALID_PARAM(mbedtls_gcm_init(NULL));
131
132    /* mbedtls_gcm_setkey */
133    TEST_INVALID_PARAM_RET(
134        MBEDTLS_ERR_GCM_BAD_INPUT,
135        mbedtls_gcm_setkey(NULL, valid_cipher, valid_buffer, valid_bitlen));
136    TEST_INVALID_PARAM_RET(
137        MBEDTLS_ERR_GCM_BAD_INPUT,
138        mbedtls_gcm_setkey(&ctx, valid_cipher, NULL, valid_bitlen));
139    TEST_INVALID_PARAM_RET(
140        MBEDTLS_ERR_GCM_BAD_INPUT,
141        mbedtls_gcm_setkey(&ctx, valid_cipher, valid_buffer, invalid_bitlen));
142
143    /* mbedtls_gcm_crypt_and_tag() */
144    TEST_INVALID_PARAM_RET(
145        MBEDTLS_ERR_GCM_BAD_INPUT,
146        mbedtls_gcm_crypt_and_tag(NULL, valid_mode, valid_len,
147                                  valid_buffer, valid_len,
148                                  valid_buffer, valid_len,
149                                  valid_buffer, valid_buffer,
150                                  valid_len, valid_buffer));
151    TEST_INVALID_PARAM_RET(
152        MBEDTLS_ERR_GCM_BAD_INPUT,
153        mbedtls_gcm_crypt_and_tag(&ctx, valid_mode, valid_len,
154                                  NULL, valid_len,
155                                  valid_buffer, valid_len,
156                                  valid_buffer, valid_buffer,
157                                  valid_len, valid_buffer));
158    TEST_INVALID_PARAM_RET(
159        MBEDTLS_ERR_GCM_BAD_INPUT,
160        mbedtls_gcm_crypt_and_tag(&ctx, valid_mode, valid_len,
161                                  valid_buffer, valid_len,
162                                  NULL, valid_len,
163                                  valid_buffer, valid_buffer,
164                                  valid_len, valid_buffer));
165    TEST_INVALID_PARAM_RET(
166        MBEDTLS_ERR_GCM_BAD_INPUT,
167        mbedtls_gcm_crypt_and_tag(&ctx, valid_mode, valid_len,
168                                  valid_buffer, valid_len,
169                                  valid_buffer, valid_len,
170                                  NULL, valid_buffer,
171                                  valid_len, valid_buffer));
172    TEST_INVALID_PARAM_RET(
173        MBEDTLS_ERR_GCM_BAD_INPUT,
174        mbedtls_gcm_crypt_and_tag(&ctx, valid_mode, valid_len,
175                                  valid_buffer, valid_len,
176                                  valid_buffer, valid_len,
177                                  valid_buffer, NULL,
178                                  valid_len, valid_buffer));
179    TEST_INVALID_PARAM_RET(
180        MBEDTLS_ERR_GCM_BAD_INPUT,
181        mbedtls_gcm_crypt_and_tag(&ctx, valid_mode, valid_len,
182                                  valid_buffer, valid_len,
183                                  valid_buffer, valid_len,
184                                  valid_buffer, valid_buffer,
185                                  valid_len, NULL));
186
187    /* mbedtls_gcm_auth_decrypt() */
188    TEST_INVALID_PARAM_RET(
189        MBEDTLS_ERR_GCM_BAD_INPUT,
190        mbedtls_gcm_auth_decrypt(NULL, valid_len,
191                                 valid_buffer, valid_len,
192                                 valid_buffer, valid_len,
193                                 valid_buffer, valid_len,
194                                 valid_buffer, valid_buffer));
195    TEST_INVALID_PARAM_RET(
196        MBEDTLS_ERR_GCM_BAD_INPUT,
197        mbedtls_gcm_auth_decrypt(&ctx, valid_len,
198                                 NULL, valid_len,
199                                 valid_buffer, valid_len,
200                                 valid_buffer, valid_len,
201                                 valid_buffer, valid_buffer));
202    TEST_INVALID_PARAM_RET(
203        MBEDTLS_ERR_GCM_BAD_INPUT,
204        mbedtls_gcm_auth_decrypt(&ctx, valid_len,
205                                 valid_buffer, valid_len,
206                                 NULL, valid_len,
207                                 valid_buffer, valid_len,
208                                 valid_buffer, valid_buffer));
209    TEST_INVALID_PARAM_RET(
210        MBEDTLS_ERR_GCM_BAD_INPUT,
211        mbedtls_gcm_auth_decrypt(&ctx, valid_len,
212                                 valid_buffer, valid_len,
213                                 valid_buffer, valid_len,
214                                 NULL, valid_len,
215                                 valid_buffer, valid_buffer));
216    TEST_INVALID_PARAM_RET(
217        MBEDTLS_ERR_GCM_BAD_INPUT,
218        mbedtls_gcm_auth_decrypt(&ctx, valid_len,
219                                 valid_buffer, valid_len,
220                                 valid_buffer, valid_len,
221                                 valid_buffer, valid_len,
222                                 NULL, valid_buffer));
223    TEST_INVALID_PARAM_RET(
224        MBEDTLS_ERR_GCM_BAD_INPUT,
225        mbedtls_gcm_auth_decrypt(&ctx, valid_len,
226                                 valid_buffer, valid_len,
227                                 valid_buffer, valid_len,
228                                 valid_buffer, valid_len,
229                                 valid_buffer, NULL));
230
231    /* mbedtls_gcm_starts() */
232    TEST_INVALID_PARAM_RET(
233        MBEDTLS_ERR_GCM_BAD_INPUT,
234        mbedtls_gcm_starts(NULL, valid_mode,
235                           valid_buffer, valid_len,
236                           valid_buffer, valid_len));
237
238    TEST_INVALID_PARAM_RET(
239        MBEDTLS_ERR_GCM_BAD_INPUT,
240        mbedtls_gcm_starts(&ctx, valid_mode,
241                           NULL, valid_len,
242                           valid_buffer, valid_len));
243
244    TEST_INVALID_PARAM_RET(
245        MBEDTLS_ERR_GCM_BAD_INPUT,
246        mbedtls_gcm_starts(&ctx, valid_mode,
247                           valid_buffer, valid_len,
248                           NULL, valid_len));
249
250    /* mbedtls_gcm_update() */
251    TEST_INVALID_PARAM_RET(
252        MBEDTLS_ERR_GCM_BAD_INPUT,
253        mbedtls_gcm_update(NULL, valid_len,
254                           valid_buffer, valid_buffer));
255    TEST_INVALID_PARAM_RET(
256        MBEDTLS_ERR_GCM_BAD_INPUT,
257        mbedtls_gcm_update(&ctx, valid_len,
258                           NULL, valid_buffer));
259    TEST_INVALID_PARAM_RET(
260        MBEDTLS_ERR_GCM_BAD_INPUT,
261        mbedtls_gcm_update(&ctx, valid_len,
262                           valid_buffer, NULL));
263
264    /* mbedtls_gcm_finish() */
265    TEST_INVALID_PARAM_RET(
266        MBEDTLS_ERR_GCM_BAD_INPUT,
267        mbedtls_gcm_finish(NULL, valid_buffer, valid_len));
268    TEST_INVALID_PARAM_RET(
269        MBEDTLS_ERR_GCM_BAD_INPUT,
270        mbedtls_gcm_finish(&ctx, NULL, valid_len));
271
272exit:
273    mbedtls_gcm_free(&ctx);
274}
275/* END_CASE */
276
277/* BEGIN_CASE */
278void gcm_valid_param()
279{
280    TEST_VALID_PARAM(mbedtls_gcm_free(NULL));
281exit:
282    return;
283}
284/* END_CASE */
285
286/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */
287void gcm_selftest()
288{
289    TEST_ASSERT(mbedtls_gcm_self_test(1) == 0);
290}
291/* END_CASE */
292