From 76c6367d7d0d105aed35c714b45b6883ec8577f7 Mon Sep 17 00:00:00 2001 From: snowdrop Date: Sat, 25 Feb 2006 10:09:28 +0000 Subject: patches by Heiko. See mailinglist (archive 25.02.06) --- nanohttp/nanohttp-base64.c | 156 ++++++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 72 deletions(-) (limited to 'nanohttp/nanohttp-base64.c') diff --git a/nanohttp/nanohttp-base64.c b/nanohttp/nanohttp-base64.c index f81039c..8abee35 100644 --- a/nanohttp/nanohttp-base64.c +++ b/nanohttp/nanohttp-base64.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-base64.c,v 1.1 2006/02/19 22:22:41 snowdrop Exp $ +* $Id: nanohttp-base64.c,v 1.2 2006/02/25 10:09:29 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,6 +25,8 @@ #include #endif +#include "nanohttp-base64.h" + static const char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char cd64[] = "|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; @@ -34,12 +36,13 @@ static const char cd64[] = "|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$ */ static void encodeblock(unsigned char in[3], unsigned char out[4], int len) { - out[0] = cb64[in[0] >> 2]; - out[1] = cb64[((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)]; - out[2] = (unsigned char)(len > 1 ? cb64[((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)] : '='); - out[3] = (unsigned char)(len > 2 ? cb64[in[2] & 0x3f] : '='); - return; + out[0] = cb64[in[0] >> 2]; + out[1] = cb64[((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)]; + out[2] = (unsigned char)(len > 1 ? cb64[((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)] : '='); + out[3] = (unsigned char)(len > 2 ? cb64[in[2] & 0x3f] : '='); + + return; } /** @@ -47,28 +50,27 @@ static void encodeblock(unsigned char in[3], unsigned char out[4], int len) */ void base64_encode(const unsigned char *instr, unsigned char *outstr) { - unsigned char in[3], out[4]; - int i, len; - - while (*instr) { - - len = 0; - for (i = 0; i < 3; i++) { - in[i] = (unsigned char)*instr++; - if (*instr) { - len++; - } - else { - in[i] = 0; - } - } - if (len) { - encodeblock(in, out, len); - for (i = 0; i < 4; i++) { - *outstr++ = out[i]; - } - } - } + unsigned char in[3], out[4]; + int i, len; + + while (*instr) + { + len = 0; + for (i = 0; i < 3; i++) + { + if ((in[i] = (unsigned char)*instr)) + { + len++; + instr++; + } + } + if (len) + { + encodeblock(in, out, len); + for (i = 0; i < 4; i++) + *outstr++ = out[i]; + } + } } /** @@ -76,11 +78,11 @@ void base64_encode(const unsigned char *instr, unsigned char *outstr) */ static void decodeblock(unsigned char in[4], unsigned char out[3]) { - out[0] = (unsigned char)(in[0] << 2 | in[1] >> 4); - out[1] = (unsigned char)(in[1] << 4 | in[2] >> 2); - out[2] = (unsigned char)(((in[2] << 6) & 0xc0) | in[3]); + out[0] = (unsigned char)(in[0] << 2 | in[1] >> 4); + out[1] = (unsigned char)(in[1] << 4 | in[2] >> 2); + out[2] = (unsigned char)(((in[2] << 6) & 0xc0) | in[3]); - return; + return; } /** @@ -88,56 +90,66 @@ static void decodeblock(unsigned char in[4], unsigned char out[3]) */ void base64_decode(const unsigned char *instr, unsigned char *outstr) { - unsigned char in[4], out[3], v; - int i, len; - - while (*instr) { - for (len = 0, i = 0; i < 4 && *instr; i++) { - v = 0; - while (*instr && v == 0) { - v = *instr++; - v = (unsigned char)((v < 43 || v > 122) ? 0 : cd64[v - 43]); - if (v) { - v = (unsigned char)((v == '$') ? 0 : v - 61); - } - } - if (*instr) { - len++; - if (v) { - in[i] = (unsigned char)(v - 1); - } - } - else { - in[i] = 0; - } - } - if (len) { - decodeblock(in, out); - for (i = 0; i < len - 1; i++) { - *outstr++ = out[i]; - } - } - } + unsigned char in[4], out[3], v; + int i, len; + + while (*instr) + { + for (len = 0, i = 0; i < 4 && *instr; i++) + { + v = 0; + while (*instr && v == 0) + { + v = *instr++; + v = (unsigned char)((v < 43 || v > 122) ? 0 : cd64[v - 43]); + if (v) + v = (unsigned char)((v == '$') ? 0 : v - 61); + } + if (*instr) + { + len++; + if (v) + in[i] = (unsigned char)(v - 1); + } + else + { + in[i] = 0; + } + } + if (len) + { + decodeblock(in, out); + for (i = 0; i < len - 1; i++) + *outstr++ = out[i]; + } + } } #ifdef BASE64_TEST_CASE_FROM_RFC2617 +#include int main(int argc, char **argv) { + unsigned char *instr = "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="; + unsigned char *result = "Aladdin:open sesame"; + unsigned char instr2[80]; + unsigned char outstr[80]; - unsigned char *instr = "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="; - unsigned char instr2[80]; - unsigned char outstr[80]; - - bzero(outstr, 80); + bzero(outstr, 80); + base64_decode(instr, outstr); - base64_decode(instr, outstr); + printf("\"%s\" => \"%s\"\n", instr, outstr); + if (strcmp(outstr, result)) + printf("base64_decode failed\n"); - printf("\"%s\" => \"%s\"\n", instr, outstr); + strcpy(instr2, outstr); - strcpy(instr2, outstr); + bzero(outstr, 80); + base64_encode(instr2, outstr); - base64_encode(instr2, outstr); + printf("\"%s\" => \"%s\"\n", instr2, outstr); + if (strcmp(outstr, instr)) + printf("base64_encode failed\n"); - return printf("\"%s\" => \"%s\"\n", instr2, outstr); + return 0; } #endif -- cgit v1.1-32-gdbae