blob: 9cf5dd41d42c8a2f7a5cb37c05aeb5f13cf79b5b [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 Elliottbe165bd2021-03-04 14:34:50 +000070 */
71static void mbedtls_base64_cond_assign_uchar( unsigned char * dest, const unsigned char * const src,
72 unsigned char condition )
Paul Elliottdadd10d2021-02-05 17:49:23 +000073{
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 Elliott07fa1f12021-03-03 17:21:17 +000081 /* Generate bitmask from condition, mask will either be 0xFF or 0 */
Paul Elliott3ffd1342021-03-03 17:11:32 +000082 unsigned char mask = ( condition | -condition );
83 mask >>= 7;
84 mask = -mask;
Paul Elliott88f2eb62021-03-03 15:31:17 +000085
86#if defined(_MSC_VER)
87#pragma warning( pop )
88#endif
89
90 *dest = ( ( *src ) & mask ) | ( ( *dest ) & ~mask );
Paul Elliottdadd10d2021-02-05 17:49:23 +000091}
92
93/*
Paul Elliott0544d492021-03-01 19:15:43 +000094 * Constant flow conditional assignment to uint_32
Paul Elliottbe165bd2021-03-04 14:34:50 +000095 */
96static void mbedtls_base64_cond_assign_uint32( uint32_t * dest, const uint32_t src,
97 uint32_t condition )
Paul Elliott0544d492021-03-01 19:15:43 +000098{
Paul Elliott88f2eb62021-03-03 15:31:17 +000099 /* MSVC has a warning about unary minus on unsigned integer types,
100 * but this is well-defined and precisely what we want to do here. */
101#if defined(_MSC_VER)
102#pragma warning( push )
103#pragma warning( disable : 4146 )
104#endif
Paul Elliott0544d492021-03-01 19:15:43 +0000105
Paul Elliott88f2eb62021-03-03 15:31:17 +0000106 /* Generate bitmask from condition, mask will either be 0xFFFFFFFF or 0 */
Paul Elliott3ffd1342021-03-03 17:11:32 +0000107 uint32_t mask = ( condition | -condition );
108 mask >>= 31;
109 mask = -mask;
Paul Elliott88f2eb62021-03-03 15:31:17 +0000110
111#if defined(_MSC_VER)
112#pragma warning( pop )
113#endif
114
115 *dest = ( src & mask ) | ( ( *dest ) & ~mask );
Paul Elliott0544d492021-03-01 19:15:43 +0000116}
117
Paul Elliott0544d492021-03-01 19:15:43 +0000118/*
Paul Elliott3e790812021-02-25 12:28:49 +0000119 * Constant flow check for equality
Paul Elliottbe165bd2021-03-04 14:34:50 +0000120 */
121static unsigned char mbedtls_base64_eq( size_t in_a, size_t in_b )
Paul Elliottdadd10d2021-02-05 17:49:23 +0000122{
Paul Elliott717ba772021-03-01 17:49:42 +0000123 size_t difference = in_a ^ in_b;
Paul Elliottdadd10d2021-02-05 17:49:23 +0000124
Paul Elliott3e790812021-02-25 12:28:49 +0000125 /* MSVC has a warning about unary minus on unsigned integer types,
126 * but this is well-defined and precisely what we want to do here. */
127#if defined(_MSC_VER)
128#pragma warning( push )
129#pragma warning( disable : 4146 )
130#endif
131
Paul Elliottdadd10d2021-02-05 17:49:23 +0000132 difference |= -difference;
Paul Elliott3e790812021-02-25 12:28:49 +0000133
134#if defined(_MSC_VER)
135#pragma warning( pop )
136#endif
137
Paul Elliott717ba772021-03-01 17:49:42 +0000138 /* cope with the varying size of size_t per platform */
139 difference >>= ( sizeof( difference ) * 8 - 1 );
140
Paul Elliottdadd10d2021-02-05 17:49:23 +0000141 return (unsigned char) ( 1 ^ difference );
142}
143
144/*
Paul Elliott3e790812021-02-25 12:28:49 +0000145 * Constant flow lookup into table.
Paul Elliottbe165bd2021-03-04 14:34:50 +0000146 */
147static unsigned char mbedtls_base64_table_lookup( const unsigned char * const table,
148 const size_t table_size, const size_t table_index )
Paul Elliottdadd10d2021-02-05 17:49:23 +0000149{
150 size_t i;
151 unsigned char result = 0;
152
153 for( i = 0; i < table_size; ++i )
154 {
Paul Elliottbe165bd2021-03-04 14:34:50 +0000155 mbedtls_base64_cond_assign_uchar( &result, &table[i], mbedtls_base64_eq( i, table_index ) );
Paul Elliottdadd10d2021-02-05 17:49:23 +0000156 }
157
158 return result;
159}
160
Paul Bakker5121ce52009-01-03 21:22:43 +0000161/*
162 * Encode a buffer into base64 format
163 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100164int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000165 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000166{
Paul Bakker23986e52011-04-24 08:57:21 +0000167 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000168 int C1, C2, C3;
169 unsigned char *p;
170
171 if( slen == 0 )
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000172 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100173 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000174 return( 0 );
Manuel Pégourié-Gonnard65fc6a82015-01-28 16:49:26 +0000175 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000176
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200177 n = slen / 3 + ( slen % 3 != 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000178
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100179 if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000180 {
Manuel Pégourié-Gonnard2d708342015-10-05 15:23:11 +0100181 *olen = BASE64_SIZE_T_MAX;
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200182 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000183 }
184
Manuel Pégourié-Gonnard0aa45c22015-09-30 16:30:28 +0200185 n *= 4;
186
Janos Follath98e28a72016-05-31 14:03:54 +0100187 if( ( dlen < n + 1 ) || ( NULL == dst ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000188 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100189 *olen = n + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000191 }
192
Paul Bakker66d5d072014-06-17 16:39:18 +0200193 n = ( slen / 3 ) * 3;
Paul Bakker5121ce52009-01-03 21:22:43 +0000194
195 for( i = 0, p = dst; i < n; i += 3 )
196 {
197 C1 = *src++;
198 C2 = *src++;
199 C3 = *src++;
200
Paul Elliottdadd10d2021-02-05 17:49:23 +0000201 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
202 ( ( C1 >> 2 ) & 0x3F ) );
203
204 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
205 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
206
207 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
208 ( ( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F ) );
209
210 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
211 ( C3 & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000212 }
213
214 if( i < slen )
215 {
216 C1 = *src++;
Paul Bakker66d5d072014-06-17 16:39:18 +0200217 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000218
Paul Elliottdadd10d2021-02-05 17:49:23 +0000219 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
220 ( ( C1 >> 2 ) & 0x3F ) );
221
222 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
223 ( ( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000224
Paul Bakker66d5d072014-06-17 16:39:18 +0200225 if( ( i + 1 ) < slen )
Paul Elliottdadd10d2021-02-05 17:49:23 +0000226 *p++ = mbedtls_base64_table_lookup( base64_enc_map, sizeof( base64_enc_map ),
227 ( ( ( C2 & 15 ) << 2 ) & 0x3F ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000228 else *p++ = '=';
229
230 *p++ = '=';
231 }
232
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100233 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000234 *p = 0;
235
236 return( 0 );
237}
238
239/*
240 * Decode a base64-formatted buffer
241 */
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100242int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
Paul Bakker23986e52011-04-24 08:57:21 +0000243 const unsigned char *src, size_t slen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000244{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000245 size_t i, n;
246 uint32_t j, x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000247 unsigned char *p;
Paul Elliott6e152fa2021-03-01 18:33:09 +0000248 unsigned char dec_map_lookup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000249
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200250 /* First pass: check for validity and get output length */
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200251 for( i = n = j = 0; i < slen; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000252 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200253 /* Skip spaces before checking for EOL */
254 x = 0;
255 while( i < slen && src[i] == ' ' )
256 {
257 ++i;
258 ++x;
259 }
260
261 /* Spaces at end of buffer are OK */
262 if( i == slen )
263 break;
264
Paul Bakker5121ce52009-01-03 21:22:43 +0000265 if( ( slen - i ) >= 2 &&
266 src[i] == '\r' && src[i + 1] == '\n' )
267 continue;
268
269 if( src[i] == '\n' )
270 continue;
271
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200272 /* Space inside a line is an error */
273 if( x != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200275
Paul Bakker5121ce52009-01-03 21:22:43 +0000276 if( src[i] == '=' && ++j > 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
Paul Elliott6e152fa2021-03-01 18:33:09 +0000279 dec_map_lookup = mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), src[i] );
280
281 if( src[i] > 127 || dec_map_lookup == 127 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
Paul Elliott6e152fa2021-03-01 18:33:09 +0000284 if( dec_map_lookup < 64 && j != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
Paul Bakker5121ce52009-01-03 21:22:43 +0000286
287 n++;
288 }
289
290 if( n == 0 )
Simon Butchera45aa132015-10-05 00:26:36 +0100291 {
292 *olen = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000293 return( 0 );
Simon Butchera45aa132015-10-05 00:26:36 +0100294 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000295
Simon Butchera29c5e9e2017-02-02 08:46:53 +0000296 /* The following expression is to calculate the following formula without
297 * risk of integer overflow in n:
298 * n = ( ( n * 6 ) + 7 ) >> 3;
299 */
Andres AG4623d832017-01-18 17:21:03 +0000300 n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );
Paul Bakkerd5983182014-07-04 13:50:31 +0200301 n -= j;
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100303 if( dst == NULL || dlen < n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 {
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100305 *olen = n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307 }
308
309 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
310 {
Manuel Pégourié-Gonnard64938c62014-10-15 21:45:39 +0200311 if( *src == '\r' || *src == '\n' || *src == ' ' )
Paul Bakker5121ce52009-01-03 21:22:43 +0000312 continue;
313
Paul Elliottbe165bd2021-03-04 14:34:50 +0000314 dec_map_lookup = mbedtls_base64_table_lookup( base64_dec_map, sizeof( base64_dec_map ), *src );
Paul Elliott6e152fa2021-03-01 18:33:09 +0000315
Paul Elliott0544d492021-03-01 19:15:43 +0000316 mbedtls_base64_cond_assign_uint32( &j, j - 1, mbedtls_base64_eq( dec_map_lookup, 64 ) );
Paul Elliott6e152fa2021-03-01 18:33:09 +0000317 x = ( x << 6 ) | ( dec_map_lookup & 0x3F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000318
319 if( ++n == 4 )
320 {
321 n = 0;
Joe Subbianiad1115a2021-07-16 14:27:50 +0100322 if( j > 0 ) *p++ = MBEDTLS_BYTE_2( x );
323 if( j > 1 ) *p++ = MBEDTLS_BYTE_1( x );
324 if( j > 2 ) *p++ = MBEDTLS_BYTE_0( x );
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 }
326 }
327
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100328 *olen = p - dst;
Paul Bakker5121ce52009-01-03 21:22:43 +0000329
330 return( 0 );
331}
332
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000334
Paul Bakker5121ce52009-01-03 21:22:43 +0000335static const unsigned char base64_test_dec[64] =
336{
337 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
338 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
339 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
340 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
341 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
342 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
343 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
344 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
345};
346
347static const unsigned char base64_test_enc[] =
348 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
349 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
350
351/*
352 * Checkup routine
353 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354int mbedtls_base64_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000355{
Paul Bakker23986e52011-04-24 08:57:21 +0000356 size_t len;
Paul Bakker3c2122f2013-06-24 19:03:14 +0200357 const unsigned char *src;
358 unsigned char buffer[128];
Paul Bakker5121ce52009-01-03 21:22:43 +0000359
360 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 mbedtls_printf( " Base64 encoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
Paul Bakker3c2122f2013-06-24 19:03:14 +0200363 src = base64_test_dec;
Paul Bakker5121ce52009-01-03 21:22:43 +0000364
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100365 if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
Paul Bakker3c2122f2013-06-24 19:03:14 +0200366 memcmp( base64_test_enc, buffer, 88 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000367 {
368 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000370
371 return( 1 );
372 }
373
374 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_printf( "passed\n Base64 decoding test: " );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
Paul Bakker3c2122f2013-06-24 19:03:14 +0200377 src = base64_test_enc;
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
Manuel Pégourié-Gonnardba561362015-06-02 16:30:35 +0100379 if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000380 memcmp( base64_test_dec, buffer, 64 ) != 0 )
381 {
382 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385 return( 1 );
386 }
387
388 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 mbedtls_printf( "passed\n\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
391 return( 0 );
392}
393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396#endif /* MBEDTLS_BASE64_C */