summaryrefslogtreecommitdiff
path: root/source3/libsmb
diff options
context:
space:
mode:
Diffstat (limited to 'source3/libsmb')
-rw-r--r--source3/libsmb/credentials.c98
1 files changed, 39 insertions, 59 deletions
diff --git a/source3/libsmb/credentials.c b/source3/libsmb/credentials.c
index 109a5a1b90..6711604f6d 100644
--- a/source3/libsmb/credentials.c
+++ b/source3/libsmb/credentials.c
@@ -72,6 +72,7 @@ Output:
void cred_create(uint32 session_key[2], 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];
@@ -87,12 +88,16 @@ void cred_create(uint32 session_key[2], DOM_CHAL *stor_cred, UTIME timestamp,
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);
+
/* 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,(" timecred : %lx %lx\n", IVAL(timecred, 0) , IVAL(timecred, 4) ));
+ 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]));
}
@@ -139,106 +144,81 @@ int cred_assert(DOM_CHAL *cred, uint32 session_key[2], DOM_CHAL *stored_cred,
/****************************************************************************
checks credentials; generates next step in the credential chain
****************************************************************************/
-BOOL srv_deal_with_creds(struct dcinfo *dc, DOM_CRED *clnt_cred, DOM_CRED *srv_cred)
+BOOL clnt_deal_with_creds(uint32 sess_key[2],
+ DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred)
{
UTIME new_clnt_time;
uint32 new_cred;
- DEBUG(5,("deal_with_creds: %d\n", __LINE__));
+ DEBUG(5,("clnt_deal_with_creds: %d\n", __LINE__));
+
+ /* increment client time by one second */
+ new_clnt_time.time = sto_clnt_cred->timestamp.time + 1;
- /* check that the client credentials are valid */
- if (!cred_assert(&(clnt_cred->challenge), dc->sess_key,
- &(dc->clnt_cred.challenge), clnt_cred->timestamp))
+ /* check that the received server credentials are valid */
+ if (!cred_assert(&(rcv_srv_cred->challenge), sess_key,
+ &(sto_clnt_cred->challenge), new_clnt_time))
{
return False;
}
- /* increment client time by one second */
- new_clnt_time.time = clnt_cred->timestamp.time + 1;
-
/* first 4 bytes of the new seed is old client 4 bytes + clnt time + 1 */
- new_cred = IVAL(dc->clnt_cred.challenge.data, 0);
+ new_cred = IVAL(sto_clnt_cred->challenge.data, 0);
new_cred += new_clnt_time.time;
- DEBUG(5,("deal_with_creds: new_cred[0]=%lx\n", new_cred));
-
- /* doesn't matter that server time is 0 */
- srv_cred->timestamp.time = 0;
-
- DEBUG(5,("deal_with_creds: new_clnt_time=%lx\n", new_clnt_time.time));
-
- /* create return credentials for inclusion in the reply */
- cred_create(dc->sess_key, &(dc->clnt_cred.challenge), new_clnt_time,
- &(srv_cred->challenge));
-
- DEBUG(5,("deal_with_creds: clnt_cred[0]=%lx\n",
- dc->clnt_cred.challenge.data[0]));
-
- /* store new seed in client and server credentials */
- SIVAL(dc->clnt_cred.challenge.data, 0, new_cred);
- SIVAL(dc->srv_cred .challenge.data, 0, new_cred);
+ /* 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]));
return True;
}
-#if 0
/****************************************************************************
checks credentials; generates next step in the credential chain
****************************************************************************/
-BOOL clnt_deal_with_creds(struct dcinfo *dc, DOM_CRED *srv_cred, DOM_CRED *clnt_cred)
+BOOL deal_with_creds(uint32 sess_key[2],
+ DOM_CRED *sto_clnt_cred,
+ DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred)
{
UTIME new_clnt_time;
uint32 new_cred;
DEBUG(5,("deal_with_creds: %d\n", __LINE__));
- /* setup new client time */
- dc->clnt_cred.timestamp.time = time(NULL);
-
- /* create sent credentials for inclusion in the reply */
- cred_create(dc->sess_key, srv_cred, dc->clnt_cred.timestamp.time, clnt_cred);
-
- /* increment client time by one second */
- (dc->clnt_cred.timestamp.time)++;
-
- /* create expected return credentials to be received from server */
- cred_create(dc->sess_key, srv_cred, dc->clnt_cred.timestamp.time, clnt_cred);
-
-
-
- /* check that the server credentials are valid */
- if (!cred_assert(&(srv_cred->challenge), dc->sess_key,
- &(dc->clnt_cred), clnt_cred->timestamp))
+ /* check that the received client credentials are valid */
+ if (!cred_assert(&(rcv_clnt_cred->challenge), sess_key,
+ &(sto_clnt_cred->challenge), rcv_clnt_cred->timestamp))
{
return False;
}
+
/* increment client time by one second */
- new_clnt_time = (dc->clnt_cred.timestamp.time += 1);
+ new_clnt_time.time = rcv_clnt_cred->timestamp.time + 1;
/* first 4 bytes of the new seed is old client 4 bytes + clnt time + 1 */
- new_cred = IVAL(dc->clnt_cred.data, 0);
+ new_cred = IVAL(sto_clnt_cred->challenge.data, 0);
new_cred += new_clnt_time.time;
DEBUG(5,("deal_with_creds: new_cred[0]=%lx\n", new_cred));
- /* create new client credentials */
- cred_create(dc->sess_key, new_cred, new_clnt_time, clnt_cred);
+ /* doesn't matter that server time is 0 */
+ rtn_srv_cred->timestamp.time = 0;
DEBUG(5,("deal_with_creds: new_clnt_time=%lx\n", new_clnt_time.time));
- /* create return credentials for inclusion in the reply
- cred_create(dc->sess_key, srv_cred, new_clnt_time,
- clnt_cred);
- */
+ /* create return credentials for inclusion in the reply */
+ 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",
- dc->clnt_cred.data[0]));
+ sto_clnt_cred->challenge.data[0]));
- /* store new seed in client and server credentials */
- SIVAL(dc->clnt_cred.data, 0, new_cred);
- SIVAL(dc->srv_cred .data, 0, new_cred);
+ /* store new seed in client credentials */
+ SIVAL(sto_clnt_cred->challenge.data, 0, new_cred);
return True;
}
-#endif
+