Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. #include <stdlib.h> /* exit */
  2. #include <unistd.h> /* read, write, close */
  3. #include <string.h> /* memcpy, memset */
  4. #include <sys/socket.h> /* socket, connect */
  5. #include <netinet/in.h> /* struct sockaddr_in, struct sockaddr */
  6. #include <netdb.h> /* struct hostent, gethostbyname */
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <unistd.h>
  10.  
  11.  
  12. #include <stdint.h>
  13. #include <stdlib.h>
  14.  
  15.  
  16. static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  17. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  18. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  19. 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  20. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  21. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  22. 'w', 'x', 'y', 'z', '0', '1', '2', '3',
  23. '4', '5', '6', '7', '8', '9', '+', '/'};
  24. static char *decoding_table = NULL;
  25. static int mod_table[] = {0, 2, 1};
  26.  
  27. void build_decoding_table() {
  28.  
  29. decoding_table = malloc(256);
  30.  
  31. for (int i = 0; i < 64; i++)
  32. decoding_table[(unsigned char) encoding_table[i]] = i;
  33. }
  34.  
  35.  
  36. void base64_cleanup() {
  37. free(decoding_table);
  38. }
  39.  
  40. unsigned char *base64_decode(const char *data,
  41. size_t input_length,
  42. size_t *output_length) {
  43.  
  44. if (decoding_table == NULL) build_decoding_table();
  45.  
  46. if (input_length % 4 != 0) return NULL;
  47.  
  48. *output_length = input_length / 4 * 3;
  49. if (data[input_length - 1] == '=') (*output_length)--;
  50. if (data[input_length - 2] == '=') (*output_length)--;
  51.  
  52. unsigned char *decoded_data = malloc(*output_length);
  53. if (decoded_data == NULL) return NULL;
  54.  
  55. for (int i = 0, j = 0; i < input_length;) {
  56.  
  57. uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  58. uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  59. uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  60. uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]];
  61.  
  62. uint32_t triple = (sextet_a << 3 * 6)
  63. + (sextet_b << 2 * 6)
  64. + (sextet_c << 1 * 6)
  65. + (sextet_d << 0 * 6);
  66.  
  67. if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
  68. if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
  69. if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
  70. }
  71.  
  72. return decoded_data;
  73. }
  74.  
  75.  
  76. #define CHUNK 512 /* read 1024 bytes at a time */
  77.  
  78. void main(int argc, char *argv[]) {
  79.  
  80. char buffer2[1024];
  81. strcpy(buffer2,argv[1]);
  82.  
  83. char buffer[CHUNK];
  84. size_t ret;
  85. int len = strlen(argv[2]);
  86. char *decoded = base64_decode(argv[2],len,&ret);
  87. printf("%s",decoded);
  88.  
  89. printf("Done!\n");
  90.  
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement