18
18
from cryptography .hazmat .primitives .asymmetric import ed25519 , padding , rsa
19
19
from cryptography .hazmat .primitives .ciphers import algorithms
20
20
from cryptography .hazmat .primitives .serialization import pkcs7
21
+ from cryptography .x509 .oid import OtherNameFormOID
21
22
from cryptography .x509 .verification import (
22
23
PolicyBuilder ,
23
24
Store ,
@@ -145,18 +146,6 @@ def _load_cert_key():
145
146
146
147
147
148
class TestPKCS7VerifyCertificate :
148
- def test_verify_pkcs7_certificate (self ):
149
- certificate , _ = _load_cert_key ()
150
- ca_policy , ee_policy = pkcs7 .pkcs7_x509_extension_policies ()
151
-
152
- verifier = (
153
- PolicyBuilder ()
154
- .store (Store ([certificate ]))
155
- .extension_policies (ca_policy = ca_policy , ee_policy = ee_policy )
156
- .build_client_verifier ()
157
- )
158
- verifier .verify (certificate , [])
159
-
160
149
@pytest .fixture (name = "certificate_builder" )
161
150
def fixture_certificate_builder (self ) -> x509 .CertificateBuilder :
162
151
certificate , private_key = _load_cert_key ()
@@ -170,6 +159,46 @@ def fixture_certificate_builder(self) -> x509.CertificateBuilder:
170
159
.not_valid_after (certificate .not_valid_after )
171
160
)
172
161
162
+ def test_verify_pkcs7_certificate (self , certificate_builder ):
163
+ certificate , private_key = _load_cert_key ()
164
+ ca_policy , ee_policy = pkcs7 .pkcs7_x509_extension_policies ()
165
+
166
+ # Add valid KeyUsage extension
167
+ ku_extension = x509 .KeyUsage (
168
+ digital_signature = True ,
169
+ content_commitment = False ,
170
+ key_encipherment = False ,
171
+ data_encipherment = False ,
172
+ key_agreement = False ,
173
+ key_cert_sign = False ,
174
+ crl_sign = False ,
175
+ encipher_only = False ,
176
+ decipher_only = False ,
177
+ )
178
+ certificate_builder = certificate_builder .add_extension (
179
+ ku_extension , True
180
+ )
181
+
182
+ # Add valid ExtendedKeyUsage extension
183
+ usages = [x509 .ExtendedKeyUsageOID .CLIENT_AUTH ] # type: ignore[attr-defined]
184
+ eku_extension = x509 .ExtendedKeyUsage (usages )
185
+ certificate_builder = certificate_builder .add_extension (
186
+ eku_extension , True
187
+ )
188
+
189
+ # Build the certificate
190
+ pkcs7_certificate = certificate_builder .sign (
191
+ private_key , certificate .signature_hash_algorithm , None
192
+ )
193
+
194
+ verifier = (
195
+ PolicyBuilder ()
196
+ .store (Store ([pkcs7_certificate ]))
197
+ .extension_policies (ca_policy = ca_policy , ee_policy = ee_policy )
198
+ .build_client_verifier ()
199
+ )
200
+ verifier .verify (certificate , [])
201
+
173
202
def test_verify_pkcs7_certificate_wrong_bc (self , certificate_builder ):
174
203
certificate , private_key = _load_cert_key ()
175
204
@@ -232,6 +261,22 @@ def test_verify_pkcs7_certificate_wrong_eku(self, certificate_builder):
232
261
# Verify the certificate
233
262
self .verify_invalid_pkcs7_certificate (pkcs7_certificate )
234
263
264
+ @pytest .mark .parametrize (
265
+ "filename" , ["ca_non_ascii_san.pem" , "ca_ascii_san.pem" ]
266
+ )
267
+ def test_verify_pkcs7_certificate_wrong_san (self , filename ):
268
+ # Read a certificate with an invalid SAN
269
+ pkcs7_certificate = load_vectors_from_file (
270
+ os .path .join ("pkcs7" , filename ),
271
+ loader = lambda pemfile : x509 .load_pem_x509_certificate (
272
+ pemfile .read ()
273
+ ),
274
+ mode = "rb" ,
275
+ )
276
+
277
+ # Verify the certificate
278
+ self .verify_invalid_pkcs7_certificate (pkcs7_certificate )
279
+
235
280
@staticmethod
236
281
def verify_invalid_pkcs7_certificate (certificate : x509 .Certificate ):
237
282
ca_policy , ee_policy = pkcs7 .pkcs7_x509_extension_policies ()
0 commit comments