summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/Base85.h36
-rw-r--r--lib/Base85.cc129
-rw-r--r--lib/LuaHttp.cc45
3 files changed, 210 insertions, 0 deletions
diff --git a/include/Base85.h b/include/Base85.h
new file mode 100644
index 0000000..1b7a439
--- /dev/null
+++ b/include/Base85.h
@@ -0,0 +1,36 @@
+/*
+ * Baltisot
+ * Copyright (C) 1999-2009 Nicolas "Pixel" Noble
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __BASE85_H__
+#define __BASE85_H__
+
+#include <Exceptions.h>
+
+class Base85 : public Base {
+ public:
+ static String encode(const char * data, int len);
+ static unsigned char * decode(const String & str_in, int * len_out);
+
+ private:
+ static String encode_block(unsigned char in_tab[4], int len);
+ static int stri(char);
+ static int decode_block(char s1, char s2, char s3, char s4, char s5, unsigned char * out_tab);
+};
+
+#endif
diff --git a/lib/Base85.cc b/lib/Base85.cc
new file mode 100644
index 0000000..d8722fb
--- /dev/null
+++ b/lib/Base85.cc
@@ -0,0 +1,129 @@
+/*
+ * Baltisot
+ * Copyright (C) 1999-2009 Nicolas "Pixel" Noble
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <Base85.h>
+
+String Base85::encode_block(unsigned char in_tab[4], int len) {
+ unsigned int tuple;
+ char r[6];
+
+ tuple = in_tab[0];
+ tuple |= in_tab[1] << 8;
+ tuple |= in_tab[2] << 16;
+ tuple |= in_tab[3] << 24;
+
+ r[0] = (tuple % 85) + '!';
+ tuple /= 85;
+ r[1] = (tuple % 85) + '!';
+ tuple /= 85;
+ r[2] = len > 1 ? (tuple % 85) + '!' : '~';
+ tuple /= 85;
+ r[3] = len > 2 ? (tuple % 85) + '!' : '~';
+ tuple /= 85;
+ r[4] = len > 3 ? (tuple % 85) + '!' : '~';
+ r[5] = 0;
+
+ return r;
+}
+
+String Base85::encode(const char * data, int stream_size) {
+ String encoded = "";
+ unsigned char in_tab[4];
+ int len, i, s_pos;
+
+ s_pos = 0;
+
+ while (stream_size > 0) {
+ in_tab[0] = 0;
+ in_tab[1] = 0;
+ in_tab[2] = 0;
+ in_tab[3] = 0;
+
+ len = stream_size >= 4 ? 4 : stream_size;
+
+ for (i = 0; i < len; i++) {
+ in_tab[i] = data[s_pos + i];
+ }
+
+ encoded += encode_block(in_tab, len);
+
+ s_pos += 4;
+ stream_size -= 4;
+ }
+
+ return encoded;
+}
+
+int Base85::decode_block(char s1, char s2, char s3, char s4, char s5, unsigned char * out_tab) {
+ int len, sb1, sb2, sb3, sb4, sb5;
+ unsigned int tuple;
+
+ len = s3 == '~' ? 1 : s4 == '~' ? 2 : s5 == '~' ? 3 : 4;
+ s3 = (s3 == '~') || (s3 == 0) ? '!' : s3;
+ s4 = (s4 == '~') || (s4 == 0) ? '!' : s4;
+ s5 = (s5 == '~') || (s5 == 0) ? '!' : s5;
+
+ sb1 = s1 - '!';
+ sb2 = s2 - '!';
+ sb3 = s3 - '!';
+ sb4 = s4 - '!';
+ sb5 = s5 - '!';
+
+ tuple = s5; tuple *= 85;
+ tuple |= s4; tuple *= 85;
+ tuple |= s3; tuple *= 85;
+ tuple |= s2; tuple *= 85;
+ tuple |= s1;
+
+ out_tab[0] = tuple & 255; tuple >>= 8;
+ out_tab[1] = tuple & 255; tuple >>= 8;
+ out_tab[2] = tuple & 255; tuple >>= 8;
+ out_tab[3] = tuple & 255;
+
+ return len;
+}
+
+unsigned char * Base85::decode(const String & str_in, int * len_out) {
+ int s_len = str_in.strlen(), len = 0, i, j, t_len;
+ char s1, s2, s3, s4, s5;
+ unsigned char t_out[4];
+ unsigned char * out = (unsigned char *) malloc(s_len * 4 / 5 + 5);
+ unsigned char * p = out;
+
+ for (i = 0; i < s_len; i += 5) {
+ s1 = str_in[i + 0];
+ s2 = str_in[i + 1];
+ s3 = str_in[i + 2];
+ s4 = str_in[i + 3];
+ s5 = str_in[i + 4];
+ t_len = decode_block(s1, s2, s3, s4, s5, t_out);
+
+ for (j = 0; j < t_len; j++) {
+ *(p++) = t_out[j];
+ }
+
+ len += t_len;
+ }
+
+ if (len_out) {
+ *len_out = len;
+ }
+
+ return out;
+}
diff --git a/lib/LuaHttp.cc b/lib/LuaHttp.cc
index 2a78391..a88c77c 100644
--- a/lib/LuaHttp.cc
+++ b/lib/LuaHttp.cc
@@ -22,6 +22,7 @@
#include "LuaHandle.h"
#include "LuaTask.h"
#include "Base64.h"
+#include "Base85.h"
#include "HashFunction.h"
#include "RandISAAC.h"
@@ -120,6 +121,9 @@ enum HttpResponse_functions_t {
HTTPRESPONSE_BASE64_ENCODE,
HTTPRESPONSE_BASE64_DECODE,
HTTPRESPONSE_BASE64_DECODE_BIN,
+ HTTPRESPONSE_BASE85_ENCODE,
+ HTTPRESPONSE_BASE85_DECODE,
+ HTTPRESPONSE_BASE85_DECODE_BIN,
HTTPRESPONSE_MD5,
HTTPRESPONSE_SHA1,
HTTPRESPONSE_SHA256,
@@ -137,6 +141,9 @@ struct lua_functypes_t HttpResponse_functions[] = {
{ HTTPRESPONSE_BASE64_ENCODE, "Base64Encode", 1, 1, { BLUA_STRING | BLUA_OBJECT } },
{ HTTPRESPONSE_BASE64_DECODE, "Base64Decode", 1, 1, { BLUA_STRING } },
{ HTTPRESPONSE_BASE64_DECODE_BIN, "Base64DecodeBin", 2, 2, { BLUA_STRING, BLUA_OBJECT } },
+ { HTTPRESPONSE_BASE85_ENCODE, "Base85Encode", 1, 1, { BLUA_STRING | BLUA_OBJECT } },
+ { HTTPRESPONSE_BASE85_DECODE, "Base85Decode", 1, 1, { BLUA_STRING } },
+ { HTTPRESPONSE_BASE85_DECODE_BIN, "Base85DecodeBin", 2, 2, { BLUA_STRING, BLUA_OBJECT } },
{ HTTPRESPONSE_MD5, "MD5", 1, 1, { BLUA_STRING | BLUA_OBJECT } },
{ HTTPRESPONSE_SHA1, "SHA1", 1, 1, { BLUA_STRING | BLUA_OBJECT } },
{ HTTPRESPONSE_SHA256, "SHA256", 1, 1, { BLUA_STRING | BLUA_OBJECT } },
@@ -153,6 +160,9 @@ class sLua_HttpResponse : public Base {
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_ENCODE);
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_DECODE);
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_DECODE_BIN);
+ DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_ENCODE);
+ DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_DECODE);
+ DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_DECODE_BIN);
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_MD5);
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_SHA1);
DECLARE_FUNCTION(HttpResponse, HTTPRESPONSE_SHA256);
@@ -177,6 +187,9 @@ void LuaHttpResponse::pushstatics(Lua * L) throw (GeneralException) {
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_ENCODE);
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_DECODE);
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE64_DECODE_BIN);
+ PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_ENCODE);
+ PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_DECODE);
+ PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_BASE85_DECODE_BIN);
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_MD5);
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_SHA1);
PUSH_FUNCTION(HttpResponse, HTTPRESPONSE_SHA256);
@@ -331,6 +344,38 @@ int sLua_HttpResponse::HttpResponse_proceed_statics(Lua * L, int n, int caller)
free(enc_t);
}
break;
+ case HTTPRESPONSE_BASE85_ENCODE:
+ if (L->isstring()) {
+ dec = L->tostring();
+ dec_t = dec.to_charp();
+ L->push(Base85::encode(dec_t, dec.strlen()));
+ } else {
+ Handle * hdata = L->recast<Handle>(1);
+ int size = hdata->GetSize();
+ char * data = (char *) malloc(size);
+ hdata->read(data, size);
+ L->push(Base85::encode(data, size));
+ free(data);
+ }
+ r = 1;
+ break;
+ case HTTPRESPONSE_BASE85_DECODE:
+ enc_t = (char *) Base85::decode(L->tostring(), &l);
+ enc_t[l] = 0;
+ L->push(enc_t, l);
+ free(enc_t);
+ r = 1;
+ break;
+ case HTTPRESPONSE_BASE85_DECODE_BIN:
+ {
+ Handle * out = lua_recast<Handle>(L, 2);
+ if (!out)
+ L->error("Need an output handle to Base85DecodeBin");
+ enc_t = (char *) Base85::decode(L->tostring(1), &l);
+ out->write(enc_t, l);
+ free(enc_t);
+ }
+ break;
case HTTPRESPONSE_MD5:
if (L->isstring()) {
dec = L->tostring();