@@ -988,20 +988,55 @@ unsigned char *SSL_SHA256(const unsigned char *d, size_t n, unsigned char *md)
988
988
return (md );
989
989
}
990
990
991
- int SSL_base64_decode (const char * in , unsigned char * out , int max_outlen )
991
+ int SSL_base64_decode_ext (const char * in , unsigned char * out , int max_outlen , int url_safe , int auto_padding )
992
992
{
993
993
size_t inlen = strlen (in );
994
+ char * in_padding_data = NULL ;
995
+ int padding_len = 0 ;
996
+ const char * in_data = in ;
994
997
int outlen = 0 ;
995
998
996
- if (max_outlen < (int )inlen / 4 * 3 ) {
997
- goto errout ;
998
- }
999
-
1000
999
if (inlen == 0 ) {
1001
1000
return 0 ;
1002
1001
}
1003
1002
1004
- outlen = EVP_DecodeBlock (out , (unsigned char * )in , inlen );
1003
+ if ((auto_padding == 1 && inlen % 4 != 0 ) || url_safe == 1 ) {
1004
+ padding_len = 4 - inlen % 4 ;
1005
+ in_padding_data = (char * )malloc (inlen + padding_len + 1 );
1006
+ if (in_padding_data == NULL ) {
1007
+ goto errout ;
1008
+ }
1009
+
1010
+ if (url_safe ) {
1011
+ for (size_t i = 0 ; i < inlen ; i ++ ) {
1012
+ if (in [i ] == '-' ) {
1013
+ in_padding_data [i ] = '+' ;
1014
+ } else if (in [i ] == '_' ) {
1015
+ in_padding_data [i ] = '/' ;
1016
+ } else {
1017
+ in_padding_data [i ] = in [i ];
1018
+ }
1019
+ }
1020
+ } else {
1021
+ memcpy (in_padding_data , in , inlen );
1022
+ }
1023
+
1024
+ if (auto_padding ) {
1025
+ memset (in_padding_data + inlen , '=' , padding_len );
1026
+ } else {
1027
+ padding_len = 0 ;
1028
+ }
1029
+
1030
+ in_padding_data [inlen + padding_len ] = '\0' ;
1031
+ in_data = in_padding_data ;
1032
+ inlen += padding_len ;
1033
+ }
1034
+
1035
+ if (max_outlen < (int )inlen / 4 * 3 ) {
1036
+ goto errout ;
1037
+ }
1038
+
1039
+ outlen = EVP_DecodeBlock (out , (unsigned char * )in_data , inlen );
1005
1040
if (outlen < 0 ) {
1006
1041
goto errout ;
1007
1042
}
@@ -1011,11 +1046,27 @@ int SSL_base64_decode(const char *in, unsigned char *out, int max_outlen)
1011
1046
-- outlen ;
1012
1047
}
1013
1048
1049
+ if (in_padding_data ) {
1050
+ free (in_padding_data );
1051
+ }
1052
+
1053
+ outlen -= padding_len ;
1054
+
1014
1055
return outlen ;
1015
1056
errout :
1057
+
1058
+ if (in_padding_data ) {
1059
+ free (in_padding_data );
1060
+ }
1061
+
1016
1062
return -1 ;
1017
1063
}
1018
1064
1065
+ int SSL_base64_decode (const char * in , unsigned char * out , int max_outlen )
1066
+ {
1067
+ return SSL_base64_decode_ext (in , out , max_outlen , 0 , 0 );
1068
+ }
1069
+
1019
1070
int SSL_base64_encode (const void * in , int in_len , char * out )
1020
1071
{
1021
1072
int outlen = 0 ;
0 commit comments