blob: f2ae49b41201e27fb614f8b60411085f9c2bb44c [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"
Paul Bakker5121ce52009-01-03 21:22:43 +000025
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020026#include <stdint.h>
Paul Bakker5c2364c2012-10-01 14:41:15 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_SELF_TEST)
Rich Evans00ab4702015-02-06 13:43:58 +000029#include <string.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010032#else
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#define mbedtls_printf printf
35#endif /* MBEDTLS_PLATFORM_C */
36#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010037
Paul Bakker5121ce52009-01-03 21:22:43 +000038static const unsigned char base64_enc_map[64] =
39{
40 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
41 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
42 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
43 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
44 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
45 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
46 '8', '9', '+', '/'
47};
48
49static const unsigned char base64_dec_map[128] =
50{
51 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
52 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
53 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
54 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
55 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
56 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
57 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
58 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
59 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
60 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
61 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
62 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
63 49, 50, 51, 127, 127, 127, 127, 127
64};
65
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +010066#define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
67
Paul Elliott3e790812021-02-25 12:28:49 +000068/*
Paul Elliott0544d492021-03-01 19:15:43 +000069 * Constant flow conditional assignment to unsigned char
Paul Elliott3e790812021-02-25 12:28:49 +000070*/
Paul Elliott0544d492021-03-01 19:15:43 +000071static void mbedtls_base64_cond_assign_uchar(unsigned char * dest, const unsigned char * const src,
Paul Elliottdadd10d2021-02-05 17:49:23 +000072 unsigned char condition)
73{
Paul Elliott88f2eb62021-03-03 15:31:17 +000074 /* MSVC has a warning about unary minus on unsigned integer types,
75 * but this is well-defined and precisely what we want to do here. */
76#if defined(_MSC_VER)
77#pragma warning( push )
78#pragma warning( disable : 4146 )
79#endif
Paul Elliottdadd10d2021-02-05 17:49:23 +000080
Paul Elliott88f2eb62021-03-03 15:31:17 +000081 /* Generate bitmask from condition, mask will either be 0xFFFFFFFF or 0 */
82 unsigned char mask = -( unsigned char )( ( condition | -condition ) >> 7 );
83
84#if defined(_MSC_VER)
85#pragma warning( pop )
86#endif
87
88 *dest = ( ( *src ) & mask ) | ( ( *dest ) & ~mask );
Paul Elliottdadd10d2021-02-05 17:49:23 +000089}
90
91/*
Paul Elliott0544d492021-03-01 19:15:43 +000092 * Constant flow conditional assignment to uint_32
93*/
94static void mbedtls_base64_cond_assign_uint32(uint32_t * dest, const uint32_t src,
Paul Elliott88f2eb62021-03-03 15:31:17 +000095 uint32_t condition)
Paul Elliott0544d492021-03-01 19:15:43 +000096{
Paul Elliott88f2eb62021-03-03 15:31:17 +000097 /* MSVC has a warning about unary minus on unsigned integer types,
98 * but this is well-defined and precisely what we want to do here. */
99#if defined(_MSC_VER)
100#pragma warning( push )
101#pragma warning( disable : 4146 )
102#endif
Paul Elliott0544d492021-03-01 19:15:43 +0000103
Paul Elliott88f2eb62021-03-03 15:31:17 +0000104 /* Generate bitmask from condition, mask will either be 0xFFFFFFFF or 0 */
105 uint32_t mask = -( uint32_t )( ( condition | -condition ) >> 31 );
106
107#if defined(_MSC_VER)
108#pragma warning( pop )
109#endif
110
111 *dest = ( src & mask ) | ( ( *dest ) & ~mask );
Paul Elliott0544d492021-03-01 19:15:43 +0000112}
113
114
115/*
Paul Elliott3e790812021-02-25 12:28:49 +0000116 * Constant flow check for equality
Paul Elliottdadd10d2021-02-05 17:49:23 +0000117*/
Paul Elliott3e790812021-02-25 12:28:49 +0000118static unsigned char mbedtls_base64_eq(size_t in_a, size_t in_b)
Paul Elliottdadd10d2021-02-05 17:49:23 +0000119{
Paul Elliott717ba772021-03-01 17:49:42 +0000120 size_t difference = in_a ^ in_b;
Paul Elliottdadd10d2021-02-05 17:49:23 +0000121
Paul Elliott3e790812021-02-25 12:28:49 +0000122 /* MSVC has a warning about unary minus on unsigned integer types,
123 * but this is well-defined and precisely what we want to do here. */
124#if defined(_MSC_VER)
125#pragma warning( push )
126#pragma warning( disable : 4146 )
127#endif
128
Paul Elliottdadd10d2021-02-05 17:49:23 +0000129 difference |= -difference;
Paul Elliott3e790812021-02-25 12:28:49 +0000130
131#if defined(_MSC_VER)
132#pragma warning( pop )
133#endif
134
Paul Elliott717ba772021-03-01 17:49:42 +0000135 /* cope with the varying size of size_t per platform */
136 difference >>= ( sizeof( difference ) * 8 - 1 );
137
Paul Elliottdadd10d2021-02-05 17:49:23 +0000138 return (unsigned char) ( 1 ^ difference );
139}
140
141/*
Paul Elliott3e790812021-02-25 12:28:49 +0000142 * Constant flow lookup into table.
Paul Elliottdadd10d2021-02-05 17:49:23 +0000143*/
144static unsigned char mbedtls_base64_table_lookup(const unsigned char * const table,
145 const size_t table_size, const size_t table_index)
146{
147 size_t i;
148 unsigned char result = 0;
149
150 for( i = 0; i < table_size; ++i )
151 {
Paul Elliott0544d492021-03-01 19:15:43 +0000152 mbedtls_base64_cond_assign_uchar(&result, &table[i], mbedtls_base64_eq(i, table_index));
Paul Elliottdadd10d2021-02-05 17:49:23 +0000153 }
154
155 return result;
156}
157
Paul Bakker5121ce52009-01-03 21:22:43 +0000158/*
159 * Encode a buffer into base64 format
160 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100161int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000162 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000163{
Paul Bakker23986e52011-04-24 08:57:21 +0000164 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000165 int C1, C2, C3;
166 unsigned char *p;
167
168 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000169 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100170 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000171 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000172 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000173
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200174 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000175
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100176 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000177 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100178 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200179 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000180 }
181
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200182 n *= 4;
183
Janos Follath98e28a72016-05-31 14:03:54 +0100184 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000185 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100186 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000188 }
189
Paul Bakker66d5d072014-06-17 16:39:18 +0200190 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000191
192 for( i = 0, p = dst; i < n; i += 3 )
193 {
194 C1 = *src++;
195 C2 = *src++;
196 C3 = *src++;
197
Paul Elliottdadd10d2021-02-05 17:49:23 +0000198 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
199 ( ( C1 >> 2 ) & 0x3F ) );
200
201 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
202 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
203
204 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
205 ( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F ) );
206
207 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
208 ( C3 & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000209 }
210
211 if( i < slen )
212 {
213 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200214 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000215
Paul Elliottdadd10d2021-02-05 17:49:23 +0000216 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
217 ( ( C1 >> 2 ) & 0x3F ) );
218
219 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
220 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000221
Paul Bakker66d5d072014-06-17 16:39:18 +0200222 if( ( i + 1 ) < slen )
Paul Elliottdadd10d2021-02-05 17:49:23 +0000223 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
224 ( ( ( C2 & 15 ) << 2 ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000225 else *p++ = '=';
226
227 *p++ = '=';
228 }
229
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100230 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000231 *p = 0;
232
233 return( 0 );
234}
235
236/*
237 * Decode a base64-formatted buffer
238 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100239int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000240 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000241{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000242 size_t i, n;
243 uint32_t j, x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000244 unsigned char *p;
Paul Elliott6e152fa2021-03-01 18:33:09 +0000245 unsigned char dec_map_lookup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000246
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200247 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200248 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000249 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200250 /* Skip spaces before checking for EOL */
251 x = 0;
252 while( i < slen && src[i] == ' ' )
253 {
254 ++i;
255 ++x;
256 }
257
258 /* Spaces at end of buffer are OK */
259 if( i == slen )
260 break;
261
Paul Bakker5121ce52009-01-03 21:22:43 +0000262 if( ( slen - i ) >= 2 &&
263 src[i] == '\r' && src[i + 1] == '\n' )
264 continue;
265
266 if( src[i] == '\n' )
267 continue;
268
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200269 /* Space inside a line is an error */
270 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200272
Paul Bakker5121ce52009-01-03 21:22:43 +0000273 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000275
Paul Elliott6e152fa2021-03-01 18:33:09 +0000276 dec_map_lookup = mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] );
277
278 if( src[i] > 127 || dec_map_lookup == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000280
Paul Elliott6e152fa2021-03-01 18:33:09 +0000281 if( dec_map_lookup < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
284 n++;
285 }
286
287 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100288 {
289 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000290 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100291 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000292
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000293 /* The following expression is to calculate the following formula without
294 * risk of integer overflow in n:
295 * n = ( ( n * 6 ) + 7 ) >> 3;
296 */
Andres AG4623d832017-01-18 17:21:03 +0000297 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200298 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000299
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100300 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000301 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100302 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 }
305
306 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
307 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200308 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000309 continue;
310
Paul Elliott6e152fa2021-03-01 18:33:09 +0000311 dec_map_lookup = mbedtls_base64_table_lookup(base64_dec_map, sizeof( base64_dec_map ), *src );
312
Paul Elliott0544d492021-03-01 19:15:43 +0000313 mbedtls_base64_cond_assign_uint32( &j, j - 1, mbedtls_base64_eq( dec_map_lookup, 64 ) );
Paul Elliott6e152fa2021-03-01 18:33:09 +0000314 x = ( x << 6 ) | ( dec_map_lookup & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000315
316 if( ++n == 4 )
317 {
318 n = 0;
319 if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
320 if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
321 if( j > 2 ) *p++ = (unsigned char)( x );
322 }
323 }
324
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100325 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000326
327 return( 0 );
328}
329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000331
Paul Bakker5121ce52009-01-03 21:22:43 +0000332static const unsigned char base64_test_dec[64] =
333{
334 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
335 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
336 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
337 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
338 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
339 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
340 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
341 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
342};
343
344static const unsigned char base64_test_enc[] =
345 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
346 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
347
348/*
349 * Checkup routine
350 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000352{
Paul Bakker23986e52011-04-24 08:57:21 +0000353 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200354 const unsigned char *src;
355 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000356
357 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000359
Paul Bakker3c2122f2013-06-24 19:03:14 +0200360 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100362 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200363 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000364 {
365 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200366 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000367
368 return( 1 );
369 }
370
371 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
Paul Bakker3c2122f2013-06-24 19:03:14 +0200374 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000375
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100376 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000377 memcmp( base64_test_dec, buffer, 64 ) != 0 )
378 {
379 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000381
382 return( 1 );
383 }
384
385 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
388 return( 0 );
389}
390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393#endif /* MBEDTLS_BASE64_C */