blob: 137b92a6e494c6725ea8ab80d15b8f154d44e087 [file] [log] [blame]
Daniel King34b822c2016-05-15 17:28:08 -03001/* BEGIN_HEADER */
2#include "mbedtls/chacha20.h"
3/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
6 * depends_on:MBEDTLS_CHACHA20_C
7 * END_DEPENDENCIES
8 */
Daniel King6155cc82016-05-18 11:51:22 -03009
10/* BEGIN_CASE */
11void chacha20_crypt( char *hex_key_string,
12 char *hex_nonce_string,
13 int counter,
14 char *hex_src_string,
Ronald Cron7e512712020-06-25 11:33:01 +020015 char *hex_expected_output_string )
Daniel King6155cc82016-05-18 11:51:22 -030016{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020017 unsigned char key_str[32]; /* size set by the standard */
18 unsigned char nonce_str[12]; /* size set by the standard */
19 unsigned char src_str[375]; /* max size of binary input */
Ronald Cron7e512712020-06-25 11:33:01 +020020 unsigned char expected_output_str[375];
21 unsigned char output[375];
22 unsigned char output_string[751]; /* ASCII string representation of output */
Daniel King6155cc82016-05-18 11:51:22 -030023 size_t key_len;
24 size_t nonce_len;
25 size_t src_len;
Ronald Cron7e512712020-06-25 11:33:01 +020026 size_t expected_output_len;
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020027 mbedtls_chacha20_context ctx;
Daniel King6155cc82016-05-18 11:51:22 -030028
Ronald Cron7e512712020-06-25 11:33:01 +020029 memset( key_str, 0x00, sizeof( key_str ) );
30 memset( nonce_str, 0x00, sizeof( nonce_str ) );
31 memset( src_str, 0x00, sizeof( src_str ) );
32 memset( output, 0x00, sizeof( output ) );
33 memset( output_string, 0x00, sizeof( output_string ) );
Daniel King6155cc82016-05-18 11:51:22 -030034
Ronald Cron72d628f2020-06-08 17:05:57 +020035 key_len = mbedtls_test_unhexify( key_str, hex_key_string );
36 nonce_len = mbedtls_test_unhexify( nonce_str, hex_nonce_string );
37 src_len = mbedtls_test_unhexify( src_str, hex_src_string );
Ronald Cron7e512712020-06-25 11:33:01 +020038 expected_output_len = mbedtls_test_unhexify( expected_output_str,
39 hex_expected_output_string );
Daniel King6155cc82016-05-18 11:51:22 -030040
Ronald Cron7e512712020-06-25 11:33:01 +020041 TEST_ASSERT( src_len == expected_output_len );
Daniel King6155cc82016-05-18 11:51:22 -030042 TEST_ASSERT( key_len == 32U );
43 TEST_ASSERT( nonce_len == 12U );
44
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020045 /*
46 * Test the integrated API
47 */
Daniel King6155cc82016-05-18 11:51:22 -030048 TEST_ASSERT( mbedtls_chacha20_crypt( key_str, nonce_str, counter, src_len, src_str, output ) == 0 );
49
Ronald Cron7e512712020-06-25 11:33:01 +020050 mbedtls_test_hexify( output_string, output, src_len );
51 TEST_ASSERT( strcmp( (char*) output_string, hex_expected_output_string ) == 0 );
Daniel King6155cc82016-05-18 11:51:22 -030052
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020053 /*
54 * Test the streaming API
55 */
56 mbedtls_chacha20_init( &ctx );
57
58 TEST_ASSERT( mbedtls_chacha20_setkey( &ctx, key_str ) == 0 );
59
60 TEST_ASSERT( mbedtls_chacha20_starts( &ctx, nonce_str, counter ) == 0 );
61
62 memset( output, 0x00, sizeof( output ) );
63 TEST_ASSERT( mbedtls_chacha20_update( &ctx, src_len, src_str, output ) == 0 );
64
Ronald Cron7e512712020-06-25 11:33:01 +020065 mbedtls_test_hexify( output_string, output, src_len );
66 TEST_ASSERT( strcmp( (char*) output_string,
67 hex_expected_output_string ) == 0 );
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020068
69 /*
70 * Test the streaming API again, piecewise
71 */
72
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020073 /* Don't free/init the context nor set the key again,
74 * in order to test that starts() does the right thing. */
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020075 TEST_ASSERT( mbedtls_chacha20_starts( &ctx, nonce_str, counter ) == 0 );
76
77 memset( output, 0x00, sizeof( output ) );
78 TEST_ASSERT( mbedtls_chacha20_update( &ctx, 1, src_str, output ) == 0 );
79 TEST_ASSERT( mbedtls_chacha20_update( &ctx, src_len - 1, src_str + 1, output + 1 ) == 0 );
80
Ronald Cron7e512712020-06-25 11:33:01 +020081 mbedtls_test_hexify( output_string, output, src_len );
82 TEST_ASSERT( strcmp( (char*) output_string,
83 hex_expected_output_string ) == 0 );
Manuel Pégourié-Gonnard55c0d092018-05-09 12:37:58 +020084
85 mbedtls_chacha20_free( &ctx );
Daniel King6155cc82016-05-18 11:51:22 -030086}
87/* END_CASE */
88
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050089/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +020090void chacha20_bad_params()
91{
92 unsigned char key[32];
93 unsigned char nonce[12];
94 unsigned char src[1];
95 unsigned char dst[1];
96 uint32_t counter = 0;
97 size_t len = sizeof( src );
98 mbedtls_chacha20_context ctx;
99
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500100 TEST_INVALID_PARAM( mbedtls_chacha20_init( NULL ) );
101 TEST_VALID_PARAM( mbedtls_chacha20_free( NULL ) );
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200102
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500103 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
104 mbedtls_chacha20_setkey( NULL, key ) );
105 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
106 mbedtls_chacha20_setkey( &ctx, NULL ) );
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200107
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500108 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
109 mbedtls_chacha20_starts( NULL, nonce, counter ) );
110 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
111 mbedtls_chacha20_starts( &ctx, NULL, counter ) );
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200112
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500113 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
114 mbedtls_chacha20_update( NULL, 0, src, dst ) );
115 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
116 mbedtls_chacha20_update( &ctx, len, NULL, dst ) );
117 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
118 mbedtls_chacha20_update( &ctx, len, src, NULL ) );
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200119
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500120 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
121 mbedtls_chacha20_crypt( NULL, nonce, counter, 0, src, dst ) );
122 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
123 mbedtls_chacha20_crypt( key, NULL, counter, 0, src, dst ) );
124 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
125 mbedtls_chacha20_crypt( key, nonce, counter, len, NULL, dst ) );
126 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA,
127 mbedtls_chacha20_crypt( key, nonce, counter, len, src, NULL ) );
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200128
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500129exit:
130 return;
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200131
Manuel Pégourié-Gonnard2aca2362018-05-10 10:11:42 +0200132}
133/* END_CASE */
134
Daniel King34b822c2016-05-15 17:28:08 -0300135/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
136void chacha20_self_test()
137{
Manuel Pégourié-Gonnardfce88b22018-05-09 13:06:12 +0200138 TEST_ASSERT( mbedtls_chacha20_self_test( 1 ) == 0 );
Daniel King34b822c2016-05-15 17:28:08 -0300139}
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +0200140/* END_CASE */