26#if !defined(POLARSSL_CONFIG_FILE)
29#include POLARSSL_CONFIG_FILE
32#if defined(POLARSSL_BASE64_C)
36#if defined(_MSC_VER) && !defined(EFIX64) && !defined(EFI32)
38typedef UINT32 uint32_t;
43#if defined(POLARSSL_PLATFORM_C)
46#define polarssl_printf printf
49static const unsigned char base64_enc_map[64] =
51 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
52 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
53 'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
54 'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
55 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
56 'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
60static const unsigned char base64_dec_map[128] =
62 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
63 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
64 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
65 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
66 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
67 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
68 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
69 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
70 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
71 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
72 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
73 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
74 49, 50, 51, 127, 127, 127, 127, 127
81 const unsigned char *src,
size_t slen )
90 n = ( slen << 3 ) / 6;
92 switch( ( slen << 3 ) - ( n * 6 ) )
94 case 2: n += 3;
break;
95 case 4: n += 2;
break;
105 n = ( slen / 3 ) * 3;
107 for( i = 0, p = dst; i < n; i += 3 )
113 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
114 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
115 *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
116 *p++ = base64_enc_map[C3 & 0x3F];
122 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
124 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
125 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
127 if( ( i + 1 ) < slen )
128 *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
144 const unsigned char *src,
size_t slen )
151 for( i = n = j = 0; i < slen; i++ )
155 while( i < slen && src[i] ==
' ' )
165 if( ( slen - i ) >= 2 &&
166 src[i] ==
'\r' && src[i + 1] ==
'\n' )
176 if( src[i] ==
'=' && ++j > 2 )
179 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
182 if( base64_dec_map[src[i]] < 64 && j != 0 )
191 n = ( ( n * 6 ) + 7 ) >> 3;
194 if( dst == NULL || *dlen < n )
200 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
202 if( *src ==
'\r' || *src ==
'\n' || *src ==
' ' )
205 j -= ( base64_dec_map[*src] == 64 );
206 x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F );
211 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
212 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
213 if( j > 2 ) *p++ = (
unsigned char)( x );
222#if defined(POLARSSL_SELF_TEST)
227static const unsigned char base64_test_dec[64] =
229 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
230 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
231 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
232 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
233 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
234 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
235 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
236 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
239static const unsigned char base64_test_enc[] =
240 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
241 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
249 const unsigned char *src;
250 unsigned char buffer[128];
255 len =
sizeof( buffer );
256 src = base64_test_dec;
259 memcmp( base64_test_enc, buffer, 88 ) != 0 )
270 len =
sizeof( buffer );
271 src = base64_test_enc;
274 memcmp( base64_test_dec, buffer, 64 ) != 0 )
RFC 1521 base64 encoding/decoding.
int base64_self_test(int verbose)
Checkup routine.
int base64_encode(unsigned char *dst, size_t *dlen, const unsigned char *src, size_t slen)
Encode a buffer into base64 format.
#define POLARSSL_ERR_BASE64_INVALID_CHARACTER
Invalid character in input.
#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL
Output buffer too small.
int base64_decode(unsigned char *dst, size_t *dlen, const unsigned char *src, size_t slen)
Decode a base64-formatted buffer.
Configuration options (set of defines)