Minor updates. A small dose of const.
[ira/wip.git] / source3 / libsmb / smbencrypt.c
index b6273dedfc6322e807c8465038e34eb9c30e14e8..2e274553628e0d5ce58090fc4bfbf6e7435edf68 100644 (file)
 */
 
 #include "includes.h"
-
-extern int DEBUGLEVEL;
-
 #include "byteorder.h"
 
 /*
    This implements the X/Open SMB password encryption
    It takes a password, a 8 byte "crypt key" and puts 24 bytes of 
    encrypted password into p24 */
-void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24)
+void SMBencrypt(const uchar *passwd, const uchar *c8, uchar *p24)
 {
        uchar p14[15], p21[21];
 
        memset(p21,'\0',21);
        memset(p14,'\0',14);
-       StrnCpy((char *)p14,(char *)passwd,14);
+       StrnCpy((char *)p14,(const char *)passwd,14);
 
        strupper((char *)p14);
        E_P16(p14, p21); 
@@ -48,7 +45,7 @@ void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24)
 #ifdef DEBUG_PASSWORD
        DEBUG(100,("SMBencrypt: lm#, challenge, response\n"));
        dump_data(100, (char *)p21, 16);
-       dump_data(100, (char *)c8, 8);
+       dump_data(100, (const char *)c8, 8);
        dump_data(100, (char *)p24, 24);
 #endif
 }
@@ -57,13 +54,13 @@ void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24)
  * Creates the MD4 Hash of the users password in NT UNICODE.
  */
  
-void E_md4hash(uchar *passwd, uchar *p16)
+void E_md4hash(const uchar *passwd, uchar *p16)
 {
        int len;
        smb_ucs2_t wpwd[129];
        
        /* Password cannot be longer than 128 characters */
-       len = strlen((char *)passwd);
+       len = strlen((const char *)passwd);
        if(len > 128)
                len = 128;
        /* Password must be converted to NT unicode - null terminated. */
@@ -75,7 +72,7 @@ void E_md4hash(uchar *passwd, uchar *p16)
 }
 
 /* Does both the NT and LM owfs of a user's password */
-void nt_lm_owf_gen(char *pwd, uchar nt_p16[16], uchar p16[16])
+void nt_lm_owf_gen(const char *pwd, uchar nt_p16[16], uchar p16[16])
 {
        char passwd[514];
 
@@ -150,7 +147,7 @@ void SMBOWFencrypt(const uchar passwd[16], const uchar *c8, uchar p24[24])
 }
 
 /* Does the des encryption from the FIRST 8 BYTES of the NT or LM MD4 hash. */
-void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24])
+void NTLMSSPOWFencrypt(const uchar passwd[8], const uchar *ntlmchalresp, uchar p24[24])
 {
        uchar p21[21];
  
@@ -162,7 +159,7 @@ void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24])
 #ifdef DEBUG_PASSWORD
        DEBUG(100,("NTLMSSPOWFencrypt: p21, c8, p24\n"));
        dump_data(100, (char *)p21, 21);
-       dump_data(100, (char *)ntlmchalresp, 8);
+       dump_data(100, (const char *)ntlmchalresp, 8);
        dump_data(100, (char *)p24, 24);
 #endif
 }
@@ -170,7 +167,7 @@ void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24])
 
 /* Does the NT MD4 hash then des encryption. */
  
-void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24)
+void SMBNTencrypt(const uchar *passwd, uchar *c8, uchar *p24)
 {
        uchar p21[21];
  
@@ -219,27 +216,27 @@ BOOL make_oem_passwd_hash(char data[516], const char *passwd, uchar old_pw_hash[
 
 /* Does the md5 encryption from the NT hash for NTLMv2. */
 void SMBOWFencrypt_ntv2(const uchar kr[16],
-                       const uchar * srv_chal, int srv_chal_len,
-                       const uchar * cli_chal, int cli_chal_len,
+                       const DATA_BLOB srv_chal,
+                       const DATA_BLOB cli_chal,
                        char resp_buf[16])
 {
        HMACMD5Context ctx;
 
        hmac_md5_init_limK_to_64(kr, 16, &ctx);
-       hmac_md5_update(srv_chal, srv_chal_len, &ctx);
-       hmac_md5_update(cli_chal, cli_chal_len, &ctx);
+       hmac_md5_update(srv_chal.data, srv_chal.length, &ctx);
+       hmac_md5_update(cli_chal.data, cli_chal.length, &ctx);
        hmac_md5_final((unsigned char *)resp_buf, &ctx);
 
 #ifdef DEBUG_PASSWORD
        DEBUG(100, ("SMBOWFencrypt_ntv2: srv_chal, cli_chal, resp_buf\n"));
-       dump_data(100, srv_chal, srv_chal_len);
-       dump_data(100, cli_chal, cli_chal_len);
+       dump_data(100, srv_chal.data, srv_chal.length);
+       dump_data(100, cli_chal.data, cli_chal.length);
        dump_data(100, resp_buf, 16);
 #endif
 }
 
 void SMBsesskeygen_ntv2(const uchar kr[16],
-                       const uchar * nt_resp, char sess_key[16])
+                       const uchar * nt_resp, uint8 sess_key[16])
 {
        HMACMD5Context ctx;
 
@@ -254,7 +251,7 @@ void SMBsesskeygen_ntv2(const uchar kr[16],
 }
 
 void SMBsesskeygen_ntv1(const uchar kr[16],
-                       const uchar * nt_resp, char sess_key[16])
+                       const uchar * nt_resp, uint8 sess_key[16])
 {
        mdfour((unsigned char *)sess_key, kr, 16);
 
@@ -292,16 +289,13 @@ BOOL encode_pw_buffer(char buffer[516], const char *new_pass,
 
 /***********************************************************
  decode a password buffer
+ *new_pw_len is the length in bytes of the possibly mulitbyte
+ returned password including termination.
 ************************************************************/
 BOOL decode_pw_buffer(char in_buffer[516], char *new_pwrd,
-                     int new_pwrd_size, uint32 *new_pw_len,
-                     uchar nt_p16[16], uchar p16[16])
+                     int new_pwrd_size, uint32 *new_pw_len)
 {
-       int uni_pw_len=0;
        int byte_len=0;
-       char unicode_passwd[514];
-       char lm_ascii_passwd[514];
-       char passwd[514];
 
        /*
          Warning !!! : This function is called from some rpc call.
@@ -310,13 +304,6 @@ BOOL decode_pw_buffer(char in_buffer[516], char *new_pwrd,
          If you reuse that code somewhere else check first.
        */
 
-       ZERO_STRUCT(unicode_passwd);
-       ZERO_STRUCT(lm_ascii_passwd);
-       ZERO_STRUCT(passwd);
-
-       memset(nt_p16, '\0', 16);
-       memset(p16, '\0', 16);
-
        /* The length of the new password is in the last 4 bytes of the data buffer. */
 
        byte_len = IVAL(in_buffer, 512);
@@ -328,50 +315,19 @@ BOOL decode_pw_buffer(char in_buffer[516], char *new_pwrd,
        /* Password cannot be longer than 128 characters */
        if ( (byte_len < 0) || (byte_len > new_pwrd_size - 1)) {
                DEBUG(0, ("decode_pw_buffer: incorrect password length (%d).\n", byte_len));
+               DEBUG(0, ("decode_pw_buffer: check that 'encrypt passwords = yes'\n"));
                return False;
        }
-       
-       pull_string(NULL, passwd, &in_buffer[512 - byte_len], -1, byte_len, STR_UNICODE);
-       uni_pw_len = byte_len/2;
 
-#ifdef DEBUG_PASSWORD
-       DEBUG(100,("nt_lm_owf_gen: passwd: "));
-       dump_data(100, (char *)passwd, uni_pw_len);
-       DEBUG(100,("len:%d\n", uni_pw_len));
-#endif
-       memcpy(unicode_passwd, &in_buffer[512 - byte_len], byte_len);
-               
-       mdfour(nt_p16, (unsigned char *)unicode_passwd, byte_len);
-       
-#ifdef DEBUG_PASSWORD
-       DEBUG(100,("nt_lm_owf_gen: nt#:"));
-       dump_data(100, (char *)nt_p16, 16);
-       DEBUG(100,("\n"));
-#endif
-       
-       /* Mangle the passwords into Lanman format */
-       memcpy(lm_ascii_passwd, passwd, byte_len/2);
-       lm_ascii_passwd[14] = '\0';
-       strupper(lm_ascii_passwd);
-
-       /* Calculate the SMB (lanman) hash functions of the password */
-       E_P16((uchar *) lm_ascii_passwd, (uchar *)p16);
+       /* decode into the return buffer.  Buffer must be a pstring */
+       *new_pw_len = pull_string(NULL, new_pwrd, &in_buffer[512 - byte_len], new_pwrd_size, byte_len, STR_UNICODE);
 
 #ifdef DEBUG_PASSWORD
-       DEBUG(100,("nt_lm_owf_gen: lm#:"));
-       dump_data(100, (char *)p16, 16);
-       DEBUG(100,("\n"));
+       DEBUG(100,("decode_pw_buffer: new_pwrd: "));
+       dump_data(100, (char *)new_pwrd, *new_pw_len);
+       DEBUG(100,("multibyte len:%d\n", *new_pw_len));
+       DEBUG(100,("original char len:%d\n", byte_len/2));
 #endif
-
-       /* copy the password and it's length to the return buffer */    
-       *new_pw_len = byte_len/2;
-       memcpy(new_pwrd, passwd, uni_pw_len);
-       new_pwrd[uni_pw_len]='\0';
-       
-       /* clear out local copy of user's password (just being paranoid). */
-       ZERO_STRUCT(unicode_passwd);
-       ZERO_STRUCT(lm_ascii_passwd);
-       ZERO_STRUCT(passwd);
        
        return True;