summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin10/lib/mir_core.libbin35798 -> 36258 bytes
-rw-r--r--bin10/lib/mir_core64.libbin32674 -> 33098 bytes
-rw-r--r--bin11/lib/mir_core.libbin35798 -> 36258 bytes
-rw-r--r--bin11/lib/mir_core64.libbin32674 -> 33098 bytes
-rw-r--r--include/delphi/m_core.inc5
-rw-r--r--include/m_core.h3
-rw-r--r--src/mir_core/mir_core.def2
-rw-r--r--src/mir_core/utils.cpp103
8 files changed, 113 insertions, 0 deletions
diff --git a/bin10/lib/mir_core.lib b/bin10/lib/mir_core.lib
index 09817ec289..a1c798fd34 100644
--- a/bin10/lib/mir_core.lib
+++ b/bin10/lib/mir_core.lib
Binary files differ
diff --git a/bin10/lib/mir_core64.lib b/bin10/lib/mir_core64.lib
index 40b929ddee..d1dd96c2f1 100644
--- a/bin10/lib/mir_core64.lib
+++ b/bin10/lib/mir_core64.lib
Binary files differ
diff --git a/bin11/lib/mir_core.lib b/bin11/lib/mir_core.lib
index 5a6813aaa9..2fa2e20ff5 100644
--- a/bin11/lib/mir_core.lib
+++ b/bin11/lib/mir_core.lib
Binary files differ
diff --git a/bin11/lib/mir_core64.lib b/bin11/lib/mir_core64.lib
index 2a2ebb2b80..3eb2c25c3d 100644
--- a/bin11/lib/mir_core64.lib
+++ b/bin11/lib/mir_core64.lib
Binary files differ
diff --git a/include/delphi/m_core.inc b/include/delphi/m_core.inc
index e462aeac27..0b14858923 100644
--- a/include/delphi/m_core.inc
+++ b/include/delphi/m_core.inc
@@ -553,6 +553,11 @@ procedure mir_sha1_hash(dataIn:pmir_sha1_byte_t; len:int;hashout:SHA1Hash); stdc
///////////////////////////////////////////////////////////////////////////////
// strings
+function mir_base64_decode(str:pAnsiChar):pAnsiChar; stdcall;
+ external CoreDLL name 'mir_base64_decode';
+function mir_base64_encode(str:pAnsiChar):pAnsiChar; stdcall;
+ external CoreDLL name 'mir_base64_encode';
+
function rtrim(str:pAnsiChar):pAnsiChar; stdcall;
external CoreDLL name 'rtrim';
function rtrimw(str:pWideChar):pWideChar; stdcall;
diff --git a/include/m_core.h b/include/m_core.h
index f67faf7be1..8c8602f921 100644
--- a/include/m_core.h
+++ b/include/m_core.h
@@ -453,6 +453,9 @@ MIR_CORE_DLL(void) mir_sha1_hash(mir_sha1_byte_t *dataIn, int len, mir_sha1_byte
///////////////////////////////////////////////////////////////////////////////
// strings
+MIR_CORE_DLL(void*) mir_base64_decode(const char *input, unsigned *outputLen);
+MIR_CORE_DLL(char*) mir_base64_encode(const BYTE *input, unsigned inputLen);
+
MIR_CORE_DLL(char*) rtrim(char *str);
MIR_CORE_DLL(WCHAR*) rtrimw(WCHAR *str);
diff --git a/src/mir_core/mir_core.def b/src/mir_core/mir_core.def
index 44ad59c86a..5f08ae2836 100644
--- a/src/mir_core/mir_core.def
+++ b/src/mir_core/mir_core.def
@@ -159,3 +159,5 @@ ltrimpw @156
wildcmpw @157
wildcmpi @158
wildcmpiw @159
+mir_base64_encode @160
+mir_base64_decode @161
diff --git a/src/mir_core/utils.cpp b/src/mir_core/utils.cpp
index 21c9e8dfd5..02593de4fa 100644
--- a/src/mir_core/utils.cpp
+++ b/src/mir_core/utils.cpp
@@ -212,3 +212,106 @@ MIR_CORE_DLL(int) wildcmpiw(const WCHAR *name, const WCHAR *mask)
if (*mask != '?' && _qtoupper(*mask) != _qtoupper(*name)) name -= (size_t)(mask - last) - 1, mask = last;
}
}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+MIR_CORE_DLL(char*) mir_base64_encode(const BYTE *input, unsigned inputLen)
+{
+ if (input == NULL)
+ return NULL;
+
+ size_t i = 0;
+ char chr[3], enc[4];
+ static char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ size_t length = inputLen;
+ size_t nLength = 4 * ((length + 2) / 3) + 1;
+
+ char *output = (char *)mir_alloc(nLength);
+ char *p = output;
+
+ while (i < length)
+ {
+ chr[0] = input[i++];
+ chr[1] = input[i++];
+ chr[2] = input[i++];
+
+ enc[0] = chr[0] >> 2;
+ enc[1] = ((chr[0] & 0x03) << 4) | (chr[1] >> 4);
+ enc[2] = ((chr[1] & 0x0F) << 2) | (chr[2] >> 6);
+ enc[3] = chr[2] & 0x3F;
+
+ *p++ = cb64[enc[0]]; *p++ = cb64[enc[1]];
+
+ if (i - 2 >= length) { *p++ = '='; *p++ = '='; }
+ else if (i - 1 >= length) { *p++ = cb64[enc[2]]; *p++ = '='; }
+ else { *p++ = cb64[enc[2]]; *p++ = cb64[enc[3]]; }
+ }
+
+ *p = 0;
+
+ return output;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+static int Base64DecodeTable[] =
+{
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
+ 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
+ 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
+ -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
+ 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
+};
+
+MIR_CORE_DLL(void*) mir_base64_decode(const char *input, unsigned *outputLen)
+{
+ if (input == NULL)
+ return NULL;
+
+ size_t i = 0;
+ char chr[3], enc[4];
+
+ size_t length = strlen(input);
+ size_t nLength = (length / 4) * 3 + 1;
+
+ char *output = (char *)mir_alloc(nLength);
+ char *p = output;
+
+ while (i < length)
+ {
+ enc[0] = Base64DecodeTable[input[i++]];
+ enc[1] = Base64DecodeTable[input[i++]];
+ enc[2] = Base64DecodeTable[input[i++]];
+ enc[3] = Base64DecodeTable[input[i++]];
+
+ if (enc[0] == -1 || enc[1] == -1) break;
+
+ chr[0] = (enc[0] << 2) | (enc[1] >> 4);
+ chr[1] = ((enc[1] & 15) << 4) | (enc[2] >> 2);
+ chr[2] = ((enc[2] & 3) << 6) | enc[3];
+
+ *p++ = chr[0];
+
+ if (enc[2] != -1) *p++ = chr[1];
+ if (enc[3] != -1) *p++ = chr[2];
+ }
+
+ *p = 0;
+
+ if (outputLen != NULL)
+ *outputLen = (unsigned)nLength;
+
+ return output;
+}