diff options
Diffstat (limited to 'source3/libsmb/pwd_cache.c')
-rw-r--r-- | source3/libsmb/pwd_cache.c | 137 |
1 files changed, 118 insertions, 19 deletions
diff --git a/source3/libsmb/pwd_cache.c b/source3/libsmb/pwd_cache.c index fc0602507a..7d1185d9a7 100644 --- a/source3/libsmb/pwd_cache.c +++ b/source3/libsmb/pwd_cache.c @@ -24,7 +24,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,21 +38,89 @@ 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(const struct pwd_info *pwd1, const 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; } /**************************************************************************** @@ -73,7 +141,7 @@ void pwd_set_cleartext(struct pwd_info *pwd, char *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) fstrcpy(clr, pwd->password); @@ -83,6 +151,29 @@ void pwd_get_cleartext(struct pwd_info *pwd, fstring clr) } /**************************************************************************** + 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; +} + +/**************************************************************************** Gets lm and nt hashed passwords. ****************************************************************************/ @@ -95,6 +186,24 @@ 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); + + push_ascii_pstring(dos_passwd, clr); + + 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 +247,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); } - - - - - - - - - - |