blob: c16d71164fe48d7e6bb425684370d6201e5f1cc3 [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/*
Paul Elliottbd559622021-03-01 19:15:43 +0000100 * Constant flow conditional assignment to unsigned char
Paul Elliottaae04ef2021-02-25 12:28:49 +0000101*/
Paul Elliottbd559622021-03-01 19:15:43 +0000102static void mbedtls_base64_cond_assign_uchar(unsigned char * dest, const unsigned char * const src,
Paul Elliottaa502792021-02-05 17:49:23 +0000103 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 Elliottbd559622021-03-01 19:15:43 +0000112 * Constant flow conditional assignment to uint_32
113*/
114static void mbedtls_base64_cond_assign_uint32(uint32_t * dest, const uint32_t src,
115 unsigned char condition)
116{
117 /* make sure assign is 0 or 1 in a time-constant manner */
118 condition = (condition | (unsigned char)-condition) >> 7;
119
120 *dest = ( *dest ) * ( 1 - condition ) + ( src ) * condition;
121}
122
123
124/*
Paul Elliottaae04ef2021-02-25 12:28:49 +0000125 * Constant flow check for equality
Paul Elliottaa502792021-02-05 17:49:23 +0000126*/
Paul Elliottaae04ef2021-02-25 12:28:49 +0000127static unsigned char mbedtls_base64_eq(size_t in_a, size_t in_b)
Paul Elliottaa502792021-02-05 17:49:23 +0000128{
Paul Elliotteb3916d2021-03-01 17:49:42 +0000129 size_t difference = in_a ^ in_b;
Paul Elliottaa502792021-02-05 17:49:23 +0000130
Paul Elliottaae04ef2021-02-25 12:28:49 +0000131 /* MSVC has a warning about unary minus on unsigned integer types,
132 * but this is well-defined and precisely what we want to do here. */
133#if defined(_MSC_VER)
134#pragma warning( push )
135#pragma warning( disable : 4146 )
136#endif
137
Paul Elliottaa502792021-02-05 17:49:23 +0000138 difference |= -difference;
Paul Elliottaae04ef2021-02-25 12:28:49 +0000139
140#if defined(_MSC_VER)
141#pragma warning( pop )
142#endif
143
Paul Elliotteb3916d2021-03-01 17:49:42 +0000144 /* cope with the varying size of size_t per platform */
145 difference >>= ( sizeof( difference ) * 8 - 1 );
146
Paul Elliottaa502792021-02-05 17:49:23 +0000147 return (unsigned char) ( 1 ^ difference );
148}
149
150/*
Paul Elliottaae04ef2021-02-25 12:28:49 +0000151 * Constant flow lookup into table.
Paul Elliottaa502792021-02-05 17:49:23 +0000152*/
153static unsigned char mbedtls_base64_table_lookup(const unsigned char * const table,
154 const size_t table_size, const size_t table_index)
155{
156 size_t i;
157 unsigned char result = 0;
158
159 for( i = 0; i < table_size; ++i )
160 {
Paul Elliottbd559622021-03-01 19:15:43 +0000161 mbedtls_base64_cond_assign_uchar(&result, &table[i], mbedtls_base64_eq(i, table_index));
Paul Elliottaa502792021-02-05 17:49:23 +0000162 }
163
164 return result;
165}
166
Paul Bakker5121ce52009-01-03 21:22:43 +0000167/*
168 * Encode a buffer into base64 format
169 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100170int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000171 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000172{
Paul Bakker23986e52011-04-24 08:57:21 +0000173 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000174 int C1, C2, C3;
175 unsigned char *p;
176
177 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000178 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100179 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000180 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000181 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000182
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200183 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000184
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100185 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000186 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100187 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200188 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000189 }
190
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200191 n *= 4;
192
Janos Follath98e28a72016-05-31 14:03:54 +0100193 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000194 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100195 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200196 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000197 }
198
Paul Bakker66d5d072014-06-17 16:39:18 +0200199 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000200
201 for( i = 0, p = dst; i < n; i += 3 )
202 {
203 C1 = *src++;
204 C2 = *src++;
205 C3 = *src++;
206
Paul Elliottaa502792021-02-05 17:49:23 +0000207 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
208 ( ( C1 >> 2 ) & 0x3F ) );
209
210 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
211 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
212
213 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
214 ( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F ) );
215
216 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
217 ( C3 & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000218 }
219
220 if( i < slen )
221 {
222 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200223 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000224
Paul Elliottaa502792021-02-05 17:49:23 +0000225 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
226 ( ( C1 >> 2 ) & 0x3F ) );
227
228 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
229 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000230
Paul Bakker66d5d072014-06-17 16:39:18 +0200231 if( ( i + 1 ) < slen )
Paul Elliottaa502792021-02-05 17:49:23 +0000232 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
233 ( ( ( C2 & 15 ) << 2 ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000234 else *p++ = '=';
235
236 *p++ = '=';
237 }
238
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100239 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000240 *p = 0;
241
242 return( 0 );
243}
244
245/*
246 * Decode a base64-formatted buffer
247 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100248int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000249 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000250{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000251 size_t i, n;
252 uint32_t j, x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000253 unsigned char *p;
Paul Elliott419983d2021-03-01 18:33:09 +0000254 unsigned char dec_map_lookup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000255
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200256 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200257 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000258 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200259 /* Skip spaces before checking for EOL */
260 x = 0;
261 while( i < slen && src[i] == ' ' )
262 {
263 ++i;
264 ++x;
265 }
266
267 /* Spaces at end of buffer are OK */
268 if( i == slen )
269 break;
270
Paul Bakker5121ce52009-01-03 21:22:43 +0000271 if( ( slen - i ) >= 2 &&
272 src[i] == '\r' && src[i + 1] == '\n' )
273 continue;
274
275 if( src[i] == '\n' )
276 continue;
277
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200278 /* Space inside a line is an error */
279 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200281
Paul Bakker5121ce52009-01-03 21:22:43 +0000282 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000284
Paul Elliott419983d2021-03-01 18:33:09 +0000285 dec_map_lookup = mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] );
286
287 if( src[i] > 127 || dec_map_lookup == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000289
Paul Elliott419983d2021-03-01 18:33:09 +0000290 if( dec_map_lookup < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000292
293 n++;
294 }
295
296 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100297 {
298 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000299 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100300 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000301
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000302 /* The following expression is to calculate the following formula without
303 * risk of integer overflow in n:
304 * n = ( ( n * 6 ) + 7 ) >> 3;
305 */
Andres AG4623d832017-01-18 17:21:03 +0000306 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200307 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000308
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100309 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000310 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100311 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000313 }
314
315 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
316 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200317 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000318 continue;
319
Paul Elliott419983d2021-03-01 18:33:09 +0000320 dec_map_lookup = mbedtls_base64_table_lookup(base64_dec_map, sizeof( base64_dec_map ), *src );
321
Paul Elliottbd559622021-03-01 19:15:43 +0000322 mbedtls_base64_cond_assign_uint32( &j, j - 1, mbedtls_base64_eq( dec_map_lookup, 64 ) );
Paul Elliott419983d2021-03-01 18:33:09 +0000323 x = ( x << 6 ) | ( dec_map_lookup & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000324
325 if( ++n == 4 )
326 {
327 n = 0;
328 if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
329 if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
330 if( j > 2 ) *p++ = (unsigned char)( x );
331 }
332 }
333
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100334 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000335
336 return( 0 );
337}
338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000340
Paul Bakker5121ce52009-01-03 21:22:43 +0000341static const unsigned char base64_test_dec[64] =
342{
343 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
344 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
345 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
346 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
347 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
348 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
349 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
350 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
351};
352
353static const unsigned char base64_test_enc[] =
354 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
355 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
356
357/*
358 * Checkup routine
359 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000361{
Paul Bakker23986e52011-04-24 08:57:21 +0000362 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200363 const unsigned char *src;
364 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
366 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000368
Paul Bakker3c2122f2013-06-24 19:03:14 +0200369 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100371 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200372 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 {
374 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
377 return( 1 );
378 }
379
380 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000382
Paul Bakker3c2122f2013-06-24 19:03:14 +0200383 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100385 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 memcmp( base64_test_dec, buffer, 64 ) != 0 )
387 {
388 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
391 return( 1 );
392 }
393
394 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200395 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000396
397 return( 0 );
398}
399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200400#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402#endif /* MBEDTLS_BASE64_C */