b6b438
From c162d52b14947990fb6102180a7e2fd6a7d8d1d5 Mon Sep 17 00:00:00 2001
b6b438
From: Andreas Schneider <asn@samba.org>
b6b438
Date: Tue, 9 Jul 2019 13:11:54 +0200
b6b438
Subject: [PATCH 021/187] s4:libnet: Use encode_rc4_passwd_buffer() in
b6b438
 libnet_SetPassword_samr_handle_25()
b6b438
b6b438
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14031
b6b438
b6b438
Signed-off-by: Andreas Schneider <asn@samba.org>
b6b438
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
b6b438
(cherry picked from commit e44ba0397c7558e1da6a46cc38237a3b0e5cef49)
b6b438
---
b6b438
 source4/libnet/libnet_passwd.c | 43 +++++++---------------------------
b6b438
 1 file changed, 9 insertions(+), 34 deletions(-)
b6b438
b6b438
diff --git a/source4/libnet/libnet_passwd.c b/source4/libnet/libnet_passwd.c
b6b438
index 0beea077bd0..b2105121523 100644
b6b438
--- a/source4/libnet/libnet_passwd.c
b6b438
+++ b/source4/libnet/libnet_passwd.c
b6b438
@@ -331,10 +331,6 @@ static NTSTATUS libnet_SetPassword_samr_handle_25(struct libnet_context *ctx, TA
b6b438
 	struct samr_SetUserInfo2 sui;
b6b438
 	union samr_UserInfo u_info;
b6b438
 	DATA_BLOB session_key;
b6b438
-	DATA_BLOB confounded_session_key = data_blob_talloc(mem_ctx, NULL, 16);
b6b438
-	uint8_t confounder[16];	
b6b438
-	gnutls_hash_hd_t hash_hnd = NULL;
b6b438
-	int rc;
b6b438
 
b6b438
 	if (!r->samr_handle.in.info21) {
b6b438
 		return NT_STATUS_INVALID_PARAMETER_MIX;
b6b438
@@ -344,7 +340,6 @@ static NTSTATUS libnet_SetPassword_samr_handle_25(struct libnet_context *ctx, TA
b6b438
 	ZERO_STRUCT(u_info);
b6b438
 	u_info.info25.info = *r->samr_handle.in.info21;
b6b438
 	u_info.info25.info.fields_present |= SAMR_FIELD_NT_PASSWORD_PRESENT;
b6b438
-	encode_pw_buffer(u_info.info25.password.data, r->samr_handle.in.newpassword, STR_UNICODE);
b6b438
 
b6b438
 	status = dcerpc_fetch_session_key(r->samr_handle.in.dcerpc_pipe, &session_key);
b6b438
 	if (!NT_STATUS_IS_OK(status)) {
b6b438
@@ -354,36 +349,17 @@ static NTSTATUS libnet_SetPassword_samr_handle_25(struct libnet_context *ctx, TA
b6b438
 		return status;
b6b438
 	}
b6b438
 
b6b438
-	generate_random_buffer((uint8_t *)confounder, 16);
b6b438
-
b6b438
-	rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_MD5);
b6b438
-	if (rc < 0) {
b6b438
-		status = gnutls_error_to_ntstatus(rc, NT_STATUS_HASH_NOT_SUPPORTED);
b6b438
-		goto out;
b6b438
-	}
b6b438
-
b6b438
-	rc = gnutls_hash(hash_hnd, confounder, 16);
b6b438
-	if (rc < 0) {
b6b438
-		gnutls_hash_deinit(hash_hnd, NULL);
b6b438
-		status = gnutls_error_to_ntstatus(rc, NT_STATUS_HASH_NOT_SUPPORTED);
b6b438
-		goto out;
b6b438
-	}
b6b438
-	rc = gnutls_hash(hash_hnd, session_key.data, session_key.length);
b6b438
-	if (rc < 0) {
b6b438
-		gnutls_hash_deinit(hash_hnd, NULL);
b6b438
-		status = gnutls_error_to_ntstatus(rc, NT_STATUS_HASH_NOT_SUPPORTED);
b6b438
-		goto out;
b6b438
+	status = encode_rc4_passwd_buffer(r->samr_handle.in.newpassword,
b6b438
+					  &session_key,
b6b438
+					  &u_info.info25.password);
b6b438
+	if (!NT_STATUS_IS_OK(status)) {
b6b438
+		r->samr_handle.out.error_string =
b6b438
+			talloc_asprintf(mem_ctx,
b6b438
+					"encode_rc4_passwd_buffer failed: %s",
b6b438
+					nt_errstr(status));
b6b438
+		return status;
b6b438
 	}
b6b438
 
b6b438
-	gnutls_hash_deinit(hash_hnd, confounded_session_key.data);
b6b438
-
b6b438
-	arcfour_crypt_blob(u_info.info25.password.data, 516, &confounded_session_key);
b6b438
-	ZERO_ARRAY_LEN(confounded_session_key.data,
b6b438
-		       confounded_session_key.length);
b6b438
-	data_blob_free(&confounded_session_key);
b6b438
-
b6b438
-	memcpy(&u_info.info25.password.data[516], confounder, 16);
b6b438
-	ZERO_ARRAY(confounder);
b6b438
 
b6b438
 	sui.in.user_handle = r->samr_handle.in.user_handle;
b6b438
 	sui.in.info = &u_info;
b6b438
@@ -401,7 +377,6 @@ static NTSTATUS libnet_SetPassword_samr_handle_25(struct libnet_context *ctx, TA
b6b438
 					  r->samr_handle.in.account_name, nt_errstr(status));
b6b438
 	}
b6b438
 
b6b438
-out:
b6b438
 	return status;
b6b438
 }
b6b438
 
b6b438
-- 
b6b438
2.23.0
b6b438