Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| SHA1 Hash: | 6a35673b789beb67da9953c3293edb74bfd81e50 |
|---|---|
| Date: | 2008-11-14 10:53:47 |
| User: | stephan |
| Comment: | added base64 encode/decode routines, so we can c11n binary data. |
Changes
Added include/s11n.net/c11n/detail/b64/cdecode.h
| Old () | New (aace08acbdf2158a) | |||
|---|---|---|---|---|
| > | 1 | /* | ||
| > | 2 | cdecode.h - c header for a base64 decoding algorithm | ||
| > | 3 | |||
| > | 4 | This is part of the libb64 project, and has been placed in the public domain. | ||
| > | 5 | For details, see http://sourceforge.net/projects/libb64 | ||
| > | 6 | */ | ||
| > | 7 | |||
| > | 8 | #ifndef BASE64_CDECODE_H | ||
| > | 9 | #define BASE64_CDECODE_H | ||
| > | 10 | |||
| > | 11 | typedef enum | ||
| > | 12 | { | ||
| > | 13 | step_a, step_b, step_c, step_d | ||
| > | 14 | } base64_decodestep; | ||
| > | 15 | |||
| > | 16 | typedef struct | ||
| > | 17 | { | ||
| > | 18 | base64_decodestep step; | ||
| > | 19 | char plainchar; | ||
| > | 20 | } base64_decodestate; | ||
| > | 21 | |||
| > | 22 | void base64_init_decodestate(base64_decodestate* state_in); | ||
| > | 23 | |||
| > | 24 | int base64_decode_value(char value_in); | ||
| > | 25 | |||
| > | 26 | int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in); | ||
| > | 27 | |||
| > | 28 | #endif /* BASE64_CDECODE_H */ | ||
Added include/s11n.net/c11n/detail/b64/cencode.h
| Old () | New (2c40267d4acdd10e) | |||
|---|---|---|---|---|
| > | 1 | /* | ||
| > | 2 | cencode.h - c header for a base64 encoding algorithm | ||
| > | 3 | |||
| > | 4 | This is part of the libb64 project, and has been placed in the public domain. | ||
| > | 5 | For details, see http://sourceforge.net/projects/libb64 | ||
| > | 6 | */ | ||
| > | 7 | |||
| > | 8 | #ifndef BASE64_CENCODE_H | ||
| > | 9 | #define BASE64_CENCODE_H | ||
| > | 10 | |||
| > | 11 | typedef enum | ||
| > | 12 | { | ||
| > | 13 | step_A, step_B, step_C | ||
| > | 14 | } base64_encodestep; | ||
| > | 15 | |||
| > | 16 | typedef struct | ||
| > | 17 | { | ||
| > | 18 | base64_encodestep step; | ||
| > | 19 | char result; | ||
| > | 20 | int stepcount; | ||
| > | 21 | } base64_encodestate; | ||
| > | 22 | |||
| > | 23 | void base64_init_encodestate(base64_encodestate* state_in); | ||
| > | 24 | |||
| > | 25 | char base64_encode_value(char value_in); | ||
| > | 26 | |||
| > | 27 | int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); | ||
| > | 28 | |||
| > | 29 | int base64_encode_blockend(char* code_out, base64_encodestate* state_in); | ||
| > | 30 | |||
| > | 31 | #endif /* BASE64_CENCODE_H */ | ||
| > | 32 | |||
Added src/cdecode.c
| Old () | New (33dfb5c2cb7a09f6) | |||
|---|---|---|---|---|
| > | 1 | /* | ||
| > | 2 | cdecoder.c - c source to a base64 decoding algorithm implementation | ||
| > | 3 | |||
| > | 4 | This is part of the libb64 project, and has been placed in the public domain. | ||
| > | 5 | For details, see http://sourceforge.net/projects/libb64 | ||
| > | 6 | */ | ||
| > | 7 | |||
| > | 8 | #include <b64/cdecode.h> | ||
| > | 9 | |||
| > | 10 | int base64_decode_value(char value_in) | ||
| > | 11 | { | ||
| > | 12 | 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}; | ||
| > | 13 | static const char decoding_size = sizeof(decoding); | ||
| > | 14 | value_in -= 43; | ||
| > | 15 | if (value_in < 0 || value_in > decoding_size) return -1; | ||
| > | 16 | return decoding[(int)value_in]; | ||
| > | 17 | } | ||
| > | 18 | |||
| > | 19 | void base64_init_decodestate(base64_decodestate* state_in) | ||
| > | 20 | { | ||
| > | 21 | state_in->step = step_a; | ||
| > | 22 | state_in->plainchar = 0; | ||
| > | 23 | } | ||
| > | 24 | |||
| > | 25 | int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) | ||
| > | 26 | { | ||
| > | 27 | const char* codechar = code_in; | ||
| > | 28 | char* plainchar = plaintext_out; | ||
| > | 29 | char fragment; | ||
| > | 30 | |||
| > | 31 | *plainchar = state_in->plainchar; | ||
| > | 32 | |||
| > | 33 | switch (state_in->step) | ||
| > | 34 | { | ||
| > | 35 | while (1) | ||
| > | 36 | { | ||
| > | 37 | case step_a: | ||
| > | 38 | do { | ||
| > | 39 | if (codechar == code_in+length_in) | ||
| > | 40 | { | ||
| > | 41 | state_in->step = step_a; | ||
| > | 42 | state_in->plainchar = *plainchar; | ||
| > | 43 | return plainchar - plaintext_out; | ||
| > | 44 | } | ||
| > | 45 | fragment = (char)base64_decode_value(*codechar++); | ||
| > | 46 | } while (fragment < 0); | ||
| > | 47 | *plainchar = (fragment & 0x03f) << 2; | ||
| > | 48 | case step_b: | ||
| > | 49 | do { | ||
| > | 50 | if (codechar == code_in+length_in) | ||
| > | 51 | { | ||
| > | 52 | state_in->step = step_b; | ||
| > | 53 | state_in->plainchar = *plainchar; | ||
| > | 54 | return plainchar - plaintext_out; | ||
| > | 55 | } | ||
| > | 56 | fragment = (char)base64_decode_value(*codechar++); | ||
| > | 57 | } while (fragment < 0); | ||
| > | 58 | *plainchar++ |= (fragment & 0x030) >> 4; | ||
| > | 59 | *plainchar = (fragment & 0x00f) << 4; | ||
| > | 60 | case step_c: | ||
| > | 61 | do { | ||
| > | 62 | if (codechar == code_in+length_in) | ||
| > | 63 | { | ||
| > | 64 | state_in->step = step_c; | ||
| > | 65 | state_in->plainchar = *plainchar; | ||
| > | 66 | return plainchar - plaintext_out; | ||
| > | 67 | } | ||
| > | 68 | fragment = (char)base64_decode_value(*codechar++); | ||
| > | 69 | } while (fragment < 0); | ||
| > | 70 | *plainchar++ |= (fragment & 0x03c) >> 2; | ||
| > | 71 | *plainchar = (fragment & 0x003) << 6; | ||
| > | 72 | case step_d: | ||
| > | 73 | do { | ||
| > | 74 | if (codechar == code_in+length_in) | ||
| > | 75 | { | ||
| > | 76 | state_in->step = step_d; | ||
| > | 77 | state_in->plainchar = *plainchar; | ||
| > | 78 | return plainchar - plaintext_out; | ||
| > | 79 | } | ||
| > | 80 | fragment = (char)base64_decode_value(*codechar++); | ||
| > | 81 | } while (fragment < 0); | ||
| > | 82 | *plainchar++ |= (fragment & 0x03f); | ||
| > | 83 | } | ||
| > | 84 | } | ||
| > | 85 | /* control should not reach here */ | ||
| > | 86 | return plainchar - plaintext_out; | ||
| > | 87 | } | ||
Added src/cencode.c
| Old () | New (daf85ac49a712d98) | |||
|---|---|---|---|---|
| > | 1 | /* | ||
| > | 2 | cencoder.c - c source to a base64 encoding algorithm implementation | ||
| > | 3 | |||
| > | 4 | This is part of the libb64 project, and has been placed in the public domain. | ||
| > | 5 | For details, see http://sourceforge.net/projects/libb64 | ||
| > | 6 | */ | ||
| > | 7 | |||
| > | 8 | #include <b64/cencode.h> | ||
| > | 9 | |||
| > | 10 | const int CHARS_PER_LINE = 72; | ||
| > | 11 | |||
| > | 12 | void base64_init_encodestate(base64_encodestate* state_in) | ||
| > | 13 | { | ||
| > | 14 | state_in->step = step_A; | ||
| > | 15 | state_in->result = 0; | ||
| > | 16 | state_in->stepcount = 0; | ||
| > | 17 | } | ||
| > | 18 | |||
| > | 19 | char base64_encode_value(char value_in) | ||
| > | 20 | { | ||
| > | 21 | static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||
| > | 22 | if (value_in > 63) return '='; | ||
| > | 23 | return encoding[(int)value_in]; | ||
| > | 24 | } | ||
| > | 25 | |||
| > | 26 | int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) | ||
| > | 27 | { | ||
| > | 28 | const char* plainchar = plaintext_in; | ||
| > | 29 | const char* const plaintextend = plaintext_in + length_in; | ||
| > | 30 | char* codechar = code_out; | ||
| > | 31 | char result; | ||
| > | 32 | char fragment; | ||
| > | 33 | |||
| > | 34 | result = state_in->result; | ||
| > | 35 | |||
| > | 36 | switch (state_in->step) | ||
| > | 37 | { | ||
| > | 38 | while (1) | ||
| > | 39 | { | ||
| > | 40 | case step_A: | ||
| > | 41 | if (plainchar == plaintextend) | ||
| > | 42 | { | ||
| > | 43 | state_in->result = result; | ||
| > | 44 | state_in->step = step_A; | ||
| > | 45 | return codechar - code_out; | ||
| > | 46 | } | ||
| > | 47 | fragment = *plainchar++; | ||
| > | 48 | result = (fragment & 0x0fc) >> 2; | ||
| > | 49 | *codechar++ = base64_encode_value(result); | ||
| > | 50 | result = (fragment & 0x003) << 4; | ||
| > | 51 | case step_B: | ||
| > | 52 | if (plainchar == plaintextend) | ||
| > | 53 | { | ||
| > | 54 | state_in->result = result; | ||
| > | 55 | state_in->step = step_B; | ||
| > | 56 | return codechar - code_out; | ||
| > | 57 | } | ||
| > | 58 | fragment = *plainchar++; | ||
| > | 59 | result |= (fragment & 0x0f0) >> 4; | ||
| > | 60 | *codechar++ = base64_encode_value(result); | ||
| > | 61 | result = (fragment & 0x00f) << 2; | ||
| > | 62 | case step_C: | ||
| > | 63 | if (plainchar == plaintextend) | ||
| > | 64 | { | ||
| > | 65 | state_in->result = result; | ||
| > | 66 | state_in->step = step_C; | ||
| > | 67 | return codechar - code_out; | ||
| > | 68 | } | ||
| > | 69 | fragment = *plainchar++; | ||
| > | 70 | result |= (fragment & 0x0c0) >> 6; | ||
| > | 71 | *codechar++ = base64_encode_value(result); | ||
| > | 72 | result = (fragment & 0x03f) >> 0; | ||
| > | 73 | *codechar++ = base64_encode_value(result); | ||
| > | 74 | |||
| > | 75 | ++(state_in->stepcount); | ||
| > | 76 | if (state_in->stepcount == CHARS_PER_LINE/4) | ||
| > | 77 | { | ||
| > | 78 | *codechar++ = '\n'; | ||
| > | 79 | state_in->stepcount = 0; | ||
| > | 80 | } | ||
| > | 81 | } | ||
| > | 82 | } | ||
| > | 83 | /* control should not reach here */ | ||
| > | 84 | return codechar - code_out; | ||
| > | 85 | } | ||
| > | 86 | |||
| > | 87 | int base64_encode_blockend(char* code_out, base64_encodestate* state_in) | ||
| > | 88 | { | ||
| > | 89 | char* codechar = code_out; | ||
| > | 90 | |||
| > | 91 | switch (state_in->step) | ||
| > | 92 | { | ||
| > | 93 | case step_B: | ||
| > | 94 | *codechar++ = base64_encode_value(state_in->result); | ||
| > | 95 | *codechar++ = '='; | ||
| > | 96 | *codechar++ = '='; | ||
| > | 97 | break; | ||
| > | 98 | case step_C: | ||
| > | 99 | *codechar++ = base64_encode_value(state_in->result); | ||
| > | 100 | *codechar++ = '='; | ||
| > | 101 | break; | ||
| > | 102 | case step_A: | ||
| > | 103 | break; | ||
| > | 104 | } | ||
| > | 105 | *codechar++ = '\n'; | ||
| > | 106 | |||
| > | 107 | return codechar - code_out; | ||
| > | 108 | } | ||