26 #if !defined(POLARSSL_CONFIG_FILE)
29 #include POLARSSL_CONFIG_FILE
32 #if defined(POLARSSL_BASE64_C)
36 #if defined(_MSC_VER) && !defined(EFIX64) && !defined(EFI32)
38 typedef UINT32 uint32_t;
43 #if defined(POLARSSL_PLATFORM_C)
46 #define polarssl_printf printf
49 static const unsigned char base64_enc_map[64] =
51 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
52 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
53 'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
54 'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
55 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
56 'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
60 static const unsigned char base64_dec_map[128] =
62 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
63 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
64 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
65 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
66 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
67 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
68 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
69 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
70 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
71 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
72 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
73 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
74 49, 50, 51, 127, 127, 127, 127, 127
81 const unsigned char *src,
size_t slen )
90 n = ( slen << 3 ) / 6;
92 switch( ( slen << 3 ) - ( n * 6 ) )
94 case 2: n += 3;
break;
95 case 4: n += 2;
break;
105 n = ( slen / 3 ) * 3;
107 for( i = 0, p = dst; i < n; i += 3 )
113 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
114 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
115 *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
116 *p++ = base64_enc_map[C3 & 0x3F];
122 C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
124 *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
125 *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
127 if( ( i + 1 ) < slen )
128 *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
144 const unsigned char *src,
size_t slen )
151 for( i = n = j = 0; i < slen; i++ )
155 while( i < slen && src[i] ==
' ' )
165 if( ( slen - i ) >= 2 &&
166 src[i] ==
'\r' && src[i + 1] ==
'\n' )
176 if( src[i] ==
'=' && ++j > 2 )
179 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
182 if( base64_dec_map[src[i]] < 64 && j != 0 )
191 n = ( ( n * 6 ) + 7 ) >> 3;
194 if( dst == NULL || *dlen < n )
200 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
202 if( *src ==
'\r' || *src ==
'\n' || *src ==
' ' )
205 j -= ( base64_dec_map[*src] == 64 );
206 x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F );
211 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
212 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
213 if( j > 2 ) *p++ = (
unsigned char)( x );
222 #if defined(POLARSSL_SELF_TEST)
227 static const unsigned char base64_test_dec[64] =
229 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
230 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
231 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
232 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
233 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
234 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
235 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
236 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
239 static const unsigned char base64_test_enc[] =
240 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
241 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
249 const unsigned char *src;
250 unsigned char buffer[128];
255 len =
sizeof( buffer );
256 src = base64_test_dec;
259 memcmp( base64_test_enc, buffer, 88 ) != 0 )
270 len =
sizeof( buffer );
271 src = base64_test_enc;
274 memcmp( base64_test_dec, buffer, 64 ) != 0 )