1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

smbdes: convert sam_rid_crypt() to use gnutls

Signed-off-by: Isaac Boukris <iboukris@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
Isaac Boukris 2019-11-07 18:40:03 +01:00 committed by Andrew Bartlett
parent bbcf568f31
commit ecee199803
5 changed files with 57 additions and 16 deletions

View File

@ -230,7 +230,8 @@ 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_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); void des_crypt112(uint8_t out[8], const uint8_t in[8], const uint8_t key[14], int forw);
void des_crypt112_16(uint8_t out[16], const uint8_t in[16], const uint8_t key[14], int forw); void des_crypt112_16(uint8_t out[16], const uint8_t in[16], const uint8_t key[14], int forw);
void sam_rid_crypt(unsigned int rid, const uint8_t *in, uint8_t *out, int forw); int sam_rid_crypt(unsigned int rid, const uint8_t *in, uint8_t *out,
enum samba_gnutls_direction encrypt);
#undef _PRINTF_ATTRIBUTE #undef _PRINTF_ATTRIBUTE
#define _PRINTF_ATTRIBUTE(a1, a2) #define _PRINTF_ATTRIBUTE(a1, a2)

View File

@ -418,15 +418,20 @@ void des_crypt112_16(uint8_t out[16], const uint8_t in[16], const uint8_t key[14
/* Decode a sam password hash into a password. The password hash is the /* Decode a sam password hash into a password. The password hash is the
same method used to store passwords in the NT registry. The DES key same method used to store passwords in the NT registry. The DES key
used is based on the RID of the user. */ used is based on the RID of the user. */
void sam_rid_crypt(unsigned int rid, const uint8_t *in, uint8_t *out, int forw) int sam_rid_crypt(unsigned int rid, const uint8_t *in, uint8_t *out,
enum samba_gnutls_direction encrypt)
{ {
uint8_t s[14]; uint8_t s[14];
int ret;
s[0] = s[4] = s[8] = s[12] = (uint8_t)(rid & 0xFF); s[0] = s[4] = s[8] = s[12] = (uint8_t)(rid & 0xFF);
s[1] = s[5] = s[9] = s[13] = (uint8_t)((rid >> 8) & 0xFF); s[1] = s[5] = s[9] = s[13] = (uint8_t)((rid >> 8) & 0xFF);
s[2] = s[6] = s[10] = (uint8_t)((rid >> 16) & 0xFF); s[2] = s[6] = s[10] = (uint8_t)((rid >> 16) & 0xFF);
s[3] = s[7] = s[11] = (uint8_t)((rid >> 24) & 0xFF); s[3] = s[7] = s[11] = (uint8_t)((rid >> 24) & 0xFF);
des_crypt56(out, in, s, forw); ret = des_crypt56_gnutls(out, in, s, encrypt);
des_crypt56(out+8, in+8, s+7, forw); if (ret != 0) {
return ret;
}
return des_crypt56_gnutls(out+8, in+8, s+7, encrypt);
} }

View File

@ -422,11 +422,14 @@ static void torture_gnutls_sam_rid_crypt(void **state)
uint8_t crypt[16]; uint8_t crypt[16];
uint8_t decrypt[16]; uint8_t decrypt[16];
int rid = 500; int rid = 500;
int rc;
sam_rid_crypt(rid, clear, crypt, 1); rc = sam_rid_crypt(rid, clear, crypt, SAMBA_GNUTLS_ENCRYPT);
assert_int_equal(rc, 0);
assert_memory_equal(crypt, crypt_expected, 16); assert_memory_equal(crypt, crypt_expected, 16);
sam_rid_crypt(rid, crypt, decrypt, 0); rc = sam_rid_crypt(rid, crypt, decrypt, SAMBA_GNUTLS_DECRYPT);
assert_int_equal(rc, 0);
assert_memory_equal(decrypt, clear, 16); assert_memory_equal(decrypt, clear, 16);
} }

View File

@ -135,7 +135,13 @@ static WERROR drsuapi_decrypt_attribute_value(TALLOC_CTX *mem_ctx,
num_hashes = plain_buffer.length / 16; num_hashes = plain_buffer.length / 16;
for (i = 0; i < num_hashes; i++) { for (i = 0; i < num_hashes; i++) {
uint32_t offset = i * 16; uint32_t offset = i * 16;
sam_rid_crypt(rid, checked_buffer.data + offset, plain_buffer.data + offset, 0); rc = sam_rid_crypt(rid, checked_buffer.data + offset,
plain_buffer.data + offset,
SAMBA_GNUTLS_DECRYPT);
if (rc != 0) {
result = gnutls_error_to_werror(rc, WERR_INTERNAL_ERROR);
goto out;
}
} }
} }
@ -255,7 +261,13 @@ static WERROR drsuapi_encrypt_attribute_value(TALLOC_CTX *mem_ctx,
num_hashes = rid_crypt_out.length / 16; num_hashes = rid_crypt_out.length / 16;
for (i = 0; i < num_hashes; i++) { for (i = 0; i < num_hashes; i++) {
uint32_t offset = i * 16; uint32_t offset = i * 16;
sam_rid_crypt(rid, in->data + offset, rid_crypt_out.data + offset, 1); rc = sam_rid_crypt(rid, in->data + offset,
rid_crypt_out.data + offset,
SAMBA_GNUTLS_ENCRYPT);
if (rc != 0) {
result = gnutls_error_to_werror(rc, WERR_INTERNAL_ERROR);
goto out;
}
} }
in = &rid_crypt_out; in = &rid_crypt_out;
} }

View File

@ -25,6 +25,7 @@
#include "../libcli/auth/libcli_auth.h" #include "../libcli/auth/libcli_auth.h"
#include "../libcli/samsync/samsync.h" #include "../libcli/samsync/samsync.h"
#include "librpc/gen_ndr/ndr_netlogon.h" #include "librpc/gen_ndr/ndr_netlogon.h"
#include "lib/crypto/gnutls_helpers.h"
/** /**
* Decrypt and extract the user's passwords. * Decrypt and extract the user's passwords.
@ -43,13 +44,19 @@ static NTSTATUS fix_user(TALLOC_CTX *mem_ctx,
struct netr_DELTA_USER *user = delta->delta_union.user; struct netr_DELTA_USER *user = delta->delta_union.user;
struct samr_Password lm_hash; struct samr_Password lm_hash;
struct samr_Password nt_hash; struct samr_Password nt_hash;
int rc;
/* Note that win2000 may send us all zeros /* Note that win2000 may send us all zeros
* for the hashes if it doesn't * for the hashes if it doesn't
* think this channel is secure enough. */ * think this channel is secure enough. */
if (user->lm_password_present) { if (user->lm_password_present) {
if (!all_zero(user->lmpassword.hash, 16)) { if (!all_zero(user->lmpassword.hash, 16)) {
sam_rid_crypt(rid, user->lmpassword.hash, lm_hash.hash, 0); rc = sam_rid_crypt(rid, user->lmpassword.hash,
lm_hash.hash, SAMBA_GNUTLS_DECRYPT);
if (rc != 0) {
return gnutls_error_to_ntstatus(rc,
NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}
} else { } else {
memset(lm_hash.hash, '\0', sizeof(lm_hash.hash)); memset(lm_hash.hash, '\0', sizeof(lm_hash.hash));
} }
@ -58,7 +65,12 @@ static NTSTATUS fix_user(TALLOC_CTX *mem_ctx,
if (user->nt_password_present) { if (user->nt_password_present) {
if (!all_zero(user->ntpassword.hash, 16)) { if (!all_zero(user->ntpassword.hash, 16)) {
sam_rid_crypt(rid, user->ntpassword.hash, nt_hash.hash, 0); rc = sam_rid_crypt(rid, user->ntpassword.hash,
nt_hash.hash, SAMBA_GNUTLS_DECRYPT);
if (rc != 0) {
return gnutls_error_to_ntstatus(rc,
NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}
} else { } else {
memset(nt_hash.hash, '\0', sizeof(nt_hash.hash)); memset(nt_hash.hash, '\0', sizeof(nt_hash.hash));
} }
@ -97,9 +109,13 @@ static NTSTATUS fix_user(TALLOC_CTX *mem_ctx,
if (keys.keys.keys2.lmpassword.length == 16) { if (keys.keys.keys2.lmpassword.length == 16) {
if (!all_zero(keys.keys.keys2.lmpassword.pwd.hash, if (!all_zero(keys.keys.keys2.lmpassword.pwd.hash,
16)) { 16)) {
sam_rid_crypt(rid, rc = sam_rid_crypt(rid,
keys.keys.keys2.lmpassword.pwd.hash, keys.keys.keys2.lmpassword.pwd.hash,
lm_hash.hash, 0); lm_hash.hash, SAMBA_GNUTLS_DECRYPT);
if (rc != 0) {
return gnutls_error_to_ntstatus(rc,
NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}
} else { } else {
memset(lm_hash.hash, '\0', sizeof(lm_hash.hash)); memset(lm_hash.hash, '\0', sizeof(lm_hash.hash));
} }
@ -109,9 +125,13 @@ static NTSTATUS fix_user(TALLOC_CTX *mem_ctx,
if (keys.keys.keys2.ntpassword.length == 16) { if (keys.keys.keys2.ntpassword.length == 16) {
if (!all_zero(keys.keys.keys2.ntpassword.pwd.hash, if (!all_zero(keys.keys.keys2.ntpassword.pwd.hash,
16)) { 16)) {
sam_rid_crypt(rid, rc = sam_rid_crypt(rid,
keys.keys.keys2.ntpassword.pwd.hash, keys.keys.keys2.ntpassword.pwd.hash,
nt_hash.hash, 0); nt_hash.hash, SAMBA_GNUTLS_DECRYPT);
if (rc != 0) {
return gnutls_error_to_ntstatus(rc,
NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER);
}
} else { } else {
memset(nt_hash.hash, '\0', sizeof(nt_hash.hash)); memset(nt_hash.hash, '\0', sizeof(nt_hash.hash));
} }