1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-29 13:49:30 +03:00

convert the credentials code back to uchar[8] from uint32[2]

This should fix the byte order problems (maybe!)
(This used to be commit 21878e7d86)
This commit is contained in:
Andrew Tridgell
1997-11-02 04:01:57 +00:00
parent 56eece129e
commit 4012c1cc8f
5 changed files with 61 additions and 63 deletions

View File

@ -197,7 +197,7 @@ BOOL cli_receive_trans_response(char *inbuf,int trans,
send a SMB trans or trans2 request
****************************************************************************/
BOOL cli_send_trans_request(char *outbuf,int trans,
char *name,int name_len, int fid,int flags,
char *name,int namelen, int fid,int flags,
char *data,char *param,uint16 *setup,
int ldata,int lparam,int lsetup,
int mdata,int mparam,int msetup)
@ -218,7 +218,7 @@ BOOL cli_send_trans_request(char *outbuf,int trans,
SSVAL(outbuf,smb_tid,cnum);
cli_setup_pkt(outbuf);
outparam = smb_buf(outbuf)+(trans==SMBtrans ? name_len+1 : 3);
outparam = smb_buf(outbuf)+(trans==SMBtrans ? namelen+1 : 3);
outdata = outparam+this_lparam;
/* primary request */
@ -238,7 +238,7 @@ BOOL cli_send_trans_request(char *outbuf,int trans,
SSVAL(outbuf,smb_setup+i*SIZEOFWORD,setup[i]);
p = smb_buf(outbuf);
if (trans==SMBtrans)
memcpy(p,name, name_len+1); /* name[] */
memcpy(p,name, namelen+1); /* name[] */
else
{
*p++ = 0; /* put in a null smb_name */

View File

@ -63,7 +63,7 @@ BOOL do_nt_login(char *desthost, char *myhostname,
UTIME zerotime;
uint32 sess_key[2];
uchar sess_key[8];
char nt_owf_mach_pwd[16];
fstring mach_acct;
fstring mach_pwd;
@ -221,8 +221,8 @@ BOOL do_nt_login(char *desthost, char *myhostname,
fstrcpy(mach_pwd , myhostname);
strcat(mach_acct, "$");
clnt_chal.data[0] = 0x11111111;
clnt_chal.data[1] = 0x22222222;
SIVAL(clnt_chal.data, 0, 0x11111111);
SIVAL(clnt_chal.data, 4, 0x22222222);
/* send a client challenge; receive a server challenge */
if (!do_lsa_req_chal(fnum, ++call_id, desthost, myhostname, &clnt_chal, &srv_chal))

View File

@ -83,7 +83,7 @@ BOOL cli_receive_trans_response(char *inbuf,int trans,
int *data_len,int *param_len,
char **data,char **param);
BOOL cli_send_trans_request(char *outbuf,int trans,
char *name,int name_len, int fid,int flags,
char *name,int namelen, int fid,int flags,
char *data,char *param,uint16 *setup,
int ldata,int lparam,int lsetup,
int mdata,int mparam,int msetup);
@ -106,17 +106,18 @@ int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind);
/*The following definitions come from credentials.c */
char *credstr(uchar *cred);
void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass,
uint32 session_key[2]);
void cred_create(uint32 session_key[2], DOM_CHAL *stor_cred, UTIME timestamp,
uchar session_key[8]);
void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp,
DOM_CHAL *cred);
int cred_assert(DOM_CHAL *cred, uint32 session_key[2], DOM_CHAL *stored_cred,
int cred_assert(DOM_CHAL *cred, char session_key[8], DOM_CHAL *stored_cred,
UTIME timestamp);
BOOL clnt_deal_with_creds(uint32 sess_key[2],
DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred);
BOOL deal_with_creds(uint32 sess_key[2],
DOM_CRED *sto_clnt_cred,
DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred);
BOOL clnt_deal_with_creds(char sess_key[8],
DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred);
BOOL deal_with_creds(uchar sess_key[8],
DOM_CRED *sto_clnt_cred,
DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred);
/*The following definitions come from dir.c */
@ -815,14 +816,14 @@ BOOL do_lsa_auth2(uint16 fnum, uint32 call_id,
char *logon_srv, char *acct_name, uint16 sec_chan, char *comp_name,
DOM_CHAL *clnt_chal, uint32 neg_flags, DOM_CHAL *srv_chal);
BOOL do_lsa_sam_logon(uint16 fnum, uint32 call_id,
uint32 sess_key[2], DOM_CRED *sto_clnt_cred,
uchar sess_key[8], DOM_CRED *sto_clnt_cred,
char *logon_srv, char *comp_name,
DOM_CRED *clnt_cred, DOM_CRED *rtn_cred,
uint16 logon_level, uint16 switch_value, DOM_ID_INFO_1 *id1,
LSA_USER_INFO *user_info,
DOM_CRED *srv_cred);
BOOL do_lsa_sam_logoff(uint16 fnum, uint32 call_id,
uint32 sess_key[2], DOM_CRED *sto_clnt_cred,
uchar sess_key[8], DOM_CRED *sto_clnt_cred,
char *logon_srv, char *comp_name,
DOM_CRED *clnt_cred, DOM_CRED *rtn_cred,
uint16 logon_level, uint16 switch_value, DOM_ID_INFO_1 *id1,

View File

@ -443,8 +443,7 @@ typedef struct log_info
/* DOM_CHAL - challenge info */
typedef struct chal_info
{
uint32 data[2]; /* credentials */
uchar data[8]; /* credentials */
} DOM_CHAL;
/* DOM_CREDs - timestamped client or server credentials */
@ -1308,7 +1307,7 @@ struct dcinfo
DOM_CRED clnt_cred; /* Last client credential */
DOM_CRED srv_cred; /* Last server credential */
uint32 sess_key[2]; /* Session key */
uchar sess_key[8]; /* Session key */
uchar md4pw[16]; /* md4(machine password) */
};

View File

@ -22,6 +22,22 @@
#include "includes.h"
extern int DEBUGLEVEL;
/****************************************************************************
represent a credential as a string
****************************************************************************/
char *credstr(uchar *cred)
{
static fstring buf;
sprintf(buf,"%02X%02X%02X%02X%02X%02X%02X%02X",
cred[0], cred[1], cred[2], cred[3],
cred[4], cred[5], cred[6], cred[7]);
return buf;
}
/****************************************************************************
setup the session key.
Input: 8 byte challenge block
@ -31,11 +47,10 @@ Output:
8 byte session key
****************************************************************************/
void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass,
uint32 session_key[2])
uchar session_key[8])
{
uint32 sum[2];
unsigned char sum2[8];
unsigned char netsesskey[8];
sum[0] = IVAL(clnt_chal->data, 0) + IVAL(srv_chal->data, 0);
sum[1] = IVAL(clnt_chal->data, 4) + IVAL(srv_chal->data, 4);
@ -43,18 +58,15 @@ void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass,
SIVAL(sum2,0,sum[0]);
SIVAL(sum2,4,sum[1]);
cred_hash1(netsesskey, sum2,(unsigned char *)pass);
session_key[0] = IVAL(netsesskey, 0);
session_key[1] = IVAL(netsesskey, 4);
cred_hash1(session_key, sum2,(unsigned char *)pass);
/* debug output */
DEBUG(4,("cred_session_key\n"));
DEBUG(5,(" clnt_chal: %lx %lx\n", clnt_chal->data[0], clnt_chal->data[1]));
DEBUG(5,(" srv_chal : %lx %lx\n", srv_chal ->data[0], srv_chal ->data[1]));
DEBUG(5,(" clnt+srv : %lx %lx\n", sum [0], sum [1]));
DEBUG(5,(" sess_key : %lx %lx\n", session_key [0], session_key [1]));
DEBUG(5,(" clnt_chal: %s\n", credstr(clnt_chal->data)));
DEBUG(5,(" srv_chal : %s\n", credstr(srv_chal->data)));
DEBUG(5,(" clnt+srv : %s\n", credstr(sum2)));
DEBUG(5,(" sess_key : %s\n", credstr(session_key)));
}
@ -69,36 +81,24 @@ Input:
Output:
8 byte credential
****************************************************************************/
void cred_create(uint32 session_key[2], DOM_CHAL *stor_cred, UTIME timestamp,
void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp,
DOM_CHAL *cred)
{
DOM_CHAL time_cred;
unsigned char calc_cred[8];
unsigned char timecred[8];
unsigned char netsesskey[8];
SIVAL(netsesskey, 0, session_key[0]);
SIVAL(netsesskey, 4, session_key[1]);
SIVAL(time_cred.data, 0, IVAL(stor_cred->data, 0) + timestamp.time);
SIVAL(time_cred.data, 4, IVAL(stor_cred->data, 4));
SIVAL(timecred, 0, IVAL(stor_cred, 0) + timestamp.time);
SIVAL(timecred, 4, IVAL(stor_cred, 4));
cred_hash2(calc_cred, timecred, netsesskey);
cred->data[0] = IVAL(calc_cred, 0);
cred->data[1] = IVAL(calc_cred, 4);
time_cred.data[0] = IVAL(timecred, 0);
time_cred.data[1] = IVAL(timecred, 4);
cred_hash2(cred->data, time_cred.data, session_key);
/* debug output*/
DEBUG(4,("cred_create\n"));
DEBUG(5,(" sess_key : %lx %lx\n", session_key [0], session_key [1]));
DEBUG(5,(" stor_cred: %lx %lx\n", stor_cred->data[0], stor_cred->data[1]));
DEBUG(5,(" sess_key : %s\n", credstr(session_key)));
DEBUG(5,(" stor_cred: %s\n", credstr(stor_cred->data)));
DEBUG(5,(" timestamp: %lx\n" , timestamp.time));
DEBUG(5,(" timecred : %lx %lx\n", time_cred .data[0], time_cred .data[1]));
DEBUG(5,(" calc_cred: %lx %lx\n", cred ->data[0], cred ->data[1]));
DEBUG(5,(" timecred : %s\n", credstr(time_cred.data)));
DEBUG(5,(" calc_cred: %s\n", credstr(cred->data)));
}
@ -115,7 +115,7 @@ Output:
returns 1 if computed credential matches received credential
returns 0 otherwise
****************************************************************************/
int cred_assert(DOM_CHAL *cred, uint32 session_key[2], DOM_CHAL *stored_cred,
int cred_assert(DOM_CHAL *cred, char session_key[8], DOM_CHAL *stored_cred,
UTIME timestamp)
{
DOM_CHAL cred2;
@ -125,8 +125,8 @@ int cred_assert(DOM_CHAL *cred, uint32 session_key[2], DOM_CHAL *stored_cred,
/* debug output*/
DEBUG(4,("cred_assert\n"));
DEBUG(5,(" challenge : %lx %lx\n", cred->data[0], cred->data[1]));
DEBUG(5,(" calculated: %lx %lx\n", cred2.data[0], cred2.data[1]));
DEBUG(5,(" challenge : %s\n", credstr(cred->data)));
DEBUG(5,(" calculated: %s\n", credstr(cred2.data)));
if (memcmp(cred->data, cred2.data, 8) == 0)
{
@ -144,8 +144,8 @@ int cred_assert(DOM_CHAL *cred, uint32 session_key[2], DOM_CHAL *stored_cred,
/****************************************************************************
checks credentials; generates next step in the credential chain
****************************************************************************/
BOOL clnt_deal_with_creds(uint32 sess_key[2],
DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred)
BOOL clnt_deal_with_creds(char sess_key[8],
DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred)
{
UTIME new_clnt_time;
uint32 new_cred;
@ -157,7 +157,7 @@ BOOL clnt_deal_with_creds(uint32 sess_key[2],
/* check that the received server credentials are valid */
if (!cred_assert(&(rcv_srv_cred->challenge), sess_key,
&(sto_clnt_cred->challenge), new_clnt_time))
&(sto_clnt_cred->challenge), new_clnt_time))
{
return False;
}
@ -169,8 +169,7 @@ BOOL clnt_deal_with_creds(uint32 sess_key[2],
/* store new seed in client credentials */
SIVAL(sto_clnt_cred->challenge.data, 0, new_cred);
DEBUG(5,(" new clnt cred: %lx %lx\n", sto_clnt_cred->challenge.data[0],
sto_clnt_cred->challenge.data[1]));
DEBUG(5,(" new clnt cred: %s\n", credstr(sto_clnt_cred->challenge.data)));
return True;
}
@ -178,9 +177,9 @@ BOOL clnt_deal_with_creds(uint32 sess_key[2],
/****************************************************************************
checks credentials; generates next step in the credential chain
****************************************************************************/
BOOL deal_with_creds(uint32 sess_key[2],
DOM_CRED *sto_clnt_cred,
DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred)
BOOL deal_with_creds(uchar sess_key[8],
DOM_CRED *sto_clnt_cred,
DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred)
{
UTIME new_clnt_time;
uint32 new_cred;
@ -212,8 +211,7 @@ BOOL deal_with_creds(uint32 sess_key[2],
cred_create(sess_key, &(sto_clnt_cred->challenge), new_clnt_time,
&(rtn_srv_cred->challenge));
DEBUG(5,("deal_with_creds: clnt_cred[0]=%lx\n",
sto_clnt_cred->challenge.data[0]));
DEBUG(5,("deal_with_creds: clnt_cred=%s\n", credstr(sto_clnt_cred->challenge.data)));
/* store new seed in client credentials */
SIVAL(sto_clnt_cred->challenge.data, 0, new_cred);