Skip to content

Commit d85e783

Browse files
rodionkvashninigrr
authored andcommitted
Fixed libb64 decoder. (#2883)
* Fixed libb64 decoder. Libb64 decoder works when "char" type is signed. In esp8266 xtensa gcc "char" is unsigned, so libb64 decoder does not work. In the implementation file I replaced "char" to "int8_t" and created function wrappers in order to keep existing interface. * For style consistency.
1 parent 9791a48 commit d85e783

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

cores/esp8266/libb64/cdecode.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ For details, see http://sourceforge.net/projects/libb64
66
*/
77

88
#include "cdecode.h"
9+
#include <stdint.h>
910

10-
int base64_decode_value(char value_in){
11-
static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
12-
static const char decoding_size = sizeof(decoding);
11+
static int base64_decode_value_signed(int8_t value_in){
12+
static const int8_t decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
13+
static const int8_t decoding_size = sizeof(decoding);
1314
value_in -= 43;
1415
if (value_in < 0 || value_in > decoding_size) return -1;
1516
return decoding[(int)value_in];
@@ -20,10 +21,10 @@ void base64_init_decodestate(base64_decodestate* state_in){
2021
state_in->plainchar = 0;
2122
}
2223

23-
int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in){
24-
const char* codechar = code_in;
25-
char* plainchar = plaintext_out;
26-
char fragment;
24+
static int base64_decode_block_signed(const int8_t* code_in, const int length_in, int8_t* plaintext_out, base64_decodestate* state_in){
25+
const int8_t* codechar = code_in;
26+
int8_t* plainchar = plaintext_out;
27+
int8_t fragment;
2728

2829
*plainchar = state_in->plainchar;
2930

@@ -36,7 +37,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
3637
state_in->plainchar = *plainchar;
3738
return plainchar - plaintext_out;
3839
}
39-
fragment = (char)base64_decode_value(*codechar++);
40+
fragment = (int8_t)base64_decode_value_signed(*codechar++);
4041
} while (fragment < 0);
4142
*plainchar = (fragment & 0x03f) << 2;
4243
case step_b:
@@ -46,7 +47,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
4647
state_in->plainchar = *plainchar;
4748
return plainchar - plaintext_out;
4849
}
49-
fragment = (char)base64_decode_value(*codechar++);
50+
fragment = (int8_t)base64_decode_value_signed(*codechar++);
5051
} while (fragment < 0);
5152
*plainchar++ |= (fragment & 0x030) >> 4;
5253
*plainchar = (fragment & 0x00f) << 4;
@@ -57,7 +58,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
5758
state_in->plainchar = *plainchar;
5859
return plainchar - plaintext_out;
5960
}
60-
fragment = (char)base64_decode_value(*codechar++);
61+
fragment = (int8_t)base64_decode_value_signed(*codechar++);
6162
} while (fragment < 0);
6263
*plainchar++ |= (fragment & 0x03c) >> 2;
6364
*plainchar = (fragment & 0x003) << 6;
@@ -68,7 +69,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
6869
state_in->plainchar = *plainchar;
6970
return plainchar - plaintext_out;
7071
}
71-
fragment = (char)base64_decode_value(*codechar++);
72+
fragment = (int8_t)base64_decode_value_signed(*codechar++);
7273
} while (fragment < 0);
7374
*plainchar++ |= (fragment & 0x03f);
7475
}
@@ -77,10 +78,22 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
7778
return plainchar - plaintext_out;
7879
}
7980

80-
int base64_decode_chars(const char* code_in, const int length_in, char* plaintext_out){
81+
static int base64_decode_chars_signed(const int8_t* code_in, const int length_in, int8_t* plaintext_out){
8182
base64_decodestate _state;
8283
base64_init_decodestate(&_state);
83-
int len = base64_decode_block(code_in, length_in, plaintext_out, &_state);
84+
int len = base64_decode_block_signed(code_in, length_in, plaintext_out, &_state);
8485
if(len > 0) plaintext_out[len] = 0;
8586
return len;
8687
}
88+
89+
int base64_decode_value(char value_in){
90+
return base64_decode_value_signed(*((int8_t *) &value_in));
91+
}
92+
93+
int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in){
94+
return base64_decode_block_signed((int8_t *) code_in, length_in, (int8_t *) plaintext_out, state_in);
95+
}
96+
97+
int base64_decode_chars(const char* code_in, const int length_in, char* plaintext_out){
98+
return base64_decode_chars_signed((int8_t *) code_in, length_in, (int8_t *) plaintext_out);
99+
}

0 commit comments

Comments
 (0)