X-Git-Url: http://www.average.org/gitweb/?p=pam_pcsc_cr.git;a=blobdiff_plain;f=base64.c;h=96ae3b8bca90897430b46309623dede1616c417b;hp=d90a927cc42a4a399c028d7d14706e058db21f78;hb=HEAD;hpb=b4ed664ffb6e3f3764fa2b2f4b05437df43d7f19 diff --git a/base64.c b/base64.c index d90a927..96ae3b8 100644 --- a/base64.c +++ b/base64.c @@ -66,10 +66,10 @@ static char base64_encode_value(char value_in) return encoding[(int)value_in]; } -static int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) +static int base64_encode_block(const unsigned char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) { - const char* plainchar = plaintext_in; - const char* const plaintextend = plaintext_in + length_in; + const unsigned char* plainchar = plaintext_in; + const unsigned char* const plaintextend = plaintext_in + length_in; char* codechar = code_out; char result; char fragment; @@ -91,6 +91,7 @@ static int base64_encode_block(const char* plaintext_in, int length_in, char* co result = (fragment & 0x0fc) >> 2; *codechar++ = base64_encode_value(result); result = (fragment & 0x003) << 4; + /* fallthrough */ case step_B: if (plainchar == plaintextend) { @@ -102,6 +103,7 @@ static int base64_encode_block(const char* plaintext_in, int length_in, char* co result |= (fragment & 0x0f0) >> 4; *codechar++ = base64_encode_value(result); result = (fragment & 0x00f) << 2; + /* fallthrough */ case step_C: if (plainchar == plaintextend) { @@ -140,7 +142,6 @@ static int base64_encode_blockend(char* code_out, base64_encodestate* state_in) case step_A: break; } - *codechar++ = '\n'; return codechar - code_out; } @@ -167,10 +168,10 @@ static void base64_init_decodestate(base64_decodestate* state_in) state_in->plainchar = 0; } -static int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) +static int base64_decode_block(const char* code_in, const int length_in, unsigned char* plaintext_out, base64_decodestate* state_in) { const char* codechar = code_in; - char* plainchar = plaintext_out; + unsigned char* plainchar = plaintext_out; char fragment; *plainchar = state_in->plainchar; @@ -190,6 +191,7 @@ static int base64_decode_block(const char* code_in, const int length_in, char* p fragment = (char)base64_decode_value(*codechar++); } while (fragment < 0); *plainchar = (fragment & 0x03f) << 2; + /* fallthrough */ case step_b: do { if (codechar == code_in+length_in) @@ -202,6 +204,7 @@ static int base64_decode_block(const char* code_in, const int length_in, char* p } while (fragment < 0); *plainchar++ |= (fragment & 0x030) >> 4; *plainchar = (fragment & 0x00f) << 4; + /* fallthrough */ case step_c: do { if (codechar == code_in+length_in) @@ -214,6 +217,7 @@ static int base64_decode_block(const char* code_in, const int length_in, char* p } while (fragment < 0); *plainchar++ |= (fragment & 0x03c) >> 2; *plainchar = (fragment & 0x003) << 6; + /* fallthrough */ case step_d: do { if (codechar == code_in+length_in) @@ -231,14 +235,14 @@ static int base64_decode_block(const char* code_in, const int length_in, char* p return plainchar - plaintext_out; } -int b64_encode(const char *src, const int ssize, +int b64_encode(const unsigned char *src, const int ssize, char *const b64, int *const bsize) { base64_encodestate s; int cnt1, cnt2; char *c = b64; - /* FIXME check size */ + if (*bsize < ((ssize-1)/3+1)*4+1) return 1; base64_init_encodestate(&s); cnt1 = base64_encode_block(src, ssize, c, &s); c += cnt1; @@ -249,14 +253,15 @@ int b64_encode(const char *src, const int ssize, return 0; } -int b64_decode(const char *b64, char *const dst, int *const dsize) +int b64_decode(const char *b64, unsigned char *const dst, int *const dsize) { base64_decodestate s; int cnt; + int bsize = strlen(b64); - /* FIXME check size */ + if (*dsize < (bsize*3/4)) return 1; base64_init_decodestate(&s); - cnt = base64_decode_block(b64, strlen(b64), dst, &s); + cnt = base64_decode_block(b64, bsize, dst, &s); *dsize = cnt; return 0; }