#include "includes.h"
extern fstring global_myworkgroup;
extern pstring global_myname;
NTSTATUS cli_nt_setup_creds(struct cli_state *cli, unsigned char mach_pwd[16])
{
NTSTATUS result;
DOM_CHAL clnt_chal;
DOM_CHAL srv_chal;
UTIME zerotime;
generate_random_buffer( clnt_chal.data, 8, False);
if (!cli_net_req_chal(cli, &clnt_chal, &srv_chal))
{
DEBUG(0,("cli_nt_setup_creds: request challenge failed\n"));
return NT_STATUS_UNSUCCESSFUL;
}
cred_session_key(&clnt_chal, &srv_chal, (char *)mach_pwd, cli->sess_key);
memset((char *)cli->sess_key+8, '\0', 8);
zerotime.time = 0;
cred_create(cli->sess_key, &clnt_chal, zerotime, &(cli->clnt_cred.challenge));
result = cli_net_auth2(cli, (lp_server_role() == ROLE_DOMAIN_MEMBER) ?
SEC_CHAN_WKSTA : SEC_CHAN_BDC, 0x000001ff, &srv_chal);
if (!NT_STATUS_IS_OK(result))
{
DEBUG(0,("cli_nt_setup_creds: auth2 challenge failed\n"));
return result;
}
return NT_STATUS_OK;
}
BOOL cli_nt_srv_pwset(struct cli_state *cli, unsigned char *new_hashof_mach_pwd)
{
unsigned char processed_new_pwd[16];
DEBUG(5,("cli_nt_srv_pwset: %d\n", __LINE__));
#ifdef DEBUG_PASSWORD
dump_data(6, (char *)new_hashof_mach_pwd, 16);
#endif
cred_hash3( processed_new_pwd, new_hashof_mach_pwd, cli->sess_key, 1);
return cli_net_srv_pwset(cli, processed_new_pwd);
}
NTSTATUS cli_nt_login_interactive(struct cli_state *cli, char *domain, char *username,
uint32 smb_userid_low, char *password,
NET_ID_INFO_CTR *ctr, NET_USER_INFO_3 *user_info3)
{
uchar lm_owf_user_pwd[16];
uchar nt_owf_user_pwd[16];
NTSTATUS ret;
DEBUG(5,("cli_nt_login_interactive: %d\n", __LINE__));
nt_lm_owf_gen(password, nt_owf_user_pwd, lm_owf_user_pwd);
#ifdef DEBUG_PASSWORD
DEBUG(100,("nt owf of user password: "));
dump_data(100, (char *)lm_owf_user_pwd, 16);
DEBUG(100,("nt owf of user password: "));
dump_data(100, (char *)nt_owf_user_pwd, 16);
#endif
DEBUG(5,("cli_nt_login_interactive: %d\n", __LINE__));
ctr->switch_value = INTERACTIVE_LOGON_TYPE;
init_id_info1(&ctr->auth.id1, domain, 0,
smb_userid_low, 0,
username, cli->clnt_name_slash,
(char *)cli->sess_key, lm_owf_user_pwd, nt_owf_user_pwd);
memset(lm_owf_user_pwd, '\0', sizeof(lm_owf_user_pwd));
memset(nt_owf_user_pwd, '\0', sizeof(nt_owf_user_pwd));
ret = cli_net_sam_logon(cli, ctr, user_info3);
memset(ctr->auth.id1.lm_owf.data, '\0', sizeof(lm_owf_user_pwd));
memset(ctr->auth.id1.nt_owf.data, '\0', sizeof(nt_owf_user_pwd));
return ret;
}
NTSTATUS cli_nt_login_network(struct cli_state *cli, char *domain, char *username,
uint32 smb_userid_low, const char lm_chal[8],
const char *lm_chal_resp, const char *nt_chal_resp,
NET_ID_INFO_CTR *ctr, NET_USER_INFO_3 *user_info3)
{
fstring dos_wksta_name, dos_username, dos_domain;
DEBUG(5,("cli_nt_login_network: %d\n", __LINE__));
ctr->switch_value = NET_LOGON_TYPE;
fstrcpy(dos_wksta_name, cli->clnt_name_slash);
unix_to_dos(dos_wksta_name, True);
fstrcpy(dos_username, username);
unix_to_dos(dos_username, True);
fstrcpy(dos_domain, domain);
unix_to_dos(dos_domain, True);
init_id_info2(&ctr->auth.id2, dos_domain, 0, smb_userid_low, 0,
dos_username, dos_wksta_name,
(const uchar *)lm_chal, (const uchar *)lm_chal_resp, lm_chal_resp ? 24 : 0,
(const uchar *)nt_chal_resp, nt_chal_resp ? 24 : 0 );
return cli_net_sam_logon(cli, ctr, user_info3);
}
BOOL cli_nt_logoff(struct cli_state *cli, NET_ID_INFO_CTR *ctr)
{
DEBUG(5,("cli_nt_logoff: %d\n", __LINE__));
return cli_net_sam_logoff(cli, ctr);
}