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 )
92 switch( (slen << 3) - (n * 6) )
94 case 2: n += 3;
break;
95 case 4: n += 2;
break;
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];
128 *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
144 const unsigned char *src,
size_t slen )
150 for( i = n = j = 0; i < slen; i++ )
152 if( ( slen - i ) >= 2 &&
153 src[i] ==
'\r' && src[i + 1] ==
'\n' )
159 if( src[i] ==
'=' && ++j > 2 )
162 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
165 if( base64_dec_map[src[i]] < 64 && j != 0 )
174 n = ((n * 6) + 7) >> 3;
176 if( dst == NULL || *dlen < n )
182 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
184 if( *src ==
'\r' || *src ==
'\n' )
187 j -= ( base64_dec_map[*src] == 64 );
188 x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
193 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
194 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
195 if( j > 2 ) *p++ = (
unsigned char)( x );
204 #if defined(POLARSSL_SELF_TEST)
209 static const unsigned char base64_test_dec[64] =
211 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
212 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
213 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
214 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
215 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
216 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
217 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
218 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
221 static const unsigned char base64_test_enc[] =
222 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
223 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
231 const unsigned char *src;
232 unsigned char buffer[128];
237 len =
sizeof( buffer );
238 src = base64_test_dec;
241 memcmp( base64_test_enc, buffer, 88 ) != 0 )
252 len =
sizeof( buffer );
253 src = base64_test_enc;
256 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.