blob: 2e1e7b2dcfa42b2044a6a957145b2f736ca91b3a [file] [log] [blame]
Daniel Kingb8025c52016-05-17 14:43:01 -03001/* BEGIN_HEADER */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02002#include "mbedtls/chachapoly.h"
Daniel Kingb8025c52016-05-17 14:43:01 -03003/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02006 * depends_on:MBEDTLS_CHACHAPOLY_C
Daniel Kingb8025c52016-05-17 14:43:01 -03007 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE */
Ronald Cron9ed40732020-06-25 09:03:34 +020011void mbedtls_chachapoly_enc( data_t *key_str, data_t *nonce_str, data_t *aad_str, data_t *input_str, data_t *output_str, data_t *mac_str )
Daniel Kingb8025c52016-05-17 14:43:01 -030012{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020013 unsigned char output[265];
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020014 unsigned char mac[16]; /* size set by the standard */
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020015 mbedtls_chachapoly_context ctx;
Daniel Kingb8025c52016-05-17 14:43:01 -030016
Ronald Cron9ed40732020-06-25 09:03:34 +020017 TEST_ASSERT( key_str->len == 32 );
18 TEST_ASSERT( nonce_str->len == 12 );
19 TEST_ASSERT( mac_str->len == 16 );
Daniel Kingb8025c52016-05-17 14:43:01 -030020
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020021 mbedtls_chachapoly_init( &ctx );
22
Ronald Cron9ed40732020-06-25 09:03:34 +020023 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str->x ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020024
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +020025 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +020026 input_str->len, nonce_str->x,
27 aad_str->x, aad_str->len,
28 input_str->x, output, mac ) == 0 );
Daniel Kingb8025c52016-05-17 14:43:01 -030029
Ronald Cron9ed40732020-06-25 09:03:34 +020030 TEST_ASSERT( memcmp( output_str->x, output, output_str->len ) == 0 );
31 TEST_ASSERT( memcmp( mac_str->x, mac, 16U ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020032
33exit:
34 mbedtls_chachapoly_free( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -030035}
36/* END_CASE */
37
38/* BEGIN_CASE */
Ronald Cron9ed40732020-06-25 09:03:34 +020039void mbedtls_chachapoly_dec( data_t *key_str, data_t *nonce_str, data_t *aad_str, data_t *input_str, data_t *output_str, data_t *mac_str, int ret_exp )
Daniel Kingb8025c52016-05-17 14:43:01 -030040{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020041 unsigned char output[265];
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020042 int ret;
43 mbedtls_chachapoly_context ctx;
Daniel Kingb8025c52016-05-17 14:43:01 -030044
Ronald Cron9ed40732020-06-25 09:03:34 +020045 TEST_ASSERT( key_str->len == 32 );
46 TEST_ASSERT( nonce_str->len == 12 );
47 TEST_ASSERT( mac_str->len == 16 );
Daniel Kingb8025c52016-05-17 14:43:01 -030048
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020049 mbedtls_chachapoly_init( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -030050
Ronald Cron9ed40732020-06-25 09:03:34 +020051 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str->x ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020052
53 ret = mbedtls_chachapoly_auth_decrypt( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +020054 input_str->len, nonce_str->x,
55 aad_str->x, aad_str->len,
56 mac_str->x, input_str->x, output );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020057
Manuel Pégourié-Gonnard72967712018-05-09 12:22:13 +020058 TEST_ASSERT( ret == ret_exp );
59 if( ret_exp == 0 )
60 {
Ronald Cron9ed40732020-06-25 09:03:34 +020061 TEST_ASSERT( memcmp( output_str->x, output, output_str->len ) == 0 );
Manuel Pégourié-Gonnard72967712018-05-09 12:22:13 +020062 }
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020063
64exit:
65 mbedtls_chachapoly_free( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -030066}
67/* END_CASE */
68
Manuel Pégourié-Gonnardceb12252018-05-10 11:41:00 +020069/* BEGIN_CASE */
70void chachapoly_state()
71{
72 unsigned char key[32];
73 unsigned char nonce[12];
74 unsigned char aad[1];
75 unsigned char input[1];
76 unsigned char output[1];
77 unsigned char mac[16];
78 size_t input_len = sizeof( input );
79 size_t aad_len = sizeof( aad );
80 mbedtls_chachapoly_context ctx;
81
82 memset( key, 0x00, sizeof( key ) );
83 memset( nonce, 0x00, sizeof( nonce ) );
84 memset( aad, 0x00, sizeof( aad ) );
85 memset( input, 0x00, sizeof( input ) );
86 memset( output, 0x00, sizeof( output ) );
87 memset( mac, 0x00, sizeof( mac ) );
88
89 /* Initial state: finish, update, update_aad forbidden */
90 mbedtls_chachapoly_init( &ctx );
91
92 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
93 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
94 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
95 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
96 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
97 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
98
99 /* Still initial state: finish, update, update_aad forbidden */
100 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key )
101 == 0 );
102
103 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
104 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
105 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
106 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
107 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
108 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
109
110 /* Starts -> finish OK */
111 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
112 == 0 );
113 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
114 == 0 );
115
116 /* After finish: update, update_aad forbidden */
117 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
118 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
119 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
120 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
121
122 /* Starts -> update* OK */
123 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
124 == 0 );
125 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
126 == 0 );
127 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
128 == 0 );
129
130 /* After update: update_aad forbidden */
131 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
132 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
133
134 /* Starts -> update_aad* -> finish OK */
135 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
136 == 0 );
137 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
138 == 0 );
139 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
140 == 0 );
141 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
142 == 0 );
143
144exit:
145 mbedtls_chachapoly_free( &ctx );
146}
147/* END_CASE */
148
Daniel Kingb8025c52016-05-17 14:43:01 -0300149/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200150void chachapoly_selftest()
Daniel Kingb8025c52016-05-17 14:43:01 -0300151{
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200152 TEST_ASSERT( mbedtls_chachapoly_self_test( 1 ) == 0 );
Daniel Kingb8025c52016-05-17 14:43:01 -0300153}
154/* END_CASE */