From 9366bde9ea0d1f499ba8223a28e426669efa6e46 Mon Sep 17 00:00:00 2001 From: Chris Venter Date: Tue, 27 Dec 2016 12:10:13 +0100 Subject: [PATCH] Initial version From project: http://libb64.sourceforge.net/ Latest CVS source from: http://libb64.cvs.sourceforge.net/viewvc/libb64/ ref: https://sourceforge.net/p/libb64/code/ --- AUTHORS | 7 ++++ LICENSE | 29 ++++++++++++++ b64/cencode.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ b64/cencode.h | 64 +++++++++++++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 AUTHORS create mode 100644 LICENSE create mode 100644 b64/cencode.c create mode 100644 b64/cencode.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..af68737 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,7 @@ +libb64: Base64 Encoding/Decoding Routines +====================================== + +Authors: +------- + +Chris Venter chris.venter@gmail.com http://rocketpod.blogspot.com diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a6b5606 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +Copyright-Only Dedication (based on United States law) +or Public Domain Certification + +The person or persons who have associated work with this document (the +"Dedicator" or "Certifier") hereby either (a) certifies that, to the best of +his knowledge, the work of authorship identified is in the public domain of the +country from which the work is published, or (b) hereby dedicates whatever +copyright the dedicators holds in the work of authorship identified below (the +"Work") to the public domain. A certifier, moreover, dedicates any copyright +interest he may have in the associated work, and for these purposes, is +described as a "dedicator" below. + +A certifier has taken reasonable steps to verify the copyright status of this +work. Certifier recognizes that his good faith efforts may not shield him from +liability if in fact the work certified is not in the public domain. + +Dedicator makes this dedication for the benefit of the public at large and to +the detriment of the Dedicator's heirs and successors. Dedicator intends this +dedication to be an overt act of relinquishment in perpetuity of all present +and future rights under copyright law, whether vested or contingent, in the +Work. Dedicator understands that such relinquishment of all rights includes +the relinquishment of all rights to enforce (by lawsuit or otherwise) those +copyrights in the Work. + +Dedicator recognizes that, once placed in the public domain, the Work may be +freely reproduced, distributed, transmitted, used, modified, built upon, or +otherwise exploited by anyone for any purpose, commercial or non-commercial, +and in any way, including by methods that have not yet been invented or +conceived. \ No newline at end of file diff --git a/b64/cencode.c b/b64/cencode.c new file mode 100644 index 0000000..03ba5b6 --- /dev/null +++ b/b64/cencode.c @@ -0,0 +1,109 @@ +/* +cencoder.c - c source to a base64 encoding algorithm implementation + +This is part of the libb64 project, and has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#include + +const int CHARS_PER_LINE = 72; + +void base64_init_encodestate(base64_encodestate* state_in) +{ + state_in->step = step_A; + state_in->result = 0; + state_in->stepcount = 0; +} + +char base64_encode_value(char value_in) +{ + static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + if (value_in > 63) return '='; + return encoding[(int)value_in]; +} + +int base64_encode_block(const 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; + char* codechar = code_out; + char result; + char fragment; + + result = state_in->result; + + switch (state_in->step) + { + while (1) + { + case step_A: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_A; + return codechar - code_out; + } + fragment = *plainchar++; + result = (fragment & 0x0fc) >> 2; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x003) << 4; + case step_B: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_B; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0f0) >> 4; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x00f) << 2; + case step_C: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_C; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0c0) >> 6; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x03f) >> 0; + *codechar++ = base64_encode_value(result); + + ++(state_in->stepcount); + if (state_in->stepcount == CHARS_PER_LINE/4) + { + *codechar++ = '\n'; + state_in->stepcount = 0; + } + } + } + /* control should not reach here */ + return codechar - code_out; +} + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in) +{ + char* codechar = code_out; + + switch (state_in->step) + { + case step_B: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + *codechar++ = '='; + break; + case step_C: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + break; + case step_A: + break; + } + *codechar++ = '\n'; + + return codechar - code_out; +} + diff --git a/b64/cencode.h b/b64/cencode.h new file mode 100644 index 0000000..0443f8e --- /dev/null +++ b/b64/cencode.h @@ -0,0 +1,64 @@ +/* + +cencode.h - c header for a base64 encoding algorithm + + + +This is part of the libb64 project, and has been placed in the public domain. + +For details, see http://sourceforge.net/projects/libb64 + +*/ + + + +#ifndef BASE64_CENCODE_H + +#define BASE64_CENCODE_H + + + +typedef enum + +{ + + step_A, step_B, step_C + +} base64_encodestep; + + + +typedef struct + +{ + + base64_encodestep step; + + char result; + + int stepcount; + +} base64_encodestate; + + + +void base64_init_encodestate(base64_encodestate* state_in); + + + +char base64_encode_value(char value_in); + + + +int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); + + + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in); + + + +#endif /* BASE64_CENCODE_H */ + + +