blob: 6dd489d8a5bda652e3f28c7eef6423b54a0eea09 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/gcm.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker89e80c92012-03-20 13:50:09 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_GCM_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker89e80c92012-03-20 13:50:09 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Manuel Pégourié-Gonnard083d6682013-10-24 12:06:54 +020011void gcm_encrypt_and_tag( int cipher_id,
12 char *hex_key_string, char *hex_src_string,
Paul Bakker33b43f12013-08-20 11:48:36 +020013 char *hex_iv_string, char *hex_add_string,
14 char *hex_dst_string, int tag_len_bits,
15 char *hex_tag_string, int init_result )
Paul Bakker89e80c92012-03-20 13:50:09 +000016{
17 unsigned char key_str[128];
18 unsigned char src_str[128];
19 unsigned char dst_str[257];
20 unsigned char iv_str[128];
21 unsigned char add_str[128];
22 unsigned char tag_str[128];
23 unsigned char output[128];
24 unsigned char tag_output[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020025 mbedtls_gcm_context ctx;
Paul Bakker89e80c92012-03-20 13:50:09 +000026 unsigned int key_len;
Paul Bakker33b43f12013-08-20 11:48:36 +020027 size_t pt_len, iv_len, add_len, tag_len = tag_len_bits / 8;
Paul Bakker89e80c92012-03-20 13:50:09 +000028
29 memset(key_str, 0x00, 128);
30 memset(src_str, 0x00, 128);
Paul Bakker68b6d882012-09-08 14:04:13 +000031 memset(dst_str, 0x00, 257);
Paul Bakker89e80c92012-03-20 13:50:09 +000032 memset(iv_str, 0x00, 128);
33 memset(add_str, 0x00, 128);
34 memset(tag_str, 0x00, 128);
35 memset(output, 0x00, 128);
36 memset(tag_output, 0x00, 16);
37
Paul Bakker33b43f12013-08-20 11:48:36 +020038 key_len = unhexify( key_str, hex_key_string );
39 pt_len = unhexify( src_str, hex_src_string );
40 iv_len = unhexify( iv_str, hex_iv_string );
41 add_len = unhexify( add_str, hex_add_string );
Paul Bakker89e80c92012-03-20 13:50:09 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043 TEST_ASSERT( mbedtls_gcm_init( &ctx, cipher_id, key_str, key_len * 8 ) == init_result );
Paul Bakker33b43f12013-08-20 11:48:36 +020044 if( init_result == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +000045 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046 TEST_ASSERT( mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT, pt_len, iv_str, iv_len, add_str, add_len, src_str, output, tag_len, tag_output ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +000047 hexify( dst_str, output, pt_len );
48 hexify( tag_str, tag_output, tag_len );
49
Paul Bakker33b43f12013-08-20 11:48:36 +020050 TEST_ASSERT( strcmp( (char *) dst_str, hex_dst_string ) == 0 );
51 TEST_ASSERT( strcmp( (char *) tag_str, hex_tag_string ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +000052 }
Manuel Pégourié-Gonnard4fe92002013-09-13 13:45:58 +020053
Paul Bakkerbd51b262014-07-10 15:26:12 +020054exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055 mbedtls_gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +000056}
Paul Bakker33b43f12013-08-20 11:48:36 +020057/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +000058
Paul Bakker33b43f12013-08-20 11:48:36 +020059/* BEGIN_CASE */
Manuel Pégourié-Gonnard083d6682013-10-24 12:06:54 +020060void gcm_decrypt_and_verify( int cipher_id,
61 char *hex_key_string, char *hex_src_string,
Paul Bakker33b43f12013-08-20 11:48:36 +020062 char *hex_iv_string, char *hex_add_string,
63 int tag_len_bits, char *hex_tag_string,
64 char *pt_result, int init_result )
Paul Bakker89e80c92012-03-20 13:50:09 +000065{
66 unsigned char key_str[128];
67 unsigned char src_str[128];
68 unsigned char dst_str[257];
69 unsigned char iv_str[128];
70 unsigned char add_str[128];
71 unsigned char tag_str[128];
72 unsigned char output[128];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073 mbedtls_gcm_context ctx;
Paul Bakker89e80c92012-03-20 13:50:09 +000074 unsigned int key_len;
Paul Bakker33b43f12013-08-20 11:48:36 +020075 size_t pt_len, iv_len, add_len, tag_len = tag_len_bits / 8;
Paul Bakker89e80c92012-03-20 13:50:09 +000076 int ret;
77
78 memset(key_str, 0x00, 128);
79 memset(src_str, 0x00, 128);
Paul Bakker68b6d882012-09-08 14:04:13 +000080 memset(dst_str, 0x00, 257);
Paul Bakker89e80c92012-03-20 13:50:09 +000081 memset(iv_str, 0x00, 128);
82 memset(add_str, 0x00, 128);
83 memset(tag_str, 0x00, 128);
84 memset(output, 0x00, 128);
85
Paul Bakker33b43f12013-08-20 11:48:36 +020086 key_len = unhexify( key_str, hex_key_string );
87 pt_len = unhexify( src_str, hex_src_string );
88 iv_len = unhexify( iv_str, hex_iv_string );
89 add_len = unhexify( add_str, hex_add_string );
90 unhexify( tag_str, hex_tag_string );
Paul Bakker89e80c92012-03-20 13:50:09 +000091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092 TEST_ASSERT( mbedtls_gcm_init( &ctx, cipher_id, key_str, key_len * 8 ) == init_result );
Paul Bakker33b43f12013-08-20 11:48:36 +020093 if( init_result == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +000094 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020095 ret = mbedtls_gcm_auth_decrypt( &ctx, pt_len, iv_str, iv_len, add_str, add_len, tag_str, tag_len, src_str, output );
Paul Bakker89e80c92012-03-20 13:50:09 +000096
Paul Bakker33b43f12013-08-20 11:48:36 +020097 if( strcmp( "FAIL", pt_result ) == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +000098 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099 TEST_ASSERT( ret == MBEDTLS_ERR_GCM_AUTH_FAILED );
Paul Bakker89e80c92012-03-20 13:50:09 +0000100 }
101 else
102 {
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +0200103 TEST_ASSERT( ret == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000104 hexify( dst_str, output, pt_len );
105
Paul Bakker33b43f12013-08-20 11:48:36 +0200106 TEST_ASSERT( strcmp( (char *) dst_str, pt_result ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000107 }
108 }
Manuel Pégourié-Gonnard4fe92002013-09-13 13:45:58 +0200109
Paul Bakkerbd51b262014-07-10 15:26:12 +0200110exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111 mbedtls_gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +0000112}
Paul Bakker33b43f12013-08-20 11:48:36 +0200113/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +0000114
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200116void gcm_selftest()
Paul Bakker89e80c92012-03-20 13:50:09 +0000117{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118 TEST_ASSERT( mbedtls_gcm_self_test( 0 ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000119}
Paul Bakker33b43f12013-08-20 11:48:36 +0200120/* END_CASE */