[SCM] Samba Shared Repository - branch master updated

Ralph Böhme slow at samba.org
Fri Aug 22 14:56:01 UTC 2025


The branch, master has been updated
       via  e20c64e14fb libsmb: Avoid smb-level encryption if quic is trusted
       via  f6292db0b35 libsmb: Add "smb_encryption_over_quic" to smb311_capabilities
       via  794b07516e2 param: Add "client smb encryption over quic"
       via  58982f9ca79 smbd: Don't request SMB-level encryption over trusted quic
       via  5e0dbd23452 smbd: Reply with SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY if we trust quic
       via  0286429fb9c smbd: Add the "server smb encryption over quic" parameter
       via  2a4ee224b9e smbd: Pass smbXsrv_connection to lp_server_smb_encrypt()
       via  e1d8227827b param: Fix whitespace
       via  5007dbbbc9d smbd: Switch from a != to a ==
       via  2d6899c03d9 smbd: Avoid an "else"
       via  c899a42f640 smbd: Modernize DEBUGs
       via  5f286b4a0ad smbd: Add a comment matching the other flags
       via  f1670643c1f smbd: Make a few encryption-related functions static to smbstatus
       via  171c584c675 smbd: Fix a typo
       via  073e82422dc smbd: Shed a nested if-expression
       via  8f116ab9ff7 docs: Fix "server smb encrypt" for SMB3+
       via  b0b3d039615 libsmb: Negotiate SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY over quic
       via  29e0d7be86e lib: tstream_tls_verify_peer_trusted()
       via  bd15054462b libcli: Add tls_verify_peer_state to smbXcli_transport
       via  0553b839f8e tls: Add tstream_tls_params_verify_peer()
       via  a881a76892d libcli: Introduce helper var in smbXcli_negprot_smb2_subreq()
      from  26065e1f1ee third_party:quic_ko_wrapper Fix compilation with clang-20

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


- Log -----------------------------------------------------------------
commit e20c64e14fbc6a478cf31e01cf33ae4abc19b1fe
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 21 12:17:55 2025 +0200

    libsmb: Avoid smb-level encryption if quic is trusted
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Ralph Böhme <slow at samba.org>
    Autobuild-Date(master): Fri Aug 22 14:55:47 UTC 2025 on atb-devel-224

commit f6292db0b359ee2a02bd54c404791a8f86c7ec8f
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 21 12:15:25 2025 +0200

    libsmb: Add "smb_encryption_over_quic" to smb311_capabilities
    
    Put here from the "client smb encryption over quic" settings
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 794b07516e2847a643f1cd14dceba3daf4a943c9
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 21 10:42:15 2025 +0200

    param: Add "client smb encryption over quic"
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 58982f9ca790d393f75b03f8bcf8e5a962d92cc5
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 18 17:13:59 2025 +0200

    smbd: Don't request SMB-level encryption over trusted quic
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 5e0dbd23452df0c4bd9b20462f3146723cd122b6
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Aug 8 12:06:13 2025 +0200

    smbd: Reply with SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY if we trust quic
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 0286429fb9c9992bb8835046db5e5e83315ccf74
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 14 15:32:12 2025 +0200

    smbd: Add the "server smb encryption over quic" parameter
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 2a4ee224b9e4afc423c2222a1e1d8444e67ee884
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 18 17:06:05 2025 +0200

    smbd: Pass smbXsrv_connection to lp_server_smb_encrypt()
    
    We'll modify the value of "server smb encrypt" when we have a trusted
    quic transport
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e1d8227827b58fcd2d5ebec5d4a12e11064400f9
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 18 16:25:38 2025 +0200

    param: Fix whitespace
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 5007dbbbc9d35c57a773cedd9882d5c33e60fbbf
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Aug 12 15:06:39 2025 +0200

    smbd: Switch from a != to a ==
    
    Simpler to read for me
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 2d6899c03d9d72caaacb790bc776510f860f255a
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 13 15:27:39 2025 +0200

    smbd: Avoid an "else"
    
    We return in the if-branch
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit c899a42f640ac7f26ca759b28ed17494efe73564
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 13 15:06:54 2025 +0200

    smbd: Modernize DEBUGs
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 5f286b4a0ad1b83f896ddf7893d52de0ad5bb458
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 13 13:55:42 2025 +0200

    smbd: Add a comment matching the other flags
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit f1670643c1f56b6085d7daa36727f5e2b81c9c87
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 11 17:02:52 2025 +0200

    smbd: Make a few encryption-related functions static to smbstatus
    
    Only referenced there, I got confused by them being part of smbd
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 171c584c67582c71efe0575b1f99f4667366de99
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 11 15:16:54 2025 +0200

    smbd: Fix a typo
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 073e82422dc84370a287fbd0f407f6661af0e0c2
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 11 15:12:31 2025 +0200

    smbd: Shed a nested if-expression
    
    Review with "git show -w". This is easier to read for me.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 8f116ab9ff7672cb42f5181f3aca4c6b0b837758
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 11 14:40:16 2025 +0200

    docs: Fix "server smb encrypt" for SMB3+
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit b0b3d039615f9e3a4bf6d585bf32d03e52214f13
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 7 12:35:23 2025 +0200

    libsmb: Negotiate SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY over quic
    
    If we trust quic, indicate to the server that we do so.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 29e0d7be86e640af9228aad145cc4bcf4372e1a2
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 7 08:56:08 2025 +0200

    lib: tstream_tls_verify_peer_trusted()
    
    We can only trust a tls connection if at connection setup we checked
    the certificates
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit bd15054462b12904c3c7583dbf5d01c7e82eec0d
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 4 14:59:15 2025 +0200

    libcli: Add tls_verify_peer_state to smbXcli_transport
    
    We have to carry a copy over from the tstream_tls_params used to
    connect, we can't get this information out once the tls-protected
    tstream is established
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 0553b839f8ed68ae13a98d276e1889093c6a6814
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 4 13:53:49 2025 +0200

    tls: Add tstream_tls_params_verify_peer()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit a881a76892dcc9b2ba30a32b4d11f2acb1ee135c
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 7 11:53:59 2025 +0200

    libcli: Introduce helper var in smbXcli_negprot_smb2_subreq()
    
    Saves a few bytes of code
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

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

Summary of changes:
 .../security/clientsmbencryptionoverquic.xml       |  40 ++++++
 docs-xml/smbdotconf/security/serversmbencrypt.xml  |   3 +-
 .../security/serversmbencryptionoverquic.xml       |  46 +++++++
 docs-xml/smbdotconf/security/smbencrypt.xml        |   2 +-
 lib/param/loadparm.c                               |   8 ++
 lib/param/param.h                                  |  16 +--
 libcli/smb/smb2_negotiate_context.h                |   9 +-
 libcli/smb/smbXcli_base.c                          | 139 ++++++++++++++++-----
 libcli/smb/smbXcli_base.h                          |  28 +++--
 libcli/smb/util.c                                  |   9 +-
 source3/librpc/idl/smbXsrv.idl                     |   6 +-
 source3/libsmb/clientgen.c                         |   6 +-
 source3/libsmb/smbsock_connect.c                   |  43 ++++---
 source3/param/loadparm.c                           |  21 +++-
 source3/param/loadparm.h                           |   3 +
 source3/smbd/globals.h                             |   6 +-
 source3/smbd/smb1_pipes.c                          |   6 +-
 source3/smbd/smb1_trans2.c                         |   2 +-
 source3/smbd/smb2_negprot.c                        |  45 ++++++-
 source3/smbd/smb2_process.c                        |  22 ++--
 source3/smbd/smb2_server.c                         |  40 +-----
 source3/smbd/smb2_service.c                        |  23 ++--
 source3/smbd/smb2_sesssetup.c                      |   4 +-
 source3/smbd/smb2_tcon.c                           |   4 +-
 source3/torture/torture.c                          |  15 ++-
 source3/utils/status.c                             |  32 +++++
 source4/lib/tls/tls.h                              |   3 +
 source4/lib/tls/tls_tstream.c                      |  21 ++++
 source4/param/loadparm.c                           |   6 +-
 source4/torture/smb2/multichannel.c                |   5 +-
 30 files changed, 453 insertions(+), 160 deletions(-)
 create mode 100644 docs-xml/smbdotconf/security/clientsmbencryptionoverquic.xml
 create mode 100644 docs-xml/smbdotconf/security/serversmbencryptionoverquic.xml


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/security/clientsmbencryptionoverquic.xml b/docs-xml/smbdotconf/security/clientsmbencryptionoverquic.xml
new file mode 100644
index 00000000000..a33a681ba48
--- /dev/null
+++ b/docs-xml/smbdotconf/security/clientsmbencryptionoverquic.xml
@@ -0,0 +1,40 @@
+<samba:parameter name="client smb encryption over quic"
+		 context="G"
+		 type="boolean"
+		 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+  <para>
+    This parameter controls whether the client requires SMB level
+    encryption even when the transport is already encrypted via QUIC
+    and thus TLS.
+  </para>
+  <para>
+    <parameter>client smb encrypt</parameter> controls the use of the
+    encryption mechanism introduced with SMB3.0. If <parameter>client
+    smb encryption over quic</parameter> value is set to
+    <emphasis>no</emphasis>, <emphasis>and</emphasis> the client
+    connects via a validated QUIC (and thus TLS) connection, the
+    client ignores the requirements from the parameter
+    <parameter>client smb encrypt</parameter> to avoid double
+    encryption.
+  </para>
+  <para>
+    If <parameter>client smb encryption over quic</parameter> is left
+    at its default <emphasis>yes</emphasis>, the client connects over
+    normal TCP, or the <parameter>tls verify peer</parameter> was set
+    to anything less than <constant>ca_and_name</constant>, the
+    requirements from <parameter>client smb encrypt</parameter> apply.
+  </para>
+  <para>
+    Note that the QUIC-layer encryption is based on a TLS-level
+    certificate presented by the server. The SMB-layer encryption is
+    based on individual user sessions and as such essentially on
+    initial user credentials such as the user's password or equivalent
+    credentials used for logging on to a Windows session. This might
+    influence your security assessment regarding the <parameter>client
+    smb encryption over quic</parameter> parameter.
+  </para>
+</description>
+
+<value type="default">yes</value>
+</samba:parameter>
diff --git a/docs-xml/smbdotconf/security/serversmbencrypt.xml b/docs-xml/smbdotconf/security/serversmbencrypt.xml
index 5f38b46419e..8a63de19b14 100644
--- a/docs-xml/smbdotconf/security/serversmbencrypt.xml
+++ b/docs-xml/smbdotconf/security/serversmbencrypt.xml
@@ -1,6 +1,7 @@
 <samba:parameter name="server smb encrypt"
 		 context="S"
 		 type="enum"
+		 function="_server_smb_encrypt"
 		 enumlist="enum_smb_encryption_vals"
 		 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
@@ -86,7 +87,7 @@
 		</varlistentry>
 
 		<varlistentry>
-		<term><emphasis>Effects for SMB2 and newer</emphasis></term>
+		<term><emphasis>Effects for SMB3.0 and newer</emphasis></term>
 		<listitem>
 		<para>
 		Native SMB transport encryption is available in SMB version 3.0
diff --git a/docs-xml/smbdotconf/security/serversmbencryptionoverquic.xml b/docs-xml/smbdotconf/security/serversmbencryptionoverquic.xml
new file mode 100644
index 00000000000..39b8f829ea5
--- /dev/null
+++ b/docs-xml/smbdotconf/security/serversmbencryptionoverquic.xml
@@ -0,0 +1,46 @@
+<samba:parameter name="server smb encryption over quic"
+		 context="G"
+		 type="boolean"
+		 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+  <para>
+    This parameter controls whether the SMB server requires SMB-level
+    encryption although the transport is encrypted via QUIC.
+  </para>
+  <para>
+    <parameter>server smb encrypt</parameter> controls the use of the
+    encryption mechanism introduced with SMB3.0. If <parameter>server
+    smb encryption over quic</parameter> value is set to
+    <emphasis>no</emphasis>, <emphasis>and</emphasis> the client
+    connects via a validated QUIC (and thus TLS) connection, the
+    server ignores the requirements from the parameter
+    <parameter>server smb encrypt</parameter> and accepts all
+    SMB-level packets inside the QUIC connection as encrypted in a
+    trustworthy way. This avoids costly double-encryption.
+  </para>
+  <para>
+    If <parameter>server smb encryption over
+    quic</parameter> is left at its default <emphasis>yes</emphasis>,
+    the client connects over normal TCP, or the client does not
+    indicate that it can trust the QUIC connection it uses, the
+    requirements from <parameter>server smb encrypt</parameter> apply.
+  </para>
+  <para>
+    Note that the QUIC-layer encryption is based on a TLS-level
+    certificate presented by the server. The SMB-layer encryption is
+    based on individual user sessions and as such essentially on
+    initial user credentials such as the user's password or equivalent
+    credentials used for logging on to a Windows session. This might
+    influence your security assessment regarding the <parameter>server
+    smb encryption over quic</parameter> parameter.
+  </para>
+  <para>
+    Windows has a similar SMB server setting with the
+    <parameter>DisableSmbEncryptionOnSecureConnection</parameter>
+    switch in the <command>Set-SmbServerConfiguration</command>
+    PowerShell commandlet.
+  </para>
+</description>
+
+<value type="default">yes</value>
+</samba:parameter>
diff --git a/docs-xml/smbdotconf/security/smbencrypt.xml b/docs-xml/smbdotconf/security/smbencrypt.xml
index 60271200c0a..2ce5e585adf 100644
--- a/docs-xml/smbdotconf/security/smbencrypt.xml
+++ b/docs-xml/smbdotconf/security/smbencrypt.xml
@@ -2,7 +2,7 @@
 		 context="S"
 		 type="enum"
 		 enumlist="enum_smb_encryption_vals"
-		 function="server_smb_encrypt"
+		 function="_server_smb_encrypt"
 		 synonym="1"
 		 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index d6553d89011..05b6ec48ac8 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -3289,6 +3289,14 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 				  "himmelblaud sfa fallback",
 				  "false");
 
+	lpcfg_do_global_parameter(lp_ctx,
+				  "server smb encryption over quic",
+				  "yes");
+
+	lpcfg_do_global_parameter(lp_ctx,
+				  "client smb encryption over quic",
+				  "yes");
+
 	for (i = 0; parm_table[i].label; i++) {
 		if (!(lp_ctx->flags[i] & FLAG_CMDLINE)) {
 			lp_ctx->flags[i] |= FLAG_DEFAULT;
diff --git a/lib/param/param.h b/lib/param/param.h
index ef678a1cbd6..ed10fa9e90d 100644
--- a/lib/param/param.h
+++ b/lib/param/param.h
@@ -1,24 +1,24 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    Generic parameter parsing interface
    Copyright (C) Jelmer Vernooij					  2005
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifndef _PARAM_H /* _PARAM_H */
-#define _PARAM_H 
+#define _PARAM_H
 
 #include <talloc.h>
 
@@ -205,7 +205,7 @@ bool lpcfg_is_my_domain_or_realm(struct loadparm_context *lp_ctx,
 			      const char *domain);
 
 /**
-  see if a string matches either our primary or one of our secondary 
+  see if a string matches either our primary or one of our secondary
   netbios aliases. do a case insensitive match
 */
 bool lpcfg_is_myname(struct loadparm_context *lp_ctx, const char *name);
@@ -253,10 +253,10 @@ char *lpcfg_private_db_path(TALLOC_CTX *mem_ctx,
 
 /**
   return a path in the smbd.tmp directory, where all temporary file
-  for smbd go. If NULL is passed for name then return the directory 
+  for smbd go. If NULL is passed for name then return the directory
   path itself
 */
-char *smbd_tmp_path(TALLOC_CTX *mem_ctx, 
+char *smbd_tmp_path(TALLOC_CTX *mem_ctx,
 			     struct loadparm_context *lp_ctx,
 			     const char *name);
 
diff --git a/libcli/smb/smb2_negotiate_context.h b/libcli/smb/smb2_negotiate_context.h
index 645fb64a377..7c061e4457b 100644
--- a/libcli/smb/smb2_negotiate_context.h
+++ b/libcli/smb/smb2_negotiate_context.h
@@ -71,14 +71,17 @@ struct smb3_encryption_capabilities {
 struct smb311_capabilities {
 	struct smb3_signing_capabilities signing;
 	struct smb3_encryption_capabilities encryption;
+	bool smb_encryption_over_quic;
 };
 
 const char *smb3_signing_algorithm_name(uint16_t algo);
 const char *smb3_encryption_algorithm_name(uint16_t algo);
 
-struct smb311_capabilities smb311_capabilities_parse(const char *role,
-				const char * const *signing_algos,
-				const char * const *encryption_algos);
+struct smb311_capabilities smb311_capabilities_parse(
+	const char *role,
+	const char *const *signing_algos,
+	const char *const *encryption_algos,
+	bool smb_encryption_over_quic);
 
 NTSTATUS smb311_capabilities_check(const struct smb311_capabilities *c,
 				   const char *debug_prefix,
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 8e5d6bf18c3..2389cf7c08b 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -51,6 +51,7 @@ struct smbXcli_transport {
 	struct smb_transport transport;
 	int sock_fd;
 	struct tstream_context *tstream;
+	enum tls_verify_peer_state verify_peer;
 	struct samba_sockaddr laddr;
 	struct samba_sockaddr raddr;
 
@@ -148,6 +149,7 @@ struct smbXcli_conn {
 			uint16_t security_mode;
 			struct GUID guid;
 			struct smb311_capabilities smb3_capabilities;
+			bool requested_transport_level_security;
 		} client;
 
 		struct {
@@ -163,6 +165,7 @@ struct smbXcli_conn {
 			uint16_t sign_algo;
 			uint16_t cipher;
 			bool smb311_posix;
+			bool transport_trusted;
 		} server;
 
 		uint64_t mid;
@@ -423,11 +426,13 @@ static int smbXcli_transport_tstream_monitor_recv(struct tevent_req *req)
 	return sys_errno;
 }
 
-struct smbXcli_transport *smbXcli_transport_tstream(TALLOC_CTX *mem_ctx,
-						    struct tstream_context **pstream,
-						    const struct samba_sockaddr *laddr,
-						    const struct samba_sockaddr *raddr,
-						    const struct smb_transport *tp)
+struct smbXcli_transport *smbXcli_transport_tstream(
+	TALLOC_CTX *mem_ctx,
+	struct tstream_context **pstream,
+	enum tls_verify_peer_state verify_peer,
+	const struct samba_sockaddr *laddr,
+	const struct samba_sockaddr *raddr,
+	const struct smb_transport *tp)
 {
 	struct smbXcli_transport *xtp = NULL;
 
@@ -438,6 +443,7 @@ struct smbXcli_transport *smbXcli_transport_tstream(TALLOC_CTX *mem_ctx,
 
 	xtp->transport = *tp;
 	xtp->sock_fd = -1;
+	xtp->verify_peer = verify_peer;
 
 	xtp->laddr = *laddr;
 	xtp->raddr = *raddr;
@@ -508,9 +514,11 @@ static int smbXcli_transport_bsd_monitor_recv(struct tevent_req *req)
 	return wait_for_error_recv(req);
 }
 
-struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx,
-						int *_fd,
-						const struct smb_transport *tp)
+struct smbXcli_transport *smbXcli_transport_bsd(
+	TALLOC_CTX *mem_ctx,
+	int *_fd,
+	enum tls_verify_peer_state verify_peer,
+	const struct smb_transport *tp)
 {
 	struct smbXcli_transport *xtp = NULL;
 	int fd = *_fd;
@@ -523,6 +531,7 @@ struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx,
 
 	xtp->transport = *tp;
 	xtp->sock_fd = fd;
+	xtp->verify_peer = verify_peer;
 
 	xtp->laddr.sa_socklen = sizeof(xtp->laddr.u);
 	ret = getsockname(fd, &xtp->laddr.u.sa, &xtp->laddr.sa_socklen);
@@ -557,9 +566,10 @@ struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx,
 }
 
 struct smbXcli_transport *smbXcli_transport_bsd_tstream(
-						TALLOC_CTX *mem_ctx,
-						int *fd,
-						const struct smb_transport *tp)
+	TALLOC_CTX *mem_ctx,
+	int *fd,
+	enum tls_verify_peer_state verify_peer,
+	const struct smb_transport *tp)
 {
 	struct samba_sockaddr laddr = {
 		.sa_socklen = sizeof(struct sockaddr_storage),
@@ -593,7 +603,8 @@ struct smbXcli_transport *smbXcli_transport_bsd_tstream(
 	*fd = -1;
 	tstream_bsd_optimize_readv(tstream, true);
 
-	xtp = smbXcli_transport_tstream(mem_ctx, &tstream, &laddr, &raddr, tp);
+	xtp = smbXcli_transport_tstream(
+		mem_ctx, &tstream, verify_peer, &laddr, &raddr, tp);
 	TALLOC_FREE(tstream);
 	return xtp;
 }
@@ -3567,6 +3578,14 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
 		}
 	}
 
+	if (conn->smb2.server.transport_trusted) {
+		/*
+		 * We as a client agreed with the server that quic
+		 * encryption is enough
+		 */
+		state->smb2.should_encrypt = false;
+	}
+
 	if (state->smb2.should_encrypt) {
 		state->smb2.should_sign = false;
 	}
@@ -5334,6 +5353,7 @@ static size_t smbXcli_padding_helper(uint32_t offset, size_t n)
 
 static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_state *state)
 {
+	struct smbXcli_conn *conn = state->conn;
 	size_t i;
 	uint8_t *buf;
 	uint16_t dialect_count = 0;
@@ -5343,11 +5363,11 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
 		bool ok;
 		uint8_t val[2];
 
-		if (smb2cli_prots[i].proto < state->conn->min_protocol) {
+		if (smb2cli_prots[i].proto < conn->min_protocol) {
 			continue;
 		}
 
-		if (smb2cli_prots[i].proto > state->conn->max_protocol) {
+		if (smb2cli_prots[i].proto > conn->max_protocol) {
 			continue;
 		}
 
@@ -5364,27 +5384,28 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
 	buf = state->smb2.fixed;
 	SSVAL(buf, 0, 36);
 	SSVAL(buf, 2, dialect_count);
-	SSVAL(buf, 4, state->conn->smb2.client.security_mode);
+	SSVAL(buf, 4, conn->smb2.client.security_mode);
 	SSVAL(buf, 6, 0);	/* Reserved */
-	if (state->conn->max_protocol >= PROTOCOL_SMB3_00) {
-		SIVAL(buf, 8, state->conn->smb2.client.capabilities);
+	if (conn->max_protocol >= PROTOCOL_SMB3_00) {
+		SIVAL(buf, 8, conn->smb2.client.capabilities);
 	} else {
 		SIVAL(buf, 8, 0); 	/* Capabilities */
 	}
-	if (state->conn->max_protocol >= PROTOCOL_SMB2_10) {
+	if (conn->max_protocol >= PROTOCOL_SMB2_10) {
 		struct GUID_ndr_buf guid_buf = { .buf = {0}, };
 
-		GUID_to_ndr_buf(&state->conn->smb2.client.guid, &guid_buf);
+		GUID_to_ndr_buf(&conn->smb2.client.guid, &guid_buf);
 		memcpy(buf+12, guid_buf.buf, 16); /* ClientGuid */
 	} else {
 		memset(buf+12, 0, 16);	/* ClientGuid */
 	}
 
-	if (state->conn->max_protocol >= PROTOCOL_SMB3_11) {
+	if (conn->max_protocol >= PROTOCOL_SMB3_11) {
 		const struct smb3_signing_capabilities *client_sign_algos =
-			&state->conn->smb2.client.smb3_capabilities.signing;
+			&conn->smb2.client.smb3_capabilities.signing;
 		const struct smb3_encryption_capabilities *client_ciphers =
-			&state->conn->smb2.client.smb3_capabilities.encryption;
+			&conn->smb2.client.smb3_capabilities.encryption;
+		enum tls_verify_peer_state verify_peer;
 		NTSTATUS status;
 		struct smb2_negotiate_contexts c = { .num_contexts = 0, };
 		uint8_t *netname_utf16 = NULL;
@@ -5445,10 +5466,38 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
 			}
 		}
 
-		ok = convert_string_talloc(state, CH_UNIX, CH_UTF16,
-					   state->conn->remote_name,
-					   strlen(state->conn->remote_name),
-					   &netname_utf16, &netname_utf16_len);
+		verify_peer = conn->transport->verify_peer;
+
+		if (tstream_tls_verify_peer_trusted(verify_peer) &&
+		    !conn->smb2.client.smb3_capabilities
+			     .smb_encryption_over_quic)
+		{
+			uint8_t cap_buf[sizeof(uint32_t)];
+
+			PUSH_LE_U32(cap_buf,
+				    0,
+				    SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY);
+
+			status = smb2_negotiate_context_add(
+				state,
+				&c,
+				SMB2_TRANSPORT_CAPABILITIES,
+				cap_buf,
+				sizeof(cap_buf));
+			if (!NT_STATUS_IS_OK(status)) {
+				return NULL;
+			}
+			conn->smb2.client
+				.requested_transport_level_security = true;
+		}
+
+		ok = convert_string_talloc(state,
+					   CH_UNIX,
+					   CH_UTF16,
+					   conn->remote_name,
+					   strlen(conn->remote_name),
+					   &netname_utf16,
+					   &netname_utf16_len);
 		if (!ok) {
 			return NULL;
 		}
@@ -5505,13 +5554,19 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
 		SBVAL(buf, 28, 0);	/* Reserved/ClientStartTime */
 	}
 
-	return smb2cli_req_send(state, state->ev,
-				state->conn, SMB2_OP_NEGPROT,
-				0, 0, /* flags */
+	return smb2cli_req_send(state,
+				state->ev,
+				conn,
+				SMB2_OP_NEGPROT,
+				0, /* additional_flags */
+				0, /* clear_flags */
 				state->timeout_msec,
-				NULL, NULL, /* tcon, session */
-				state->smb2.fixed, sizeof(state->smb2.fixed),
-				dyn.data, dyn.length,
+				NULL, /* tcon */
+				NULL, /* session */
+				state->smb2.fixed,
+				sizeof(state->smb2.fixed),
+				dyn.data,
+				dyn.length,
 				UINT16_MAX); /* max_dyn_len */
 }
 
@@ -5547,6 +5602,7 @@ static void smbXcli_negprot_smb2_done(struct tevent_req *subreq)
 	struct smb2_negotiate_context *sign_algo = NULL;
 	struct smb2_negotiate_context *cipher = NULL;
 	struct smb2_negotiate_context *posix = NULL;
+	struct smb2_negotiate_context *transport_caps = NULL;
 	struct iovec sent_iov[3] = {{0}, {0}, {0}};
 	static const struct smb2cli_req_expected_response expected[] = {
 	{
@@ -5914,6 +5970,25 @@ static void smbXcli_negprot_smb2_done(struct tevent_req *subreq)
 		conn->smb2.server.cipher = cipher_selected;
 	}
 
+	if (conn->smb2.client.requested_transport_level_security) {
+		transport_caps = smb2_negotiate_context_find(
+			state->out_ctx, SMB2_TRANSPORT_CAPABILITIES);
+	}
+	if (transport_caps != NULL) {
+		uint32_t caps;
+
+		if (transport_caps->data.length != sizeof(uint32_t)) {
+			tevent_req_nterror(req,
+					   NT_STATUS_INVALID_NETWORK_RESPONSE);
+			return;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list