blob: b7e2e393782eef1259d543e5b1e908300c021e46 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1521 base64 encoding/decoding
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19
Gilles Peskinedb09ef62020-06-03 01:43:33 +020020#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022#if defined(MBEDTLS_BASE64_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000023
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000024#include "mbedtls/base64.h"
Gilles Peskinec1776a02021-08-06 14:47:10 +020025#include "base64_invasive.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000026
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020027#include <stdint.h>
Paul Bakker5c2364c2012-10-01 14:41:15 +000028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if defined(MBEDTLS_SELF_TEST)
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010033#else
Rich Evans00ab4702015-02-06 13:43:58 +000034#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#define mbedtls_printf printf
36#endif /* MBEDTLS_PLATFORM_C */
37#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010038
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +010039#define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
40
Gilles Peskineab043352021-07-28 13:54:02 +020041/* Return 0xff if low <= c <= high, 0 otherwise.
42 *
43 * Constant flow with respect to c.
44 */
Gilles Peskined7d32792021-08-03 12:19:30 +020045MBEDTLS_STATIC_TESTABLE
Gabor Mezeib8d78922021-11-15 16:03:24 +010046unsigned char mbedtls_ct_uchar_mask_of_range( unsigned char low,
47 unsigned char high,
48 unsigned char c )
Gilles Peskineab043352021-07-28 13:54:02 +020049{
Gilles Peskine8635e232021-07-30 12:57:22 +020050 /* low_mask is: 0 if low <= c, 0x...ff if low > c */
51 unsigned low_mask = ( (unsigned) c - low ) >> 8;
Gilles Peskineac253ea2021-10-25 21:13:27 +020052 /* high_mask is: 0 if c <= high, 0x...ff if c > high */
Gilles Peskine8635e232021-07-30 12:57:22 +020053 unsigned high_mask = ( (unsigned) high - c ) >> 8;
54 return( ~( low_mask | high_mask ) & 0xff );
Gilles Peskineab043352021-07-28 13:54:02 +020055}
56
Gilles Peskine2c4a3682021-07-28 14:31:39 +020057/* Given a value in the range 0..63, return the corresponding Base64 digit.
58 * The implementation assumes that letters are consecutive (e.g. ASCII
59 * but not EBCDIC).
60 */
Gilles Peskined7d32792021-08-03 12:19:30 +020061MBEDTLS_STATIC_TESTABLE
Gabor Mezeib8d78922021-11-15 16:03:24 +010062unsigned char mbedtls_ct_base64_enc_char( unsigned char val )
Gilles Peskine2c4a3682021-07-28 14:31:39 +020063{
64 unsigned char digit = 0;
65 /* For each range of values, if val is in that range, mask digit with
66 * the corresponding value. Since val can only be in a single range,
67 * only at most one masking will change digit. */
Gabor Mezeib8d78922021-11-15 16:03:24 +010068 digit |= mbedtls_ct_uchar_mask_of_range( 0, 25, val ) & ( 'A' + val );
69 digit |= mbedtls_ct_uchar_mask_of_range( 26, 51, val ) & ( 'a' + val - 26 );
70 digit |= mbedtls_ct_uchar_mask_of_range( 52, 61, val ) & ( '0' + val - 52 );
71 digit |= mbedtls_ct_uchar_mask_of_range( 62, 62, val ) & '+';
72 digit |= mbedtls_ct_uchar_mask_of_range( 63, 63, val ) & '/';
Gilles Peskine2c4a3682021-07-28 14:31:39 +020073 return( digit );
74}
75
Paul Bakker5121ce52009-01-03 21:22:43 +000076/*
77 * Encode a buffer into base64 format
78 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +010079int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +000080 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +000081{
Paul Bakker23986e52011-04-24 08:57:21 +000082 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +000083 int C1, C2, C3;
84 unsigned char *p;
85
86 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +000087 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +010088 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +000089 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +000090 }
Paul Bakker5121ce52009-01-03 21:22:43 +000091
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +020092 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +000093
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +010094 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +000095 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +010096 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +020097 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +000098 }
99
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200100 n *= 4;
101
Janos Follath98e28a72016-05-31 14:03:54 +0100102 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000103 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100104 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000106 }
107
Paul Bakker66d5d072014-06-17 16:39:18 +0200108 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000109
110 for( i = 0, p = dst; i < n; i += 3 )
111 {
112 C1 = *src++;
113 C2 = *src++;
114 C3 = *src++;
115
Gabor Mezeib8d78922021-11-15 16:03:24 +0100116 *p++ = mbedtls_ct_base64_enc_char( ( C1 >> 2 ) & 0x3F );
117 *p++ = mbedtls_ct_base64_enc_char( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) )
Gilles Peskined7d32792021-08-03 12:19:30 +0200118 & 0x3F );
Gabor Mezeib8d78922021-11-15 16:03:24 +0100119 *p++ = mbedtls_ct_base64_enc_char( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) )
Gilles Peskined7d32792021-08-03 12:19:30 +0200120 & 0x3F );
Gabor Mezeib8d78922021-11-15 16:03:24 +0100121 *p++ = mbedtls_ct_base64_enc_char( C3 & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000122 }
123
124 if( i < slen )
125 {
126 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200127 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000128
Gabor Mezeib8d78922021-11-15 16:03:24 +0100129 *p++ = mbedtls_ct_base64_enc_char( ( C1 >> 2 ) & 0x3F );
130 *p++ = mbedtls_ct_base64_enc_char( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) )
Gilles Peskined7d32792021-08-03 12:19:30 +0200131 & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000132
Paul Bakker66d5d072014-06-17 16:39:18 +0200133 if( ( i + 1 ) < slen )
Gabor Mezeib8d78922021-11-15 16:03:24 +0100134 *p++ = mbedtls_ct_base64_enc_char( ( ( C2 & 15 ) << 2 ) & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000135 else *p++ = '=';
136
137 *p++ = '=';
138 }
139
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100140 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000141 *p = 0;
142
143 return( 0 );
144}
145
Gilles Peskineab043352021-07-28 13:54:02 +0200146/* Given a Base64 digit, return its value.
147 * If c is not a Base64 digit ('A'..'Z', 'a'..'z', '0'..'9', '+' or '/'),
148 * return -1.
149 *
150 * The implementation assumes that letters are consecutive (e.g. ASCII
151 * but not EBCDIC).
152 *
153 * The implementation is constant-flow (no branch or memory access depending
154 * on the value of c) unless the compiler inlines and optimizes a specific
155 * access.
156 */
Gilles Peskined7d32792021-08-03 12:19:30 +0200157MBEDTLS_STATIC_TESTABLE
Gabor Mezeib8d78922021-11-15 16:03:24 +0100158signed char mbedtls_ct_base64_dec_value( unsigned char c )
Gilles Peskineab043352021-07-28 13:54:02 +0200159{
160 unsigned char val = 0;
161 /* For each range of digits, if c is in that range, mask val with
162 * the corresponding value. Since c can only be in a single range,
163 * only at most one masking will change val. Set val to one plus
164 * the desired value so that it stays 0 if c is in none of the ranges. */
Gabor Mezeib8d78922021-11-15 16:03:24 +0100165 val |= mbedtls_ct_uchar_mask_of_range( 'A', 'Z', c ) & ( c - 'A' + 0 + 1 );
166 val |= mbedtls_ct_uchar_mask_of_range( 'a', 'z', c ) & ( c - 'a' + 26 + 1 );
167 val |= mbedtls_ct_uchar_mask_of_range( '0', '9', c ) & ( c - '0' + 52 + 1 );
168 val |= mbedtls_ct_uchar_mask_of_range( '+', '+', c ) & ( c - '+' + 62 + 1 );
169 val |= mbedtls_ct_uchar_mask_of_range( '/', '/', c ) & ( c - '/' + 63 + 1 );
Gilles Peskineab043352021-07-28 13:54:02 +0200170 /* At this point, val is 0 if c is an invalid digit and v+1 if c is
171 * a digit with the value v. */
172 return( val - 1 );
173}
174
Paul Bakker5121ce52009-01-03 21:22:43 +0000175/*
176 * Decode a base64-formatted buffer
177 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100178int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000179 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000180{
Gilles Peskine1121cd22021-07-28 14:20:06 +0200181 size_t i; /* index in source */
182 size_t n; /* number of digits or trailing = in source */
183 uint32_t x; /* value accumulator */
Gilles Peskine67468e82021-07-30 12:56:21 +0200184 unsigned accumulated_digits = 0;
Gilles Peskine1121cd22021-07-28 14:20:06 +0200185 unsigned equals = 0;
186 int spaces_present = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000187 unsigned char *p;
188
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200189 /* First pass: check for validity and get output length */
Gilles Peskine1121cd22021-07-28 14:20:06 +0200190 for( i = n = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000191 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200192 /* Skip spaces before checking for EOL */
Gilles Peskine1121cd22021-07-28 14:20:06 +0200193 spaces_present = 0;
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200194 while( i < slen && src[i] == ' ' )
195 {
196 ++i;
Gilles Peskine1121cd22021-07-28 14:20:06 +0200197 spaces_present = 1;
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200198 }
199
200 /* Spaces at end of buffer are OK */
201 if( i == slen )
202 break;
203
Paul Bakker5121ce52009-01-03 21:22:43 +0000204 if( ( slen - i ) >= 2 &&
205 src[i] == '\r' && src[i + 1] == '\n' )
206 continue;
207
208 if( src[i] == '\n' )
209 continue;
210
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200211 /* Space inside a line is an error */
Gilles Peskine1121cd22021-07-28 14:20:06 +0200212 if( spaces_present )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200214
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200215 if( src[i] > 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200216 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000217
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200218 if( src[i] == '=' )
219 {
Gilles Peskine1121cd22021-07-28 14:20:06 +0200220 if( ++equals > 2 )
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200221 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
222 }
223 else
224 {
Gilles Peskine1121cd22021-07-28 14:20:06 +0200225 if( equals != 0 )
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200226 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Gabor Mezeib8d78922021-11-15 16:03:24 +0100227 if( mbedtls_ct_base64_dec_value( src[i] ) < 0 )
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200228 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
229 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000230 n++;
231 }
232
233 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100234 {
235 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000236 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100237 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000238
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000239 /* The following expression is to calculate the following formula without
240 * risk of integer overflow in n:
241 * n = ( ( n * 6 ) + 7 ) >> 3;
242 */
Andres AG4623d832017-01-18 17:21:03 +0000243 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Gilles Peskine1121cd22021-07-28 14:20:06 +0200244 n -= equals;
Paul Bakker5121ce52009-01-03 21:22:43 +0000245
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100246 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000247 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100248 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200249 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000250 }
251
Gilles Peskine1121cd22021-07-28 14:20:06 +0200252 equals = 0;
Gilles Peskine67468e82021-07-30 12:56:21 +0200253 for( x = 0, p = dst; i > 0; i--, src++ )
Gilles Peskine1121cd22021-07-28 14:20:06 +0200254 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200255 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000256 continue;
257
Gilles Peskine1121cd22021-07-28 14:20:06 +0200258 x = x << 6;
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200259 if( *src == '=' )
Gilles Peskine1121cd22021-07-28 14:20:06 +0200260 ++equals;
Gilles Peskineb553eaa2021-07-28 11:33:04 +0200261 else
Gabor Mezeib8d78922021-11-15 16:03:24 +0100262 x |= mbedtls_ct_base64_dec_value( *src );
Paul Bakker5121ce52009-01-03 21:22:43 +0000263
Gilles Peskine67468e82021-07-30 12:56:21 +0200264 if( ++accumulated_digits == 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000265 {
Gilles Peskine67468e82021-07-30 12:56:21 +0200266 accumulated_digits = 0;
Gilles Peskine1121cd22021-07-28 14:20:06 +0200267 *p++ = MBEDTLS_BYTE_2( x );
268 if( equals <= 1 ) *p++ = MBEDTLS_BYTE_1( x );
269 if( equals <= 0 ) *p++ = MBEDTLS_BYTE_0( x );
Paul Bakker5121ce52009-01-03 21:22:43 +0000270 }
271 }
272
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100273 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000274
275 return( 0 );
276}
277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200278#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000279
Paul Bakker5121ce52009-01-03 21:22:43 +0000280static const unsigned char base64_test_dec[64] =
281{
282 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
283 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
284 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
285 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
286 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
287 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
288 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
289 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
290};
291
292static const unsigned char base64_test_enc[] =
293 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
294 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
295
296/*
297 * Checkup routine
298 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000300{
Paul Bakker23986e52011-04-24 08:57:21 +0000301 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200302 const unsigned char *src;
303 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000304
305 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307
Paul Bakker3c2122f2013-06-24 19:03:14 +0200308 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000309
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100310 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200311 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000312 {
313 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000315
316 return( 1 );
317 }
318
319 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000321
Paul Bakker3c2122f2013-06-24 19:03:14 +0200322 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000323
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100324 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 memcmp( base64_test_dec, buffer, 64 ) != 0 )
326 {
327 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000329
330 return( 1 );
331 }
332
333 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000335
336 return( 0 );
337}
338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341#endif /* MBEDTLS_BASE64_C */