From 93415a58dafa772f9854618dccf8e49e0d6afe1b Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Wed, 31 Jan 2024 20:37:00 -0500 Subject: [PATCH] Wed Jan 31 08:37:00 PM EST 2024 --- bin/CryptoFoleo.h | 2 + src/encodings.c | 178 ++++++++++++++++++++++++++++++++++++++++++++-- src/headers.h | 2 + 3 files changed, 177 insertions(+), 5 deletions(-) diff --git a/bin/CryptoFoleo.h b/bin/CryptoFoleo.h index d799ed0..5aee984 100644 --- a/bin/CryptoFoleo.h +++ b/bin/CryptoFoleo.h @@ -56,5 +56,7 @@ void foleo_rand_mode(uint8_t, uint8_t*); uint8_t* foleo_base64_decode(uint8_t*, size_t*); uint8_t* foleo_hex_decode(uint8_t*); +uint8_t* foleo_hex_encode(uint8_t*, size_t); +uint8_t* foleo_base64_encode(uint8_t*, size_t); #endif diff --git a/src/encodings.c b/src/encodings.c index d6833e2..2cb2c73 100644 --- a/src/encodings.c +++ b/src/encodings.c @@ -73,6 +73,78 @@ static uint8_t foleo_base64_decode1(uint8_t v) return 255; } +static uint8_t foleo_base64_encode1(uint8_t v) +{ + switch (v) + { + case 0: return 'A'; + case 1: return 'B'; + case 2: return 'C'; + case 3: return 'D'; + case 4: return 'E'; + case 5: return 'F'; + case 6: return 'G'; + case 7: return 'H'; + case 8: return 'I'; + case 9: return 'J'; + case 10: return 'K'; + case 11: return 'L'; + case 12: return 'M'; + case 13: return 'N'; + case 14: return 'O'; + case 15: return 'P'; + case 16: return 'Q'; + case 17: return 'R'; + case 18: return 'S'; + case 19: return 'T'; + case 20: return 'U'; + case 21: return 'V'; + case 22: return 'W'; + case 23: return 'X'; + case 24: return 'Y'; + case 25: return 'Z'; + case 26: return 'a'; + case 27: return 'b'; + case 28: return 'c'; + case 29: return 'd'; + case 30: return 'e'; + case 31: return 'f'; + case 32: return 'g'; + case 33: return 'h'; + case 34: return 'i'; + case 35: return 'j'; + case 36: return 'k'; + case 37: return 'l'; + case 38: return 'm'; + case 39: return 'n'; + case 40: return 'o'; + case 41: return 'p'; + case 42: return 'q'; + case 43: return 'r'; + case 44: return 's'; + case 45: return 't'; + case 46: return 'u'; + case 47: return 'v'; + case 48: return 'w'; + case 49: return 'x'; + case 50: return 'y'; + case 51: return 'z'; + case 52: return '0'; + case 53: return '1'; + case 54: return '2'; + case 55: return '3'; + case 56: return '4'; + case 57: return '5'; + case 58: return '6'; + case 59: return '7'; + case 60: return '8'; + case 61: return '9'; + case 62: return '+'; + case 63: return '/'; + } + return 255; +} + uint8_t* foleo_base64_decode(uint8_t* b64, size_t *r) { uint32_t size = strlen(b64); @@ -80,7 +152,7 @@ uint8_t* foleo_base64_decode(uint8_t* b64, size_t *r) uint32_t retS = 0; uint16_t buffer = 0; uint8_t bufferS = 0; - for (uint32_t i = 0; i < size; i++) + for (size_t i = 0; i < size; i++) { if (b64[i] == '=') { bufferS = 0; continue; }; uint8_t val = foleo_base64_decode1(b64[i]); @@ -89,22 +161,18 @@ uint8_t* foleo_base64_decode(uint8_t* b64, size_t *r) *r = 0; return NULL; } - //printf("Pre : %04x %i\n", buffer, bufferS); buffer = (buffer << 6) | val; bufferS += 6; if (bufferS >= 8) { uint8_t shift = 16 - bufferS; buffer <<= shift; - //printf("Shift: %04x %i\n", buffer, bufferS); ret = realloc(ret, ++retS); ret[retS - 1] = buffer >> 8; buffer = buffer & 0x00FF; buffer >>= shift; bufferS -= 8; } - //printf("Post : %04x %i\n", buffer, bufferS); - //printf("--------------------------------\n"); } if (bufferS > 0) { @@ -116,6 +184,92 @@ uint8_t* foleo_base64_decode(uint8_t* b64, size_t *r) return ret; } +uint8_t* foleo_base64_encode(uint8_t* data, size_t dataS) +{ + uint8_t* ret = malloc(0); + size_t retS = 0; + uint16_t buffer = 0; + uint8_t bufferS = 0; + for (size_t i = 0; i < dataS; i++) + { + buffer = (buffer << 8) | data[i]; + bufferS += 8; + buffer = buffer << (16 - bufferS); + uint8_t c = foleo_base64_encode1(buffer >> 10); + bufferS -= 6; + buffer <<= 6; + buffer >>= 16 - bufferS; + ret = realloc(ret, retS + 1); + ret[retS++] = c; + } + switch (bufferS) + { + case 2: + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000000011) << 4); + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + break; + case 4: + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000001111) << 2); + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + break; + case 6: + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1(buffer); + break; + case 8: + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1(buffer >> 2); + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000000011) << 4); + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + break; + case 10: + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1(buffer >> 4); + ret = realloc(ret, retS + 1); + ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000001111) << 2); + ret = realloc(ret, retS + 1); + ret[retS++] = '='; + break; + } + ret = realloc(ret, retS + 1); + ret[retS++] = 0; + return ret; +} + +static uint8_t foleo_hex_encode1(uint8_t v) +{ + switch (v) + { + case 0: return '0'; + case 1: return '1'; + case 2: return '2'; + case 3: return '3'; + case 4: return '4'; + case 5: return '5'; + case 6: return '6'; + case 7: return '7'; + case 8: return '8'; + case 9: return '9'; + case 10: return 'a'; + case 11: return 'b'; + case 12: return 'c'; + case 13: return 'd'; + case 14: return 'e'; + case 15: return 'f'; + } + return 255; +} + static uint8_t foleo_hex_decode1(uint8_t v) { switch (v) @@ -164,4 +318,18 @@ uint8_t* foleo_hex_decode(uint8_t* hex) return ret; } +uint8_t* foleo_hex_encode(uint8_t* data, size_t dataS) +{ + uint8_t* ret = malloc(dataS * 2 + 1); + for (size_t i = 0; i < dataS; i++) + { + uint8_t cU = foleo_hex_encode1(data[i] >> 4); + uint8_t cL = foleo_hex_encode1(data[i] & 0xF); + ret[i * 2] = cU; + ret[i * 2 + 1] = cL; + } + ret[dataS * 2] = 0; + return ret; +} + #endif \ No newline at end of file diff --git a/src/headers.h b/src/headers.h index d799ed0..5aee984 100644 --- a/src/headers.h +++ b/src/headers.h @@ -56,5 +56,7 @@ void foleo_rand_mode(uint8_t, uint8_t*); uint8_t* foleo_base64_decode(uint8_t*, size_t*); uint8_t* foleo_hex_decode(uint8_t*); +uint8_t* foleo_hex_encode(uint8_t*, size_t); +uint8_t* foleo_base64_encode(uint8_t*, size_t); #endif -- 2.39.5