]> foleosoft.com Git - CryptoFoleo.git/commitdiff
Wed Jan 31 08:37:00 PM EST 2024
authormiha-q <>
Thu, 1 Feb 2024 01:37:00 +0000 (20:37 -0500)
committermiha-q <>
Thu, 1 Feb 2024 01:37:00 +0000 (20:37 -0500)
bin/CryptoFoleo.h
src/encodings.c
src/headers.h

index d799ed0626cbc66afcaebb02898d4128fbbe8880..5aee9841ef2b4f93caf2d08ee6e94adebff0ba04 100644 (file)
@@ -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
index d6833e273d58ae9527817c0a3786327c747bca13..2cb2c732380fd5d453861e992ff57f518a09f9e4 100644 (file)
@@ -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
index d799ed0626cbc66afcaebb02898d4128fbbe8880..5aee9841ef2b4f93caf2d08ee6e94adebff0ba04 100644 (file)
@@ -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