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