--- ppp-2.4.3/pppd/plugins/winbind.c.orig 2005-05-12 14:18:10.000000000 -0700 +++ ppp-2.4.3/pppd/plugins/winbind.c 2005-05-12 14:37:59.000000000 -0700 @@ -200,50 +200,41 @@ return num_chars; } -static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char *codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * Encode a base64 string into a malloc()ed string caller to free. - * - *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments **/ char * base64_encode(const char *data) { - int bits = 0; - int char_count = 0; - size_t out_cnt = 0; - size_t len = strlen(data); - size_t output_len = strlen(data) * 2; - char *result = malloc(output_len); /* get us plenty of space */ - - while (len-- && out_cnt < (output_len) - 5) { - int c = (unsigned char) *(data++); - bits += c; - char_count++; - if (char_count == 3) { - result[out_cnt++] = b64[bits >> 18]; - result[out_cnt++] = b64[(bits >> 12) & 0x3f]; - result[out_cnt++] = b64[(bits >> 6) & 0x3f]; - result[out_cnt++] = b64[bits & 0x3f]; - bits = 0; - char_count = 0; - } else { - bits <<= 8; - } + int i; + size_t len = strlen(data); + size_t leven = 3*(len / 3); + size_t output_len = 4 * ((len + 2) / 3) + 1; + char *p, *result = malloc(output_len); /* get us plenty of space */ + const char *in; + p = result; + in = data; + for (i = 0; i < leven; i += 3) + { + *p++ = codes[(in[0] >> 2) & 0x3F]; + *p++ = codes[(((in[0] & 3) << 4) + (in[1] >> 4)) & 0x3F]; + *p++ = codes[(((in[1] & 0xf) << 2) + (in[2] >> 6)) & 0x3F]; + *p++ = codes[in[2] & 0x3F]; + in += 3; } - if (char_count != 0) { - bits <<= 16 - (8 * char_count); - result[out_cnt++] = b64[bits >> 18]; - result[out_cnt++] = b64[(bits >> 12) & 0x3f]; - if (char_count == 1) { - result[out_cnt++] = '='; - result[out_cnt++] = '='; - } else { - result[out_cnt++] = b64[(bits >> 6) & 0x3f]; - result[out_cnt++] = '='; - } + /* Pad it if necessary... */ + if (i < len) + { + unsigned a = in[0]; + unsigned b = (i+1 < len) ? in[1] : 0; + *p++ = codes[(a >> 2) & 0x3F]; + *p++ = codes[(((a & 3) << 4) + (b >> 4)) & 0x3F]; + *p++ = (i+1 < len) ? codes[(((b & 0xf) << 2)) & 0x3F] : '='; + *p++ = '='; } - result[out_cnt] = '\0'; /* terminate */ + /* append a NULL byte */ + *p = '\0'; return result; }