aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/http_ntlm.c44
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 */