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