[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Fri Sep 26 18:39:02 UTC 2025


The branch, master has been updated
       via  11299ccee30 lib:crypto: Use gnutls_cipher_decrypt3() if possible
       via  9742093bf3c lib:crypto: Use gnutls_cipher_encrypt3() if possible
      from  ebff8568d2a s3/rpc_server/samr: fix CID 1509008 - time_t truncation

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 11299ccee304e5632197506689ffbb282b7eb11f
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Sep 10 10:12:02 2025 +0200

    lib:crypto: Use gnutls_cipher_decrypt3() if possible
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
    Autobuild-Date(master): Fri Sep 26 18:38:57 UTC 2025 on atb-devel-224

commit 9742093bf3c3434cf2819d13429386780de8f174
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Sep 10 10:07:40 2025 +0200

    lib:crypto: Use gnutls_cipher_encrypt3() if possible
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/crypto/gnutls_aead_aes_256_cbc_hmac_sha512.c | 97 ++++++++++++++++++------
 wscript_configure_system_gnutls                  |  3 +
 2 files changed, 78 insertions(+), 22 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/crypto/gnutls_aead_aes_256_cbc_hmac_sha512.c b/lib/crypto/gnutls_aead_aes_256_cbc_hmac_sha512.c
index 2e37dcd23aa..97f09f827ba 100644
--- a/lib/crypto/gnutls_aead_aes_256_cbc_hmac_sha512.c
+++ b/lib/crypto/gnutls_aead_aes_256_cbc_hmac_sha512.c
@@ -108,8 +108,10 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 	uint8_t version_byte = SAMR_AES_VERSION_BYTE;
 	uint8_t version_byte_len = SAMR_AES_VERSION_BYTE_LEN;
 	uint8_t auth_data[hmac_size];
+#ifndef HAVE_GNUTLS_CIPHER_ENCRYPT3
 	DATA_BLOB padded_plaintext;
 	size_t padding;
+#endif
 	NTSTATUS status;
 	int rc;
 
@@ -124,16 +126,61 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	/*
-	 * PKCS#7 padding
-	 *
-	 * TODO: Use gnutls_cipher_encrypt3()
-	 */
-
 	if (plaintext->length + aes_block_size < plaintext->length) {
 		return NT_STATUS_INVALID_BUFFER_SIZE;
 	}
 
+	status = calculate_enc_key(cek, key_salt, enc_key_data);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	rc = gnutls_cipher_init(&cipher_hnd, cipher_algo, &enc_key, &iv_datum);
+	if (rc < 0) {
+		BURN_DATA(enc_key_data);
+		return gnutls_error_to_ntstatus(rc,
+						NT_STATUS_ENCRYPTION_FAILED);
+	}
+
+#ifdef HAVE_GNUTLS_CIPHER_ENCRYPT3
+	/* Figure out the size for the cipher text */
+	rc = gnutls_cipher_encrypt3(cipher_hnd,
+				    plaintext->data,
+				    plaintext->length,
+				    NULL,
+				    &cipher_text_len,
+				    GNUTLS_CIPHER_PADDING_PKCS7);
+	if (rc < 0) {
+		BURN_DATA(enc_key_data);
+		gnutls_cipher_deinit(cipher_hnd);
+		return gnutls_error_to_ntstatus(rc,
+						NT_STATUS_ENCRYPTION_FAILED);
+	}
+
+	cipher_text = talloc_size(mem_ctx, cipher_text_len);
+	if (cipher_text == NULL) {
+		BURN_DATA(enc_key_data);
+		gnutls_cipher_deinit(cipher_hnd);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	rc = gnutls_cipher_encrypt3(cipher_hnd,
+				    plaintext->data,
+				    plaintext->length,
+				    cipher_text,
+				    &cipher_text_len,
+				    GNUTLS_CIPHER_PADDING_PKCS7);
+	gnutls_cipher_deinit(cipher_hnd);
+	BURN_DATA(enc_key_data);
+	if (rc < 0) {
+		TALLOC_FREE(cipher_text);
+		return gnutls_error_to_ntstatus(rc,
+						NT_STATUS_ENCRYPTION_FAILED);
+	}
+#else /* HAVE_GNUTLS_CIPHER_ENCRYPT3 */
+	/*
+	 * PKCS#7 padding
+	 */
 	padded_plaintext.length =
 		aes_block_size * (plaintext->length / aes_block_size) +
 		aes_block_size;
@@ -143,6 +190,8 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 	padded_plaintext =
 		data_blob_talloc(mem_ctx, NULL, padded_plaintext.length);
 	if (padded_plaintext.data == NULL) {
+		BURN_DATA(enc_key_data);
+		gnutls_cipher_deinit(cipher_hnd);
 		return NT_STATUS_NO_MEMORY;
 	}
 
@@ -150,6 +199,8 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 	cipher_text_len = padded_plaintext.length;
 	cipher_text = talloc_size(mem_ctx, cipher_text_len);
 	if (cipher_text == NULL) {
+		BURN_DATA(enc_key_data);
+		gnutls_cipher_deinit(cipher_hnd);
 		data_blob_free(&padded_plaintext);
 		return NT_STATUS_NO_MEMORY;
 	}
@@ -157,22 +208,6 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 	memcpy(padded_plaintext.data, plaintext->data, plaintext->length);
 	memset(padded_plaintext.data + plaintext->length, padding, padding);
 
-	status = calculate_enc_key(cek, key_salt, enc_key_data);
-	if (!NT_STATUS_IS_OK(status)) {
-		data_blob_clear_free(&padded_plaintext);
-		return status;
-	}
-
-	/* Encrypt plaintext */
-	rc = gnutls_cipher_init(&cipher_hnd, cipher_algo, &enc_key, &iv_datum);
-	if (rc < 0) {
-		data_blob_clear_free(&padded_plaintext);
-		BURN_DATA(enc_key_data);
-		TALLOC_FREE(cipher_text);
-		return gnutls_error_to_ntstatus(rc,
-						NT_STATUS_ENCRYPTION_FAILED);
-	}
-
 	rc = gnutls_cipher_encrypt2(cipher_hnd,
 				    padded_plaintext.data,
 				    padded_plaintext.length,
@@ -186,6 +221,7 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_encrypt(TALLOC_CTX *mem_ctx,
 		return gnutls_error_to_ntstatus(rc,
 						NT_STATUS_ENCRYPTION_FAILED);
 	}
+#endif /* HAVE_GNUTLS_CIPHER_ENCRYPT3 */
 
 	/* Calculate mac key */
 	status = calculate_mac_key(cek, mac_salt, mac_key_data);
@@ -277,8 +313,10 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_decrypt(TALLOC_CTX *mem_ctx,
 	uint8_t version_byte = SAMR_AES_VERSION_BYTE;
 	uint8_t version_byte_len = SAMR_AES_VERSION_BYTE_LEN;
 	uint8_t auth_data[hmac_size];
+#ifndef HAVE_GNUTLS_CIPHER_ENCRYPT3
 	uint8_t padding;
 	size_t i;
+#endif
 	NTSTATUS status;
 	bool equal;
 	int rc;
@@ -355,6 +393,20 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_decrypt(TALLOC_CTX *mem_ctx,
 						NT_STATUS_DECRYPTION_FAILED);
 	}
 
+#ifdef HAVE_GNUTLS_CIPHER_ENCRYPT3
+	rc = gnutls_cipher_decrypt3(cipher_hnd,
+				    ciphertext->data,
+				    ciphertext->length,
+				    pplaintext->data,
+				    &pplaintext->length,
+				    GNUTLS_CIPHER_PADDING_PKCS7);
+	gnutls_cipher_deinit(cipher_hnd);
+	if (rc < 0) {
+		data_blob_clear_free(pplaintext);
+		return gnutls_error_to_ntstatus(rc,
+						NT_STATUS_DECRYPTION_FAILED);
+	}
+#else /* HAVE_GNUTLS_CIPHER_ENCRYPT3 */
 	rc = gnutls_cipher_decrypt2(cipher_hnd,
 				    ciphertext->data,
 				    ciphertext->length,
@@ -394,6 +446,7 @@ samba_gnutls_aead_aes_256_cbc_hmac_sha512_decrypt(TALLOC_CTX *mem_ctx,
 	}
 
 	pplaintext->length -= padding;
+#endif /* HAVE_GNUTLS_CIPHER_ENCRYPT3 */
 
 	return NT_STATUS_OK;
 }
diff --git a/wscript_configure_system_gnutls b/wscript_configure_system_gnutls
index 09c22ef5a9f..7c54a30e048 100644
--- a/wscript_configure_system_gnutls
+++ b/wscript_configure_system_gnutls
@@ -42,6 +42,9 @@ if (gnutls_version >= parse_version('3.7.2')):
       conf.msg('Defined HAVE_GNUTLS_CB_TLS_SERVER_END_POINT', '1')
       conf.DEFINE('HAVE_GNUTLS_CB_TLS_SERVER_END_POINT', 1)
 
+# This is available since 3.7.7
+conf.CHECK_FUNCS_IN('gnutls_cipher_encrypt3', 'gnutls')
+
 # Check if gnutls has fips mode support
 # gnutls_fips140_mode_enabled() is available since 3.3.0
 fragment = '''


-- 
Samba Shared Repository



More information about the samba-cvs mailing list