1/* BEGIN_HEADER */
2#include "mbedtls/base64.h"
3#include "base64_invasive.h"
4#include <test/constant_flow.h>
5
6#if defined(MBEDTLS_TEST_HOOKS)
7static const char base64_digits[] =
8    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
9#endif /* MBEDTLS_TEST_HOOKS */
10
11/* END_HEADER */
12
13/* BEGIN_DEPENDENCIES
14 * depends_on:MBEDTLS_BASE64_C
15 * END_DEPENDENCIES
16 */
17
18/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS */
19void mask_of_range( int low_arg, int high_arg )
20{
21    unsigned char low = low_arg, high = high_arg;
22    unsigned c;
23    for( c = 0; c <= 0xff; c++ )
24    {
25        mbedtls_test_set_step( c );
26        TEST_CF_SECRET( &c, sizeof( c ) );
27        unsigned char m = mbedtls_base64_mask_of_range( low, high, c );
28        TEST_CF_PUBLIC( &c, sizeof( c ) );
29        TEST_CF_PUBLIC( &m, sizeof( m ) );
30        if( low <= c && c <= high )
31            TEST_EQUAL( m, 0xff );
32        else
33            TEST_EQUAL( m, 0 );
34    }
35}
36/* END_CASE */
37
38/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS */
39void enc_chars( )
40{
41    for( unsigned value = 0; value < 64; value++ )
42    {
43        mbedtls_test_set_step( value );
44        TEST_CF_SECRET( &value, sizeof( value ) );
45        unsigned char digit = mbedtls_base64_enc_char( value );
46        TEST_CF_PUBLIC( &value, sizeof( value ) );
47        TEST_CF_PUBLIC( &digit, sizeof( digit ) );
48        TEST_EQUAL( digit, base64_digits[value] );
49    }
50}
51/* END_CASE */
52
53/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS */
54void dec_chars( )
55{
56    char *p;
57    signed char expected;
58
59    for( unsigned c = 0; c <= 0xff; c++ )
60    {
61        mbedtls_test_set_step( c );
62        /* base64_digits is 0-terminated. sizeof()-1 excludes the trailing 0. */
63        p = memchr( base64_digits, c, sizeof( base64_digits ) - 1 );
64        if( p == NULL )
65            expected = -1;
66        else
67            expected = p - base64_digits;
68        TEST_CF_SECRET( &c, sizeof( c ) );
69        signed char actual = mbedtls_base64_dec_value( c );
70        TEST_CF_PUBLIC( &c, sizeof( c ) );
71        TEST_CF_PUBLIC( &actual, sizeof( actual ) );
72        TEST_EQUAL( actual, expected );
73    }
74}
75/* END_CASE */
76
77/* BEGIN_CASE */
78void mbedtls_base64_encode( char * src_string, char * dst_string,
79                            int dst_buf_size, int result )
80{
81    unsigned char src_str[1000];
82    unsigned char dst_str[1000];
83    size_t len, src_len;
84
85    memset(src_str, 0x00, 1000);
86    memset(dst_str, 0x00, 1000);
87
88    strncpy( (char *) src_str, src_string, sizeof(src_str) - 1 );
89    src_len = strlen( (char *) src_str );
90
91    TEST_CF_SECRET( src_str, sizeof( src_str ) );
92    TEST_ASSERT( mbedtls_base64_encode( dst_str, dst_buf_size, &len, src_str, src_len) == result );
93    TEST_CF_PUBLIC( src_str, sizeof( src_str ) );
94
95    /* dest_str will have had tainted data copied to it, prevent the TEST_ASSERT below from triggering
96       CF failures by unmarking it. */
97    TEST_CF_PUBLIC( dst_str, len );
98
99    if( result == 0 )
100    {
101        TEST_ASSERT( strcmp( (char *) dst_str, dst_string ) == 0 );
102    }
103}
104/* END_CASE */
105
106/* BEGIN_CASE */
107void mbedtls_base64_decode( char * src_string, char * dst_string, int result )
108{
109    unsigned char src_str[1000];
110    unsigned char dst_str[1000];
111    size_t len;
112    int res;
113
114    memset(src_str, 0x00, 1000);
115    memset(dst_str, 0x00, 1000);
116
117    strncpy( (char *) src_str, src_string, sizeof(src_str) - 1 );
118    res = mbedtls_base64_decode( dst_str, sizeof( dst_str ), &len, src_str, strlen( (char *) src_str ) );
119    TEST_ASSERT( res == result );
120    if( result == 0 )
121    {
122        TEST_ASSERT( strcmp( (char *) dst_str, dst_string ) == 0 );
123    }
124}
125/* END_CASE */
126
127/* BEGIN_CASE */
128void base64_encode_hex( data_t * src, char * dst, int dst_buf_size,
129                        int result )
130{
131    unsigned char *res = NULL;
132    size_t len;
133
134    res = mbedtls_test_zero_alloc( dst_buf_size );
135
136    TEST_CF_SECRET( src->x, src->len );
137    TEST_ASSERT( mbedtls_base64_encode( res, dst_buf_size, &len, src->x, src->len ) == result );
138    TEST_CF_PUBLIC( src->x, src->len );
139
140    /* res will have had tainted data copied to it, prevent the TEST_ASSERT below from triggering
141       CF failures by unmarking it. */
142    TEST_CF_PUBLIC( res, len );
143
144    if( result == 0 )
145    {
146        TEST_ASSERT( len == strlen( dst ) );
147        TEST_ASSERT( memcmp( dst, res, len ) == 0 );
148    }
149
150exit:
151    mbedtls_free( res );
152}
153/* END_CASE */
154
155/* BEGIN_CASE */
156void base64_decode_hex( char * src, data_t * dst, int dst_buf_size,
157                        int result )
158{
159    unsigned char *res = NULL;
160    size_t len;
161
162    res = mbedtls_test_zero_alloc( dst_buf_size );
163
164    TEST_ASSERT( mbedtls_base64_decode( res, dst_buf_size, &len, (unsigned char *) src,
165                                strlen( src ) ) == result );
166    if( result == 0 )
167    {
168        TEST_ASSERT( len == dst->len );
169        TEST_ASSERT( memcmp( dst->x, res, len ) == 0 );
170    }
171
172exit:
173    mbedtls_free( res );
174}
175/* END_CASE */
176
177/* BEGIN_CASE */
178void base64_decode_hex_src( data_t * src, char * dst_ref, int result )
179{
180    unsigned char dst[1000] = { 0 };
181    size_t len;
182
183    TEST_ASSERT( mbedtls_base64_decode( dst, sizeof( dst ), &len, src->x, src->len ) == result );
184    if( result == 0 )
185    {
186        TEST_ASSERT( len == strlen( dst_ref ) );
187        TEST_ASSERT( memcmp( dst, dst_ref, len ) == 0 );
188    }
189
190exit:
191    ;;
192}
193/* END_CASE */
194
195/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
196void base64_selftest(  )
197{
198    TEST_ASSERT( mbedtls_base64_self_test( 1 ) == 0 );
199}
200/* END_CASE */
201