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;
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 unsigned char *src, buffer[128];
224 printf(
" Base64 encoding test: " );
226 len =
sizeof( buffer );
227 src = (
unsigned char *) base64_test_dec;
230 memcmp( base64_test_enc, buffer, 88 ) != 0 )
233 printf(
"failed\n" );
239 printf(
"passed\n Base64 decoding test: " );
241 len =
sizeof( buffer );
242 src = (
unsigned char *) base64_test_enc;
245 memcmp( base64_test_dec, buffer, 64 ) != 0 )
248 printf(
"failed\n" );
254 printf(
"passed\n\n" );