]> www.average.org Git - pam_pcsc_cr.git/blobdiff - base64.c
configure.ac: remove sanitizer by default
[pam_pcsc_cr.git] / base64.c
index d90a927cc42a4a399c028d7d14706e058db21f78..96ae3b8bca90897430b46309623dede1616c417b 100644 (file)
--- 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;
 }