X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fhttp-ntlm.c;h=d9b688450618b796ef6c0b8d5469b1fdd5922a24;hp=591bfb514b9a1619b62a95da31ffac3a0a4ca46e;hb=38a7829dcb4eb5dba28dbf0f05c6a80fea9217f8;hpb=c19d76c02483f070beb688d6fe6f5fafb5674a08 diff --git a/src/http-ntlm.c b/src/http-ntlm.c index 591bfb51..d9b68845 100644 --- a/src/http-ntlm.c +++ b/src/http-ntlm.c @@ -73,42 +73,13 @@ as that of the covered work. */ /* Define this to make the type-3 message include the NT response message */ #define USE_NTRESPONSES 1 + /* Flag bits definitions available at on http://davenport.sourceforge.net/ntlm.html */ -#define NTLMFLAG_NEGOTIATE_UNICODE (1<<0) #define NTLMFLAG_NEGOTIATE_OEM (1<<1) -#define NTLMFLAG_REQUEST_TARGET (1<<2) -/* unknown (1<<3) */ -#define NTLMFLAG_NEGOTIATE_SIGN (1<<4) -#define NTLMFLAG_NEGOTIATE_SEAL (1<<5) -#define NTLMFLAG_NEGOTIATE_DATAGRAM_STYLE (1<<6) -#define NTLMFLAG_NEGOTIATE_LM_KEY (1<<7) -#define NTLMFLAG_NEGOTIATE_NETWARE (1<<8) #define NTLMFLAG_NEGOTIATE_NTLM_KEY (1<<9) -/* unknown (1<<10) */ -/* unknown (1<<11) */ -#define NTLMFLAG_NEGOTIATE_DOMAIN_SUPPLIED (1<<12) -#define NTLMFLAG_NEGOTIATE_WORKSTATION_SUPPLIED (1<<13) -#define NTLMFLAG_NEGOTIATE_LOCAL_CALL (1<<14) -#define NTLMFLAG_NEGOTIATE_ALWAYS_SIGN (1<<15) -#define NTLMFLAG_TARGET_TYPE_DOMAIN (1<<16) -#define NTLMFLAG_TARGET_TYPE_SERVER (1<<17) -#define NTLMFLAG_TARGET_TYPE_SHARE (1<<18) -#define NTLMFLAG_NEGOTIATE_NTLM2_KEY (1<<19) -#define NTLMFLAG_REQUEST_INIT_RESPONSE (1<<20) -#define NTLMFLAG_REQUEST_ACCEPT_RESPONSE (1<<21) -#define NTLMFLAG_REQUEST_NONNT_SESSION_KEY (1<<22) -#define NTLMFLAG_NEGOTIATE_TARGET_INFO (1<<23) -/* unknown (1<24) */ -/* unknown (1<25) */ -/* unknown (1<26) */ -/* unknown (1<27) */ -/* unknown (1<28) */ -#define NTLMFLAG_NEGOTIATE_128 (1<<29) -#define NTLMFLAG_NEGOTIATE_KEY_EXCHANGE (1<<30) -#define NTLMFLAG_NEGOTIATE_56 (1<<31) /* (*) = A "security buffer" is a triplet consisting of two shorts and one @@ -146,7 +117,7 @@ ntlm_input (struct ntlmdata *ntlm, const char *header) (40) Target Information (optional) security buffer(*) 32 (48) start of data block */ - int size; + ssize_t size; char *buffer = (char *) alloca (strlen (header)); DEBUGP (("Received a type-2 NTLM message.\n")); @@ -277,8 +248,7 @@ mkhash(const char *password, static const unsigned char magic[] = { 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 }; - int i; - int len = strlen(password); + size_t i, len = strlen(password); /* make it fit at least 14 bytes */ pw = (unsigned char *) alloca (len < 7 ? 14 : len * 2); @@ -287,7 +257,7 @@ mkhash(const char *password, len = 14; for (i=0; i> 8) +#define SHORTPAIR(x) (char) ((x) & 0xff), (char) ((x) >> 8) #define LONGQUARTET(x) ((x) & 0xff), (((x) >> 8)&0xff), \ (((x) >>16)&0xff), ((x)>>24) @@ -361,19 +331,19 @@ char * ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, bool *ready) { - const char *domain=""; /* empty */ - const char *host=""; /* empty */ - int domlen=strlen(domain); - int hostlen = strlen(host); - int hostoff; /* host name offset */ - int domoff; /* domain name offset */ - int size; + const char *domain = ""; /* empty */ + const char *host = ""; /* empty */ + size_t domlen = strlen(domain); + size_t hostlen = strlen(host); + size_t hostoff; /* host name offset */ + size_t domoff; /* domain name offset */ + size_t size; char *base64; char ntlmbuf[256]; /* enough, unless the host/domain is very long */ /* point to the address of the pointer that holds the string to sent to the server, which is for a plain host or for a HTTP proxy */ - char *output; + char *output = NULL; *ready = false; @@ -386,7 +356,8 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, switch(ntlm->state) { case NTLMSTATE_TYPE1: - default: /* for the weird cases we (re)start here */ + case NTLMSTATE_NONE: + case NTLMSTATE_LAST: hostoff = 32; domoff = hostoff + hostlen; @@ -464,15 +435,15 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, */ { - int lmrespoff; - int ntrespoff; - int useroff; + size_t lmrespoff; + size_t ntrespoff; + size_t useroff; unsigned char lmresp[0x18]; /* fixed-size */ #ifdef USE_NTRESPONSES unsigned char ntresp[0x18]; /* fixed-size */ #endif const char *usr; - int userlen; + size_t userlen; DEBUGP (("Creating a type-3 NTLM message.\n")); @@ -482,7 +453,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, if (usr) { domain = user; - domlen = usr - domain; + domlen = (size_t) (usr - domain); usr++; } else @@ -503,7 +474,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, /* Create the big type-3 message binary blob */ - size = snprintf (ntlmbuf, sizeof(ntlmbuf), + size = (size_t) snprintf (ntlmbuf, sizeof(ntlmbuf), "NTLMSSP%c" "\x03%c%c%c" /* type-3, 32 bits */ @@ -586,7 +557,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, /* Make sure that the user and domain strings fit in the target buffer before we copy them there. */ - if(((size_t) size + userlen + domlen) >= sizeof(ntlmbuf)) + if((size + userlen + domlen) >= sizeof(ntlmbuf)) return NULL; memcpy(&ntlmbuf[size], domain, domlen); @@ -596,20 +567,20 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, size += userlen; /* we append the binary hashes to the end of the blob */ - if(size < ((int)sizeof(ntlmbuf) - 0x18)) { + if(size < (sizeof(ntlmbuf) - 0x18)) { memcpy(&ntlmbuf[size], lmresp, 0x18); size += 0x18; } #ifdef USE_NTRESPONSES - if(size < ((int)sizeof(ntlmbuf) - 0x18)) { + if(size < (sizeof(ntlmbuf) - 0x18)) { memcpy(&ntlmbuf[size], ntresp, 0x18); size += 0x18; } #endif - ntlmbuf[56] = size & 0xff; - ntlmbuf[57] = size >> 8; + ntlmbuf[56] = (char) (size & 0xff); + ntlmbuf[57] = (char) (size >> 8); /* convert the binary blob into base64 */ base64 = (char *) alloca (BASE64_LENGTH (size) + 1);