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;
+}
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 */