From: Michael Tremer Date: Sat, 21 Jun 2025 12:59:17 +0000 (+0000) Subject: base64: Add function to normalize non-standard base64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8905a995f4a836a45019083e85c91ba064684ed;p=pakfire.git base64: Add function to normalize non-standard base64 Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/base64.c b/src/pakfire/base64.c index 9c018cd6..c0af7b96 100644 --- a/src/pakfire/base64.c +++ b/src/pakfire/base64.c @@ -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; +} diff --git a/src/pakfire/base64.h b/src/pakfire/base64.h index 8e9306ac..21fe7c24 100644 --- a/src/pakfire/base64.h +++ b/src/pakfire/base64.h @@ -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 */