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 )
150 for( i = n = j = 0; i < slen; i++ )
152 if( ( slen - i ) >= 2 &&
153 src[i] ==
'\r' && src[i + 1] ==
'\n' )
159 if( src[i] ==
'=' && ++j > 2 )
162 if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
165 if( base64_dec_map[src[i]] < 64 && j != 0 )
174 n = ( ( n * 6 ) + 7 ) >> 3;
177 if( dst == NULL || *dlen < n )
183 for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
185 if( *src ==
'\r' || *src ==
'\n' )
188 j -= ( base64_dec_map[*src] == 64 );
189 x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F );
194 if( j > 0 ) *p++ = (
unsigned char)( x >> 16 );
195 if( j > 1 ) *p++ = (
unsigned char)( x >> 8 );
196 if( j > 2 ) *p++ = (
unsigned char)( x );
205 #if defined(POLARSSL_SELF_TEST)
210 static const unsigned char base64_test_dec[64] =
212 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
213 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
214 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
215 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
216 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
217 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
218 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
219 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
222 static const unsigned char base64_test_enc[] =
223 "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
224 "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
232 const unsigned char *src;
233 unsigned char buffer[128];
238 len =
sizeof( buffer );
239 src = base64_test_dec;
242 memcmp( base64_test_enc, buffer, 88 ) != 0 )
253 len =
sizeof( buffer );
254 src = base64_test_enc;
257 memcmp( base64_test_dec, buffer, 64 ) != 0 )
int base64_decode(unsigned char *dst, size_t *dlen, const unsigned char *src, size_t slen)
Decode a base64-formatted buffer.
Configuration options (set of defines)
int base64_self_test(int verbose)
Checkup routine.
#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL
Output buffer too small.
RFC 1521 base64 encoding/decoding.
#define POLARSSL_ERR_BASE64_INVALID_CHARACTER
Invalid character in input.
int base64_encode(unsigned char *dst, size_t *dlen, const unsigned char *src, size_t slen)
Encode a buffer into base64 format.