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)
38 typedef UINT32 uint32_t;
43 #if defined(POLARSSL_PLATFORM_C)
46 #define polarssl_printf printf
49 static 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',
60 static 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)
227 static 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
239 static 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 )
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)
int base64_self_test(int verbose)
Checkup routine.
#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL
Output buffer too small.
RFC 1521 base64 encoding/decoding.
#define POLARSSL_ERR_BASE64_INVALID_CHARACTER
Invalid character in input.
int base64_encode(unsigned char *dst, size_t *dlen, const unsigned char *src, size_t slen)
Encode a buffer into base64 format.