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 )
141 for( i = n = j = 0; i < slen; i++ )
145 while( i < slen && src[i] ==
' ' )
155 if( ( slen - i ) >= 2 &&
156 src[i] ==
'\r' && src[i + 1] ==
'\n' )
166 if( src[i] ==
'=' && ++j > 2 )
169 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
172 if( base64_dec_map[src[i]] < 64 && j != 0 )
181 n = ((n * 6) + 7) >> 3;
190 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
192 if( *src ==
'\r' || *src ==
'\n' )
195 j -= ( base64_dec_map[*src] == 64 );
196 x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
201 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
202 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
203 if( j > 2 ) *p++ = (
unsigned char)( x );
212 #if defined(POLARSSL_SELF_TEST)
217 static const unsigned char base64_test_dec[64] =
219 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
220 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
221 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
222 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
223 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
224 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
225 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
226 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
229 static const unsigned char base64_test_enc[] =
230 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
231 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
239 const unsigned char *src;
240 unsigned char buffer[128];
243 printf(
" Base64 encoding test: " );
245 len =
sizeof( buffer );
246 src = base64_test_dec;
249 memcmp( base64_test_enc, buffer, 88 ) != 0 )
252 printf(
"failed\n" );
258 printf(
"passed\n Base64 decoding test: " );
260 len =
sizeof( buffer );
261 src = base64_test_enc;
264 memcmp( base64_test_dec, buffer, 64 ) != 0 )
267 printf(
"failed\n" );
273 printf(
"passed\n\n" );