diff --git a/programs/cmm/lib/base64.h b/programs/cmm/lib/base64.h new file mode 100644 index 0000000000..2048bbd7e2 --- /dev/null +++ b/programs/cmm/lib/base64.h @@ -0,0 +1,59 @@ +/* Author: PaulCodeman + Example: + char bufferb64[0x1000] = {0}; + base64_encode("Kevin van Zonneveld",#bufferb64, 19); + #bufferb64 == "S2V2aW4gdmFuIFpvbm5ldmVsZA==" +*/ + +:dword b64_symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +inline void base64_encode(dword data, buffer, length) +{ + byte o1 = 0; + byte o2 = 0; + byte o3 = 0; + dword bits = 0; + dword h1 = 0; + dword h2 = 0; + dword h3 = 0; + dword h4 = 0; + + dword end = 0; + end = data+length; + + do + { + o1 = DSBYTE[data];data++; + if (data < end) {o2 = DSBYTE[data];data++;} else o2 = 0; + if (data < end) {o3 = DSBYTE[data];data++;} else o3 = 0; + + bits = o1<<16; + bits |= o2<<8; + bits |= o3; + + h1 = bits>>18 & 0x3f; + h2 = bits>>12 & 0x3f; + h3 = bits>>6 & 0x3f; + h4 = bits & 0x3f; + + DSBYTE[buffer] = DSBYTE[#b64_symbols+h1];buffer++; + DSBYTE[buffer] = DSBYTE[#b64_symbols+h2];buffer++; + DSBYTE[buffer] = DSBYTE[#b64_symbols+h3];buffer++; + DSBYTE[buffer] = DSBYTE[#b64_symbols+h4];buffer++; + } while(end > data); + switch(length % 3) + { + case 1: + buffer--; + DSBYTE[buffer] = '='; + buffer--; + DSBYTE[buffer] = '='; + buffer+=2; + break; + case 2: + buffer--; + DSBYTE[buffer] = '='; + buffer++; + break; + } + DSBYTE[buffer] = 0; +}