diff -ruX exclude curl-7.16.1-20061221/lib/base64.c curlinux/lib/base64.c --- curl-7.16.1-20061221/lib/base64.c 2006-10-17 22:00:36.000000000 -0400 +++ curlinux/lib/base64.c 2006-12-29 23:39:58.000000000 -0500 @@ -40,28 +40,27 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include +#include "urldata.h" /* for the SessionHandle definition */ +#include "easyif.h" /* for Curl_convert_... prototypes */ #include "base64.h" #include "memory.h" /* include memdebug.h last */ #include "memdebug.h" +/* ---- Base64 Encoding/Decoding Table --- */ +static const char table64[]= + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static void decodeQuantum(unsigned char *dest, const char *src) { unsigned int x = 0; int i; + char *found; + for(i = 0; i < 4; i++) { - if(src[i] >= 'A' && src[i] <= 'Z') - x = (x << 6) + (unsigned int)(src[i] - 'A' + 0); - else if(src[i] >= 'a' && src[i] <= 'z') - x = (x << 6) + (unsigned int)(src[i] - 'a' + 26); - else if(src[i] >= '0' && src[i] <= '9') - x = (x << 6) + (unsigned int)(src[i] - '0' + 52); - else if(src[i] == '+') - x = (x << 6) + 62; - else if(src[i] == '/') - x = (x << 6) + 63; + if((found = strchr(table64, src[i]))) + x = (x << 6) + (unsigned int)(found - table64); else if(src[i] == '=') x = (x << 6); } @@ -133,10 +132,6 @@ return rawlen; } -/* ---- Base64 Encoding --- */ -static const char table64[]= - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - /* * Curl_base64_encode() * @@ -145,7 +140,8 @@ * went wrong, -1 is returned. * */ -size_t Curl_base64_encode(const char *inp, size_t insize, char **outptr) +size_t Curl_base64_encode(struct SessionHandle *data, + const char *inp, size_t insize, char **outptr) { unsigned char ibuf[3]; unsigned char obuf[4]; @@ -153,6 +149,9 @@ int inputparts; char *output; char *base64data; +#ifdef CURL_DOES_CONVERSIONS + char *convbuf; +#endif char *indata = (char *)inp; @@ -165,6 +164,26 @@ if(NULL == output) return 0; +#ifdef CURL_DOES_CONVERSIONS + /* + * The base64 data needs to be created using the network encoding + * not the host encoding. And we can't change the actual input + * so we copy it to a buffer, translate it, and use that instead. + */ + if(data) { + convbuf = (char*)malloc(insize); + if(!convbuf) { + return 0; + } + memcpy(convbuf, indata, insize); + if(CURLE_OK != Curl_convert_to_network(data, convbuf, insize)) { + free(convbuf); + return 0; + } + indata = convbuf; /* switch to the converted buffer */ + } +#endif + while(insize > 0) { for (i = inputparts = 0; i < 3; i++) { if(insize > 0) { @@ -209,6 +228,10 @@ *output=0; *outptr = base64data; /* make it return the actual data memory */ +#ifdef CURL_DOES_CONVERSIONS + if(data) + free(convbuf); +#endif return strlen(base64data); /* return the length of the new data */ } /* ---- End of Base64 Encoding ---- */ @@ -231,14 +254,26 @@ size_t base64Len; unsigned char *data; int dataLen; + struct SessionHandle *handle = NULL; +#ifdef CURL_DOES_CONVERSIONS + /* get a Curl handle so Curl_base64_encode can translate properly */ + handle = curl_easy_init(); + if(handle == NULL) { + fprintf(stderr, "Error: curl_easy_init failed\n"); + return 0; + } +#endif data = (unsigned char *)suck(&dataLen); - base64Len = Curl_base64_encode(data, dataLen, &base64); + base64Len = Curl_base64_encode(handle, data, dataLen, &base64); fprintf(stderr, "%d\n", base64Len); - fprintf(stdout, "%s", base64); + fprintf(stdout, "%s\n", base64); free(base64); free(data); +#ifdef CURL_DOES_CONVERSIONS + curl_easy_cleanup(handle); +#endif return 0; } #endif @@ -261,10 +296,17 @@ unsigned char *data; int dataLen; int i, j; +#ifdef CURL_DOES_CONVERSIONS + /* get a Curl handle so main can translate properly */ + struct SessionHandle *handle = curl_easy_init(); + if(handle == NULL) { + fprintf(stderr, "Error: curl_easy_init failed\n"); + return 0; + } +#endif base64 = (char *)suck(&base64Len); - data = (unsigned char *)malloc(base64Len * 3/4 + 8); - dataLen = Curl_base64_decode(base64, data); + dataLen = Curl_base64_decode(base64, &data); fprintf(stderr, "%d\n", dataLen); @@ -279,13 +321,21 @@ printf(" | "); for(j=0; j < 0x10; j++) - if((j+i) < dataLen) + if((j+i) < dataLen) { +#ifdef CURL_DOES_CONVERSIONS + if(CURLE_OK != + Curl_convert_from_network(handle, &data[i+j], (size_t)1)) + data[i+j] = '.'; +#endif /* CURL_DOES_CONVERSIONS */ printf("%c", ISGRAPH(data[i+j])?data[i+j]:'.'); - else + } else break; puts(""); } +#ifdef CURL_DOES_CONVERSIONS + curl_easy_cleanup(handle); +#endif free(base64); free(data); return 0; } diff -ruX exclude curl-7.16.1-20061221/lib/base64.h curlinux/lib/base64.h --- curl-7.16.1-20061221/lib/base64.h 2005-03-31 21:00:05.000000000 -0500 +++ curlinux/lib/base64.h 2006-12-29 23:39:58.000000000 -0500 @@ -22,6 +22,7 @@ * * $Id: base64.h,v 1.17 2005/03/31 07:02:03 bagder Exp $ ***************************************************************************/ -size_t Curl_base64_encode(const char *input, size_t size, char **str); +size_t Curl_base64_encode(struct SessionHandle *data, + const char *input, size_t size, char **str); size_t Curl_base64_decode(const char *source, unsigned char **outptr); #endif diff -ruX exclude curl-7.16.1-20061221/lib/http.c curlinux/lib/http.c --- curl-7.16.1-20061221/lib/http.c 2006-12-15 22:00:12.000000000 -0500 +++ curlinux/lib/http.c 2006-12-29 23:39:58.000000000 -0500 @@ -149,7 +149,7 @@ } snprintf(data->state.buffer, sizeof(data->state.buffer), "%s:%s", user, pwd); - if(Curl_base64_encode(data->state.buffer, + if(Curl_base64_encode(data, data->state.buffer, strlen(data->state.buffer), &authorization) > 0) { if(*userp) diff -ruX exclude curl-7.16.1-20061221/lib/http_digest.c curlinux/lib/http_digest.c --- curl-7.16.1-20061221/lib/http_digest.c 2006-10-17 22:00:37.000000000 -0400 +++ curlinux/lib/http_digest.c 2006-12-29 23:39:58.000000000 -0500 @@ -270,7 +270,7 @@ /* Generate a cnonce */ now = Curl_tvnow(); snprintf(cnoncebuf, sizeof(cnoncebuf), "%06ld", now.tv_sec); - if(Curl_base64_encode(cnoncebuf, strlen(cnoncebuf), &cnonce)) + if(Curl_base64_encode(data, cnoncebuf, strlen(cnoncebuf), &cnonce)) d->cnonce = cnonce; else return CURLE_OUT_OF_MEMORY; diff -ruX exclude curl-7.16.1-20061221/lib/http_negotiate.c curlinux/lib/http_negotiate.c --- curl-7.16.1-20061221/lib/http_negotiate.c 2006-10-17 22:00:37.000000000 -0400 +++ curlinux/lib/http_negotiate.c 2006-12-29 23:39:58.000000000 -0500 @@ -290,7 +290,8 @@ } } #endif - len = Curl_base64_encode(neg_ctx->output_token.value, + len = Curl_base64_encode(conn->data, + neg_ctx->output_token.value, neg_ctx->output_token.length, &encoded); diff -ruX exclude curl-7.16.1-20061221/lib/http_ntlm.c curlinux/lib/http_ntlm.c --- curl-7.16.1-20061221/lib/http_ntlm.c 2006-11-01 22:00:16.000000000 -0500 +++ curlinux/lib/http_ntlm.c 2006-12-29 23:39:58.000000000 -0500 @@ -706,7 +706,7 @@ }); /* now size is the size of the base64 encoded package size */ - size = Curl_base64_encode((char *)ntlmbuf, size, &base64); + size = Curl_base64_encode(conn->data, (char *)ntlmbuf, size, &base64); if(size >0 ) { Curl_safefree(*allocuserpwd); @@ -1017,7 +1017,7 @@ #endif /* convert the binary blob into base64 */ - size = Curl_base64_encode((char *)ntlmbuf, size, &base64); + size = Curl_base64_encode(conn->data, (char *)ntlmbuf, size, &base64); if(size >0 ) { Curl_safefree(*allocuserpwd); diff -ruX exclude curl-7.16.1-20061221/lib/krb4.c curlinux/lib/krb4.c --- curl-7.16.1-20061221/lib/krb4.c 2006-01-26 22:00:14.000000000 -0500 +++ curlinux/lib/krb4.c 2006-12-29 23:39:58.000000000 -0500 @@ -252,7 +252,7 @@ } #endif - if(Curl_base64_encode((char *)adat.dat, adat.length, &p) < 1) { + if(Curl_base64_encode(conn->data, (char *)adat.dat, adat.length, &p) < 1) { Curl_failf(data, "Out of memory base64-encoding"); return AUTH_CONTINUE; } @@ -400,7 +400,8 @@ memset(key, 0, sizeof(key)); memset(schedule, 0, sizeof(schedule)); memset(passwd, 0, sizeof(passwd)); - if(Curl_base64_encode((char *)tktcopy.dat, tktcopy.length, &p) < 1) { + if(Curl_base64_encode(conn->data, (char *)tktcopy.dat, tktcopy.length, &p) + < 1) { failf(conn->data, "Out of memory base64-encoding."); Curl_set_command_prot(conn, save); return CURLE_OUT_OF_MEMORY; diff -ruX exclude curl-7.16.1-20061221/lib/ldap.c curlinux/lib/ldap.c --- curl-7.16.1-20061221/lib/ldap.c 2006-10-29 22:00:25.000000000 -0500 +++ curlinux/lib/ldap.c 2006-12-29 23:39:58.000000000 -0500 @@ -402,7 +402,9 @@ (char *)attribute + (strlen((char *)attribute) - 7)) == 0)) { /* Binary attribute, encode to base64. */ - val_b64_sz = Curl_base64_encode(vals[i]->bv_val, vals[i]->bv_len, + val_b64_sz = Curl_base64_encode(conn->data, + vals[i]->bv_val, + vals[i]->bv_len, &val_b64); if (val_b64_sz > 0) { Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, val_b64_sz);