Author: jra Date: 2005-08-16 19:39:27 +0000 (Tue, 16 Aug 2005) New Revision: 9324
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9324 Log: Final function moved to standard arc4 implementation. Jeremy. Modified: trunk/source/include/ntdomain.h trunk/source/rpc_server/srv_pipe.c Changeset: Modified: trunk/source/include/ntdomain.h =================================================================== --- trunk/source/include/ntdomain.h 2005-08-16 17:31:51 UTC (rev 9323) +++ trunk/source/include/ntdomain.h 2005-08-16 19:39:27 UTC (rev 9324) @@ -181,7 +181,7 @@ BOOL ntlmssp_auth_requested; /* If the client wanted authenticated rpc. */ BOOL ntlmssp_auth_validated; /* If the client *got* authenticated rpc. */ unsigned char challenge[8]; - unsigned char ntlmssp_hash[258]; + unsigned char ntlmssp_arc4_state[258]; uint32 ntlmssp_seq_num; }; Modified: trunk/source/rpc_server/srv_pipe.c =================================================================== --- trunk/source/rpc_server/srv_pipe.c 2005-08-16 17:31:51 UTC (rev 9323) +++ trunk/source/rpc_server/srv_pipe.c 2005-08-16 19:39:27 UTC (rev 9324) @@ -55,30 +55,10 @@ struct dcinfo last_dcinfo; BOOL server_auth2_negotiated = False; -static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, int len) +static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, size_t len) { - unsigned char *hash = p->auth.a_u.ntlmssp_auth->ntlmssp_hash; - unsigned char index_i = hash[256]; - unsigned char index_j = hash[257]; - int ind; - - for( ind = 0; ind < len; ind++) { - unsigned char tc; - unsigned char t; - - index_i++; - index_j += hash[index_i]; - - tc = hash[index_i]; - hash[index_i] = hash[index_j]; - hash[index_j] = tc; - - t = hash[index_i] + hash[index_j]; - data[ind] = data[ind] ^ hash[t]; - } - - hash[256] = index_i; - hash[257] = index_j; + unsigned char *a4state = p->auth.a_u.ntlmssp_auth->ntlmssp_arc4_state; + smb_arc4_crypt(a4state, data, len); } /******************************************************************* @@ -495,39 +475,20 @@ return False; } else { uchar p24[24]; + unsigned char k2[8]; NTLMSSPOWFencrypt(server_info->lm_session_key.data, lm_owf, p24); - { - unsigned char j = 0; - int ind; - unsigned char k2[8]; + memcpy(k2, p24, 5); + k2[5] = 0xe5; + k2[6] = 0x38; + k2[7] = 0xb0; - memcpy(k2, p24, 5); - k2[5] = 0xe5; - k2[6] = 0x38; - k2[7] = 0xb0; + smb_arc4_init(pa->ntlmssp_arc4_state, k2, 8); - for (ind = 0; ind < 256; ind++) - pa->ntlmssp_hash[ind] = (unsigned char)ind; + dump_data_pw("NTLMSSP hash (v1)\n", pa->ntlmssp_arc4_state, + sizeof(pa->ntlmssp_arc4_state)); - for( ind = 0; ind < 256; ind++) { - unsigned char tc; - - j += (pa->ntlmssp_hash[ind] + k2[ind%8]); - - tc = pa->ntlmssp_hash[ind]; - pa->ntlmssp_hash[ind] = pa->ntlmssp_hash[j]; - pa->ntlmssp_hash[j] = tc; - } - - pa->ntlmssp_hash[256] = 0; - pa->ntlmssp_hash[257] = 0; - } - - dump_data_pw("NTLMSSP hash (v1)\n", pa->ntlmssp_hash, - sizeof(pa->ntlmssp_hash)); - -/* NTLMSSPhash(p->ntlmssp_hash, p24); */ +/* NTLMSSPhash(p->ntlmssp_arc4_state, p24); */ pa->ntlmssp_seq_num = 0; } @@ -1789,8 +1750,8 @@ * has already been consumed. */ char *data = prs_data_p(rpc_in) + RPC_HDR_REQ_LEN; - dump_data_pw("NTLMSSP hash (v1)\n", p->auth.a_u.ntlmssp_auth->ntlmssp_hash, - sizeof(p->auth.a_u.ntlmssp_auth->ntlmssp_hash)); + dump_data_pw("NTLMSSP hash (v1)\n", p->auth.a_u.ntlmssp_auth->ntlmssp_arc4_state, + sizeof(p->auth.a_u.ntlmssp_auth->ntlmssp_arc4_state)); dump_data_pw("Incoming RPC PDU (NTLMSSP sealed)\n", (const unsigned char *)data, data_len);