00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "utils/base64.h"
00031
00032 #include <stdlib.h>
00033 #include <string.h>
00034
00035 static char base64_table[] =
00036 {
00037 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
00038 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
00039 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
00040 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
00041 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
00042 };
00043 static char base64_pad = '=';
00044
00045 unsigned char *php3_base64_encode(const unsigned char *string, int length, int *ret_length) {
00046 const unsigned char *current = string;
00047 int i = 0;
00048 unsigned char *result = (unsigned char *)malloc(((length + 3 - length % 3) * 4 / 3 + 1) * sizeof(char));
00049
00050 while (length > 2) {
00051 result[i++] = base64_table[current[0] >> 2];
00052 result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
00053 result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
00054 result[i++] = base64_table[current[2] & 0x3f];
00055
00056 current += 3;
00057 length -= 3;
00058 }
00059
00060
00061 if (length != 0) {
00062 result[i++] = base64_table[current[0] >> 2];
00063 if (length > 1) {
00064 result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
00065 result[i++] = base64_table[(current[1] & 0x0f) << 2];
00066 result[i++] = base64_pad;
00067 }
00068 else {
00069 result[i++] = base64_table[(current[0] & 0x03) << 4];
00070 result[i++] = base64_pad;
00071 result[i++] = base64_pad;
00072 }
00073 }
00074 if(ret_length) {
00075 *ret_length = i;
00076 }
00077 result[i] = '\0';
00078 return result;
00079 }
00080
00081
00082 unsigned char *php3_base64_decode(const unsigned char *string, int length, int *ret_length) {
00083 const unsigned char *current = string;
00084 int ch, i = 0, j = 0, k;
00085 char *chp;
00086
00087 unsigned char *result = (unsigned char *)malloc(length + 1);
00088
00089 if (result == NULL) {
00090 return NULL;
00091 }
00092
00093
00094 while ((ch = *current++) != '\0') {
00095 if (ch == base64_pad) break;
00096
00097
00098
00099
00100
00101
00102
00103
00104 if (ch == ' ') ch = '+';
00105
00106 chp = strchr(base64_table, ch);
00107 if (chp == NULL) continue;
00108 ch = chp - base64_table;
00109
00110 switch(i % 4) {
00111 case 0:
00112 result[j] = ch << 2;
00113 break;
00114 case 1:
00115 result[j++] |= ch >> 4;
00116 result[j] = (ch & 0x0f) << 4;
00117 break;
00118 case 2:
00119 result[j++] |= ch >>2;
00120 result[j] = (ch & 0x03) << 6;
00121 break;
00122 case 3:
00123 result[j++] |= ch;
00124 break;
00125 }
00126 i++;
00127 }
00128
00129 k = j;
00130
00131 if (ch == base64_pad) {
00132 switch(i % 4) {
00133 case 0:
00134 case 1:
00135 free(result);
00136 return NULL;
00137 case 2:
00138 k++;
00139 case 3:
00140 result[k++] = 0;
00141 }
00142 }
00143 if(ret_length) {
00144 *ret_length = j;
00145 }
00146 result[k] = '\0';
00147 return result;
00148 }