blob: 3167bdb8ccd3dd176ca8abbffaa85ade218d86a2 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Paul Bakker89e80c92012-03-20 13:50:09 +00002#include <polarssl/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
6 * depends_on:POLARSSL_GCM_C
7 * 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];
25 gcm_context ctx;
26 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é-Gonnard083d6682013-10-24 12:06:54 +020043 TEST_ASSERT( 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 {
46 TEST_ASSERT( gcm_crypt_and_tag( &ctx, GCM_ENCRYPT, pt_len, iv_str, iv_len, add_str, add_len, src_str, output, tag_len, tag_output ) == 0 );
47 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
54 gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +000055}
Paul Bakker33b43f12013-08-20 11:48:36 +020056/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +000057
Paul Bakker33b43f12013-08-20 11:48:36 +020058/* BEGIN_CASE */
Manuel Pégourié-Gonnard083d6682013-10-24 12:06:54 +020059void gcm_decrypt_and_verify( int cipher_id,
60 char *hex_key_string, char *hex_src_string,
Paul Bakker33b43f12013-08-20 11:48:36 +020061 char *hex_iv_string, char *hex_add_string,
62 int tag_len_bits, char *hex_tag_string,
63 char *pt_result, int init_result )
Paul Bakker89e80c92012-03-20 13:50:09 +000064{
65 unsigned char key_str[128];
66 unsigned char src_str[128];
67 unsigned char dst_str[257];
68 unsigned char iv_str[128];
69 unsigned char add_str[128];
70 unsigned char tag_str[128];
71 unsigned char output[128];
72 gcm_context ctx;
73 unsigned int key_len;
Paul Bakker33b43f12013-08-20 11:48:36 +020074 size_t pt_len, iv_len, add_len, tag_len = tag_len_bits / 8;
Paul Bakker89e80c92012-03-20 13:50:09 +000075 int ret;
76
77 memset(key_str, 0x00, 128);
78 memset(src_str, 0x00, 128);
Paul Bakker68b6d882012-09-08 14:04:13 +000079 memset(dst_str, 0x00, 257);
Paul Bakker89e80c92012-03-20 13:50:09 +000080 memset(iv_str, 0x00, 128);
81 memset(add_str, 0x00, 128);
82 memset(tag_str, 0x00, 128);
83 memset(output, 0x00, 128);
84
Paul Bakker33b43f12013-08-20 11:48:36 +020085 key_len = unhexify( key_str, hex_key_string );
86 pt_len = unhexify( src_str, hex_src_string );
87 iv_len = unhexify( iv_str, hex_iv_string );
88 add_len = unhexify( add_str, hex_add_string );
89 unhexify( tag_str, hex_tag_string );
Paul Bakker89e80c92012-03-20 13:50:09 +000090
Manuel Pégourié-Gonnard083d6682013-10-24 12:06:54 +020091 TEST_ASSERT( gcm_init( &ctx, cipher_id, key_str, key_len * 8 ) == init_result );
Paul Bakker33b43f12013-08-20 11:48:36 +020092 if( init_result == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +000093 {
94 ret = gcm_auth_decrypt( &ctx, pt_len, iv_str, iv_len, add_str, add_len, tag_str, tag_len, src_str, output );
95
Paul Bakker33b43f12013-08-20 11:48:36 +020096 if( strcmp( "FAIL", pt_result ) == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +000097 {
98 TEST_ASSERT( ret == POLARSSL_ERR_GCM_AUTH_FAILED );
99 }
100 else
101 {
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +0200102 TEST_ASSERT( ret == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000103 hexify( dst_str, output, pt_len );
104
Paul Bakker33b43f12013-08-20 11:48:36 +0200105 TEST_ASSERT( strcmp( (char *) dst_str, pt_result ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000106 }
107 }
Manuel Pégourié-Gonnard4fe92002013-09-13 13:45:58 +0200108
109 gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +0000110}
Paul Bakker33b43f12013-08-20 11:48:36 +0200111/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +0000112
Manuel Pégourié-Gonnard20140162013-10-10 12:48:03 +0200113/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200114void gcm_selftest()
Paul Bakker89e80c92012-03-20 13:50:09 +0000115{
116 TEST_ASSERT( gcm_self_test( 0 ) == 0 );
117}
Paul Bakker33b43f12013-08-20 11:48:36 +0200118/* END_CASE */