blob: 0bc9437a74fa4f15f6e6772556cc41b48cddf99c [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1521 base64 encoding/decoding
3 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkúti4e9f7122020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
Paul Bakker5121ce52009-01-03 21:22:43 +000045 */
46
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000048#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020049#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020051#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if defined(MBEDTLS_BASE64_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000055#include "mbedtls/base64.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000056
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020057#include <stdint.h>
Paul Bakker5c2364c2012-10-01 14:41:15 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_SELF_TEST)
Rich Evans00ab4702015-02-06 13:43:58 +000060#include <string.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000062#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010063#else
Rich Evans00ab4702015-02-06 13:43:58 +000064#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065#define mbedtls_printf printf
66#endif /* MBEDTLS_PLATFORM_C */
67#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010068
Paul Bakker5121ce52009-01-03 21:22:43 +000069static const unsigned char base64_enc_map[64] =
70{
71 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
72 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
73 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
74 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
75 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
76 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
77 '8', '9', '+', '/'
78};
79
80static const unsigned char base64_dec_map[128] =
81{
82 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
83 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
84 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
85 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
86 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
87 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
88 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
89 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
90 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
91 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
92 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
93 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
94 49, 50, 51, 127, 127, 127, 127, 127
95};
96
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +010097#define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
98
Paul Elliottaae04ef2021-02-25 12:28:49 +000099/*
100 * Constant flow conditional assignment
101*/
Paul Elliottaa502792021-02-05 17:49:23 +0000102static void mbedtls_base64_cond_assign(unsigned char * dest, const unsigned char * const src,
103 unsigned char condition)
104{
105 /* make sure assign is 0 or 1 in a time-constant manner */
106 condition = (condition | (unsigned char)-condition) >> 7;
107
108 *dest = ( *dest ) * ( 1 - condition ) + ( *src ) * condition;
109}
110
111/*
Paul Elliottaae04ef2021-02-25 12:28:49 +0000112 * Constant flow check for equality
Paul Elliottaa502792021-02-05 17:49:23 +0000113*/
Paul Elliottaae04ef2021-02-25 12:28:49 +0000114static unsigned char mbedtls_base64_eq(size_t in_a, size_t in_b)
Paul Elliottaa502792021-02-05 17:49:23 +0000115{
Paul Elliotteb3916d2021-03-01 17:49:42 +0000116 size_t difference = in_a ^ in_b;
Paul Elliottaa502792021-02-05 17:49:23 +0000117
Paul Elliottaae04ef2021-02-25 12:28:49 +0000118 /* MSVC has a warning about unary minus on unsigned integer types,
119 * but this is well-defined and precisely what we want to do here. */
120#if defined(_MSC_VER)
121#pragma warning( push )
122#pragma warning( disable : 4146 )
123#endif
124
Paul Elliottaa502792021-02-05 17:49:23 +0000125 difference |= -difference;
Paul Elliottaae04ef2021-02-25 12:28:49 +0000126
127#if defined(_MSC_VER)
128#pragma warning( pop )
129#endif
130
Paul Elliotteb3916d2021-03-01 17:49:42 +0000131 /* cope with the varying size of size_t per platform */
132 difference >>= ( sizeof( difference ) * 8 - 1 );
133
Paul Elliottaa502792021-02-05 17:49:23 +0000134 return (unsigned char) ( 1 ^ difference );
135}
136
137/*
Paul Elliottaae04ef2021-02-25 12:28:49 +0000138 * Constant flow lookup into table.
Paul Elliottaa502792021-02-05 17:49:23 +0000139*/
140static unsigned char mbedtls_base64_table_lookup(const unsigned char * const table,
141 const size_t table_size, const size_t table_index)
142{
143 size_t i;
144 unsigned char result = 0;
145
146 for( i = 0; i < table_size; ++i )
147 {
148 mbedtls_base64_cond_assign(&result, &table[i], mbedtls_base64_eq(i, table_index));
149 }
150
151 return result;
152}
153
Paul Bakker5121ce52009-01-03 21:22:43 +0000154/*
155 * Encode a buffer into base64 format
156 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100157int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000158 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000159{
Paul Bakker23986e52011-04-24 08:57:21 +0000160 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000161 int C1, C2, C3;
162 unsigned char *p;
163
164 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000165 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100166 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000167 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000168 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000169
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200170 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000171
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100172 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000173 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100174 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200175 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000176 }
177
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200178 n *= 4;
179
Janos Follath98e28a72016-05-31 14:03:54 +0100180 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000181 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100182 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200183 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000184 }
185
Paul Bakker66d5d072014-06-17 16:39:18 +0200186 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000187
188 for( i = 0, p = dst; i < n; i += 3 )
189 {
190 C1 = *src++;
191 C2 = *src++;
192 C3 = *src++;
193
Paul Elliottaa502792021-02-05 17:49:23 +0000194 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
195 ( ( C1 >> 2 ) & 0x3F ) );
196
197 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
198 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
199
200 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
201 ( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F ) );
202
203 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
204 ( C3 & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000205 }
206
207 if( i < slen )
208 {
209 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200210 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000211
Paul Elliottaa502792021-02-05 17:49:23 +0000212 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
213 ( ( C1 >> 2 ) & 0x3F ) );
214
215 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
216 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000217
Paul Bakker66d5d072014-06-17 16:39:18 +0200218 if( ( i + 1 ) < slen )
Paul Elliottaa502792021-02-05 17:49:23 +0000219 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
220 ( ( ( C2 & 15 ) << 2 ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000221 else *p++ = '=';
222
223 *p++ = '=';
224 }
225
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100226 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000227 *p = 0;
228
229 return( 0 );
230}
231
232/*
233 * Decode a base64-formatted buffer
234 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100235int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000236 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000237{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000238 size_t i, n;
239 uint32_t j, x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000240 unsigned char *p;
Paul Elliott419983d2021-03-01 18:33:09 +0000241 unsigned char dec_map_lookup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000242
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200243 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200244 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000245 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200246 /* Skip spaces before checking for EOL */
247 x = 0;
248 while( i < slen && src[i] == ' ' )
249 {
250 ++i;
251 ++x;
252 }
253
254 /* Spaces at end of buffer are OK */
255 if( i == slen )
256 break;
257
Paul Bakker5121ce52009-01-03 21:22:43 +0000258 if( ( slen - i ) >= 2 &&
259 src[i] == '\r' && src[i + 1] == '\n' )
260 continue;
261
262 if( src[i] == '\n' )
263 continue;
264
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200265 /* Space inside a line is an error */
266 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200268
Paul Bakker5121ce52009-01-03 21:22:43 +0000269 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000271
Paul Elliott419983d2021-03-01 18:33:09 +0000272 dec_map_lookup = mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] );
273
274 if( src[i] > 127 || dec_map_lookup == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200275 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000276
Paul Elliott419983d2021-03-01 18:33:09 +0000277 if( dec_map_lookup < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200278 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000279
280 n++;
281 }
282
283 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100284 {
285 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000286 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100287 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000288
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000289 /* The following expression is to calculate the following formula without
290 * risk of integer overflow in n:
291 * n = ( ( n * 6 ) + 7 ) >> 3;
292 */
Andres AG4623d832017-01-18 17:21:03 +0000293 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200294 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000295
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100296 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000297 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100298 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300 }
301
302 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
303 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200304 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000305 continue;
306
Paul Elliott419983d2021-03-01 18:33:09 +0000307 dec_map_lookup = mbedtls_base64_table_lookup(base64_dec_map, sizeof( base64_dec_map ), *src );
308
309 j -= ( dec_map_lookup == 64 );
310 x = ( x << 6 ) | ( dec_map_lookup & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000311
312 if( ++n == 4 )
313 {
314 n = 0;
315 if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
316 if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
317 if( j > 2 ) *p++ = (unsigned char)( x );
318 }
319 }
320
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100321 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000322
323 return( 0 );
324}
325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000327
Paul Bakker5121ce52009-01-03 21:22:43 +0000328static const unsigned char base64_test_dec[64] =
329{
330 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
331 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
332 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
333 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
334 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
335 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
336 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
337 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
338};
339
340static const unsigned char base64_test_enc[] =
341 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
342 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
343
344/*
345 * Checkup routine
346 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000348{
Paul Bakker23986e52011-04-24 08:57:21 +0000349 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200350 const unsigned char *src;
351 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000352
353 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
Paul Bakker3c2122f2013-06-24 19:03:14 +0200356 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000357
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100358 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200359 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000360 {
361 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
364 return( 1 );
365 }
366
367 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000369
Paul Bakker3c2122f2013-06-24 19:03:14 +0200370 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100372 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 memcmp( base64_test_dec, buffer, 64 ) != 0 )
374 {
375 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
378 return( 1 );
379 }
380
381 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 return( 0 );
385}
386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389#endif /* MBEDTLS_BASE64_C */