28 #if defined(POLARSSL_BASE64_C)
34 typedef UINT32 uint32_t;
39 static const unsigned char base64_enc_map[64] =
41 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
42 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
43 'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
44 'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
45 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
46 'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
50 static const unsigned char base64_dec_map[128] =
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, 127, 127, 127, 127, 127, 127, 127,
56 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
57 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
58 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
59 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
60 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
61 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
62 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
63 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
64 49, 50, 51, 127, 127, 127, 127, 127
71 const unsigned char *src,
size_t slen )
82 switch( (slen << 3) - (n * 6) )
84 case 2: n += 3;
break;
85 case 4: n += 2;
break;
97 for( i = 0, p = dst; i < n; i += 3 )
103 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
104 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
105 *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
106 *p++ = base64_enc_map[C3 & 0x3F];
112 C2 = ((i + 1) < slen) ? *src++ : 0;
114 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
115 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
118 *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
134 const unsigned char *src,
size_t slen )
140 for( i = j = n = 0; i < slen; i++ )
142 if( ( slen - i ) >= 2 &&
143 src[i] ==
'\r' && src[i + 1] ==
'\n' )
149 if( src[i] ==
'=' && ++j > 2 )
152 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
155 if( base64_dec_map[src[i]] < 64 && j != 0 )
164 n = ((n * 6) + 7) >> 3;
173 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
175 if( *src ==
'\r' || *src ==
'\n' )
178 j -= ( base64_dec_map[*src] == 64 );
179 x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
184 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
185 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
186 if( j > 2 ) *p++ = (
unsigned char)( x );
195 #if defined(POLARSSL_SELF_TEST)
200 static const unsigned char base64_test_dec[64] =
202 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
203 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
204 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
205 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
206 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
207 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
208 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
209 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
212 static const unsigned char base64_test_enc[] =
213 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
214 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
222 const unsigned char *src;
223 unsigned char buffer[128];
226 printf(
" Base64 encoding test: " );
228 len =
sizeof( buffer );
229 src = base64_test_dec;
232 memcmp( base64_test_enc, buffer, 88 ) != 0 )
235 printf(
"failed\n" );
241 printf(
"passed\n Base64 decoding test: " );
243 len =
sizeof( buffer );
244 src = base64_test_enc;
247 memcmp( base64_test_dec, buffer, 64 ) != 0 )
250 printf(
"failed\n" );
256 printf(
"passed\n\n" );
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.