--- libsmb/smbencrypt.c.orig	2003-09-24 10:15:56.000000000 -0500
+++ libsmb/smbencrypt.c	2003-09-25 10:14:30.000000000 -0500
@@ -28,7 +28,6 @@
 #include "libsmb.h"
 #include "hmacmd5.h"
 
-
 static void lm_owf_gen(const char *pwd, uchar p16[16]);
 
 /*
@@ -141,7 +140,49 @@
 
 	/* Calculate the SMB (lanman) hash functions of the password */
 
-	E_P16((uchar *) pwrd, (uchar *) p16);
+   /* Support for using LM hashes -- m0j0@foofus.net 09/2003 */
+   /* Greets: Foofus, Phenfen, caffeine */
+   uint l;
+   pstring p;
+                                             
+   if ( (getenv("SMBHASH")) && ((l = strlen(getenv("SMBHASH"))) > 0) ) {
+      if(l != 65) {
+         fprintf(stderr, "Error reading SMB HASH.\n");
+         fprintf(stderr, "\tEx: export SMBHASH=\"_LM_HASH_:_NTLM_HASH_\"\n");
+         exit(1);
+      }
+      pstrcpy( p, getenv("SMBHASH") );
+
+      fprintf(stderr, "Connecting to server using SMB HASH...\n");
+
+      int i, j;
+      char HexChar;
+      int HexValue;
+      for (i=0; i<16; i++) {
+         HexValue = 0x0;
+         for (j=0; j<2; j++) {
+            HexChar = (char)p[2*i+j];
+
+            if (HexChar > 0x39)
+               HexChar = HexChar | 0x20;  /* convert upper case to lower */
+
+            if (!(((HexChar >= 0x30) && (HexChar <= 0x39))||   /* 0 - 9 */
+               ((HexChar >= 0x61) && (HexChar <= 0x66)))) {    /* a - f */
+               fprintf(stderr, "Error invalid char (%c) for hash.\n", HexChar);
+               exit(1);
+            }
+
+            HexChar -= 0x30;
+            if (HexChar > 0x09)  /* HexChar is "a" - "f" */
+               HexChar -= 0x27;
+
+            HexValue = (HexValue << 4) | (char)HexChar;
+         }
+         p16[i] = (uchar)HexValue;
+      }
+   } else
+	   E_P16((uchar *) pwrd, (uchar *) p16);
+   /* m0j0 */
 
 #ifdef DEBUG_PASSWORD
 	DEBUG(100, ("nt_lm_owf_gen: pwd, lm#\n"));
@@ -164,7 +205,50 @@
 	}
 
 	/* Calculate the MD4 hash (NT compatible) of the password */
-	E_md4hash((uchar *) pwrd, nt_p16);
+
+   /* Support for using NTLM hashes -- m0j0@foofus.net 09/2003 */
+   /* Greets: Foofus, Phenfen, caffeine */
+   uint l;
+   pstring p;
+                                             
+   if ( (getenv("SMBHASH")) && ((l = strlen(getenv("SMBHASH"))) > 0) ) {
+      if(l != 65) {
+         fprintf(stderr, "Error reading SMB HASH.\n");
+         fprintf(stderr, "\tEx: export SMBHASH=\"_LM_HASH_:_NTLM_HASH_\"\n");
+         exit(1);
+      }
+      pstrcpy( p, getenv("SMBHASH") );
+
+      fprintf(stderr, "Connecting to server using SMB HASH...\n");
+
+      int i, j;
+      char HexChar;
+      int HexValue;
+      for (i=0; i<16; i++) {
+         HexValue = 0x0;
+         for (j=0; j<2; j++) {
+            HexChar = (char)p[2*i+j+33];
+
+            if (HexChar > 0x39)
+               HexChar = HexChar | 0x20;  /* convert upper case to lower */
+
+            if (!(((HexChar >= 0x30) && (HexChar <= 0x39))||   /* 0 - 9 */
+               ((HexChar >= 0x61) && (HexChar <= 0x66)))) {    /* a - f */
+               fprintf(stderr, "Error invalid char (%c) for hash.\n", HexChar);
+               exit(1);
+            }
+
+            HexChar -= 0x30;
+            if (HexChar > 0x09)  /* HexChar is "a" - "f" */
+               HexChar -= 0x27;
+
+            HexValue = (HexValue << 4) | (char)HexChar;
+         }
+         nt_p16[i] = (uchar)HexValue;
+      }
+   } else
+	   E_md4hash((uchar *) pwrd, nt_p16);
+   /* m0j0 */
 
 #ifdef DEBUG_PASSWORD
 	DEBUG(100, ("nt_owf_gen: pwd, nt#\n"));
