diff options
-rw-r--r-- | lib/http_ntlm.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c index d1f2edd45..47b7a75f4 100644 --- a/lib/http_ntlm.c +++ b/lib/http_ntlm.c @@ -658,6 +658,18 @@ ntlm_sspi_cleanup(struct ntlmdata *ntlm) #define HOSTNAME_MAX 1024 +/* copy the source to the destination and fill in zeroes in every + other destination byte! */ +static void unicodecpy(unsigned char *dest, + const char *src, size_t length) +{ + size_t i; + for(i=0; i<length; i++) { + dest[2*i] = (unsigned char)src[i]; + dest[2*i+1] = '\0'; + } +} + /* this is for creating ntlm header output */ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy) @@ -972,6 +984,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, int ntrespoff; unsigned char ntresp[24]; /* fixed-size */ #endif + bool unicode = ntlm->flags & NTLMFLAG_NEGOTIATE_UNICODE; size_t useroff; const char *user; size_t userlen; @@ -1004,6 +1017,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, hostlen = strlen(host); } + if(unicode) { + domlen = domlen * 2; + userlen = userlen * 2; + hostlen = hostlen * 2; + } + #if USE_NTLM2SESSION /* We don't support NTLM2 if we don't have USE_NTRESPONSES */ if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) { @@ -1093,13 +1112,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, useroff = domoff + domlen; hostoff = useroff + userlen; - /* - * In the case the server sets the flag NTLMFLAG_NEGOTIATE_UNICODE, we - * need to filter it off because libcurl doesn't UNICODE encode the - * strings it packs into the NTLM authenticate packet. - */ - ntlm->flags &= ~NTLMFLAG_NEGOTIATE_UNICODE; - /* Create the big type-3 message binary blob */ size = snprintf((char *)ntlmbuf, sizeof(ntlmbuf), NTLMSSP_SIGNATURE "%c" @@ -1227,15 +1239,27 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, } DEBUGASSERT(size == domoff); - memcpy(&ntlmbuf[size], domain, domlen); + if(unicode) + unicodecpy(&ntlmbuf[size], domain, domlen/2); + else + memcpy(&ntlmbuf[size], domain, domlen); + size += domlen; DEBUGASSERT(size == useroff); - memcpy(&ntlmbuf[size], user, userlen); + if(unicode) + unicodecpy(&ntlmbuf[size], user, userlen/2); + else + memcpy(&ntlmbuf[size], user, userlen); + size += userlen; DEBUGASSERT(size == hostoff); - memcpy(&ntlmbuf[size], host, hostlen); + if(unicode) + unicodecpy(&ntlmbuf[size], host, hostlen/2); + else + memcpy(&ntlmbuf[size], host, hostlen); + size += hostlen; /* convert domain, user, and host to ASCII but leave the rest as-is */ |