blob: 3b2b35daed4acc90f2981342826b265e862522b5 [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;
241
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200242 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200243 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000244 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200245 /* Skip spaces before checking for EOL */
246 x = 0;
247 while( i < slen && src[i] == ' ' )
248 {
249 ++i;
250 ++x;
251 }
252
253 /* Spaces at end of buffer are OK */
254 if( i == slen )
255 break;
256
Paul Bakker5121ce52009-01-03 21:22:43 +0000257 if( ( slen - i ) >= 2 &&
258 src[i] == '\r' && src[i + 1] == '\n' )
259 continue;
260
261 if( src[i] == '\n' )
262 continue;
263
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200264 /* Space inside a line is an error */
265 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200266 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200267
Paul Bakker5121ce52009-01-03 21:22:43 +0000268 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000270
Paul Elliottaa502792021-02-05 17:49:23 +0000271 if( src[i] > 127 ||
272 mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] ) == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000274
275 if( base64_dec_map[src[i]] < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000277
278 n++;
279 }
280
281 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100282 {
283 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000284 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100285 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000286
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000287 /* The following expression is to calculate the following formula without
288 * risk of integer overflow in n:
289 * n = ( ( n * 6 ) + 7 ) >> 3;
290 */
Andres AG4623d832017-01-18 17:21:03 +0000291 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200292 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000293
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100294 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000295 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100296 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000298 }
299
300 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
301 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200302 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000303 continue;
304
Paul Elliottaa502792021-02-05 17:49:23 +0000305 j -= ( mbedtls_base64_table_lookup(base64_dec_map, sizeof( base64_dec_map ), *src ) == 64 );
306 x = ( x << 6 ) |
307 ( mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), *src ) & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000308
309 if( ++n == 4 )
310 {
311 n = 0;
312 if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
313 if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
314 if( j > 2 ) *p++ = (unsigned char)( x );
315 }
316 }
317
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100318 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000319
320 return( 0 );
321}
322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000324
Paul Bakker5121ce52009-01-03 21:22:43 +0000325static const unsigned char base64_test_dec[64] =
326{
327 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
328 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
329 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
330 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
331 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
332 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
333 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
334 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
335};
336
337static const unsigned char base64_test_enc[] =
338 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
339 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
340
341/*
342 * Checkup routine
343 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000345{
Paul Bakker23986e52011-04-24 08:57:21 +0000346 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200347 const unsigned char *src;
348 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000349
350 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000352
Paul Bakker3c2122f2013-06-24 19:03:14 +0200353 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100355 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200356 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000357 {
358 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200359 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
361 return( 1 );
362 }
363
364 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
Paul Bakker3c2122f2013-06-24 19:03:14 +0200367 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000368
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100369 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 memcmp( base64_test_dec, buffer, 64 ) != 0 )
371 {
372 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374
375 return( 1 );
376 }
377
378 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200379 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
381 return( 0 );
382}
383
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386#endif /* MBEDTLS_BASE64_C */