]> git.ipfire.org Git - pakfire.git/commitdiff
base64: Add function to normalize non-standard base64
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 12:59:17 +0000 (12:59 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 12:59:17 +0000 (12:59 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/base64.c
src/pakfire/base64.h

index 9c018cd69cf9b534a5b1ce00e6c77fa58b76357e..c0af7b9674254af5a388288f342a976d016feb61 100644 (file)
@@ -117,3 +117,47 @@ ERROR:
 
        return r;
 }
+
+int pakfire_b64normalize(char** output, const char* input, ssize_t length) {
+       char* buffer = NULL;
+
+       // Automatically determine input length
+       if (length < 0)
+               length = strlen(input);
+
+       // Compute length of required padding
+       size_t padding = (4 - (length % 4)) % 4;
+
+       // Allocate a buffer
+       buffer = malloc(length + padding + 1);
+       if (!buffer)
+               return -errno;
+
+       // Copy and translate to standard base64
+       for (ssize_t i = 0; i < length; i++) {
+               switch (input[i]) {
+                       case '-':
+                               buffer[i] = '+';
+                               break;
+
+                       case '/':
+                               buffer[i] = '/';
+                               break;
+
+                       default:
+                               buffer[i] = input[i];
+                               break;
+               }
+       }
+
+       // Add the padding
+       for (size_t i = 0; i < padding; i++)
+               buffer[length + i] = '=';
+
+       // Terminate the buffer
+       buffer[length + padding] = '\0';
+
+       // Return the buffer
+       *output = buffer;
+       return 0;
+}
index 8e9306ac6314c08d54050db3f936ab713395ad2a..21fe7c2484e318362c54116cf99a54232a87aa9e 100644 (file)
@@ -28,4 +28,6 @@ int pakfire_b64encode(char** output, const unsigned char* input, const size_t le
 
 int pakfire_b64decode(unsigned char** output, size_t* length, const char* input, ssize_t l);
 
+int pakfire_b64normalize(char** output, const char* input, ssize_t length);
+
 #endif /* PAKFIRE_BASE64_H */