@ -9,6 +9,7 @@
# include "includes.h"
# include <stdint.h>
# include "utils/common.h"
# include "os.h"
# include "base64.h"
@ -18,6 +19,10 @@ static const char base64_url_table[65] =
" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ " ;
# define BASE64_PAD BIT(0)
# define BASE64_LF BIT(1)
static char * base64_gen_encode ( const unsigned char * src , size_t len ,
size_t * out_len , const char * table , int add_pad )
{
@ -29,7 +34,7 @@ static char * base64_gen_encode(const unsigned char *src, size_t len,
if ( len > = SIZE_MAX / 4 )
return NULL ;
olen = len * 4 / 3 + 4 ; /* 3-byte blocks to 4-byte */
if ( add_pad )
if ( add_pad & BASE64_LF )
olen + = olen / 72 ; /* line feeds */
olen + + ; /* nul termination */
if ( olen < len )
@ -49,7 +54,7 @@ static char * base64_gen_encode(const unsigned char *src, size_t len,
* pos + + = table [ in [ 2 ] & 0x3f ] ;
in + = 3 ;
line_len + = 4 ;
if ( add_pad & & line_len > = 72 ) {
if ( ( add_pad & BASE64_LF ) & & line_len > = 72 ) {
* pos + + = ' \n ' ;
line_len = 0 ;
}
@ -59,19 +64,19 @@ static char * base64_gen_encode(const unsigned char *src, size_t len,
* pos + + = table [ ( in [ 0 ] > > 2 ) & 0x3f ] ;
if ( end - in = = 1 ) {
* pos + + = table [ ( ( in [ 0 ] & 0x03 ) < < 4 ) & 0x3f ] ;
if ( add_pad )
if ( add_pad & BASE64_PAD )
* pos + + = ' = ' ;
} else {
* pos + + = table [ ( ( ( in [ 0 ] & 0x03 ) < < 4 ) |
( in [ 1 ] > > 4 ) ) & 0x3f ] ;
* pos + + = table [ ( ( in [ 1 ] & 0x0f ) < < 2 ) & 0x3f ] ;
}
if ( add_pad )
if ( add_pad & BASE64_PAD )
* pos + + = ' = ' ;
line_len + = 4 ;
}
if ( add_pad & & line_len )
if ( ( add_pad & BASE64_LF ) & & line_len )
* pos + + = ' \n ' ;
* pos = ' \0 ' ;
@ -164,7 +169,14 @@ static unsigned char * base64_gen_decode(const char *src, size_t len,
*/
char * base64_encode ( const void * src , size_t len , size_t * out_len )
{
return base64_gen_encode ( src , len , out_len , base64_table , 1 ) ;
return base64_gen_encode ( src , len , out_len , base64_table ,
BASE64_PAD | BASE64_LF ) ;
}
char * base64_encode_no_lf ( const void * src , size_t len , size_t * out_len )
{
return base64_gen_encode ( src , len , out_len , base64_table , BASE64_PAD ) ;
}