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 = n = j = 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;
166 if( dst == NULL || *dlen < n )
172 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
174 if( *src ==
'\r' || *src ==
'\n' )
177 j -= ( base64_dec_map[*src] == 64 );
178 x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
183 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
184 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
185 if( j > 2 ) *p++ = (
unsigned char)( x );
194 #if defined(POLARSSL_SELF_TEST)
199 static const unsigned char base64_test_dec[64] =
201 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
202 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
203 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
204 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
205 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
206 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
207 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
208 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
211 static const unsigned char base64_test_enc[] =
212 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
213 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
221 const unsigned char *src;
222 unsigned char buffer[128];
225 printf(
" Base64 encoding test: " );
227 len =
sizeof( buffer );
228 src = base64_test_dec;
231 memcmp( base64_test_enc, buffer, 88 ) != 0 )
234 printf(
"failed\n" );
240 printf(
"passed\n Base64 decoding test: " );
242 len =
sizeof( buffer );
243 src = base64_test_enc;
246 memcmp( base64_test_dec, buffer, 64 ) != 0 )
249 printf(
"failed\n" );
255 printf(
"passed\n\n" );