28 #if defined(POLARSSL_BASE64_C)
32 static const unsigned char base64_enc_map[64] =
34 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
35 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
36 'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
37 'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
38 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
39 'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
43 static const unsigned char base64_dec_map[128] =
45 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
46 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
47 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
48 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
49 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
50 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
51 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
52 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
53 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
54 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
55 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
56 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
57 49, 50, 51, 127, 127, 127, 127, 127
64 const unsigned char *src,
size_t slen )
75 switch( (slen << 3) - (n * 6) )
77 case 2: n += 3;
break;
78 case 4: n += 2;
break;
90 for( i = 0, p = dst; i < n; i += 3 )
96 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
97 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
98 *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
99 *p++ = base64_enc_map[C3 & 0x3F];
105 C2 = ((i + 1) < slen) ? *src++ : 0;
107 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
108 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
111 *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
127 const unsigned char *src,
size_t slen )
133 for( i = j = n = 0; i < slen; i++ )
135 if( ( slen - i ) >= 2 &&
136 src[i] ==
'\r' && src[i + 1] ==
'\n' )
142 if( src[i] ==
'=' && ++j > 2 )
145 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
148 if( base64_dec_map[src[i]] < 64 && j != 0 )
157 n = ((n * 6) + 7) >> 3;
165 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
167 if( *src ==
'\r' || *src ==
'\n' )
170 j -= ( base64_dec_map[*src] == 64 );
171 x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
176 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
177 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
178 if( j > 2 ) *p++ = (
unsigned char)( x );
187 #if defined(POLARSSL_SELF_TEST)
192 static const unsigned char base64_test_dec[64] =
194 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
195 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
196 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
197 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
198 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
199 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
200 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
201 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
204 static const unsigned char base64_test_enc[] =
205 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
206 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
214 unsigned char *src, buffer[128];
217 printf(
" Base64 encoding test: " );
219 len =
sizeof( buffer );
220 src = (
unsigned char *) base64_test_dec;
223 memcmp( base64_test_enc, buffer, 88 ) != 0 )
226 printf(
"failed\n" );
232 printf(
"passed\n Base64 decoding test: " );
234 len =
sizeof( buffer );
235 src = (
unsigned char *) base64_test_enc;
238 memcmp( base64_test_dec, buffer, 64 ) != 0 )
241 printf(
"failed\n" );
247 printf(
"passed\n\n" );