summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/src/base16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CryptoPP/src/base16.cpp')
-rw-r--r--plugins/CryptoPP/src/base16.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/plugins/CryptoPP/src/base16.cpp b/plugins/CryptoPP/src/base16.cpp
new file mode 100644
index 0000000000..ace113ff76
--- /dev/null
+++ b/plugins/CryptoPP/src/base16.cpp
@@ -0,0 +1,64 @@
+#include "commonheaders.h"
+
+
+char *base16encode(const char *inBuffer, int count) {
+
+ char *outBuffer = (char *) malloc(count*2+1);
+ char *outBufferPtr = outBuffer;
+ BYTE *inBufferPtr = (BYTE *) inBuffer;
+
+ while(count){
+ *outBufferPtr++ = encode16(((*inBufferPtr)>>4)&0x0F);
+ *outBufferPtr++ = encode16((*inBufferPtr++)&0x0F);
+ count--;
+ }
+ *outBufferPtr = '\0';
+
+ return outBuffer;
+}
+
+
+char *base16decode(const char *inBuffer, size_t *count) {
+
+ char *outBuffer = (char *) malloc(*count);
+ BYTE *outBufferPtr = (BYTE *) outBuffer;
+ bool big_endian = false;
+
+ if (*inBuffer == '0' && *(inBuffer+1) == 'x') {
+ inBuffer += *count;
+ big_endian = true;
+ *count -= 2;
+ }
+ while(*count>1){
+ BYTE c0,c1;
+ if (big_endian) {
+ c1 = decode16(*--inBuffer);
+ c0 = decode16(*--inBuffer);
+ }
+ else {
+ c0 = decode16(*inBuffer++);
+ c1 = decode16(*inBuffer++);
+ }
+ if ((c0 | c1) == BERR) {
+ free(outBuffer);
+ *count = 0;
+ return(NULL);
+ }
+ *outBufferPtr++ = (c0<<4) | c1;
+ *count -= 2;
+ }
+ *outBufferPtr = '\0';
+ *count = (int)(outBufferPtr-(BYTE *)outBuffer);
+
+ return outBuffer;
+}
+
+
+char *base16decode(const char *inBuffer)
+{
+ size_t count = strlen(inBuffer);
+ return base16decode(inBuffer, &count);
+}
+
+
+// EOF