Skip to content

Commit

Permalink
smbdes: convert E_P24() and SMBOWFencrypt to use gnutls
Browse files Browse the repository at this point in the history
Signed-off-by: Isaac Boukris <[email protected]>
Reviewed-by: Andrew Bartlett <[email protected]>
  • Loading branch information
iboukris authored and abartlet committed Dec 10, 2019
1 parent 2eef129 commit a5548af
Show file tree
Hide file tree
Showing 12 changed files with 129 additions and 44 deletions.
31 changes: 22 additions & 9 deletions auth/credentials/credentials_ntlm.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ _PUBLIC_ NTSTATUS cli_credentials_get_ntlm_response(struct cli_credentials *cred
DATA_BLOB lm_session_key = data_blob_null;
DATA_BLOB session_key = data_blob_null;
const struct samr_Password *nt_hash = NULL;
int rc;

if (cred->use_kerberos == CRED_MUST_USE_KERBEROS) {
TALLOC_FREE(frame);
Expand Down Expand Up @@ -159,7 +160,6 @@ _PUBLIC_ NTSTATUS cli_credentials_get_ntlm_response(struct cli_credentials *cred
uint8_t session_nonce[16];
uint8_t session_nonce_hash[16];
uint8_t user_session_key[16];
int rc;

lm_response = data_blob_talloc_zero(frame, 24);
if (lm_response.data == NULL) {
Expand Down Expand Up @@ -188,9 +188,13 @@ _PUBLIC_ NTSTATUS cli_credentials_get_ntlm_response(struct cli_credentials *cred
TALLOC_FREE(frame);
return NT_STATUS_NO_MEMORY;
}
SMBOWFencrypt(nt_hash->hash,
session_nonce_hash,
nt_response.data);
rc = SMBOWFencrypt(nt_hash->hash,
session_nonce_hash,
nt_response.data);
if (rc != 0) {
TALLOC_FREE(frame);
return gnutls_error_to_ntstatus(rc, NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}

ZERO_ARRAY(session_nonce_hash);

Expand Down Expand Up @@ -228,8 +232,12 @@ _PUBLIC_ NTSTATUS cli_credentials_get_ntlm_response(struct cli_credentials *cred
TALLOC_FREE(frame);
return NT_STATUS_NO_MEMORY;
}
SMBOWFencrypt(nt_hash->hash, challenge.data,
nt_response.data);
rc = SMBOWFencrypt(nt_hash->hash, challenge.data,
nt_response.data);
if (rc != 0) {
TALLOC_FREE(frame);
return gnutls_error_to_ntstatus(rc, NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}

session_key = data_blob_talloc_zero(frame, 16);
if (session_key.data == NULL) {
Expand All @@ -254,9 +262,14 @@ _PUBLIC_ NTSTATUS cli_credentials_get_ntlm_response(struct cli_credentials *cred
return NT_STATUS_NO_MEMORY;
}

SMBencrypt_hash(lm_hash,
challenge.data,
lm_response.data);
rc = SMBencrypt_hash(lm_hash,
challenge.data,
lm_response.data);
if (rc != 0) {
ZERO_STRUCT(lm_hash);
TALLOC_FREE(frame);
return gnutls_error_to_ntstatus(rc, NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}
} else {
/* just copy the nt_response */
lm_response = data_blob_dup_talloc(frame, nt_response);
Expand Down
6 changes: 5 additions & 1 deletion libcli/auth/ntlm_check.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ static bool smb_pwd_check_ntlmv1(TALLOC_CTX *mem_ctx,
{
/* Finish the encryption of part_passwd. */
uint8_t p24[24];
int rc;

if (part_passwd == NULL) {
DEBUG(10,("No password set - DISALLOWING access\n"));
Expand All @@ -55,7 +56,10 @@ static bool smb_pwd_check_ntlmv1(TALLOC_CTX *mem_ctx,
return false;
}

SMBOWFencrypt(part_passwd, sec_blob->data, p24);
rc = SMBOWFencrypt(part_passwd, sec_blob->data, p24);
if (rc != 0) {
return false;
}

#if DEBUG_PASSWORD
DEBUG(100,("Part password (P16) was |\n"));
Expand Down
10 changes: 5 additions & 5 deletions libcli/auth/proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ NTSTATUS sess_decrypt_blob(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, const DAT

/* The following definitions come from /home/jeremy/src/samba/git/master/source3/../source4/../libcli/auth/smbencrypt.c */

void SMBencrypt_hash(const uint8_t lm_hash[16], const uint8_t *c8, uint8_t p24[24]);
int SMBencrypt_hash(const uint8_t lm_hash[16], const uint8_t *c8, uint8_t p24[24]);
bool SMBencrypt(const char *passwd, const uint8_t *c8, uint8_t p24[24]);

/**
Expand Down Expand Up @@ -129,9 +129,9 @@ void nt_lm_owf_gen(const char *pwd, uint8_t nt_p16[16], uint8_t p16[16]);
bool ntv2_owf_gen(const uint8_t owf[16],
const char *user_in, const char *domain_in,
uint8_t kr_buf[16]);
void SMBOWFencrypt(const uint8_t passwd[16], const uint8_t *c8, uint8_t p24[24]);
void SMBNTencrypt_hash(const uint8_t nt_hash[16], const uint8_t *c8, uint8_t *p24);
void SMBNTencrypt(const char *passwd, const uint8_t *c8, uint8_t *p24);
int SMBOWFencrypt(const uint8_t passwd[16], const uint8_t *c8, uint8_t p24[24]);
int SMBNTencrypt_hash(const uint8_t nt_hash[16], const uint8_t *c8, uint8_t *p24);
int SMBNTencrypt(const char *passwd, const uint8_t *c8, uint8_t *p24);
NTSTATUS SMBOWFencrypt_ntv2(const uint8_t kr[16],
const DATA_BLOB *srv_chal,
const DATA_BLOB *smbcli_chal,
Expand Down Expand Up @@ -224,7 +224,7 @@ void des_crypt56(uint8_t out[8], const uint8_t in[8], const uint8_t key[7], int
int des_crypt56_gnutls(uint8_t out[8], const uint8_t in[8], const uint8_t key[7],
enum samba_gnutls_direction encrypt);
int E_P16(const uint8_t *p14,uint8_t *p16);
void E_P24(const uint8_t *p21, const uint8_t *c8, uint8_t *p24);
int E_P24(const uint8_t *p21, const uint8_t *c8, uint8_t *p24);
void E_old_pw_hash( uint8_t *p14, const uint8_t *in, uint8_t *out);
void des_crypt128(uint8_t out[8], const uint8_t in[8], const uint8_t key[16]);
void des_crypt112(uint8_t out[8], const uint8_t in[8], const uint8_t key[14], int forw);
Expand Down
18 changes: 14 additions & 4 deletions libcli/auth/smbdes.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,11 +374,21 @@ int E_P16(const uint8_t *p14,uint8_t *p16)
return des_crypt56_gnutls(p16+8, sp8, p14+7, SAMBA_GNUTLS_ENCRYPT);
}

void E_P24(const uint8_t *p21, const uint8_t *c8, uint8_t *p24)
int E_P24(const uint8_t *p21, const uint8_t *c8, uint8_t *p24)
{
des_crypt56(p24, c8, p21, 1);
des_crypt56(p24+8, c8, p21+7, 1);
des_crypt56(p24+16, c8, p21+14, 1);
int ret;

ret = des_crypt56_gnutls(p24, c8, p21, SAMBA_GNUTLS_ENCRYPT);
if (ret != 0) {
return ret;
}

ret = des_crypt56_gnutls(p24+8, c8, p21+7, SAMBA_GNUTLS_ENCRYPT);
if (ret != 0) {
return ret;
}

return des_crypt56_gnutls(p24+16, c8, p21+14, SAMBA_GNUTLS_ENCRYPT);
}

void E_old_pw_hash( uint8_t *p14, const uint8_t *in, uint8_t *out)
Expand Down
28 changes: 19 additions & 9 deletions libcli/auth/smbencrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,24 @@
#include <gnutls/gnutls.h>
#include <gnutls/crypto.h>

void SMBencrypt_hash(const uint8_t lm_hash[16], const uint8_t *c8, uint8_t p24[24])
int SMBencrypt_hash(const uint8_t lm_hash[16], const uint8_t *c8, uint8_t p24[24])
{
uint8_t p21[21];
int rc;

memset(p21,'\0',21);
memcpy(p21, lm_hash, 16);

SMBOWFencrypt(p21, c8, p24);
rc = SMBOWFencrypt(p21, c8, p24);

#ifdef DEBUG_PASSWORD
DEBUG(100,("SMBencrypt_hash: lm#, challenge, response\n"));
dump_data(100, p21, 16);
dump_data(100, c8, 8);
dump_data(100, p24, 24);
#endif

return rc;
}

/*
Expand All @@ -61,9 +64,13 @@ bool SMBencrypt(const char *passwd, const uint8_t *c8, uint8_t p24[24])
{
bool ret;
uint8_t lm_hash[16];
int rc;

ret = E_deshash(passwd, lm_hash);
SMBencrypt_hash(lm_hash, c8, p24);
rc = SMBencrypt_hash(lm_hash, c8, p24);
if (rc != 0) {
ret = false;
}
return ret;
}

Expand Down Expand Up @@ -266,41 +273,44 @@ bool ntv2_owf_gen(const uint8_t owf[16],
}

/* Does the des encryption from the NT or LM MD4 hash. */
void SMBOWFencrypt(const uint8_t passwd[16], const uint8_t *c8, uint8_t p24[24])
int SMBOWFencrypt(const uint8_t passwd[16], const uint8_t *c8, uint8_t p24[24])
{
uint8_t p21[21];

ZERO_STRUCT(p21);

memcpy(p21, passwd, 16);
E_P24(p21, c8, p24);
return E_P24(p21, c8, p24);
}

/* Does the des encryption. */

void SMBNTencrypt_hash(const uint8_t nt_hash[16], const uint8_t *c8, uint8_t *p24)
int SMBNTencrypt_hash(const uint8_t nt_hash[16], const uint8_t *c8, uint8_t *p24)
{
uint8_t p21[21];
int rc;

memset(p21,'\0',21);
memcpy(p21, nt_hash, 16);
SMBOWFencrypt(p21, c8, p24);
rc = SMBOWFencrypt(p21, c8, p24);

#ifdef DEBUG_PASSWORD
DEBUG(100,("SMBNTencrypt: nt#, challenge, response\n"));
dump_data(100, p21, 16);
dump_data(100, c8, 8);
dump_data(100, p24, 24);
#endif

return rc;
}

/* Does the NT MD4 hash then des encryption. Plaintext version of the above. */

void SMBNTencrypt(const char *passwd, const uint8_t *c8, uint8_t *p24)
int SMBNTencrypt(const char *passwd, const uint8_t *c8, uint8_t *p24)
{
uint8_t nt_hash[16];
E_md4hash(passwd, nt_hash);
SMBNTencrypt_hash(nt_hash, c8, p24);
return SMBNTencrypt_hash(nt_hash, c8, p24);
}


Expand Down
8 changes: 6 additions & 2 deletions libcli/auth/tests/test_gnutls.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,10 @@ static void torture_gnutls_E_P24(void **state)
};

uint8_t crypt[24];
int rc;

E_P24(key, c8, crypt);
rc = E_P24(key, c8, crypt);
assert_int_equal(rc, 0);
assert_memory_equal(crypt, crypt_expected, 24);
}

Expand All @@ -319,8 +321,10 @@ static void torture_gnutls_SMBOWFencrypt(void **state)
};

uint8_t crypt[24];
int rc;

SMBOWFencrypt(password, c8, crypt);
rc = SMBOWFencrypt(password, c8, crypt);
assert_int_equal(rc, 0);
assert_memory_equal(crypt, crypt_expected, 24);
}

Expand Down
19 changes: 14 additions & 5 deletions source3/auth/auth_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,20 +209,29 @@ bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
struct samr_Password nt_pwd;
unsigned char local_lm_response[24];
unsigned char local_nt_response[24];
int rc;

if (lm_interactive_pwd)
memcpy(lm_pwd.hash, lm_interactive_pwd, sizeof(lm_pwd.hash));

if (nt_interactive_pwd)
memcpy(nt_pwd.hash, nt_interactive_pwd, sizeof(nt_pwd.hash));

if (lm_interactive_pwd)
SMBOWFencrypt(lm_pwd.hash, chal,
local_lm_response);
if (lm_interactive_pwd) {
rc = SMBOWFencrypt(lm_pwd.hash, chal,
local_lm_response);
if (rc != 0) {
return false;
}
}

if (nt_interactive_pwd)
SMBOWFencrypt(nt_pwd.hash, chal,
if (nt_interactive_pwd) {
rc = SMBOWFencrypt(nt_pwd.hash, chal,
local_nt_response);
if (rc != 0) {
return false;
}
}

{
bool ret;
Expand Down
8 changes: 7 additions & 1 deletion source3/rpc_client/cli_netlogon.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "dbwrap/dbwrap.h"
#include "dbwrap/dbwrap_open.h"
#include "util_tdb.h"
#include "lib/crypto/gnutls_helpers.h"


NTSTATUS rpccli_pre_open_netlogon_creds(void)
Expand Down Expand Up @@ -528,6 +529,7 @@ NTSTATUS rpccli_netlogon_password_logon(
case NetlogonNetworkTransitiveInformation: {
struct netr_NetworkInfo *network_info;
uint8_t chal[8];
int rc;

ZERO_STRUCT(lm);
ZERO_STRUCT(nt);
Expand All @@ -541,7 +543,11 @@ NTSTATUS rpccli_netlogon_password_logon(
generate_random_buffer(chal, 8);

SMBencrypt(password, chal, local_lm_response);
SMBNTencrypt(password, chal, local_nt_response);
rc = SMBNTencrypt(password, chal, local_nt_response);
if (rc != 0) {
TALLOC_FREE(frame);
return gnutls_error_to_ntstatus(rc, NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}

lm.length = 24;
lm.data = local_lm_response;
Expand Down
9 changes: 7 additions & 2 deletions source3/torture/pdbtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,9 +278,14 @@ static bool test_auth(TALLOC_CTX *mem_ctx, struct samu *pdb_entry)
NTSTATUS status;
bool ok;
uint8_t authoritative = 0;
int rc;

rc = SMBOWFencrypt(pdb_get_nt_passwd(pdb_entry), challenge_8,
local_nt_response);
if (rc != 0) {
return False;
}

SMBOWFencrypt(pdb_get_nt_passwd(pdb_entry), challenge_8,
local_nt_response);
SMBsesskeygen_ntv1(pdb_get_nt_passwd(pdb_entry), local_nt_session_key);

if (tsocket_address_inet_from_strings(NULL, "ip", NULL, 0, &remote_address) != 0) {
Expand Down
9 changes: 8 additions & 1 deletion source3/winbindd/winbindd_pam.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "libads/krb5_errs.h"
#include "param/param.h"
#include "messaging/messaging.h"
#include "lib/crypto/gnutls_helpers.h"

#include "lib/crypto/gnutls_helpers.h"
#include <gnutls/crypto.h>
Expand Down Expand Up @@ -1792,8 +1793,14 @@ static NTSTATUS winbindd_dual_pam_auth_samlogon(
}
data_blob_free(&names_blob);
} else {
int rc;
lm_resp = data_blob_null;
SMBNTencrypt(pass, chal, local_nt_response);
rc = SMBNTencrypt(pass, chal, local_nt_response);
if (rc != 0) {
DEBUG(0, ("winbindd_pam_auth: SMBNTencrypt() failed!\n"));
result = gnutls_error_to_ntstatus(rc, NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
goto done;
}

nt_resp = data_blob_talloc(mem_ctx, local_nt_response,
sizeof(local_nt_response));
Expand Down
Loading

0 comments on commit a5548af

Please sign in to comment.