summaryrefslogtreecommitdiff
path: root/src/base64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/base64.cc')
-rw-r--r--src/base64.cc121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/base64.cc b/src/base64.cc
new file mode 100644
index 0000000..367a3e4
--- /dev/null
+++ b/src/base64.cc
@@ -0,0 +1,121 @@
+/** --------------------------------------------------------------------
+ * @file base64.cc
+ * @brief Implementation of base64 Utilities
+ * @author Andreas Aardal Hanssen
+ * @date 2002-2005
+ * ----------------------------------------------------------------- **/
+#include "base64.h"
+#include <string>
+#include <iostream>
+
+using namespace ::std;
+
+typedef unsigned char bbyte; /* Byte type */
+
+#define TRUE 1
+#define FALSE 0
+
+#define LINELEN 72 /* Encoded line length (max 76) */
+
+static bbyte dtable[256];
+
+string Binc::base64encode(const string &s_in)
+{
+ int i;
+ string result;
+
+ /* Fill dtable with character encodings. */
+
+ for (i = 0; i < 26; i++) {
+ dtable[i] = 'A' + i;
+ dtable[26 + i] = 'a' + i;
+ }
+ for (i = 0; i < 10; i++) {
+ dtable[52 + i] = '0' + i;
+ }
+ dtable[62] = '+';
+ dtable[63] = '/';
+
+ string::const_iterator s_i = s_in.begin();
+ while (s_i != s_in.end()) {
+
+ bbyte igroup[3], ogroup[4];
+ int c, n;
+
+ igroup[0] = igroup[1] = igroup[2] = 0;
+ for (n = 0; n < 3 && s_i != s_in.end(); n++) {
+ c = *s_i++;
+ igroup[n] = (bbyte) c;
+ }
+ if (n > 0) {
+ ogroup[0] = dtable[igroup[0] >> 2];
+ ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
+ ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
+ ogroup[3] = dtable[igroup[2] & 0x3F];
+
+ /* Replace characters in output stream with "=" pad
+ characters if fewer than three characters were
+ read from the end of the input stream. */
+
+ if (n < 3) {
+ ogroup[3] = '=';
+ if (n < 2) {
+ ogroup[2] = '=';
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ result += ogroup[i];
+ }
+ }
+
+ return result;
+}
+
+string Binc::base64decode(const string &s_in)
+{
+ string result;
+ int i;
+
+ for (i = 0; i < 255; i++) {
+ dtable[i] = 0x80;
+ }
+ for (i = 'A'; i <= 'Z'; i++) {
+ dtable[i] = 0 + (i - 'A');
+ }
+ for (i = 'a'; i <= 'z'; i++) {
+ dtable[i] = 26 + (i - 'a');
+ }
+ for (i = '0'; i <= '9'; i++) {
+ dtable[i] = 52 + (i - '0');
+ }
+ dtable[(int) '+'] = 62;
+ dtable[(int) '/'] = 63;
+ dtable[(int) '='] = 0;
+
+ /*CONSTANTCONDITION*/
+ string::const_iterator s_i = s_in.begin();
+ while (s_i != s_in.end()) {
+ bbyte a[4], b[4], o[3];
+
+ for (i = 0; i < 4 && s_i != s_in.end(); i++) {
+ int c = *s_i++;
+ if (dtable[c] & 0x80) return result;
+ a[i] = (bbyte) c;
+ b[i] = (bbyte) dtable[c];
+ }
+
+ o[0] = (b[0] << 2) | (b[1] >> 4);
+ o[1] = (b[1] << 4) | (b[2] >> 2);
+ o[2] = (b[2] << 6) | b[3];
+
+ i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
+
+ for (int j = 0; j < i; ++j)
+ result += o[j];
+
+ if (i < 3) break;
+ }
+
+ return result;
+}