blob: 201055b67f216b4e3b9a8b09222d78b817225fda [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1521 base64 encoding/decoding
3 *
Bence Szépkútia2947ac2020-08-19 16:37:36 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkútif744bd72020-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útif744bd72020-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 Elliottf13a47b2021-02-25 12:28:49 +000099/*
100 * Constant flow conditional assignment
101*/
Paul Elliott738d2312021-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 Elliottf13a47b2021-02-25 12:28:49 +0000112 * Constant flow check for equality
Paul Elliott738d2312021-02-05 17:49:23 +0000113*/
Paul Elliottf13a47b2021-02-25 12:28:49 +0000114static unsigned char mbedtls_base64_eq(size_t in_a, size_t in_b)
Paul Elliott738d2312021-02-05 17:49:23 +0000115{
116 uint32_t difference = in_a ^ in_b;
117
Paul Elliottf13a47b2021-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 Elliott738d2312021-02-05 17:49:23 +0000125 difference |= -difference;
Paul Elliottf13a47b2021-02-25 12:28:49 +0000126
127#if defined(_MSC_VER)
128#pragma warning( pop )
129#endif
130
Paul Elliott738d2312021-02-05 17:49:23 +0000131 difference >>= 31;
132 return (unsigned char) ( 1 ^ difference );
133}
134
135/*
Paul Elliottf13a47b2021-02-25 12:28:49 +0000136 * Constant flow lookup into table.
Paul Elliott738d2312021-02-05 17:49:23 +0000137*/
138static unsigned char mbedtls_base64_table_lookup(const unsigned char * const table,
139 const size_t table_size, const size_t table_index)
140{
141 size_t i;
142 unsigned char result = 0;
143
144 for( i = 0; i < table_size; ++i )
145 {
146 mbedtls_base64_cond_assign(&result, &table[i], mbedtls_base64_eq(i, table_index));
147 }
148
149 return result;
150}
151
Paul Bakker5121ce52009-01-03 21:22:43 +0000152/*
153 * Encode a buffer into base64 format
154 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100155int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000156 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000157{
Paul Bakker23986e52011-04-24 08:57:21 +0000158 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000159 int C1, C2, C3;
160 unsigned char *p;
161
162 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000163 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100164 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000165 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000166 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000167
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200168 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000169
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100170 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000171 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100172 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200173 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000174 }
175
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200176 n *= 4;
177
Janos Follath98e28a72016-05-31 14:03:54 +0100178 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000179 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100180 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000182 }
183
Paul Bakker66d5d072014-06-17 16:39:18 +0200184 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000185
186 for( i = 0, p = dst; i < n; i += 3 )
187 {
188 C1 = *src++;
189 C2 = *src++;
190 C3 = *src++;
191
Paul Elliott738d2312021-02-05 17:49:23 +0000192 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
193 ( ( C1 >> 2 ) & 0x3F ) );
194
195 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
196 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
197
198 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
199 ( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F ) );
200
201 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
202 ( C3 & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000203 }
204
205 if( i < slen )
206 {
207 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200208 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000209
Paul Elliott738d2312021-02-05 17:49:23 +0000210 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
211 ( ( C1 >> 2 ) & 0x3F ) );
212
213 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
214 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000215
Paul Bakker66d5d072014-06-17 16:39:18 +0200216 if( ( i + 1 ) < slen )
Paul Elliott738d2312021-02-05 17:49:23 +0000217 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
218 ( ( ( C2 & 15 ) << 2 ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000219 else *p++ = '=';
220
221 *p++ = '=';
222 }
223
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100224 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000225 *p = 0;
226
227 return( 0 );
228}
229
230/*
231 * Decode a base64-formatted buffer
232 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100233int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000234 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000235{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000236 size_t i, n;
237 uint32_t j, x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000238 unsigned char *p;
239
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200240 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200241 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000242 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200243 /* Skip spaces before checking for EOL */
244 x = 0;
245 while( i < slen && src[i] == ' ' )
246 {
247 ++i;
248 ++x;
249 }
250
251 /* Spaces at end of buffer are OK */
252 if( i == slen )
253 break;
254
Paul Bakker5121ce52009-01-03 21:22:43 +0000255 if( ( slen - i ) >= 2 &&
256 src[i] == '\r' && src[i + 1] == '\n' )
257 continue;
258
259 if( src[i] == '\n' )
260 continue;
261
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200262 /* Space inside a line is an error */
263 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200265
Paul Bakker5121ce52009-01-03 21:22:43 +0000266 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000268
Paul Elliott738d2312021-02-05 17:49:23 +0000269 if( src[i] > 127 ||
270 mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] ) == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000272
273 if( base64_dec_map[src[i]] < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000275
276 n++;
277 }
278
279 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100280 {
281 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000282 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100283 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000284
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000285 /* The following expression is to calculate the following formula without
286 * risk of integer overflow in n:
287 * n = ( ( n * 6 ) + 7 ) >> 3;
288 */
Andres AG4623d832017-01-18 17:21:03 +0000289 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200290 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000291
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100292 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000293 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100294 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000296 }
297
298 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
299 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200300 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000301 continue;
302
Paul Elliott738d2312021-02-05 17:49:23 +0000303 j -= ( mbedtls_base64_table_lookup(base64_dec_map, sizeof( base64_dec_map ), *src ) == 64 );
304 x = ( x << 6 ) |
305 ( mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), *src ) & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000306
307 if( ++n == 4 )
308 {
309 n = 0;
310 if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
311 if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
312 if( j > 2 ) *p++ = (unsigned char)( x );
313 }
314 }
315
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100316 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000317
318 return( 0 );
319}
320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000322
Paul Bakker5121ce52009-01-03 21:22:43 +0000323static const unsigned char base64_test_dec[64] =
324{
325 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
326 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
327 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
328 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
329 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
330 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
331 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
332 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
333};
334
335static const unsigned char base64_test_enc[] =
336 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
337 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
338
339/*
340 * Checkup routine
341 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000343{
Paul Bakker23986e52011-04-24 08:57:21 +0000344 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200345 const unsigned char *src;
346 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000347
348 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
Paul Bakker3c2122f2013-06-24 19:03:14 +0200351 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000352
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100353 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200354 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000355 {
356 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000358
359 return( 1 );
360 }
361
362 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000364
Paul Bakker3c2122f2013-06-24 19:03:14 +0200365 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100367 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000368 memcmp( base64_test_dec, buffer, 64 ) != 0 )
369 {
370 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000372
373 return( 1 );
374 }
375
376 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
379 return( 0 );
380}
381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384#endif /* MBEDTLS_BASE64_C */