From 2bce38afce22a39bd10a93464aca358172b75dd6 Mon Sep 17 00:00:00 2001 From: colm Date: Thu, 26 Jan 2017 12:45:40 -0500 Subject: [PATCH] FS-9952: Add base64 code (from verto) --- libs/libks/Makefile.am | 4 +- libs/libks/src/include/ks_base64.h | 54 ++++++++++++ libs/libks/src/ks_base64.c | 130 +++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 libs/libks/src/include/ks_base64.h create mode 100644 libs/libks/src/ks_base64.c diff --git a/libs/libks/Makefile.am b/libs/libks/Makefile.am index 8007ce6feb..57538f236b 100644 --- a/libs/libks/Makefile.am +++ b/libs/libks/Makefile.am @@ -10,7 +10,7 @@ lib_LTLIBRARIES = libks.la libks_la_SOURCES = src/ks.c src/ks_string.c src/ks_json.c src/cJSON.c src/cJSON_Utils.c src/ks_thread.c src/ks_thread_pool.c src/ks_mutex.c src/ks_config.c libks_la_SOURCES += src/ks_log.c src/ks_socket.c src/ks_buffer.c src/ks_pool.c src/simclist.c libks_la_SOURCES += src/ks_time.c src/ks_printf.c src/ks_hash.c src/ks_q.c src/ks_dso.c # src/ks_dht.c -libks_la_SOURCES += src/ks_ssl.c src/kws.c src/ks_rng.c src/ks_rpcmessage.c +libks_la_SOURCES += src/ks_ssl.c src/kws.c src/ks_rng.c src/ks_rpcmessage.c src/ks_base64.c libks_la_SOURCES += src/utp/utp_api.cpp src/utp/utp_callbacks.cpp src/utp/utp_hash.cpp src/utp/utp_internal.cpp libks_la_SOURCES += src/utp/utp_packedsockaddr.cpp src/utp/utp_utils.cpp src/ks_bencode.c libks_la_SOURCES += src/dht/ks_dht.c src/dht/ks_dht_datagram.c src/dht/ks_dht_endpoint.c src/dht/ks_dht_message.c src/dht/ks_dht_transaction.c @@ -30,7 +30,7 @@ library_include_HEADERS += src/include/ks_thread_pool.h src/include/ks_cJSON.h s library_include_HEADERS += src/include/ks_pool.h src/include/simclist.h src/include/ks_time.h src/include/ks_q.h src/include/ks_socket.h library_include_HEADERS += src/include/ks_dso.h src/include/ks_platform.h src/include/ks_types.h # src/include/ks_rng.h src/include/ks_dht.h library_include_HEADERS += src/include/ks_printf.h src/include/ks_hash.h src/include/ks_ssl.h src/include/kws.h -library_include_HEADERS += src/include/ks_rpcmessage.h +library_include_HEADERS += src/include/ks_rpcmessage.h src/include/ks_base64.h library_include_HEADERS += src/utp/utp_internal.h src/utp/utp.h src/utp/utp_types.h src/utp/utp_callbacks.h src/utp/utp_templates.h library_include_HEADERS += src/utp/utp_hash.h src/utp/utp_packedsockaddr.h src/utp/utp_utils.h src/include/ks_utp.h src/include/ks_acl.h diff --git a/libs/libks/src/include/ks_base64.h b/libs/libks/src/include/ks_base64.h new file mode 100644 index 0000000000..3c5eb81ace --- /dev/null +++ b/libs/libks/src/include/ks_base64.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 FreeSWITCH Solutions LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#ifndef _KS_BASE64_H__ +#define _KS_BASE64_H__ + +#include + +KS_DECLARE(ks_status_t) ks_b64_encode(unsigned char *in, ks_size_t ilen, unsigned char *out, ks_size_t olen); +KS_DECLARE(ks_size_t) ks_b64_decode(char *in, char *out, ks_size_t olen); + +#endif + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: + */ diff --git a/libs/libks/src/ks_base64.c b/libs/libks/src/ks_base64.c new file mode 100644 index 0000000000..6e528f0fd2 --- /dev/null +++ b/libs/libks/src/ks_base64.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2017 FreeSWITCH Solutions LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include + + +static const char ks_b64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + +KS_DECLARE(ks_status_t) ks_b64_encode(unsigned char *in, ks_size_t ilen, unsigned char *out, ks_size_t olen) +{ + int y = 0, bytes = 0; + size_t x = 0; + unsigned int b = 0, l = 0; + + for (x = 0; x < ilen; x++) { + b = (b << 8) + in[x]; + l += 8; + + while (l >= 6) { + out[bytes++] = ks_b64_table[(b >> (l -= 6)) % 64]; + if (bytes >= (int)olen - 1) { + goto end; + } + if (++y != 72) { + continue; + } + /* out[bytes++] = '\n'; */ + y = 0; + } + } + + if (l > 0) { + out[bytes++] = ks_b64_table[((b % 16) << (6 - l)) % 64]; + } + if (l != 0) { + while (l < 6 && bytes < (int)olen - 1) { + out[bytes++] = '=', l += 2; + } + } + + end: + + out[bytes] = '\0'; + + return KS_STATUS_SUCCESS; +} + +KS_DECLARE(ks_size_t) ks_b64_decode(char *in, char *out, ks_size_t olen) +{ + + char l64[256]; + int b = 0, c, l = 0, i; + char *ip, *op = out; + size_t ol = 0; + + for (i = 0; i < 256; i++) { + l64[i] = -1; + } + + for (i = 0; i < 64; i++) { + l64[(int) ks_b64_table[i]] = (char) i; + } + + for (ip = in; ip && *ip; ip++) { + c = l64[(int) *ip]; + if (c == -1) { + continue; + } + + b = (b << 6) + c; + l += 6; + + while (l >= 8) { + op[ol++] = (char) ((b >> (l -= 8)) % 256); + if (ol >= olen - 2) { + goto end; + } + } + } + + end: + + op[ol++] = '\0'; + + return ol; +} + + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: + */