The branch, master has been updated
       via  23e5b7cc79b s4:torture: Add rpc netlogon fips test
       via  f1df0c4d0ad s4:torture: Remove trailing whitespaces in rpc.c
       via  fd5b315805c s4:selftest: Pass environ to plansmbtorture4testsuite()
       via  e8a2c2fe4e7 selftest: Fix setting environ for 
plansmbtorture4testsuite()
       via  d6c7a2a7003 netlogon:schannel: If weak crypto is disabled, do not 
announce RC4 support.
       via  17cc20ebe60 s4:libnet: Allow libnet_SetPassword() for encrypted SMB 
connections
       via  1326e7d65d1 s4:libnet: Remove trailing whitespaces
       via  868a9577d6a s4:rpc_server: Allow to set user password in FIPS mode
       via  2daf3e79751 auth:gensec: Use lpcfg_weak_crypto()
      from  6d928eb1e8e smbd: only open full fd for directories if needed

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


- Log -----------------------------------------------------------------
commit 23e5b7cc79b006ae9260d3723e6c44ad66589382
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Jul 26 10:18:05 2021 +0200

    s4:torture: Add rpc netlogon fips test
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    
    Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date(master): Tue Aug  3 10:18:26 UTC 2021 on sn-devel-184

commit f1df0c4d0ad43ed1726ba961810078059b990be3
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Jul 26 10:17:38 2021 +0200

    s4:torture: Remove trailing whitespaces in rpc.c
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit fd5b315805c6c1a4af64e9db57771d864f631207
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jul 28 11:57:02 2021 +0200

    s4:selftest: Pass environ to plansmbtorture4testsuite()
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit e8a2c2fe4e75c2e6a690ea75045942ec9730c5dc
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jul 28 11:56:12 2021 +0200

    selftest: Fix setting environ for plansmbtorture4testsuite()
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit d6c7a2a7003a2c081aa1ed710a84941bc8f331bf
Author: Andreas Schneider <a...@samba.org>
Date:   Thu Sep 3 15:58:56 2020 +0200

    netlogon:schannel: If weak crypto is disabled, do not announce RC4 support.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 17cc20ebe602b619461efa215ac75fed8e0d6338
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Jul 26 10:13:52 2021 +0200

    s4:libnet: Allow libnet_SetPassword() for encrypted SMB connections
    
    This is needed for smbtorture to join a domain in FIPS mode.
    
    FYI: The correct way would be to join using LDAP as the s3 code is doing 
it. But
    this requires a bigger rewrite.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 1326e7d65d1feff53303df35b2d641660a5babc0
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Jul 26 10:12:56 2021 +0200

    s4:libnet: Remove trailing whitespaces
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 868a9577d6a1da6d1aa1738adaa541038ec3c1cd
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Jul 26 10:02:13 2021 +0200

    s4:rpc_server: Allow to set user password in FIPS mode
    
    Only in case we have an SMB encrypted connection ...
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 2daf3e79751d11a31a1e44d21b70517356301ee7
Author: Andreas Schneider <a...@samba.org>
Date:   Fri Apr 23 16:32:27 2021 +0200

    auth:gensec: Use lpcfg_weak_crypto()
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

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

Summary of changes:
 auth/gensec/gensec_start.c                    |   5 +-
 libcli/auth/netlogon_creds_cli.c              |  12 ++
 selftest/selftesthelpers.py                   |   3 +-
 source3/rpc_server/netlogon/srv_netlog_nt.c   |   7 +
 source4/libnet/libnet_passwd.c                |  75 ++++---
 source4/librpc/rpc/dcerpc_schannel.c          |   5 +
 source4/rpc_server/netlogon/dcerpc_netlogon.c |   9 +
 source4/rpc_server/samr/samr_password.c       |  12 ++
 source4/selftest/tests.py                     |  26 ++-
 source4/torture/rpc/netlogon_crypto.c         | 274 ++++++++++++++++++++++++++
 source4/torture/rpc/rpc.c                     |  77 ++++----
 source4/torture/wscript_build                 |   1 +
 12 files changed, 438 insertions(+), 68 deletions(-)
 create mode 100644 source4/torture/rpc/netlogon_crypto.c


Changeset truncated at 500 lines:

diff --git a/auth/gensec/gensec_start.c b/auth/gensec/gensec_start.c
index 906e3ee302c..bd5b7259d3f 100644
--- a/auth/gensec/gensec_start.c
+++ b/auth/gensec/gensec_start.c
@@ -29,10 +29,10 @@
 #include "auth/gensec/gensec.h"
 #include "auth/gensec/gensec_internal.h"
 #include "lib/param/param.h"
+#include "lib/param/loadparm.h"
 #include "lib/util/tsort.h"
 #include "lib/util/samba_modules.h"
 #include "lib/util/base64.h"
-#include "lib/crypto/gnutls_helpers.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_AUTH
@@ -51,7 +51,8 @@ bool gensec_security_ops_enabled(const struct 
gensec_security_ops *ops, struct g
                                  ops->name,
                                  ops->enabled);
 
-       if (!samba_gnutls_weak_crypto_allowed() && ops->weak_crypto) {
+       if (ops->weak_crypto &&
+           lpcfg_weak_crypto(security->settings->lp_ctx) != 
SAMBA_WEAK_CRYPTO_ALLOWED) {
                ok = false;
        }
 
diff --git a/libcli/auth/netlogon_creds_cli.c b/libcli/auth/netlogon_creds_cli.c
index 12cb3149ff6..e78bc173968 100644
--- a/libcli/auth/netlogon_creds_cli.c
+++ b/libcli/auth/netlogon_creds_cli.c
@@ -39,6 +39,7 @@
 #include "libds/common/roles.h"
 #include "lib/crypto/md4.h"
 #include "auth/credentials/credentials.h"
+#include "lib/param/loadparm.h"
 
 struct netlogon_creds_cli_locked_state;
 
@@ -414,6 +415,17 @@ NTSTATUS netlogon_creds_cli_context_global(struct 
loadparm_context *lp_ctx,
                required_flags |= NETLOGON_NEG_AUTHENTICATED_RPC;
        }
 
+       /*
+        * If weak crypto is disabled, do not announce that we support RC4 and
+        * require AES.
+        */
+       if (lpcfg_weak_crypto(lp_ctx) == SAMBA_WEAK_CRYPTO_DISALLOWED) {
+               required_flags &= ~NETLOGON_NEG_ARCFOUR;
+               required_flags |= NETLOGON_NEG_SUPPORTS_AES;
+               proposed_flags &= ~NETLOGON_NEG_ARCFOUR;
+               proposed_flags |= NETLOGON_NEG_SUPPORTS_AES;
+       }
+
        proposed_flags |= required_flags;
 
        if (seal_secure_channel) {
diff --git a/selftest/selftesthelpers.py b/selftest/selftesthelpers.py
index 542737dbd10..0320008faf9 100644
--- a/selftest/selftesthelpers.py
+++ b/selftest/selftesthelpers.py
@@ -201,7 +201,8 @@ def plansmbtorture4testsuite(name, env, options, target, 
modname=None, environ={
     cmdline = ""
     if environ:
         environ = dict(environ)
-        cmdline = ["%s=%s" % item for item in environ.items()]
+        cmdline_env = ["%s=%s" % item for item in environ.items()]
+        cmdline += " ".join(cmdline_env) + " "
     cmdline += " %s $LISTOPT $LOADLIST %s %s" % (valgrindify(smbtorture4), 
options, name)
     plantestsuite_loadlist(modname, env, cmdline)
 
diff --git a/source3/rpc_server/netlogon/srv_netlog_nt.c 
b/source3/rpc_server/netlogon/srv_netlog_nt.c
index eaacd8dbc6a..51a5663b9da 100644
--- a/source3/rpc_server/netlogon/srv_netlog_nt.c
+++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
@@ -910,6 +910,13 @@ NTSTATUS _netr_ServerAuthenticate3(struct pipes_struct *p,
                            NETLOGON_NEG_NEUTRALIZE_NT4_EMULATION;
        }
 
+       /*
+        * If weak cryto is disabled, do not announce that we support RC4.
+        */
+       if (lp_weak_crypto() == SAMBA_WEAK_CRYPTO_DISALLOWED) {
+               srv_flgs &= ~NETLOGON_NEG_ARCFOUR;
+       }
+
        switch (p->opnum) {
                case NDR_NETR_SERVERAUTHENTICATE:
                        fn = "_netr_ServerAuthenticate";
diff --git a/source4/libnet/libnet_passwd.c b/source4/libnet/libnet_passwd.c
index 868f9442cd0..2bb7e392bd8 100644
--- a/source4/libnet/libnet_passwd.c
+++ b/source4/libnet/libnet_passwd.c
@@ -1,19 +1,19 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
-   
+
    Copyright (C) Stefan Metzmacher     2004
    Copyright (C) Andrew Bartlett <abart...@samba.org> 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/>.
 */
@@ -23,6 +23,8 @@
 #include "libcli/auth/libcli_auth.h"
 #include "librpc/gen_ndr/ndr_samr_c.h"
 #include "source4/librpc/rpc/dcerpc.h"
+#include "auth/credentials/credentials.h"
+#include "libcli/smb/smb_constants.h"
 
 #include "lib/crypto/gnutls_helpers.h"
 #include <gnutls/gnutls.h>
@@ -245,7 +247,7 @@ static NTSTATUS libnet_ChangePassword_samr(struct 
libnet_context *ctx, TALLOC_CT
                if (!NT_STATUS_IS_OK(status)) {
                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
                                                                   
"samr_ChangePasswordUser2 for '%s\\%s' failed: %s",
-                                                                  
r->samr.in.domain_name, r->samr.in.account_name, 
+                                                                  
r->samr.in.domain_name, r->samr.in.account_name,
                                                                   
nt_errstr(status));
                }
                goto disconnect;
@@ -296,7 +298,7 @@ static NTSTATUS libnet_ChangePassword_samr(struct 
libnet_context *ctx, TALLOC_CT
                if (!NT_STATUS_IS_OK(oe2.out.result)) {
                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
                                                                   
"samr_OemChangePasswordUser2 for '%s\\%s' failed: %s",
-                                                                  
r->samr.in.domain_name, r->samr.in.account_name, 
+                                                                  
r->samr.in.domain_name, r->samr.in.account_name,
                                                                   
nt_errstr(status));
                }
                goto disconnect;
@@ -337,7 +339,7 @@ static NTSTATUS libnet_ChangePassword_samr(struct 
libnet_context *ctx, TALLOC_CT
        if (!NT_STATUS_IS_OK(pw.out.result)) {
                r->samr.out.error_string = talloc_asprintf(mem_ctx,
                                                "samr_ChangePasswordUser for 
'%s\\%s' failed: %s",
-                                               r->samr.in.domain_name, 
r->samr.in.account_name, 
+                                               r->samr.in.domain_name, 
r->samr.in.account_name,
                                                nt_errstr(pw.out.result));
                if (NT_STATUS_EQUAL(pw.out.result, 
NT_STATUS_PASSWORD_RESTRICTION)) {
                        status = pw.out.result;
@@ -426,7 +428,7 @@ static NTSTATUS libnet_SetPassword_samr_handle_26(struct 
libnet_context *ctx, TA
        sui.in.user_handle = r->samr_handle.in.user_handle;
        sui.in.info = &u_info;
        sui.in.level = 26;
-       
+
        /* 7. try samr_SetUserInfo2 level 26 to set the password */
        status = 
dcerpc_samr_SetUserInfo2_r(r->samr_handle.in.dcerpc_pipe->binding_handle, 
mem_ctx, &sui);
        /* check result of samr_SetUserInfo2 level 26 */
@@ -671,7 +673,7 @@ static NTSTATUS libnet_SetPassword_samr_handle(struct 
libnet_context *ctx, TALLO
                }
                break;
        }
-       
+
        return status;
 }
 /*
@@ -707,7 +709,7 @@ static NTSTATUS libnet_SetPassword_samr(struct 
libnet_context *ctx, TALLOC_CTX *
        c.level               = LIBNET_RPC_CONNECT_PDC;
        c.in.name             = r->samr.in.domain_name;
        c.in.dcerpc_iface     = &ndr_table_samr;
-       
+
        /* 1. connect to the SAMR pipe of users domain PDC (maybe a standalone 
server or workstation) */
        status = libnet_RpcConnect(ctx, mem_ctx, &c);
        if (!NT_STATUS_IS_OK(status)) {
@@ -802,7 +804,7 @@ static NTSTATUS libnet_SetPassword_samr(struct 
libnet_context *ctx, TALLOC_CTX *
                                                "samr_LookupNames for [%s] 
returns %d RIDs",
                                                r->samr.in.account_name, 
ln.out.rids->count);
                status = NT_STATUS_INVALID_NETWORK_RESPONSE;
-               goto disconnect;        
+               goto disconnect;
        }
 
        if (ln.out.types->count != 1) {
@@ -870,28 +872,55 @@ static NTSTATUS libnet_SetPassword_generic(struct 
libnet_context *ctx, TALLOC_CT
 
 NTSTATUS libnet_SetPassword(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, 
union libnet_SetPassword *r)
 {
+       enum smb_encryption_setting encryption_state =
+               cli_credentials_get_smb_encryption(ctx->cred);
+       NTSTATUS status =  NT_STATUS_INVALID_LEVEL;
+
        switch (r->generic.level) {
                case LIBNET_SET_PASSWORD_GENERIC:
-                       return libnet_SetPassword_generic(ctx, mem_ctx, r);
+                       status = libnet_SetPassword_generic(ctx, mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR:
-                       return libnet_SetPassword_samr(ctx, mem_ctx, r);
+                       status = libnet_SetPassword_samr(ctx, mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR_HANDLE:
-                       return libnet_SetPassword_samr_handle(ctx, mem_ctx, r);
+                       status = libnet_SetPassword_samr_handle(ctx, mem_ctx, 
r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR_HANDLE_26:
-                       return libnet_SetPassword_samr_handle_26(ctx, mem_ctx, 
r);
+                       if (encryption_state == SMB_ENCRYPTION_REQUIRED) {
+                               GNUTLS_FIPS140_SET_LAX_MODE();
+                       }
+                       status = libnet_SetPassword_samr_handle_26(ctx, 
mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR_HANDLE_25:
-                       return libnet_SetPassword_samr_handle_25(ctx, mem_ctx, 
r);
+                       if (encryption_state == SMB_ENCRYPTION_REQUIRED) {
+                               GNUTLS_FIPS140_SET_LAX_MODE();
+                       }
+                       status = libnet_SetPassword_samr_handle_25(ctx, 
mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR_HANDLE_24:
-                       return libnet_SetPassword_samr_handle_24(ctx, mem_ctx, 
r);
+                       if (encryption_state == SMB_ENCRYPTION_REQUIRED) {
+                               GNUTLS_FIPS140_SET_LAX_MODE();
+                       }
+                       status = libnet_SetPassword_samr_handle_24(ctx, 
mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_SAMR_HANDLE_23:
-                       return libnet_SetPassword_samr_handle_23(ctx, mem_ctx, 
r);
+                       if (encryption_state == SMB_ENCRYPTION_REQUIRED) {
+                               GNUTLS_FIPS140_SET_LAX_MODE();
+                       }
+                       status = libnet_SetPassword_samr_handle_23(ctx, 
mem_ctx, r);
+                       break;
                case LIBNET_SET_PASSWORD_KRB5:
-                       return NT_STATUS_NOT_IMPLEMENTED;
+                       status = NT_STATUS_NOT_IMPLEMENTED;
+                       break;
                case LIBNET_SET_PASSWORD_LDAP:
-                       return NT_STATUS_NOT_IMPLEMENTED;
+                       status = NT_STATUS_NOT_IMPLEMENTED;
+                       break;
                case LIBNET_SET_PASSWORD_RAP:
-                       return NT_STATUS_NOT_IMPLEMENTED;
+                       status = NT_STATUS_NOT_IMPLEMENTED;
+                       break;
        }
 
-       return NT_STATUS_INVALID_LEVEL;
+       GNUTLS_FIPS140_SET_STRICT_MODE();
+       return status;
 }
diff --git a/source4/librpc/rpc/dcerpc_schannel.c 
b/source4/librpc/rpc/dcerpc_schannel.c
index d12647222eb..68bc3b34e24 100644
--- a/source4/librpc/rpc/dcerpc_schannel.c
+++ b/source4/librpc/rpc/dcerpc_schannel.c
@@ -31,6 +31,7 @@
 #include "auth/credentials/credentials.h"
 #include "librpc/rpc/dcerpc_proto.h"
 #include "param/param.h"
+#include "lib/param/loadparm.h"
 
 struct schannel_key_state {
        struct dcerpc_pipe *pipe;
@@ -346,6 +347,10 @@ static struct composite_context 
*dcerpc_schannel_key_send(TALLOC_CTX *mem_ctx,
                s->local_negotiate_flags |= NETLOGON_NEG_RODC_PASSTHROUGH;
        }
 
+       if (lpcfg_weak_crypto(lp_ctx) == SAMBA_WEAK_CRYPTO_DISALLOWED) {
+               s->local_negotiate_flags &= ~NETLOGON_NEG_ARCFOUR;
+       }
+
        epm_creds = cli_credentials_init_anon(s);
        if (composite_nomem(epm_creds, c)) return c;
 
diff --git a/source4/rpc_server/netlogon/dcerpc_netlogon.c 
b/source4/rpc_server/netlogon/dcerpc_netlogon.c
index c87375c16a5..6860202a985 100644
--- a/source4/rpc_server/netlogon/dcerpc_netlogon.c
+++ b/source4/rpc_server/netlogon/dcerpc_netlogon.c
@@ -44,6 +44,7 @@
 #include "lib/socket/netif.h"
 #include "rpc_server/common/sid_helper.h"
 #include "lib/util/util_str_escape.h"
+#include "lib/param/loadparm.h"
 
 #define DCESRV_INTERFACE_NETLOGON_BIND(context, iface) \
        dcesrv_interface_netlogon_bind(context, iface)
@@ -223,6 +224,14 @@ static NTSTATUS dcesrv_netr_ServerAuthenticate3_helper(
                       NETLOGON_NEG_AUTHENTICATED_RPC_LSASS |
                       NETLOGON_NEG_AUTHENTICATED_RPC;
 
+       /*
+        * If weak cryto is disabled, do not announce that we support RC4.
+        */
+       if (lpcfg_weak_crypto(dce_call->conn->dce_ctx->lp_ctx) ==
+           SAMBA_WEAK_CRYPTO_DISALLOWED) {
+               server_flags &= ~NETLOGON_NEG_ARCFOUR;
+       }
+
        negotiate_flags = *r->in.negotiate_flags & server_flags;
 
        if (negotiate_flags & NETLOGON_NEG_STRONG_KEYS) {
diff --git a/source4/rpc_server/samr/samr_password.c 
b/source4/rpc_server/samr/samr_password.c
index 83b104fbd0e..0f5a6d0f820 100644
--- a/source4/rpc_server/samr/samr_password.c
+++ b/source4/rpc_server/samr/samr_password.c
@@ -702,6 +702,9 @@ NTSTATUS samr_set_password_ex(struct dcesrv_call_state 
*dce_call,
                              TALLOC_CTX *mem_ctx,
                              struct samr_CryptPasswordEx *pwbuf)
 {
+       struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;
+       struct auth_session_info *session_info =
+               dcesrv_call_session_info(dce_call);
        NTSTATUS nt_status;
        DATA_BLOB new_password;
 
@@ -710,6 +713,7 @@ NTSTATUS samr_set_password_ex(struct dcesrv_call_state 
*dce_call,
        DATA_BLOB pw_data = data_blob_const(pwbuf->data, 516);
        DATA_BLOB session_key = data_blob(NULL, 0);
        int rc;
+       bool encrypted;
 
        nt_status = dcesrv_transport_session_key(dce_call, &session_key);
        if (!NT_STATUS_IS_OK(nt_status)) {
@@ -719,10 +723,18 @@ NTSTATUS samr_set_password_ex(struct dcesrv_call_state 
*dce_call,
                return NT_STATUS_WRONG_PASSWORD;
        }
 
+       encrypted = dcerpc_is_transport_encrypted(session_info);
+       if (lpcfg_weak_crypto(lp_ctx) == SAMBA_WEAK_CRYPTO_DISALLOWED &&
+           !encrypted) {
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
+       GNUTLS_FIPS140_SET_LAX_MODE();
        rc = samba_gnutls_arcfour_confounded_md5(&confounder,
                                                 &session_key,
                                                 &pw_data,
                                                 SAMBA_GNUTLS_DECRYPT);
+       GNUTLS_FIPS140_SET_STRICT_MODE();
        if (rc < 0) {
                nt_status = gnutls_error_to_ntstatus(rc, 
NT_STATUS_HASH_NOT_SUPPORTED);
                goto out;
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index 4820af85a85..01c190704a0 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -34,9 +34,13 @@ from selftesthelpers import smbtorture4, ntlm_auth3, 
samba3srcdir
 print("OPTIONS %s" % " ".join(smbtorture4_options), file=sys.stderr)
 
 
-def plansmbtorture4testsuite(name, env, options, modname=None):
-    return selftesthelpers.plansmbtorture4testsuite(name, env, options,
-                                                    target='samba4', 
modname=modname)
+def plansmbtorture4testsuite(name, env, options, modname=None, environ={}):
+    return selftesthelpers.plansmbtorture4testsuite(name,
+                                                    env,
+                                                    options,
+                                                    target='samba4',
+                                                    modname=modname,
+                                                    environ=environ)
 
 
 samba4srcdir = source4dir()
@@ -197,7 +201,11 @@ all_rpc_tests = ncalrpc_tests + ncacn_np_tests + 
ncacn_ip_tcp_tests + slow_ncacn
 rpc_s3only = [
     "rpc.mdssvc",
 ]
-rpc_tests = [x for x in smbtorture4_testsuites("rpc.") if x not in rpc_s3only]
+rpc_fipsonly = [
+    "rpc.fips.netlogon.crypto",
+]
+rpc_exclude = rpc_s3only + rpc_fipsonly
+rpc_tests = [x for x in smbtorture4_testsuites("rpc.") if x not in rpc_exclude]
 auto_rpc_tests = list(filter(lambda t: t not in all_rpc_tests, rpc_tests))
 
 for bindoptions in ["seal,padcheck"] + validate_list + ["bigendian"]:
@@ -632,6 +640,16 @@ if have_gnutls_fips_mode_support:
                   environ={'GNUTLS_FORCE_FIPS_MODE': '1',
                            'OPENSSL_FORCE_FIPS_MODE': '1'})
 
+    plansmbtorture4testsuite('rpc.fips.netlogon.crypto',
+                             'ad_dc_fips',
+                             ['ncacn_np:$SERVER[krb5]',
+                              '-U$USERNAME%$PASSWORD',
+                              '--workgroup=$DOMAIN',
+                              '--client-protection=encrypt'],
+                             'samba4.rpc.fips.netlogon.crypto',
+                             environ={'GNUTLS_FORCE_FIPS_MODE': '1',
+                                      'OPENSSL_FORCE_FIPS_MODE': '1'})
+
 plansmbtorture4testsuite('rpc.echo', "ad_dc_ntvfs", ['ncacn_np:$NETBIOSALIAS', 
'-U$DOMAIN/$USERNAME%$PASSWORD'], "samba4.rpc.echo against NetBIOS alias")
 
 # Test wbinfo trust auth
diff --git a/source4/torture/rpc/netlogon_crypto.c 
b/source4/torture/rpc/netlogon_crypto.c
new file mode 100644
index 00000000000..05beb2b77b3
--- /dev/null
+++ b/source4/torture/rpc/netlogon_crypto.c
@@ -0,0 +1,274 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   test suite for netlogon rpc operations
+
+   Copyright (C) Andrew Tridgell 2003
+   Copyright (C) Andrew Bartlett <abart...@samba.org> 2003-2004
+   Copyright (C) Tim Potter      2003
+   Copyright (C) Matthias Dieter Wallnöfer            2009-2010
+
+   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/>.
+*/
+
+#include "includes.h"
+#include "lib/replace/system/network.h"
+#include "lib/cmdline/cmdline.h"
+#include "torture/rpc/torture_rpc.h"
+#include "libcli/auth/libcli_auth.h"
+#include "librpc/gen_ndr/ndr_netlogon_c.h"
+#include "param/param.h"
+#include "lib/param/loadparm.h"
+#include "libcli/security/security.h"
+
+#undef strcasecmp
+
+#define TEST_MACHINE_NAME "torturetest"
+
+static bool test_ServerAuth3Crypto(struct dcerpc_pipe *p,
+                                  struct torture_context *tctx,
+                                  uint32_t negotiate_flags,
+                                  struct cli_credentials *machine_credentials,
+                                  bool force_client_rc4)
+{
+       struct netr_ServerReqChallenge r;
+       struct netr_ServerAuthenticate3 a;
+       struct netr_Credential netr_creds1 = {
+               .data = {0},
+       };
+       struct netr_Credential netr_creds2 = {
+               .data = {0},
+       };
+       struct netr_Credential netr_creds3 = {
+               .data = {0},
+       };
+       struct netlogon_creds_CredentialState *creds_state = NULL;
+       struct samr_Password machine_password = {
+               .hash = {0},
+       };
+       const char *machine_name = NULL;
+       const char *plain_pass = NULL;
+       struct dcerpc_binding_handle *b = NULL;
+       uint32_t rid = 0;
+       NTSTATUS status;
+       bool weak_crypto_allowed =
+               (lpcfg_weak_crypto(tctx->lp_ctx) ==
+                SAMBA_WEAK_CRYPTO_ALLOWED);
+
+       if (p == NULL) {
+               return false;
+       }
+       b = p->binding_handle;
+
+       ZERO_STRUCT(r);
+       ZERO_STRUCT(a);
+
+       torture_comment(tctx, "client negotiate_flags=0x%08x\n", 
negotiate_flags);
+
+       machine_name = cli_credentials_get_workstation(machine_credentials);
+       torture_assert_not_null(tctx, machine_name, "machine name is not set");
+
+       plain_pass = cli_credentials_get_password(machine_credentials);
+       torture_assert_not_null(tctx, plain_pass, "plain_pass is not set");
+
+
+       torture_comment(tctx, "Testing ServerReqChallenge\n");
+
+       r.in.server_name = NULL;
+       r.in.computer_name = machine_name;
+       r.in.credentials = &netr_creds1;
+       r.out.return_credentials = &netr_creds2;
+
+       netlogon_creds_random_challenge(&netr_creds1);
+
+       status = dcerpc_netr_ServerReqChallenge_r(b, tctx, &r);
+       torture_assert_ntstatus_ok(tctx,


-- 
Samba Shared Repository

Reply via email to