aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil/base64.c
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2013-12-21 14:38:51 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2013-12-21 14:38:51 +0000
commitbe733f30414ceb85304396d30b9648b6afe283e5 (patch)
tree1c451580b0bea8d8c2d1350e4cad0e064f693dbb /wsutil/base64.c
parent576c7eae45be250478b5317bacfa19ad46f812de (diff)
Move epan/base64.[ch] to wsutil/ with function name change.
svn path=/trunk/; revision=54326
Diffstat (limited to 'wsutil/base64.c')
-rw-r--r--wsutil/base64.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/wsutil/base64.c b/wsutil/base64.c
new file mode 100644
index 0000000000..2211cff522
--- /dev/null
+++ b/wsutil/base64.c
@@ -0,0 +1,67 @@
+/* base64.c
+ * Base-64 conversion
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include "base64.h"
+
+/* Decode a base64 string in-place - simple and slow algorithm.
+ Return length of result. Taken from rproxy/librsync/base64.c by
+ Andrew Tridgell. */
+
+size_t ws_base64_decode_inplace(char *s)
+{
+ static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n";
+ int bit_offset, byte_offset, idx, i;
+ unsigned char *d = (unsigned char *)s;
+ char *p;
+ int cr_idx;
+
+ /* we will allow CR and LF - but ignore them */
+ cr_idx = (int) (strchr(b64, '\r') - b64);
+
+ i=0;
+
+ while (*s && (p=strchr(b64, *s))) {
+ idx = (int)(p - b64);
+ if(idx < cr_idx) {
+ byte_offset = (i*6)/8;
+ bit_offset = (i*6)%8;
+ d[byte_offset] &= ~((1<<(8-bit_offset))-1);
+ if (bit_offset < 3) {
+ d[byte_offset] |= (idx << (2-bit_offset));
+ } else {
+ d[byte_offset] |= (idx >> (bit_offset-2));
+ d[byte_offset+1] = 0;
+ d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
+ }
+ i++;
+ }
+ s++;
+ }
+
+ d[i*3/4] = 0;
+ return i*3/4;
+}