blob: 44617d98ef9455f05d2ae8677d9f9ada1f5d5e6e [file] [log] [blame]
Daniel Kingadc32c02016-05-16 18:25:45 -03001/* BEGIN_HEADER */
2#include "mbedtls/poly1305.h"
3#include <stddef.h>
4/* END_HEADER */
5
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +02006/* BEGIN_DEPENDENCIES
7 * depends_on:MBEDTLS_POLY1305_C
8 * END_DEPENDENCIES
9 */
10
11/* BEGIN_CASE */
Ronald Cron9ed40732020-06-25 09:03:34 +020012void mbedtls_poly1305( data_t *key, char *hex_mac_string, data_t *src_str )
Daniel Kingadc32c02016-05-16 18:25:45 -030013{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020014 unsigned char mac[16]; /* size set by the standard */
15 unsigned char mac_str[33]; /* hex expansion of the above */
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020016 mbedtls_poly1305_context ctx;
Daniel Kingadc32c02016-05-16 18:25:45 -030017
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020018 memset( mac_str, 0x00, sizeof( mac_str ) );
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020019 memset( mac, 0x00, sizeof( mac ) );
Daniel Kingadc32c02016-05-16 18:25:45 -030020
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020021 /*
22 * Test the integrated API
23 */
Ronald Cron9ed40732020-06-25 09:03:34 +020024 TEST_ASSERT( mbedtls_poly1305_mac( key->x, src_str->x,
25 src_str->len, mac ) == 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -030026
Ronald Cron72d628f2020-06-08 17:05:57 +020027 mbedtls_test_hexify( mac_str, mac, 16 );
Daniel Kingadc32c02016-05-16 18:25:45 -030028 TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020029
30 /*
31 * Test the streaming API
32 */
33 mbedtls_poly1305_init( &ctx );
34
Ronald Cron9ed40732020-06-25 09:03:34 +020035 TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key->x ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020036
Ronald Cron9ed40732020-06-25 09:03:34 +020037 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x, src_str->len ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020038
39 TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );
40
Ronald Cron72d628f2020-06-08 17:05:57 +020041 mbedtls_test_hexify( mac_str, mac, 16 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020042 TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
43
44 /*
45 * Test the streaming API again, piecewise
46 */
47
48 /* Don't free/init the context, in order to test that starts() does the
49 * right thing. */
Ronald Cron9ed40732020-06-25 09:03:34 +020050 if( src_str->len >= 1 )
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020051 {
Ronald Cron9ed40732020-06-25 09:03:34 +020052 TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key->x ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020053
Ronald Cron9ed40732020-06-25 09:03:34 +020054 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x, 1 ) == 0 );
55 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x + 1, src_str->len - 1 ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020056
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020057 TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020058
Ronald Cron72d628f2020-06-08 17:05:57 +020059 mbedtls_test_hexify( mac_str, mac, 16 );
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020060 TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
61 }
62
63 /*
64 * Again with more pieces
65 */
Ronald Cron9ed40732020-06-25 09:03:34 +020066 if( src_str->len >= 2 )
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020067 {
Ronald Cron9ed40732020-06-25 09:03:34 +020068 TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key->x ) == 0 );
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020069
Ronald Cron9ed40732020-06-25 09:03:34 +020070 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x, 1 ) == 0 );
71 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x + 1, 1 ) == 0 );
72 TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str->x + 2, src_str->len - 2 ) == 0 );
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020073
74 TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );
75
Ronald Cron72d628f2020-06-08 17:05:57 +020076 mbedtls_test_hexify( mac_str, mac, 16 );
Manuel Pégourié-Gonnard444f7112018-05-10 11:06:46 +020077 TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
78 }
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +020079
80 mbedtls_poly1305_free( &ctx );
Daniel Kingadc32c02016-05-16 18:25:45 -030081}
82/* END_CASE */
83
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050084/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +020085void poly1305_bad_params()
86{
87 unsigned char src[1];
88 unsigned char key[32];
89 unsigned char mac[16];
90 size_t src_len = sizeof( src );
91 mbedtls_poly1305_context ctx;
92
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050093 TEST_INVALID_PARAM( mbedtls_poly1305_init( NULL ) );
94 TEST_VALID_PARAM( mbedtls_poly1305_free( NULL ) );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +020095
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050096 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
97 mbedtls_poly1305_starts( NULL, key ) );
98 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
99 mbedtls_poly1305_starts( &ctx, NULL ) );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200100
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500101 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
102 mbedtls_poly1305_update( NULL, src, 0 ) );
103 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
104 mbedtls_poly1305_update( &ctx, NULL, src_len ) );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200105
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500106 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
107 mbedtls_poly1305_finish( NULL, mac ) );
108 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
109 mbedtls_poly1305_finish( &ctx, NULL ) );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200110
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500111 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
112 mbedtls_poly1305_mac( NULL, src, 0, mac ) );
113 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
114 mbedtls_poly1305_mac( key, NULL, src_len, mac ) );
115 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
116 mbedtls_poly1305_mac( key, src, 0, NULL ) );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200117
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500118exit:
119 return;
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200120}
121/* END_CASE */
122
123/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Daniel Kingadc32c02016-05-16 18:25:45 -0300124void poly1305_selftest()
125{
Manuel Pégourié-Gonnardfce88b22018-05-09 13:06:12 +0200126 TEST_ASSERT( mbedtls_poly1305_self_test( 1 ) == 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300127}
128/* END_CASE */