00001
00002
00003
00004 #include "define.h"
00005
00006
00007 static char base64_code_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/==";
00008
00009 void base64_append(char **ou, int *line_count, char data)
00010 {
00011 if (*line_count == 76) {
00012 *(*ou)++ = '\n';
00013 *line_count = 0;
00014 }
00015 *(*ou)++ = data;
00016 (*line_count)++;
00017 }
00018
00019
00020 char *base64_encode(void *data, size_t size)
00021 {
00022 int line_count = 0;
00023 return base64_encode_multiple(data, size, &line_count);
00024 }
00025
00026
00027 char *base64_encode_multiple(void *data, size_t size, int *line_count)
00028 {
00029 char *output;
00030 char *ou;
00031 unsigned char *p = (unsigned char *)data;
00032 unsigned char *dte = p + size;
00033
00034 if (data == NULL || size == 0) return NULL;
00035
00036 ou = output = (char *)malloc(size / 3 * 4 + (size / 57) + 6);
00037 if (!output) return NULL;
00038
00039 while((dte-p) >= 3) {
00040 unsigned char x = p[0];
00041 unsigned char y = p[1];
00042 unsigned char z = p[2];
00043 base64_append(&ou, line_count, base64_code_chars[ x >> 2 ]);
00044 base64_append(&ou, line_count, base64_code_chars[ ((x & 0x03) << 4) | (y >> 4) ]);
00045 base64_append(&ou, line_count, base64_code_chars[ ((y & 0x0F) << 2) | (z >> 6) ]);
00046 base64_append(&ou, line_count, base64_code_chars[ z & 0x3F ]);
00047 p+=3;
00048 };
00049 if ((dte-p) == 2) {
00050 base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00051 base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) | (p[1] >> 4) ]);
00052 base64_append(&ou, line_count, base64_code_chars[ ((p[1] & 0x0F) << 2) ]);
00053 base64_append(&ou, line_count, '=');
00054 } else if ((dte-p) == 1) {
00055 base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00056 base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) ]);
00057 base64_append(&ou, line_count, '=');
00058 base64_append(&ou, line_count, '=');
00059 };
00060
00061 *ou=0;
00062 return output;
00063 };
00064
00065
00066 void hexdump(char *hbuf, int start, int stop, int ascii)
00067 {
00068 char c;
00069 int diff,i;
00070
00071 while (start < stop ) {
00072 diff = stop - start;
00073 if (diff > 16) diff = 16;
00074
00075 fprintf(stderr, ":%08X ",start);
00076
00077 for (i = 0; i < diff; i++) {
00078 if( 8 == i ) fprintf( stderr, " " );
00079 fprintf(stderr, "%02X ",(unsigned char)*(hbuf+start+i));
00080 }
00081 if (ascii) {
00082 for (i = diff; i < 16; i++) fprintf(stderr, " ");
00083 for (i = 0; i < diff; i++) {
00084 c = *(hbuf+start+i);
00085 fprintf(stderr, "%c", isprint(c) ? c : '.');
00086 }
00087 }
00088 fprintf(stderr, "\n");
00089 start += 16;
00090 }
00091 }