Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <errno.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <iconv.h>
- char base64decode_lut[] = {
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
- 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
- 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
- };
- static void base64decode(char *src, char *dest, int len)
- {
- int i = 0, slen = strlen(src);
- for (i = 0; i < slen && i < len; i += 4, src += 4) {
- char c1 = base64decode_lut[*(src + 0)],
- c2 = base64decode_lut[*(src + 1)],
- c3 = base64decode_lut[*(src + 2)],
- c4 = base64decode_lut[*(src + 3)];
- *(dest++) = (c1 & 0x3F) << 0x2 | (c2 & 0x30) >> 0x4;
- *(dest++) = (c3 != 64) ? ((c2 & 0xF) << 0x4 | (c3 & 0x3C) >> 0x2) : '\0';
- *(dest++) = (c4 != 64) ? ((c3 & 0x3) << 0x6 | c4 & 0x3F) : '\0';
- }
- *dest = '\0'; // Append terminator
- }
- static int b64_decode_string(char *source)
- {
- iconv_t handle;
- size_t dest_size;
- size_t utf_size;
- char *dest, *d;
- char *utf, *u;
- dest_size = strlen(source);
- d = dest = calloc(dest_size, sizeof(char));
- if (!dest)
- return -ENOMEM;
- base64decode(source, dest, dest_size);
- for (int j = 0; j < dest_size; j++)
- printf("%d: %x\n", j, *((unsigned char *)(dest + j)));
- printf("Decode: %s\n", dest);
- utf_size = dest_size * 4;
- u = utf = malloc(utf_size);
- if (!utf) {
- free(d);
- return -ENOMEM;
- }
- handle = iconv_open("UTF-8", "UTF-16LE");
- if (handle < 0)
- perror("Can't open translation");
- iconv(handle, &dest, &dest_size, &utf, &utf_size);
- iconv_close(handle);
- printf("Decode (UTF-8): %s\n", u);
- free(u);
- free(d);
- return 0;
- }
- int main()
- {
- return b64_decode_string("SABlAGwAbABvAA==");
- }
Add Comment
Please, Sign In to add comment