[SCM] Samba Shared Repository - branch master updated
Andrew Bartlett
abartlet at samba.org
Wed Jul 19 02:42:01 UTC 2023
The branch, master has been updated
via 81058c60136 third_party/heimdal: Import lorikeet-heimdal-202307050413 (commit e0597fe1d01b109e64d9c2a5bcada664ac199498)
via 90b240be086 tests/krb5: Add a test for PK-INIT with a revoked certificate
via 2ab15cf1172 tests/krb5: Allow passing a pre-created certificate into _pkinit_req()
via b73a01eefd2 tests/krb5: Have the caller of create_certificate() fetch the CA certificate and private key
via 01196cc741d tests/krb5: Factor out a method to fetch the CA certificate and private key
via ce9786748b7 tests/krb5: Factor out a method to create a certificate
via db64b2762c4 s4:kdc: Add auth_data_reqd flag to SDBFlags
via 7340351097a third_party/heimdal_build: Make Heimdal version strings const
via a25f549e9a0 third_party/heimdal: Import lorikeet-heimdal-202307040259 (commit 33d117b8a9c11714ef709e63a005d87e34b9bfde)
via 5bfccbb7643 tests/krb5: Test Windows 2000 variant of PK-INIT
via af97579f161 tests/krb5: Add ASN.1 definitions for Windows 2000 PK-INIT
via ecc62bc1207 tests/krb5: Add tests for PK-INIT Freshness Extension (RFC 8070)
via f7393da2c07 tests/krb5: Remove unused methods
via 97ead77767c tests/krb5: Check PAC_TYPE_CREDENTIAL_INFO PAC buffer
via 3ea1c559213 tests/krb5: Add PK-INIT testing framework
via 699d211084f tests/krb5: Allow KerberosCredentials to have associated RSA private key
via 7584e7a3a13 tests/krb5: Add helper methods for PK-INIT testing
via 7f9547fda79 tests/krb5: Refactor encryption type selection
via ef9ffbacb9c tests/krb5: Add PK-INIT ASN1 definitions and include licence
via 477fbd7bb4c tests/krb5: Add PKINIT pre-authentication types
via 8a0bde46a25 tests/krb5: Add PKINIT typed data errors
via d818ed644a5 tests/krb5: Add PKINIT error codes
via 7d2c267ae1a s4:kdc: Fix wrong debug message
via 97cde6f97b4 tests/krb5: Remove unused variables
from 7d2c68f2e25 s3:nmbd: Fix code spelling
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 81058c60136fba9af2dd7de8f15baef5e7e97bde
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jul 5 16:21:07 2023 +1200
third_party/heimdal: Import lorikeet-heimdal-202307050413 (commit e0597fe1d01b109e64d9c2a5bcada664ac199498)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
Autobuild-Date(master): Wed Jul 19 02:41:25 UTC 2023 on atb-devel-224
commit 90b240be08629ab6cad7651c59df1d9f533797c0
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:31:03 2023 +1200
tests/krb5: Add a test for PK-INIT with a revoked certificate
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 2ab15cf11721eaec95950b634b4782d7cae0d311
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jul 5 16:12:42 2023 +1200
tests/krb5: Allow passing a pre-created certificate into _pkinit_req()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit b73a01eefd2a526936f11e08a5a32dd2f1106359
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jul 5 12:55:41 2023 +1200
tests/krb5: Have the caller of create_certificate() fetch the CA certificate and private key
These are useful to keep around for other purposes.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 01196cc741ddf611794ba6eb1b5f3a0bcff2f0da
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jul 5 12:53:45 2023 +1200
tests/krb5: Factor out a method to fetch the CA certificate and private key
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit ce9786748b7b594ca0864158ba49ca4def1b593c
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jul 5 12:43:52 2023 +1200
tests/krb5: Factor out a method to create a certificate
BUG: https://bugzilla.samba.org/show_bug.cgi?id=9612
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit db64b2762c49ce4f155e6a98b2ea868578503d58
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jun 26 13:07:44 2023 +1200
s4:kdc: Add auth_data_reqd flag to SDBFlags
This is to adapt to Heimdal:
commit 3c4548025c0a239ff580e7974939185eadf1856b
Author: Nicolas Williams <nico at twosigma.com>
Date: Sun Jun 4 22:54:03 2023 -0500
hdb: Add auth-data-reqd flag
NOTE: This commit finally works again!
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 7340351097a95f8e52d48365d4619c32080ebd30
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Thu Jun 22 16:46:09 2023 +1200
third_party/heimdal_build: Make Heimdal version strings const
This is to adapt to Heimdal:
commit 997916e3f67d70bb52674829615c50455918fbb3
Author: Taylor R Campbell <campbell+heimdal at mumble.net>
Date: Sun May 28 20:34:34 2023 +0000
krb5: Make heimdal_version and heimdal_long_version const.
NOTE: THIS COMMIT WON’T COMPILE/WORK ON ITS OWN!
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit a25f549e9a03010996300b04271a7909b6fbf756
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Tue Jul 4 15:16:27 2023 +1200
third_party/heimdal: Import lorikeet-heimdal-202307040259 (commit 33d117b8a9c11714ef709e63a005d87e34b9bfde)
NOTE: THIS COMMIT WON’T COMPILE/WORK ON ITS OWN!
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 5bfccbb76433f4fa035040f5305f0258f6fbcb51
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Tue Jul 4 15:28:04 2023 +1200
tests/krb5: Test Windows 2000 variant of PK-INIT
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit af97579f161bf814e91f19cd495019524cc6a329
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Tue Jul 4 15:40:31 2023 +1200
tests/krb5: Add ASN.1 definitions for Windows 2000 PK-INIT
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit ecc62bc120792ef8157b6f700b42dabdbb9518e5
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 16:34:11 2023 +1200
tests/krb5: Add tests for PK-INIT Freshness Extension (RFC 8070)
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit f7393da2c0724839ec8a0510daa114eb8d75a707
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 16:43:37 2023 +1200
tests/krb5: Remove unused methods
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 97ead77767c7a30e61c9916d478203041cde89d7
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:46:23 2023 +1200
tests/krb5: Check PAC_TYPE_CREDENTIAL_INFO PAC buffer
When PK-INIT is performed, check that the buffer is as expected and
contains the correct NT hash.
The PK-INIT tests now pass against Windows Server 2019.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14985
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 3ea1c559213d02cff7fae5cdf2694178cc88a817
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:43:10 2023 +1200
tests/krb5: Add PK-INIT testing framework
To run these tests standalone, you will need the certificate and private
key of the Certificate Authority. These can be specified together in the
same file with the environment variable CA_CERT, or the private key may
be specified in its own file with CA_PRIVATE_KEY.
If either of these files are encrypted, you can specify the password in
the environment variable CA_PASS.
These tests create a new certificate for the user account, signed with
the private key of the Certificate Authority. We negotiate the reply key
with either of the public-key and Diffie-Hellman PK-INIT variants, and
use the reply key to decrypt the enc-part in the response. We also check
that the KDC’s signatures are valid.
Most of the failures with the Heimdal KDC are due to the wrong nonce
being returned in the reply compared to Windows, which issue is simple
enough to correct.
An example command line for manual testing against Windows:
SMB_CONF_PATH=ad_dc.conf KRB5_CONFIG=krb5.conf SERVICE_USERNAME=win2k19-dc.example.com ADMIN_USERNAME=Administrator ADMIN_PASSWORD=locDCpass ADMIN_KVNO=1 FOR_USER=Administrator USERNAME=Administrator PASSWORD=locDCpass DC_SERVER=win2k19-dc.example.com SERVER=win2k19-dc.example.com DOMAIN=example REALM=example.com PYTHONPATH=bin/python STRICT_CHECKING=1 FAST_SUPPORT=1 CLAIMS_SUPPORT=1 COMPOUND_ID_SUPPORT=1 TKT_SIG_SUPPORT=1 FULL_SIG_SUPPORT=1 GNUTLS_PBKDF2_SUPPORT=1 EXPECT_PAC=1 EXPECT_EXTRA_PAC_BUFFERS=1 CHECK_CNAME=1 CHECK_PADATA=1 KADMIN_IS_TGS=0 FORCED_RC4=1 DEFAULT_ETYPES=36 CA_CERT=./win2k19-ca.pfx CA_PASS=1234 python3 python/samba/tests/krb5/pkinit_tests.py
To set up windows for this I first installed an Certificate Authority with an Enterprise CA.
Then I exported the private key and certificate of the CA:
1. go into the Certification Authority snap-in for the relevant computer,
2. right-clicking the CA
3. clicking ‘All Tasks’ → ‘Back up CA...’
4. and exporting the private key and CA certificate.
(I downloaded the resulting file via smbclient).
After setting up an Enterprise CA, I also needed to edit the domain
controller GPO to enable auto-enrollment, otherwise Windows would
refuse to accept as legitimate any certificates provided by the client.
That can be done by first enabling the policy:
‘Computer Configuration/Policies/Windows Settings/Security Settings/Public Key Policies/Certificate Services Client — Auto-Enrollment’,
and then ticking both ‘Renew expired certificates…’ and ‘Update certificates…’)
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 699d211084fcbad61b3a53b42ccc721e1fbc9695
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:49:03 2023 +1200
tests/krb5: Allow KerberosCredentials to have associated RSA private key
This is needed for PK-INIT testing.
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 7584e7a3a131795b7bb57c59c53754e9b4ab1855
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:49:43 2023 +1200
tests/krb5: Add helper methods for PK-INIT testing
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 7f9547fda793af65346708bbe14f8a4995d50a5a
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Mon Jul 3 14:41:55 2023 +1200
tests/krb5: Refactor encryption type selection
Add and use some methods to calculate the highest supported AES and RC4
encryption types, respectively.
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit ef9ffbacb9cdcbcb7da124f617c2f98257d59615
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jun 21 12:16:53 2023 +1200
tests/krb5: Add PK-INIT ASN1 definitions and include licence
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
commit 477fbd7bb4c31f33b6624e6060920fda591f9a56
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jun 21 11:16:32 2023 +1200
tests/krb5: Add PKINIT pre-authentication types
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 8a0bde46a254add13b38f41ef056926d07aba5f5
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jun 21 11:13:46 2023 +1200
tests/krb5: Add PKINIT typed data errors
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit d818ed644a59635ce238cd617a16b929ad693753
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jun 21 11:11:12 2023 +1200
tests/krb5: Add PKINIT error codes
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 7d2c267ae1ade3600ea5f37a256c904f60e9e6ac
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Thu Jun 22 16:21:17 2023 +1200
s4:kdc: Fix wrong debug message
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 97cde6f97b4d39476c6ad83fff285e11c483681e
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Jun 21 16:42:29 2023 +1200
tests/krb5: Remove unused variables
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
python/samba/tests/krb5/kdc_tgs_tests.py | 13 -
python/samba/tests/krb5/pkinit_tests.py | 1233 +++++++++++++
python/samba/tests/krb5/raw_testcase.py | 1069 +++++++++++-
python/samba/tests/krb5/rfc4120.asn1 | 1067 +++++++++++-
python/samba/tests/krb5/rfc4120_constants.py | 29 +
python/samba/tests/krb5/rfc4120_pyasn1.py | 1927 +++++++++++++++++++--
selftest/knownfail_heimdal_kdc | 12 +
selftest/knownfail_mit_kdc_1_20 | 53 +
selftest/target/Samba.pm | 3 +
selftest/target/Samba4.pm | 1 +
source4/kdc/pac-glue.c | 2 +-
source4/kdc/sdb.h | 2 +-
source4/kdc/sdb_to_hdb.c | 2 +-
source4/selftest/tests.py | 23 +
third_party/heimdal/appl/gssmask/gssmask.c | 12 +-
third_party/heimdal/cf/make-proto.pl | 4 +-
third_party/heimdal/configure.ac | 9 +-
third_party/heimdal/include/NTMakefile | 4 +-
third_party/heimdal/kadmin/check.c | 19 +-
third_party/heimdal/kadmin/kadmin.1 | 62 +-
third_party/heimdal/kadmin/util.c | 1 +
third_party/heimdal/kcm/config.c | 15 +-
third_party/heimdal/kdc/config.c | 18 +-
third_party/heimdal/kdc/default_config.c | 17 +
third_party/heimdal/kdc/httpkadmind.c | 1 +
third_party/heimdal/kdc/kdc_locl.h | 2 +
third_party/heimdal/kdc/kerberos5.c | 197 ++-
third_party/heimdal/kdc/misc.c | 4 +
third_party/heimdal/kdc/pkinit.c | 180 ++
third_party/heimdal/kuser/kinit.c | 80 +-
third_party/heimdal/lib/asn1/Makefile.am | 2 +-
third_party/heimdal/lib/asn1/check-gen.c | 18 +-
third_party/heimdal/lib/asn1/krb5.asn1 | 1 +
third_party/heimdal/lib/asn1/pkinit.asn1 | 1 +
third_party/heimdal/lib/base/common_plugin.h | 1 +
third_party/heimdal/lib/base/dict.c | 4 +-
third_party/heimdal/lib/base/heimbase.c | 16 +-
third_party/heimdal/lib/base/heimbase.h | 2 +-
third_party/heimdal/lib/base/heimbasepriv.h | 5 +-
third_party/heimdal/lib/base/plugin.c | 16 +-
third_party/heimdal/lib/com_err/Makefile.am | 4 +-
third_party/heimdal/lib/com_err/com_err.c | 2 +-
third_party/heimdal/lib/com_err/com_err.h | 2 +-
third_party/heimdal/lib/com_err/com_right.h | 2 +-
third_party/heimdal/lib/com_err/compile_et.c | 2 +-
third_party/heimdal/lib/com_err/error.c | 2 +-
third_party/heimdal/lib/hdb/hdb-mitdb.c | 4 +-
third_party/heimdal/lib/hdb/hdb.asn1 | 1 +
third_party/heimdal/lib/hx509/Makefile.am | 2 +-
third_party/heimdal/lib/hx509/hxtool.c | 7 +-
third_party/heimdal/lib/ipc/client.c | 4 +-
third_party/heimdal/lib/kadm5/admin.h | 1 +
third_party/heimdal/lib/kadm5/ent_setup.c | 4 +
third_party/heimdal/lib/kadm5/get_s.c | 1 +
third_party/heimdal/lib/krb5/addr_families.c | 34 +-
third_party/heimdal/lib/krb5/aname_to_localname.c | 6 +-
third_party/heimdal/lib/krb5/changepw.c | 10 +-
third_party/heimdal/lib/krb5/constants.c | 18 +-
third_party/heimdal/lib/krb5/context.c | 2 +-
third_party/heimdal/lib/krb5/crypto.c | 4 +-
third_party/heimdal/lib/krb5/db_plugin.c | 4 +-
third_party/heimdal/lib/krb5/get_host_realm.c | 6 +-
third_party/heimdal/lib/krb5/get_in_tkt.c | 4 +-
third_party/heimdal/lib/krb5/init_creds_pw.c | 14 +-
third_party/heimdal/lib/krb5/krb5.conf.5 | 15 +-
third_party/heimdal/lib/krb5/krb5.h | 22 +-
third_party/heimdal/lib/krb5/krb5_err.et | 3 +
third_party/heimdal/lib/krb5/krbhst.c | 4 +-
third_party/heimdal/lib/krb5/kuserok.c | 20 +-
third_party/heimdal/lib/krb5/mk_error.c | 4 +-
third_party/heimdal/lib/krb5/pac.c | 8 +-
third_party/heimdal/lib/krb5/pcache.c | 4 +-
third_party/heimdal/lib/krb5/pkinit.c | 1 +
third_party/heimdal/lib/krb5/plugin.c | 4 +-
third_party/heimdal/lib/krb5/salt-aes-sha1.c | 2 +-
third_party/heimdal/lib/krb5/salt-aes-sha2.c | 2 +-
third_party/heimdal/lib/krb5/send_to_kdc.c | 12 +-
third_party/heimdal/lib/roken/parse_bytes-test.c | 6 +-
third_party/heimdal/lib/roken/parse_bytes.c | 18 +-
third_party/heimdal/lib/roken/parse_bytes.h | 6 +-
third_party/heimdal/lib/sl/Makefile.am | 4 +-
third_party/heimdal/lib/vers/make-print-version.c | 2 +-
third_party/heimdal/tests/kdc/check-kdc.in | 38 +-
third_party/heimdal_build/roken.h | 4 +-
84 files changed, 5951 insertions(+), 495 deletions(-)
create mode 100755 python/samba/tests/krb5/pkinit_tests.py
Changeset truncated at 500 lines:
diff --git a/python/samba/tests/krb5/kdc_tgs_tests.py b/python/samba/tests/krb5/kdc_tgs_tests.py
index 1254ea2e0cb..27c7ee38cc6 100755
--- a/python/samba/tests/krb5/kdc_tgs_tests.py
+++ b/python/samba/tests/krb5/kdc_tgs_tests.py
@@ -890,9 +890,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def _run_upn_dns_info_ex_test(self, client_creds):
service_creds = self.get_service_creds()
- samdb = self.get_samdb()
- dn = client_creds.get_dn()
-
account_name = client_creds.get_username()
upn_name = client_creds.get_upn()
if upn_name is None:
@@ -2148,7 +2145,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_as_requester_sid(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
self.get_tgt(creds, pac_request=None,
@@ -2159,7 +2155,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_tgs_requester_sid(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2173,7 +2168,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_tgs_requester_sid_renew(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2192,7 +2186,6 @@ class KdcTgsTests(KdcTgsBaseTests):
creds = self._get_creds(replication_allowed=True,
revealed_to_rodc=True)
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2209,7 +2202,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_tgs_requester_sid_missing_renew(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2225,7 +2217,6 @@ class KdcTgsTests(KdcTgsBaseTests):
creds = self._get_creds(replication_allowed=True,
revealed_to_rodc=True)
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2240,7 +2231,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_tgs_requester_sid_validate(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2259,7 +2249,6 @@ class KdcTgsTests(KdcTgsBaseTests):
creds = self._get_creds(replication_allowed=True,
revealed_to_rodc=True)
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2276,7 +2265,6 @@ class KdcTgsTests(KdcTgsBaseTests):
def test_tgs_requester_sid_missing_validate(self):
creds = self._get_creds()
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
@@ -2292,7 +2280,6 @@ class KdcTgsTests(KdcTgsBaseTests):
creds = self._get_creds(replication_allowed=True,
revealed_to_rodc=True)
- samdb = self.get_samdb()
sid = creds.get_sid()
tgt = self.get_tgt(creds, pac_request=None,
diff --git a/python/samba/tests/krb5/pkinit_tests.py b/python/samba/tests/krb5/pkinit_tests.py
new file mode 100755
index 00000000000..15166499adc
--- /dev/null
+++ b/python/samba/tests/krb5/pkinit_tests.py
@@ -0,0 +1,1233 @@
+#!/usr/bin/env python3
+# Unix SMB/CIFS implementation.
+# Copyright (C) Stefan Metzmacher 2020
+# Copyright (C) Catalyst.Net Ltd 2023
+#
+# 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/>.
+#
+
+import sys
+import os
+
+sys.path.insert(0, 'bin/python')
+os.environ['PYTHONUNBUFFERED'] = '1'
+
+from datetime import datetime, timedelta
+
+from pyasn1.type import univ
+
+from cryptography import x509
+from cryptography.hazmat.primitives.serialization import pkcs12
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives import hashes, serialization
+from cryptography.hazmat.primitives.asymmetric import dh, padding
+from cryptography.x509.oid import NameOID
+
+import samba.tests
+from samba.tests.krb5 import kcrypto
+from samba.tests.krb5.kdc_base_test import KDCBaseTest
+from samba.tests.krb5.raw_testcase import PkInit
+from samba.tests.krb5.rfc4120_constants import (
+ DES_EDE3_CBC,
+ KDC_ERR_CLIENT_NOT_TRUSTED,
+ KDC_ERR_ETYPE_NOSUPP,
+ KDC_ERR_MODIFIED,
+ KDC_ERR_PREAUTH_EXPIRED,
+ KDC_ERR_PREAUTH_FAILED,
+ KDC_ERR_PREAUTH_REQUIRED,
+ KU_PA_ENC_TIMESTAMP,
+ NT_PRINCIPAL,
+ PADATA_AS_FRESHNESS,
+ PADATA_ENC_TIMESTAMP,
+ PADATA_PK_AS_REP_19,
+ PADATA_PK_AS_REQ,
+)
+import samba.tests.krb5.rfc4120_pyasn1 as krb5_asn1
+
+global_asn1_print = False
+global_hexdump = False
+
+
+class PkInitTests(KDCBaseTest):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ def setUp(self):
+ super().setUp()
+ self.do_asn1_print = global_asn1_print
+ self.do_hexdump = global_hexdump
+
+ def _get_creds(self, account_type=KDCBaseTest.AccountType.USER):
+ """Return credentials with an account having a UPN for performing
+ PK-INIT."""
+ samdb = self.get_samdb()
+ realm = samdb.domain_dns_name().upper()
+
+ return self.get_cached_creds(
+ account_type=account_type,
+ opts={'upn': f'{{account}}.{realm}@{realm}'})
+
+ def test_pkinit(self):
+ """Test public-key PK-INIT."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds)
+
+ def test_pkinit_dh(self):
+ """Test Diffie-Hellman PK-INIT."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN)
+
+ def test_pkinit_win2k(self):
+ """Test public-key Windows 2000 PK-INIT."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds, win2k_variant=True)
+
+ def test_pkinit_no_des3(self):
+ """Test public-key PK-INIT without specifying the DES3 encryption
+ type. It should fail."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ etypes=(kcrypto.Enctype.AES256, kcrypto.Enctype.RC4),
+ expect_error=KDC_ERR_ETYPE_NOSUPP)
+
+ def test_pkinit_no_des3_dh(self):
+ """Test Diffie-Hellman PK-INIT without specifying the DES3 encryption
+ type. This time, it should succeed."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ etypes=(kcrypto.Enctype.AES256, kcrypto.Enctype.RC4))
+
+ def test_pkinit_aes128(self):
+ """Test public-key PK-INIT, specifying the AES128 encryption type
+ first."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ etypes=(
+ kcrypto.Enctype.AES128,
+ kcrypto.Enctype.AES256,
+ DES_EDE3_CBC,
+ ))
+
+ def test_pkinit_rc4(self):
+ """Test public-key PK-INIT, specifying the RC4 encryption type first.
+ """
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ etypes=(
+ kcrypto.Enctype.RC4,
+ kcrypto.Enctype.AES256,
+ DES_EDE3_CBC,
+ ))
+
+ def test_pkinit_zero_nonce(self):
+ """Test public-key PK-INIT with a nonce of zero. The nonce in the
+ request body should take precedence."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds, pk_nonce=0)
+
+ def test_pkinit_zero_nonce_dh(self):
+ """Test Diffie-Hellman PK-INIT with a nonce of zero. The nonce in the
+ request body should take precedence.
+ """
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ pk_nonce=0)
+
+ def test_pkinit_computer(self):
+ """Test public-key PK-INIT with a computer account."""
+ client_creds = self._get_creds(self.AccountType.COMPUTER)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds)
+
+ def test_pkinit_computer_dh(self):
+ """Test Diffie-Hellman PK-INIT with a computer account."""
+ client_creds = self._get_creds(self.AccountType.COMPUTER)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN)
+
+ def test_pkinit_computer_win2k(self):
+ """Test public-key Windows 2000 PK-INIT with a computer account."""
+ client_creds = self._get_creds(self.AccountType.COMPUTER)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds, win2k_variant=True)
+
+ def test_pkinit_service(self):
+ """Test public-key PK-INIT with a service account."""
+ client_creds = self._get_creds(self.AccountType.MANAGED_SERVICE)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds)
+
+ def test_pkinit_service_dh(self):
+ """Test Diffie-Hellman PK-INIT with a service account."""
+ client_creds = self._get_creds(self.AccountType.MANAGED_SERVICE)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN)
+
+ def test_pkinit_service_win2k(self):
+ """Test public-key Windows 2000 PK-INIT with a service account."""
+ client_creds = self._get_creds(self.AccountType.MANAGED_SERVICE)
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds, win2k_variant=True)
+
+ def test_pkinit_no_supported_cms_types(self):
+ """Test public-key PK-INIT, excluding the supportedCmsTypes field. This
+ causes Windows to reply with differently-encoded ASN.1."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ supported_cms_types=False)
+
+ def test_pkinit_no_supported_cms_types_dh(self):
+ """Test Diffie-Hellman PK-INIT, excluding the supportedCmsTypes field.
+ """
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ supported_cms_types=False)
+
+ def test_pkinit_empty_supported_cms_types(self):
+ """Test public-key PK-INIT with an empty supportedCmsTypes field."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ supported_cms_types=[])
+
+ def test_pkinit_empty_supported_cms_types_dh(self):
+ """Test Diffie-Hellman PK-INIT with an empty supportedCmsTypes field.
+ """
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ supported_cms_types=[])
+
+ def test_pkinit_sha256_signature(self):
+ """Test public-key PK-INIT with a SHA256 signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ signature_algorithm=krb5_asn1.id_pkcs1_sha256WithRSAEncryption)
+
+ def test_pkinit_sha256_signature_dh(self):
+ """Test Diffie-Hellman PK-INIT with a SHA256 signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ signature_algorithm=krb5_asn1.id_pkcs1_sha256WithRSAEncryption)
+
+ def test_pkinit_sha256_signature_win2k(self):
+ """Test public-key Windows 2000 PK-INIT with a SHA256 signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ signature_algorithm=krb5_asn1.id_pkcs1_sha256WithRSAEncryption,
+ win2k_variant=True)
+
+ def test_pkinit_sha256_certificate_signature(self):
+ """Test public-key PK-INIT with a SHA256 certificate signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ certificate_signature=hashes.SHA256)
+
+ def test_pkinit_sha256_certificate_signature_dh(self):
+ """Test Diffie-Hellman PK-INIT with a SHA256 certificate signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ certificate_signature=hashes.SHA256)
+
+ def test_pkinit_sha256_certificate_signature_win2k(self):
+ """Test public-key Windows 2000 PK-INIT with a SHA256 certificate
+ signature."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ self._pkinit_req(
+ client_creds, target_creds,
+ certificate_signature=hashes.SHA256,
+ win2k_variant=True)
+
+ def test_pkinit_freshness(self):
+ """Test public-key PK-INIT with the PKINIT Freshness Extension."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ # Perform the AS-REQ to get the freshness token.
+ kdc_exchange_dict = self._as_req(client_creds, target_creds,
+ freshness=b'',
+ expect_error=KDC_ERR_PREAUTH_REQUIRED,
+ expect_edata=True)
+ freshness_token = kdc_exchange_dict.get('freshness_token')
+ self.assertIsNotNone(freshness_token)
+
+ # Include the freshness token in the PK-INIT request.
+ self._pkinit_req(client_creds, target_creds,
+ freshness_token=freshness_token)
+
+ def test_pkinit_freshness_dh(self):
+ """Test Diffie-Hellman PK-INIT with the PKINIT Freshness Extension."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ kdc_exchange_dict = self._as_req(client_creds, target_creds,
+ freshness=b'',
+ expect_error=KDC_ERR_PREAUTH_REQUIRED,
+ expect_edata=True)
+ freshness_token = kdc_exchange_dict.get('freshness_token')
+ self.assertIsNotNone(freshness_token)
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ freshness_token=freshness_token)
+
+ def test_pkinit_freshness_non_empty(self):
+ """Test sending a non-empty freshness token."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ kdc_exchange_dict = self._as_req(
+ client_creds, target_creds,
+ freshness=b'A genuine freshness token',
+ expect_error=KDC_ERR_PREAUTH_REQUIRED,
+ expect_edata=True)
+ freshness_token = kdc_exchange_dict.get('freshness_token')
+ self.assertIsNotNone(freshness_token)
+
+ def test_pkinit_freshness_with_enc_ts(self):
+ """Test sending a freshness token and ENC-TS in the same request."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ kdc_exchange_dict = self._as_req(client_creds, target_creds,
+ freshness=b'',
+ send_enc_ts=True)
+
+ # There should be no freshness token in the reply.
+ freshness_token = kdc_exchange_dict.get('freshness_token')
+ self.assertIsNone(freshness_token)
+
+ def test_pkinit_freshness_current(self):
+ """Test public-key PK-INIT with an up-to-date freshness token."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ freshness_token = self.create_freshness_token()
+
+ self._pkinit_req(client_creds, target_creds,
+ freshness_token=freshness_token)
+
+ def test_pkinit_freshness_current_dh(self):
+ """Test Diffie-Hellman PK-INIT with an up-to-date freshness token."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ freshness_token = self.create_freshness_token()
+
+ self._pkinit_req(client_creds, target_creds,
+ using_pkinit=PkInit.DIFFIE_HELLMAN,
+ freshness_token=freshness_token)
+
+ def test_pkinit_freshness_old(self):
+ """Test public-key PK-INIT with an old freshness token."""
+ client_creds = self._get_creds()
+ target_creds = self.get_service_creds()
+
+ # Present a freshness token from fifteen minutes in the past.
+ fifteen_minutes = timedelta(minutes=15).total_seconds()
+ freshness_token = self.create_freshness_token(offset=-fifteen_minutes)
+
+ # The request should be rejected.
+ self._pkinit_req(client_creds, target_creds,
+ freshness_token=freshness_token,
--
Samba Shared Repository
More information about the samba-cvs
mailing list