#include #include static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int base64_decode(const char *b64message, unsigned char **buffer, size_t *length) { size_t b64len = strlen(b64message); size_t declen = (b64len * 3) / 4; // Maximum possible decoded length *buffer = (unsigned char *)malloc(declen); *length = 0; int padding = 0; if (b64message[b64len - 1] == '=') padding++; if (b64message[b64len - 2] == '=') padding++; int i, j; unsigned char sextet_a, sextet_b, sextet_c, sextet_d; unsigned char triple[3]; for (i = 0, j = 0; i < b64len; i += 4) { sextet_a = strchr(base64_chars, b64message[i]) - base64_chars; sextet_b = strchr(base64_chars, b64message[i + 1]) - base64_chars; sextet_c = strchr(base64_chars, b64message[i + 2]) - base64_chars; sextet_d = strchr(base64_chars, b64message[i + 3]) - base64_chars; triple[0] = (sextet_a << 2) | (sextet_b >> 4); triple[1] = (sextet_b << 4) | (sextet_c >> 2); triple[2] = (sextet_c << 6) | sextet_d; if (j < declen) (*buffer)[j++] = triple[0]; if (j < declen) (*buffer)[j++] = triple[1]; if (j < declen) (*buffer)[j++] = triple[2]; } *length = j - padding; return 1; } int main() { const char *b64message = "SGVsbG8gV29ybGQh"; unsigned char *buffer = NULL; size_t length = 0; if (base64_decode(b64message, &buffer, &length)) { printf("Decoded message: %.*s\n", (int)length, buffer); free(buffer); return 0; } else { printf("Failed to decode Base64 message\n"); return 1; } }