diff options
Diffstat (limited to 'source/libsmb/pwd_cache.c')
-rw-r--r-- | source/libsmb/pwd_cache.c | 152 |
1 files changed, 127 insertions, 25 deletions
diff --git a/source/libsmb/pwd_cache.c b/source/libsmb/pwd_cache.c index fc0602507ab..dde5a02ead2 100644 --- a/source/libsmb/pwd_cache.c +++ b/source/libsmb/pwd_cache.c @@ -1,5 +1,6 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 1.9. Password cacheing. obfuscation is planned Copyright (C) Luke Kenneth Casson Leighton 1996-1998 @@ -24,7 +25,7 @@ Initialises a password structure. ****************************************************************************/ -static void pwd_init(struct pwd_info *pwd) +void pwd_init(struct pwd_info *pwd) { memset((char *)pwd->password , '\0', sizeof(pwd->password )); memset((char *)pwd->smb_lm_pwd, '\0', sizeof(pwd->smb_lm_pwd)); @@ -38,48 +39,140 @@ static void pwd_init(struct pwd_info *pwd) } /**************************************************************************** - Makes lm and nt hashed passwords. + Returns NULL password flag. ****************************************************************************/ -static void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr) +BOOL pwd_is_nullpwd(const struct pwd_info *pwd) { - pstring dos_passwd; + return pwd->null_pwd; +} + +/**************************************************************************** + Compares two passwords. hmm, not as trivial as expected. hmm. +****************************************************************************/ + +BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2) +{ + if (pwd1->cleartext && pwd2->cleartext) { + if (strequal(pwd1->password, pwd2->password)) + return True; + } + if (pwd1->null_pwd && pwd2->null_pwd) + return True; + + if (!pwd1->null_pwd && !pwd2->null_pwd && + !pwd1->cleartext && !pwd2->cleartext) { +#ifdef DEBUG_PASSWORD + DEBUG(100,("pwd compare: nt#\n")); + dump_data(100, pwd1->smb_nt_pwd, 16); + dump_data(100, pwd2->smb_nt_pwd, 16); +#endif + if (memcmp(pwd1->smb_nt_pwd, pwd2->smb_nt_pwd, 16) == 0) + return True; +#ifdef DEBUG_PASSWORD + DEBUG(100,("pwd compare: lm#\n")); + dump_data(100, pwd1->smb_lm_pwd, 16); + dump_data(100, pwd2->smb_lm_pwd, 16); +#endif + if (memcmp(pwd1->smb_lm_pwd, pwd2->smb_lm_pwd, 16) == 0) + return True; + } + return False; +} + +/**************************************************************************** + Reads a password. +****************************************************************************/ + +void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt) +{ + /* grab a password */ + char *user_pass; pwd_init(pwd); - push_ascii_pstring(dos_passwd, clr); + user_pass = (char*)getpass(passwd_report); + + /* + * Do not assume that an empty string is a NULL password. + * If you do this will break the session key generation for + * and account with an emtpy password. If you wish to use + * a NULL password, use the -N option to smbclient and rpcclient + * --jerry + */ +#if 0 + if (user_pass == NULL || user_pass[0] == 0) + pwd_set_nullpwd(pwd); + else if (do_encrypt) +#endif + if (do_encrypt) + pwd_make_lm_nt_16(pwd, user_pass); + else + pwd_set_cleartext(pwd, user_pass); +} + +/**************************************************************************** + Stores a cleartext password. +****************************************************************************/ + +void pwd_set_nullpwd(struct pwd_info *pwd) +{ + pwd_init(pwd); - nt_lm_owf_gen(dos_passwd, pwd->smb_nt_pwd, pwd->smb_lm_pwd); - pwd->null_pwd = False; pwd->cleartext = False; - pwd->crypted = False; + pwd->null_pwd = True; + pwd->crypted = False; } /**************************************************************************** Stores a cleartext password. -****************************************************************************/ + ****************************************************************************/ void pwd_set_cleartext(struct pwd_info *pwd, char *clr) { pwd_init(pwd); - push_ascii_fstring(pwd->password, clr); + fstrcpy(pwd->password, clr); + unix_to_dos(pwd->password); pwd->cleartext = True; pwd->null_pwd = False; pwd->crypted = False; - pwd_make_lm_nt_16(pwd, clr); } /**************************************************************************** Gets a cleartext password. ****************************************************************************/ -void pwd_get_cleartext(struct pwd_info *pwd, fstring clr) +void pwd_get_cleartext(struct pwd_info *pwd, char *clr) { - if (pwd->cleartext) + if (pwd->cleartext) { fstrcpy(clr, pwd->password); - else + dos_to_unix(clr); + } else { clr[0] = 0; + } +} + +/**************************************************************************** + Stores lm and nt hashed passwords. +****************************************************************************/ + +void pwd_set_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]) +{ + pwd_init(pwd); + + if (lm_pwd) + memcpy(pwd->smb_lm_pwd, lm_pwd, 16); + else + memset((char *)pwd->smb_lm_pwd, '\0', 16); + + if (nt_pwd) + memcpy(pwd->smb_nt_pwd, nt_pwd, 16); + else + memset((char *)pwd->smb_nt_pwd, '\0', 16); + pwd->null_pwd = False; + pwd->cleartext = False; + pwd->crypted = False; } /**************************************************************************** @@ -95,6 +188,25 @@ void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]) } /**************************************************************************** + Makes lm and nt hashed passwords. +****************************************************************************/ + +void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr) +{ + pstring dos_passwd; + + pwd_init(pwd); + + pstrcpy(dos_passwd, clr); + unix_to_dos(dos_passwd); + + nt_lm_owf_gen(dos_passwd, pwd->smb_nt_pwd, pwd->smb_lm_pwd); + pwd->null_pwd = False; + pwd->cleartext = False; + pwd->crypted = False; +} + +/**************************************************************************** Makes lm and nt OWF crypts. ****************************************************************************/ @@ -138,13 +250,3 @@ void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24]) if (nt_owf != NULL) memcpy(nt_owf, pwd->smb_nt_owf, 24); } - - - - - - - - - - |