X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fhttp-ntlm.c;h=591bfb514b9a1619b62a95da31ffac3a0a4ca46e;hp=054c8a95939a18b3fced17d09d87cd279de28a20;hb=320cfdcb658e8d6556ae9dfd902c2db1db866a6b;hpb=6633b74930870ffb148c46129c738af78082d934 diff --git a/src/http-ntlm.c b/src/http-ntlm.c index 054c8a95..591bfb51 100644 --- a/src/http-ntlm.c +++ b/src/http-ntlm.c @@ -1,5 +1,6 @@ /* NTLM code. - Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software + Foundation, Inc. Contributed by Daniel Stenberg. This file is part of GNU Wget. @@ -17,20 +18,21 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wget. If not, see . -In addition, as a special exception, the Free Software Foundation -gives permission to link the code of its release of Wget with the -OpenSSL project's "OpenSSL" library (or with modified versions of it -that use the same license as the "OpenSSL" library), and distribute -the linked executables. You must obey the GNU General Public License -in all respects for all of the code used other than "OpenSSL". If you -modify this file, you may extend this exception to your version of the -file, but you are not obligated to do so. If you do not wish to do -so, delete this exception statement from your version. */ +Additional permission under GNU GPL version 3 section 7 -#include +If you modify this program, or any covered work, by linking or +combining it with the OpenSSL project's OpenSSL library (or a +modified version of that library), containing parts covered by the +terms of the OpenSSL or SSLeay licenses, the Free Software Foundation +grants you additional permission to convey the resulting work. +Corresponding Source for a non-source form of such a combination +shall include the source code for the parts of OpenSSL used as well +as that of the covered work. */ + +#include "wget.h" /* NTLM details: - + http://davenport.sourceforge.net/ntlm.html http://www.innovation.ch/java/ntlm.html @@ -40,27 +42,33 @@ so, delete this exception statement from your version. */ #include #include -#include -#include - -#include "wget.h" #include "utils.h" #include "http-ntlm.h" -#if OPENSSL_VERSION_NUMBER < 0x00907001L -#define DES_key_schedule des_key_schedule -#define DES_cblock des_cblock -#define DES_set_odd_parity des_set_odd_parity -#define DES_set_key des_set_key -#define DES_ecb_encrypt des_ecb_encrypt +#ifdef HAVE_NETTLE +# include +# include +#else +# include +# include +# include + +# if OPENSSL_VERSION_NUMBER < 0x00907001L +# define DES_key_schedule des_key_schedule +# define DES_cblock des_cblock +# define DES_set_odd_parity des_set_odd_parity +# define DES_set_key des_set_key +# define DES_ecb_encrypt des_ecb_encrypt /* This is how things were done in the old days */ -#define DESKEY(x) x -#define DESKEYARG(x) x -#else +# define DESKEY(x) x +# define DESKEYARG(x) x +# else /* Modern version */ -#define DESKEYARG(x) *x -#define DESKEY(x) &x +# define DESKEYARG(x) *x +# define DESKEY(x) &x +# endif + #endif /* Define this to make the type-3 message include the NT response message */ @@ -120,7 +128,7 @@ ntlm_input (struct ntlmdata *ntlm, const char *header) return false; header += 4; - while (*header && ISSPACE(*header)) + while (*header && c_isspace(*header)) header++; if (*header) @@ -174,6 +182,25 @@ ntlm_input (struct ntlmdata *ntlm, const char *header) * Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The * key schedule ks is also set. */ +#ifdef HAVE_NETTLE +static void +setup_des_key(unsigned char *key_56, + struct des_ctx *des) +{ + unsigned char key[8]; + + key[0] = key_56[0]; + key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); + key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); + key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); + key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); + key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); + key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); + key[7] = (key_56[6] << 1) & 0xFF; + + nettle_des_set_key(des, key); +} +#else static void setup_des_key(unsigned char *key_56, DES_key_schedule DESKEYARG(ks)) @@ -192,6 +219,7 @@ setup_des_key(unsigned char *key_56, DES_set_odd_parity(&key); DES_set_key(&key, ks); } +#endif /* * takes a 21 byte array and treats it as 3 56-bit DES keys. The @@ -201,6 +229,18 @@ setup_des_key(unsigned char *key_56, static void calc_resp(unsigned char *keys, unsigned char *plaintext, unsigned char *results) { +#ifdef HAVE_NETTLE + struct des_ctx des; + + setup_des_key(keys, &des); + nettle_des_encrypt(&des, 8, results, plaintext); + + setup_des_key(keys + 7, &des); + nettle_des_encrypt(&des, 8, results + 8, plaintext); + + setup_des_key(keys + 14, &des); + nettle_des_encrypt(&des, 8, results + 16, plaintext); +#else DES_key_schedule ks; setup_des_key(keys, DESKEY(ks)); @@ -214,6 +254,7 @@ calc_resp(unsigned char *keys, unsigned char *plaintext, unsigned char *results) setup_des_key(keys+14, DESKEY(ks)); DES_ecb_encrypt((DES_cblock*) plaintext, (DES_cblock*) (results+16), DESKEY(ks), DES_ENCRYPT); +#endif } /* @@ -244,24 +285,34 @@ mkhash(const char *password, if (len > 14) len = 14; - + for (i=0; istate) { case NTLMSTATE_TYPE1: default: /* for the weird cases we (re)start here */ @@ -330,7 +391,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, domoff = hostoff + hostlen; DEBUGP (("Creating a type-1 NTLM message.\n")); - + /* Create and send a type-1 message: Index Description Content @@ -383,7 +444,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, output = concat_strings ("NTLM ", base64, (char *) 0); break; - + case NTLMSTATE_TYPE2: /* We received the type-2 already, create a type-3 message: @@ -401,7 +462,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, 52 (64) start of data block */ - + { int lmrespoff; int ntrespoff; @@ -459,20 +520,20 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, "%c%c" /* domain allocated space */ "%c%c" /* domain name offset */ "%c%c" /* 2 zeroes */ - + "%c%c" /* user length */ "%c%c" /* user allocated space */ "%c%c" /* user offset */ "%c%c" /* 2 zeroes */ - + "%c%c" /* host length */ "%c%c" /* host allocated space */ "%c%c" /* host offset */ "%c%c%c%c%c%c" /* 6 zeroes */ - + "\xff\xff" /* message length */ "%c%c" /* 2 zeroes */ - + "\x01\x82" /* flags */ "%c%c" /* 2 zeroes */ @@ -525,9 +586,9 @@ 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 + userlen + domlen >= sizeof(ntlmbuf)) + if(((size_t) size + userlen + domlen) >= sizeof(ntlmbuf)) return NULL; - + memcpy(&ntlmbuf[size], domain, domlen); size += domlen; @@ -541,7 +602,7 @@ ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd, } #ifdef USE_NTRESPONSES - if(size < ((int)sizeof(ntlmbuf) - 0x18)) { + if(size < ((int)sizeof(ntlmbuf) - 0x18)) { memcpy(&ntlmbuf[size], ntresp, 0x18); size += 0x18; }