blob: d9743c8ebaf481f35552cfa866afb4a3a38ae33d [file] [log] [blame]
Paul Kehrer8cf26422015-03-21 09:50:24 -05001# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import absolute_import, division, print_function
6
Paul Kehrer1eb82a62015-03-31 20:00:33 -05007import binascii
Paul Kehrer31bdf792015-03-25 14:11:00 -05008import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05009import os
10
Paul Kehrer8cf26422015-03-21 09:50:24 -050011import pytest
12
Paul Kehrercbfb1012015-04-10 20:57:20 -040013import six
14
Paul Kehrer8cf26422015-03-21 09:50:24 -050015from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010016from cryptography.hazmat.backends.interfaces import (
17 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
18)
19from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050020from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080021 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
22 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050023)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050024
Paul Kehrerf22f6122015-08-05 12:57:13 +010025from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050026from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050027
28
Paul Kehrer85894662015-03-22 13:19:31 -050029class TestExtension(object):
30 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050031 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050032 with pytest.raises(TypeError):
33 x509.Extension("notanoid", True, bc)
34
35 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050036 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050037 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050038 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050039
40 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050041 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050042 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050043 assert repr(ext) == (
44 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
45 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
46 "_length=None)>)>"
47 )
48
Paul Kehrer58e870c2015-05-17 09:15:30 -070049 def test_eq(self):
50 ext1 = x509.Extension(
51 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
52 )
53 ext2 = x509.Extension(
54 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
55 )
56 assert ext1 == ext2
57
58 def test_ne(self):
59 ext1 = x509.Extension(
60 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
61 )
62 ext2 = x509.Extension(
63 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
64 )
65 ext3 = x509.Extension(
66 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
67 )
68 ext4 = x509.Extension(
69 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
70 )
71 assert ext1 != ext2
72 assert ext1 != ext3
73 assert ext1 != ext4
74 assert ext1 != object()
75
Paul Kehrer85894662015-03-22 13:19:31 -050076
Paul Kehrer2b622582015-04-15 11:04:29 -040077class TestNoticeReference(object):
78 def test_notice_numbers_not_all_int(self):
79 with pytest.raises(TypeError):
80 x509.NoticeReference("org", [1, 2, "three"])
81
82 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -050083 with pytest.raises(TypeError):
84 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -040085
86 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -050087 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -040088
Paul Kehrer73be2ca2015-05-11 21:22:38 -050089 if six.PY3:
90 assert repr(nr) == (
91 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
92 "])>"
93 )
94 else:
95 assert repr(nr) == (
96 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
97 "4])>"
98 )
Paul Kehrer2b622582015-04-15 11:04:29 -040099
Paul Kehrerc56ab622015-05-03 09:56:31 -0500100 def test_eq(self):
101 nr = x509.NoticeReference("org", [1, 2])
102 nr2 = x509.NoticeReference("org", [1, 2])
103 assert nr == nr2
104
105 def test_ne(self):
106 nr = x509.NoticeReference("org", [1, 2])
107 nr2 = x509.NoticeReference("org", [1])
108 nr3 = x509.NoticeReference(None, [1, 2])
109 assert nr != nr2
110 assert nr != nr3
111 assert nr != object()
112
Paul Kehrer2b622582015-04-15 11:04:29 -0400113
114class TestUserNotice(object):
115 def test_notice_reference_invalid(self):
116 with pytest.raises(TypeError):
117 x509.UserNotice("invalid", None)
118
119 def test_notice_reference_none(self):
120 un = x509.UserNotice(None, "text")
121 assert un.notice_reference is None
122 assert un.explicit_text == "text"
123
124 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500125 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500126 if six.PY3:
127 assert repr(un) == (
128 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500129 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500130 )
131 else:
132 assert repr(un) == (
133 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500134 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500135 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400136
Paul Kehrerc56ab622015-05-03 09:56:31 -0500137 def test_eq(self):
138 nr = x509.NoticeReference("org", [1, 2])
139 nr2 = x509.NoticeReference("org", [1, 2])
140 un = x509.UserNotice(nr, "text")
141 un2 = x509.UserNotice(nr2, "text")
142 assert un == un2
143
144 def test_ne(self):
145 nr = x509.NoticeReference("org", [1, 2])
146 nr2 = x509.NoticeReference("org", [1])
147 un = x509.UserNotice(nr, "text")
148 un2 = x509.UserNotice(nr2, "text")
149 un3 = x509.UserNotice(nr, "text3")
150 assert un != un2
151 assert un != un3
152 assert un != object()
153
Paul Kehrer2b622582015-04-15 11:04:29 -0400154
Paul Kehrer2b622582015-04-15 11:04:29 -0400155class TestPolicyInformation(object):
156 def test_invalid_policy_identifier(self):
157 with pytest.raises(TypeError):
158 x509.PolicyInformation("notanoid", None)
159
160 def test_none_policy_qualifiers(self):
161 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
162 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
163 assert pi.policy_qualifiers is None
164
165 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500166 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400167 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
168 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
169 assert pi.policy_qualifiers == pq
170
171 def test_invalid_policy_identifiers(self):
172 with pytest.raises(TypeError):
173 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
174
175 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500176 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400177 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500178 if six.PY3:
179 assert repr(pi) == (
180 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
181 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500182 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500183 )
184 else:
185 assert repr(pi) == (
186 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
187 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500188 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500189 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400190
Paul Kehrerc56ab622015-05-03 09:56:31 -0500191 def test_eq(self):
192 pi = x509.PolicyInformation(
193 x509.ObjectIdentifier("1.2.3"),
194 [u"string", x509.UserNotice(None, u"hi")]
195 )
196 pi2 = x509.PolicyInformation(
197 x509.ObjectIdentifier("1.2.3"),
198 [u"string", x509.UserNotice(None, u"hi")]
199 )
200 assert pi == pi2
201
202 def test_ne(self):
203 pi = x509.PolicyInformation(
204 x509.ObjectIdentifier("1.2.3"), [u"string"]
205 )
206 pi2 = x509.PolicyInformation(
207 x509.ObjectIdentifier("1.2.3"), [u"string2"]
208 )
209 pi3 = x509.PolicyInformation(
210 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
211 )
212 assert pi != pi2
213 assert pi != pi3
214 assert pi != object()
215
Paul Kehrer2b622582015-04-15 11:04:29 -0400216
217class TestCertificatePolicies(object):
218 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500219 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400220 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
221 with pytest.raises(TypeError):
222 x509.CertificatePolicies([1, pi])
223
224 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500225 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400226 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
227 cp = x509.CertificatePolicies([pi])
228 assert len(cp) == 1
229 for policyinfo in cp:
230 assert policyinfo == pi
231
232 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500233 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400234 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
235 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500236 if six.PY3:
237 assert repr(cp) == (
238 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
239 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
240 "ers=['string'])>])>"
241 )
242 else:
243 assert repr(cp) == (
244 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
245 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
246 "ers=[u'string'])>])>"
247 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400248
Paul Kehrerc56ab622015-05-03 09:56:31 -0500249 def test_eq(self):
250 pi = x509.PolicyInformation(
251 x509.ObjectIdentifier("1.2.3"), [u"string"]
252 )
253 cp = x509.CertificatePolicies([pi])
254 pi2 = x509.PolicyInformation(
255 x509.ObjectIdentifier("1.2.3"), [u"string"]
256 )
257 cp2 = x509.CertificatePolicies([pi2])
258 assert cp == cp2
259
260 def test_ne(self):
261 pi = x509.PolicyInformation(
262 x509.ObjectIdentifier("1.2.3"), [u"string"]
263 )
264 cp = x509.CertificatePolicies([pi])
265 pi2 = x509.PolicyInformation(
266 x509.ObjectIdentifier("1.2.3"), [u"string2"]
267 )
268 cp2 = x509.CertificatePolicies([pi2])
269 assert cp != cp2
270 assert cp != object()
271
Paul Kehrer2b622582015-04-15 11:04:29 -0400272
Paul Kehrer11026fe2015-05-12 11:23:56 -0500273@pytest.mark.requires_backend_interface(interface=RSABackend)
274@pytest.mark.requires_backend_interface(interface=X509Backend)
275class TestCertificatePoliciesExtension(object):
276 def test_cps_uri_policy_qualifier(self, backend):
277 cert = _load_cert(
278 os.path.join("x509", "custom", "cp_cps_uri.pem"),
279 x509.load_pem_x509_certificate,
280 backend
281 )
282
283 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500284 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500285 ).value
286
287 assert cp == x509.CertificatePolicies([
288 x509.PolicyInformation(
289 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
290 [u"http://other.com/cps"]
291 )
292 ])
293
294 def test_user_notice_with_notice_reference(self, backend):
295 cert = _load_cert(
296 os.path.join(
297 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
298 ),
299 x509.load_pem_x509_certificate,
300 backend
301 )
302
303 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500304 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500305 ).value
306
307 assert cp == x509.CertificatePolicies([
308 x509.PolicyInformation(
309 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
310 [
311 u"http://example.com/cps",
312 u"http://other.com/cps",
313 x509.UserNotice(
314 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
315 u"thing"
316 )
317 ]
318 )
319 ])
320
321 def test_user_notice_with_explicit_text(self, backend):
322 cert = _load_cert(
323 os.path.join(
324 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
325 ),
326 x509.load_pem_x509_certificate,
327 backend
328 )
329
330 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500331 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500332 ).value
333
334 assert cp == x509.CertificatePolicies([
335 x509.PolicyInformation(
336 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
337 [x509.UserNotice(None, u"thing")]
338 )
339 ])
340
341 def test_user_notice_no_explicit_text(self, backend):
342 cert = _load_cert(
343 os.path.join(
344 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
345 ),
346 x509.load_pem_x509_certificate,
347 backend
348 )
349
350 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500351 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500352 ).value
353
354 assert cp == x509.CertificatePolicies([
355 x509.PolicyInformation(
356 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
357 [
358 x509.UserNotice(
359 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
360 None
361 )
362 ]
363 )
364 ])
365
366
Paul Kehrercecbbba2015-03-30 14:58:38 -0500367class TestKeyUsage(object):
368 def test_key_agreement_false_encipher_decipher_true(self):
369 with pytest.raises(ValueError):
370 x509.KeyUsage(
371 digital_signature=False,
372 content_commitment=False,
373 key_encipherment=False,
374 data_encipherment=False,
375 key_agreement=False,
376 key_cert_sign=False,
377 crl_sign=False,
378 encipher_only=True,
379 decipher_only=False
380 )
381
382 with pytest.raises(ValueError):
383 x509.KeyUsage(
384 digital_signature=False,
385 content_commitment=False,
386 key_encipherment=False,
387 data_encipherment=False,
388 key_agreement=False,
389 key_cert_sign=False,
390 crl_sign=False,
391 encipher_only=True,
392 decipher_only=True
393 )
394
395 with pytest.raises(ValueError):
396 x509.KeyUsage(
397 digital_signature=False,
398 content_commitment=False,
399 key_encipherment=False,
400 data_encipherment=False,
401 key_agreement=False,
402 key_cert_sign=False,
403 crl_sign=False,
404 encipher_only=False,
405 decipher_only=True
406 )
407
408 def test_properties_key_agreement_true(self):
409 ku = x509.KeyUsage(
410 digital_signature=True,
411 content_commitment=True,
412 key_encipherment=False,
413 data_encipherment=False,
414 key_agreement=False,
415 key_cert_sign=True,
416 crl_sign=False,
417 encipher_only=False,
418 decipher_only=False
419 )
420 assert ku.digital_signature is True
421 assert ku.content_commitment is True
422 assert ku.key_encipherment is False
423 assert ku.data_encipherment is False
424 assert ku.key_agreement is False
425 assert ku.key_cert_sign is True
426 assert ku.crl_sign is False
427
428 def test_key_agreement_true_properties(self):
429 ku = x509.KeyUsage(
430 digital_signature=False,
431 content_commitment=False,
432 key_encipherment=False,
433 data_encipherment=False,
434 key_agreement=True,
435 key_cert_sign=False,
436 crl_sign=False,
437 encipher_only=False,
438 decipher_only=True
439 )
440 assert ku.key_agreement is True
441 assert ku.encipher_only is False
442 assert ku.decipher_only is True
443
444 def test_key_agreement_false_properties(self):
445 ku = x509.KeyUsage(
446 digital_signature=False,
447 content_commitment=False,
448 key_encipherment=False,
449 data_encipherment=False,
450 key_agreement=False,
451 key_cert_sign=False,
452 crl_sign=False,
453 encipher_only=False,
454 decipher_only=False
455 )
456 assert ku.key_agreement is False
457 with pytest.raises(ValueError):
458 ku.encipher_only
459
460 with pytest.raises(ValueError):
461 ku.decipher_only
462
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500463 def test_repr_key_agreement_false(self):
464 ku = x509.KeyUsage(
465 digital_signature=True,
466 content_commitment=True,
467 key_encipherment=False,
468 data_encipherment=False,
469 key_agreement=False,
470 key_cert_sign=True,
471 crl_sign=False,
472 encipher_only=False,
473 decipher_only=False
474 )
475 assert repr(ku) == (
476 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
477 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400478 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
479 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500480 )
481
482 def test_repr_key_agreement_true(self):
483 ku = x509.KeyUsage(
484 digital_signature=True,
485 content_commitment=True,
486 key_encipherment=False,
487 data_encipherment=False,
488 key_agreement=True,
489 key_cert_sign=True,
490 crl_sign=False,
491 encipher_only=False,
492 decipher_only=False
493 )
494 assert repr(ku) == (
495 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
496 "cipherment=False, data_encipherment=False, key_agreement=True, k"
497 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
498 "only=False)>"
499 )
500
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500501 def test_eq(self):
502 ku = x509.KeyUsage(
503 digital_signature=False,
504 content_commitment=False,
505 key_encipherment=False,
506 data_encipherment=False,
507 key_agreement=True,
508 key_cert_sign=False,
509 crl_sign=False,
510 encipher_only=False,
511 decipher_only=True
512 )
513 ku2 = x509.KeyUsage(
514 digital_signature=False,
515 content_commitment=False,
516 key_encipherment=False,
517 data_encipherment=False,
518 key_agreement=True,
519 key_cert_sign=False,
520 crl_sign=False,
521 encipher_only=False,
522 decipher_only=True
523 )
524 assert ku == ku2
525
526 def test_ne(self):
527 ku = x509.KeyUsage(
528 digital_signature=False,
529 content_commitment=False,
530 key_encipherment=False,
531 data_encipherment=False,
532 key_agreement=True,
533 key_cert_sign=False,
534 crl_sign=False,
535 encipher_only=False,
536 decipher_only=True
537 )
538 ku2 = x509.KeyUsage(
539 digital_signature=False,
540 content_commitment=False,
541 key_encipherment=False,
542 data_encipherment=False,
543 key_agreement=False,
544 key_cert_sign=False,
545 crl_sign=False,
546 encipher_only=False,
547 decipher_only=False
548 )
549 assert ku != ku2
550 assert ku != object()
551
Paul Kehrercecbbba2015-03-30 14:58:38 -0500552
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500553class TestSubjectKeyIdentifier(object):
554 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400555 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500556 ski = x509.SubjectKeyIdentifier(value)
557 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500558
559 def test_repr(self):
560 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500561 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500562 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500563 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400564 if six.PY3:
565 assert repr(ext) == (
566 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
567 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
568 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
569 "\\xf7\\xff:\\xc9\')>)>"
570 )
571 else:
572 assert repr(ext) == (
573 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
574 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
575 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
576 "\\xf7\\xff:\\xc9\')>)>"
577 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500578
579 def test_eq(self):
580 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500581 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500582 )
583 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500584 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500585 )
586 assert ski == ski2
587
588 def test_ne(self):
589 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500590 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500591 )
592 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500593 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500594 )
595 assert ski != ski2
596 assert ski != object()
597
598
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400599class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500600 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400601 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500602 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400603
604 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500605 dirname = x509.DirectoryName(
606 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800607 x509.NameAttribute(
608 x509.ObjectIdentifier('2.999.1'),
609 u'value1'
610 ),
611 x509.NameAttribute(
612 x509.ObjectIdentifier('2.999.2'),
613 u'value2'
614 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500615 ])
616 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400617 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500618 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400619
620 def test_authority_issuer_none_serial_not_none(self):
621 with pytest.raises(ValueError):
622 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
623
624 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500625 dirname = x509.DirectoryName(
626 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800627 x509.NameAttribute(
628 x509.ObjectIdentifier('2.999.1'),
629 u'value1'
630 ),
631 x509.NameAttribute(
632 x509.ObjectIdentifier('2.999.2'),
633 u'value2'
634 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500635 ])
636 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400637 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500638 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400639
640 def test_authority_cert_serial_and_issuer_none(self):
641 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
642 assert aki.key_identifier == b"id"
643 assert aki.authority_cert_issuer is None
644 assert aki.authority_cert_serial_number is None
645
646 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500647 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500648 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500649 )
650 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400651
652 if six.PY3:
653 assert repr(aki) == (
654 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500655 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500656 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500657 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400658 )
659 else:
660 assert repr(aki) == (
661 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500662 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500663 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
664 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400665 )
666
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500667 def test_eq(self):
668 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500669 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500670 )
671 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
672 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500673 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500674 )
675 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
676 assert aki == aki2
677
678 def test_ne(self):
679 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500680 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500681 )
682 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500683 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500684 )
685 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
686 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
687 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
688 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
689 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
690 assert aki != aki2
691 assert aki != aki3
692 assert aki != aki4
693 assert aki != aki5
694 assert aki != object()
695
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400696
Paul Kehrer8cf26422015-03-21 09:50:24 -0500697class TestBasicConstraints(object):
698 def test_ca_not_boolean(self):
699 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500700 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500701
702 def test_path_length_not_ca(self):
703 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500704 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500705
706 def test_path_length_not_int(self):
707 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500708 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500709
710 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500711 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500712
713 def test_path_length_negative(self):
714 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500715 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500716
717 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500718 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500719 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500720 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500721 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500722
Paul Kehrer3a69b132015-05-13 10:03:46 -0500723 def test_eq(self):
724 na = x509.BasicConstraints(ca=True, path_length=None)
725 na2 = x509.BasicConstraints(ca=True, path_length=None)
726 assert na == na2
727
728 def test_ne(self):
729 na = x509.BasicConstraints(ca=True, path_length=None)
730 na2 = x509.BasicConstraints(ca=True, path_length=1)
731 na3 = x509.BasicConstraints(ca=False, path_length=None)
732 assert na != na2
733 assert na != na3
734 assert na != object()
735
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500736
Paul Kehrerffa2a152015-03-31 08:18:25 -0500737class TestExtendedKeyUsage(object):
738 def test_not_all_oids(self):
739 with pytest.raises(TypeError):
740 x509.ExtendedKeyUsage(["notoid"])
741
742 def test_iter_len(self):
743 eku = x509.ExtendedKeyUsage([
744 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
745 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
746 ])
747 assert len(eku) == 2
748 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500749 ExtendedKeyUsageOID.SERVER_AUTH,
750 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500751 ]
752
Paul Kehrer23d10c32015-04-02 23:12:32 -0500753 def test_repr(self):
754 eku = x509.ExtendedKeyUsage([
755 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
756 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
757 ])
758 assert repr(eku) == (
759 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
760 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
761 "tAuth)>])>"
762 )
763
Paul Kehrerb0476172015-05-02 19:34:51 -0500764 def test_eq(self):
765 eku = x509.ExtendedKeyUsage([
766 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
767 ])
768 eku2 = x509.ExtendedKeyUsage([
769 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
770 ])
771 assert eku == eku2
772
773 def test_ne(self):
774 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
775 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
776 assert eku != eku2
777 assert eku != object()
778
Paul Kehrerffa2a152015-03-31 08:18:25 -0500779
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500780@pytest.mark.requires_backend_interface(interface=RSABackend)
781@pytest.mark.requires_backend_interface(interface=X509Backend)
782class TestExtensions(object):
783 def test_no_extensions(self, backend):
784 cert = _load_cert(
785 os.path.join("x509", "verisign_md2_root.pem"),
786 x509.load_pem_x509_certificate,
787 backend
788 )
789 ext = cert.extensions
790 assert len(ext) == 0
791 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500792 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500793 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500794
Paul Kehrerd44e4132015-08-10 19:13:13 -0500795 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500796
797 def test_one_extension(self, backend):
798 cert = _load_cert(
799 os.path.join(
800 "x509", "custom", "basic_constraints_not_critical.pem"
801 ),
802 x509.load_pem_x509_certificate,
803 backend
804 )
805 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500806 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500807 assert ext is not None
808 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500809
810 def test_duplicate_extension(self, backend):
811 cert = _load_cert(
812 os.path.join(
813 "x509", "custom", "two_basic_constraints.pem"
814 ),
815 x509.load_pem_x509_certificate,
816 backend
817 )
818 with pytest.raises(x509.DuplicateExtension) as exc:
819 cert.extensions
820
Paul Kehrerd44e4132015-08-10 19:13:13 -0500821 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500822
823 def test_unsupported_critical_extension(self, backend):
824 cert = _load_cert(
825 os.path.join(
826 "x509", "custom", "unsupported_extension_critical.pem"
827 ),
828 x509.load_pem_x509_certificate,
829 backend
830 )
831 with pytest.raises(x509.UnsupportedExtension) as exc:
832 cert.extensions
833
834 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
835
836 def test_unsupported_extension(self, backend):
837 # TODO: this will raise an exception when all extensions are complete
838 cert = _load_cert(
839 os.path.join(
840 "x509", "custom", "unsupported_extension.pem"
841 ),
842 x509.load_pem_x509_certificate,
843 backend
844 )
845 extensions = cert.extensions
846 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500847
Phoebe Queenecae9812015-08-12 05:00:32 +0100848 def test_no_extensions_get_for_class(self, backend):
849 cert = _load_cert(
850 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100851 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100852 ),
853 x509.load_pem_x509_certificate,
854 backend
855 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100856 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100857 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100858 exts.get_extension_for_class(x509.IssuerAlternativeName)
859 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100860
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100861 def test_one_extension_get_for_class(self, backend):
862 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100863 os.path.join(
864 "x509", "custom", "basic_constraints_not_critical.pem"
865 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100866 x509.load_pem_x509_certificate,
867 backend
868 )
869 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
870 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100871 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500872
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500873 def test_repr(self, backend):
874 cert = _load_cert(
875 os.path.join(
876 "x509", "custom", "basic_constraints_not_critical.pem"
877 ),
878 x509.load_pem_x509_certificate,
879 backend
880 )
881 assert repr(cert.extensions) == (
882 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
883 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
884 "alse, path_length=None)>)>])>"
885 )
886
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100887
Paul Kehrerfa56a232015-03-17 13:14:03 -0500888@pytest.mark.requires_backend_interface(interface=RSABackend)
889@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500890class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500891 def test_ca_true_pathlen_6(self, backend):
892 cert = _load_cert(
893 os.path.join(
894 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
895 ),
896 x509.load_der_x509_certificate,
897 backend
898 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100899 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500900 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500901 )
902 assert ext is not None
903 assert ext.critical is True
904 assert ext.value.ca is True
905 assert ext.value.path_length == 6
906
907 def test_path_length_zero(self, backend):
908 cert = _load_cert(
909 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
910 x509.load_pem_x509_certificate,
911 backend
912 )
913 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500914 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500915 )
916 assert ext is not None
917 assert ext.critical is True
918 assert ext.value.ca is True
919 assert ext.value.path_length == 0
920
921 def test_ca_true_no_pathlen(self, backend):
922 cert = _load_cert(
923 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
924 x509.load_der_x509_certificate,
925 backend
926 )
927 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500928 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500929 )
930 assert ext is not None
931 assert ext.critical is True
932 assert ext.value.ca is True
933 assert ext.value.path_length is None
934
935 def test_ca_false(self, backend):
936 cert = _load_cert(
937 os.path.join("x509", "cryptography.io.pem"),
938 x509.load_pem_x509_certificate,
939 backend
940 )
941 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500942 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500943 )
944 assert ext is not None
945 assert ext.critical is True
946 assert ext.value.ca is False
947 assert ext.value.path_length is None
948
949 def test_no_basic_constraints(self, backend):
950 cert = _load_cert(
951 os.path.join(
952 "x509",
953 "PKITS_data",
954 "certs",
955 "ValidCertificatePathTest1EE.crt"
956 ),
957 x509.load_der_x509_certificate,
958 backend
959 )
960 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500961 cert.extensions.get_extension_for_oid(
962 ExtensionOID.BASIC_CONSTRAINTS
963 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500964
965 def test_basic_constraint_not_critical(self, backend):
966 cert = _load_cert(
967 os.path.join(
968 "x509", "custom", "basic_constraints_not_critical.pem"
969 ),
970 x509.load_pem_x509_certificate,
971 backend
972 )
973 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500974 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500975 )
976 assert ext is not None
977 assert ext.critical is False
978 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500979
980
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500981class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100982 @pytest.mark.requires_backend_interface(interface=RSABackend)
983 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500984 def test_subject_key_identifier(self, backend):
985 cert = _load_cert(
986 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
987 x509.load_der_x509_certificate,
988 backend
989 )
990 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500991 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500992 )
993 ski = ext.value
994 assert ext is not None
995 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500996 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500997 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500998 )
999
Paul Kehrerf22f6122015-08-05 12:57:13 +01001000 @pytest.mark.requires_backend_interface(interface=RSABackend)
1001 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001002 def test_no_subject_key_identifier(self, backend):
1003 cert = _load_cert(
1004 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1005 x509.load_pem_x509_certificate,
1006 backend
1007 )
1008 with pytest.raises(x509.ExtensionNotFound):
1009 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001010 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001011 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001012
Paul Kehrerf22f6122015-08-05 12:57:13 +01001013 @pytest.mark.requires_backend_interface(interface=RSABackend)
1014 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001015 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001016 cert = _load_cert(
1017 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1018 x509.load_der_x509_certificate,
1019 backend
1020 )
1021 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001022 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001023 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001024 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001025 cert.public_key()
1026 )
1027 assert ext.value == ski
1028
1029 @pytest.mark.requires_backend_interface(interface=DSABackend)
1030 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001031 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001032 cert = _load_cert(
1033 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1034 x509.load_pem_x509_certificate,
1035 backend
1036 )
1037
1038 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001039 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001040 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001041 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001042 cert.public_key()
1043 )
1044 assert ext.value == ski
1045
1046 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1047 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001048 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001049 _skip_curve_unsupported(backend, ec.SECP384R1())
1050 cert = _load_cert(
1051 os.path.join("x509", "ecdsa_root.pem"),
1052 x509.load_pem_x509_certificate,
1053 backend
1054 )
1055
1056 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001057 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001058 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001059 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001060 cert.public_key()
1061 )
1062 assert ext.value == ski
1063
Paul Kehrer5508ee22015-04-02 19:31:03 -05001064
1065@pytest.mark.requires_backend_interface(interface=RSABackend)
1066@pytest.mark.requires_backend_interface(interface=X509Backend)
1067class TestKeyUsageExtension(object):
1068 def test_no_key_usage(self, backend):
1069 cert = _load_cert(
1070 os.path.join("x509", "verisign_md2_root.pem"),
1071 x509.load_pem_x509_certificate,
1072 backend
1073 )
1074 ext = cert.extensions
1075 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001076 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001077
Paul Kehrerd44e4132015-08-10 19:13:13 -05001078 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001079
1080 def test_all_purposes(self, backend):
1081 cert = _load_cert(
1082 os.path.join(
1083 "x509", "custom", "all_key_usages.pem"
1084 ),
1085 x509.load_pem_x509_certificate,
1086 backend
1087 )
1088 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001089 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001090 assert ext is not None
1091
1092 ku = ext.value
1093 assert ku.digital_signature is True
1094 assert ku.content_commitment is True
1095 assert ku.key_encipherment is True
1096 assert ku.data_encipherment is True
1097 assert ku.key_agreement is True
1098 assert ku.key_cert_sign is True
1099 assert ku.crl_sign is True
1100 assert ku.encipher_only is True
1101 assert ku.decipher_only is True
1102
1103 def test_key_cert_sign_crl_sign(self, backend):
1104 cert = _load_cert(
1105 os.path.join(
1106 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1107 ),
1108 x509.load_der_x509_certificate,
1109 backend
1110 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001111 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001112 assert ext is not None
1113 assert ext.critical is True
1114
1115 ku = ext.value
1116 assert ku.digital_signature is False
1117 assert ku.content_commitment is False
1118 assert ku.key_encipherment is False
1119 assert ku.data_encipherment is False
1120 assert ku.key_agreement is False
1121 assert ku.key_cert_sign is True
1122 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001123
1124
1125@pytest.mark.parametrize(
1126 "name", [
1127 x509.RFC822Name,
1128 x509.DNSName,
1129 x509.UniformResourceIdentifier
1130 ]
1131)
1132class TestTextGeneralNames(object):
1133 def test_not_text(self, name):
1134 with pytest.raises(TypeError):
1135 name(b"notaunicodestring")
1136
1137 with pytest.raises(TypeError):
1138 name(1.3)
1139
1140 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301141 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001142 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1143
1144 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301145 gn = name(u"string")
1146 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001147 assert gn == gn2
1148
1149 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301150 gn = name(u"string")
1151 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001152 assert gn != gn2
1153 assert gn != object()
1154
1155
1156class TestDirectoryName(object):
1157 def test_not_name(self):
1158 with pytest.raises(TypeError):
1159 x509.DirectoryName(b"notaname")
1160
1161 with pytest.raises(TypeError):
1162 x509.DirectoryName(1.3)
1163
1164 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001165 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001166 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001167 if six.PY3:
1168 assert repr(gn) == (
1169 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1170 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1171 ">])>)>"
1172 )
1173 else:
1174 assert repr(gn) == (
1175 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1176 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1177 ")>])>)>"
1178 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001179
1180 def test_eq(self):
1181 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001182 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001183 ])
1184 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001185 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001186 ])
1187 gn = x509.DirectoryName(x509.Name([name]))
1188 gn2 = x509.DirectoryName(x509.Name([name2]))
1189 assert gn == gn2
1190
1191 def test_ne(self):
1192 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001193 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001194 ])
1195 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001196 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001197 ])
1198 gn = x509.DirectoryName(x509.Name([name]))
1199 gn2 = x509.DirectoryName(x509.Name([name2]))
1200 assert gn != gn2
1201 assert gn != object()
1202
1203
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001204class TestRFC822Name(object):
1205 def test_invalid_email(self):
1206 with pytest.raises(ValueError):
1207 x509.RFC822Name(u"Name <email>")
1208
1209 with pytest.raises(ValueError):
1210 x509.RFC822Name(u"")
1211
1212 def test_single_label(self):
1213 gn = x509.RFC822Name(u"administrator")
1214 assert gn.value == u"administrator"
1215
1216 def test_idna(self):
1217 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1218 assert gn.value == u"email@em\xe5\xefl.com"
1219 assert gn._encoded == b"email@xn--eml-vla4c.com"
1220
1221
Paul Kehrere28d6c42015-07-12 14:59:37 -05001222class TestUniformResourceIdentifier(object):
1223 def test_no_parsed_hostname(self):
1224 gn = x509.UniformResourceIdentifier(u"singlelabel")
1225 assert gn.value == u"singlelabel"
1226
1227 def test_with_port(self):
1228 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1229 assert gn.value == u"singlelabel:443/test"
1230
1231 def test_idna_no_port(self):
1232 gn = x509.UniformResourceIdentifier(
1233 u"http://\u043f\u044b\u043a\u0430.cryptography"
1234 )
1235 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1236 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1237
1238 def test_idna_with_port(self):
1239 gn = x509.UniformResourceIdentifier(
1240 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1241 )
1242 assert gn.value == (
1243 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1244 )
1245 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1246
1247 def test_query_and_fragment(self):
1248 gn = x509.UniformResourceIdentifier(
1249 u"ldap://cryptography:90/path?query=true#somedata"
1250 )
1251 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1252
1253
Paul Kehrer31bdf792015-03-25 14:11:00 -05001254class TestRegisteredID(object):
1255 def test_not_oid(self):
1256 with pytest.raises(TypeError):
1257 x509.RegisteredID(b"notanoid")
1258
1259 with pytest.raises(TypeError):
1260 x509.RegisteredID(1.3)
1261
1262 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001263 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001264 assert repr(gn) == (
1265 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1266 "e)>)>"
1267 )
1268
1269 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001270 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1271 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001272 assert gn == gn2
1273
1274 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001275 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001276 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001277 assert gn != gn2
1278 assert gn != object()
1279
1280
1281class TestIPAddress(object):
1282 def test_not_ipaddress(self):
1283 with pytest.raises(TypeError):
1284 x509.IPAddress(b"notanipaddress")
1285
1286 with pytest.raises(TypeError):
1287 x509.IPAddress(1.3)
1288
1289 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301290 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001291 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1292
Eeshan Gargf1234152015-04-29 18:41:00 +05301293 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001294 assert repr(gn2) == "<IPAddress(value=ff::)>"
1295
Paul Kehrereb177932015-05-17 18:33:33 -07001296 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1297 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1298
1299 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1300 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1301
Paul Kehrer31bdf792015-03-25 14:11:00 -05001302 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301303 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1304 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001305 assert gn == gn2
1306
1307 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301308 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1309 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001310 assert gn != gn2
1311 assert gn != object()
1312
1313
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001314class TestOtherName(object):
1315 def test_invalid_args(self):
1316 with pytest.raises(TypeError):
1317 x509.OtherName(b"notanobjectidentifier", b"derdata")
1318
1319 with pytest.raises(TypeError):
1320 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1321
1322 def test_repr(self):
1323 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1324 if six.PY3:
1325 assert repr(gn) == (
1326 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1327 "name=Unknown OID)>, value=b'derdata')>"
1328 )
1329 else:
1330 assert repr(gn) == (
1331 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1332 "name=Unknown OID)>, value='derdata')>"
1333 )
1334
1335 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1336 if six.PY3:
1337 assert repr(gn) == (
1338 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1339 "name=pseudonym)>, value=b'derdata')>"
1340 )
1341 else:
1342 assert repr(gn) == (
1343 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1344 "name=pseudonym)>, value='derdata')>"
1345 )
1346
1347 def test_eq(self):
1348 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1349 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1350 assert gn == gn2
1351
1352 def test_ne(self):
1353 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1354 assert gn != object()
1355
1356 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1357 assert gn != gn2
1358
1359 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1360 assert gn != gn2
1361
1362
Erik Trauschke2dcce902015-05-14 16:12:24 -07001363class TestGeneralNames(object):
1364 def test_get_values_for_type(self):
1365 gns = x509.GeneralNames(
1366 [x509.DNSName(u"cryptography.io")]
1367 )
1368 names = gns.get_values_for_type(x509.DNSName)
1369 assert names == [u"cryptography.io"]
1370
1371 def test_iter_names(self):
1372 gns = x509.GeneralNames([
1373 x509.DNSName(u"cryptography.io"),
1374 x509.DNSName(u"crypto.local"),
1375 ])
1376 assert len(gns) == 2
1377 assert list(gns) == [
1378 x509.DNSName(u"cryptography.io"),
1379 x509.DNSName(u"crypto.local"),
1380 ]
1381
1382 def test_invalid_general_names(self):
1383 with pytest.raises(TypeError):
1384 x509.GeneralNames(
1385 [x509.DNSName(u"cryptography.io"), "invalid"]
1386 )
1387
1388 def test_repr(self):
1389 gns = x509.GeneralNames(
1390 [
1391 x509.DNSName(u"cryptography.io")
1392 ]
1393 )
1394 assert repr(gns) == (
1395 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1396 )
1397
1398 def test_eq(self):
1399 gns = x509.GeneralNames(
1400 [x509.DNSName(u"cryptography.io")]
1401 )
1402 gns2 = x509.GeneralNames(
1403 [x509.DNSName(u"cryptography.io")]
1404 )
1405 assert gns == gns2
1406
1407 def test_ne(self):
1408 gns = x509.GeneralNames(
1409 [x509.DNSName(u"cryptography.io")]
1410 )
1411 gns2 = x509.GeneralNames(
1412 [x509.RFC822Name(u"admin@cryptography.io")]
1413 )
1414 assert gns != gns2
1415 assert gns != object()
1416
1417
Paul Kehrer99125c92015-06-07 18:37:10 -05001418class TestIssuerAlternativeName(object):
1419 def test_get_values_for_type(self):
1420 san = x509.IssuerAlternativeName(
1421 [x509.DNSName(u"cryptography.io")]
1422 )
1423 names = san.get_values_for_type(x509.DNSName)
1424 assert names == [u"cryptography.io"]
1425
1426 def test_iter_names(self):
1427 san = x509.IssuerAlternativeName([
1428 x509.DNSName(u"cryptography.io"),
1429 x509.DNSName(u"crypto.local"),
1430 ])
1431 assert len(san) == 2
1432 assert list(san) == [
1433 x509.DNSName(u"cryptography.io"),
1434 x509.DNSName(u"crypto.local"),
1435 ]
1436
1437 def test_invalid_general_names(self):
1438 with pytest.raises(TypeError):
1439 x509.IssuerAlternativeName(
1440 [x509.DNSName(u"cryptography.io"), "invalid"]
1441 )
1442
1443 def test_repr(self):
1444 san = x509.IssuerAlternativeName(
1445 [
1446 x509.DNSName(u"cryptography.io")
1447 ]
1448 )
1449 assert repr(san) == (
1450 "<IssuerAlternativeName("
1451 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1452 )
1453
1454 def test_eq(self):
1455 san = x509.IssuerAlternativeName(
1456 [x509.DNSName(u"cryptography.io")]
1457 )
1458 san2 = x509.IssuerAlternativeName(
1459 [x509.DNSName(u"cryptography.io")]
1460 )
1461 assert san == san2
1462
1463 def test_ne(self):
1464 san = x509.IssuerAlternativeName(
1465 [x509.DNSName(u"cryptography.io")]
1466 )
1467 san2 = x509.IssuerAlternativeName(
1468 [x509.RFC822Name(u"admin@cryptography.io")]
1469 )
1470 assert san != san2
1471 assert san != object()
1472
1473
Alex Gaynorf1c17672015-06-20 14:20:20 -04001474@pytest.mark.requires_backend_interface(interface=RSABackend)
1475@pytest.mark.requires_backend_interface(interface=X509Backend)
1476class TestRSAIssuerAlternativeNameExtension(object):
1477 def test_uri(self, backend):
1478 cert = _load_cert(
1479 os.path.join("x509", "custom", "ian_uri.pem"),
1480 x509.load_pem_x509_certificate,
1481 backend,
1482 )
1483 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001484 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001485 )
1486 assert list(ext.value) == [
1487 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1488 ]
1489
1490
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001491class TestCRLNumber(object):
1492 def test_eq(self):
1493 crl_number = x509.CRLNumber(15)
1494 assert crl_number == x509.CRLNumber(15)
1495
1496 def test_ne(self):
1497 crl_number = x509.CRLNumber(15)
1498 assert crl_number != x509.CRLNumber(14)
1499 assert crl_number != object()
1500
1501 def test_repr(self):
1502 crl_number = x509.CRLNumber(15)
1503 assert repr(crl_number) == "<CRLNumber(15)>"
1504
Paul Kehrera9718fc2015-12-22 22:55:35 -06001505 def test_invalid_number(self):
1506 with pytest.raises(TypeError):
1507 x509.CRLNumber("notanumber")
1508
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001509
Paul Kehrer31bdf792015-03-25 14:11:00 -05001510class TestSubjectAlternativeName(object):
1511 def test_get_values_for_type(self):
1512 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301513 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001514 )
1515 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301516 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001517
1518 def test_iter_names(self):
1519 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301520 x509.DNSName(u"cryptography.io"),
1521 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001522 ])
1523 assert len(san) == 2
1524 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301525 x509.DNSName(u"cryptography.io"),
1526 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001527 ]
1528
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001529 def test_invalid_general_names(self):
1530 with pytest.raises(TypeError):
1531 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301532 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001533 )
1534
Paul Kehrer31bdf792015-03-25 14:11:00 -05001535 def test_repr(self):
1536 san = x509.SubjectAlternativeName(
1537 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301538 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001539 ]
1540 )
1541 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001542 "<SubjectAlternativeName("
1543 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001544 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001545
Paul Kehrer58cc3972015-05-13 10:00:41 -05001546 def test_eq(self):
1547 san = x509.SubjectAlternativeName(
1548 [x509.DNSName(u"cryptography.io")]
1549 )
1550 san2 = x509.SubjectAlternativeName(
1551 [x509.DNSName(u"cryptography.io")]
1552 )
1553 assert san == san2
1554
1555 def test_ne(self):
1556 san = x509.SubjectAlternativeName(
1557 [x509.DNSName(u"cryptography.io")]
1558 )
1559 san2 = x509.SubjectAlternativeName(
1560 [x509.RFC822Name(u"admin@cryptography.io")]
1561 )
1562 assert san != san2
1563 assert san != object()
1564
Paul Kehrer40f83382015-04-20 15:00:16 -05001565
1566@pytest.mark.requires_backend_interface(interface=RSABackend)
1567@pytest.mark.requires_backend_interface(interface=X509Backend)
1568class TestRSASubjectAlternativeNameExtension(object):
1569 def test_dns_name(self, backend):
1570 cert = _load_cert(
1571 os.path.join("x509", "cryptography.io.pem"),
1572 x509.load_pem_x509_certificate,
1573 backend
1574 )
1575 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001576 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001577 )
1578 assert ext is not None
1579 assert ext.critical is False
1580
1581 san = ext.value
1582
1583 dns = san.get_values_for_type(x509.DNSName)
1584 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001585
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001586 def test_wildcard_dns_name(self, backend):
1587 cert = _load_cert(
1588 os.path.join("x509", "wildcard_san.pem"),
1589 x509.load_pem_x509_certificate,
1590 backend
1591 )
1592 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001593 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001594 )
1595
1596 dns = ext.value.get_values_for_type(x509.DNSName)
1597 assert dns == [
1598 u'*.langui.sh',
1599 u'langui.sh',
1600 u'*.saseliminator.com',
1601 u'saseliminator.com'
1602 ]
1603
Dominic Chen87bb9572015-10-09 00:23:07 -04001604 def test_san_empty_hostname(self, backend):
1605 cert = _load_cert(
1606 os.path.join(
1607 "x509", "custom", "san_empty_hostname.pem"
1608 ),
1609 x509.load_pem_x509_certificate,
1610 backend
1611 )
1612 san = cert.extensions.get_extension_for_oid(
1613 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1614 )
1615
1616 dns = san.value.get_values_for_type(x509.DNSName)
1617 assert dns == [u'']
1618
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001619 def test_san_wildcard_idna_dns_name(self, backend):
1620 cert = _load_cert(
1621 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1622 x509.load_pem_x509_certificate,
1623 backend
1624 )
1625 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001626 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001627 )
1628
1629 dns = ext.value.get_values_for_type(x509.DNSName)
1630 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1631
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001632 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001633 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001634 os.path.join("x509", "san_x400address.der"),
1635 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001636 backend
1637 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001638 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001639 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001640
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001641 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001642
1643 def test_registered_id(self, backend):
1644 cert = _load_cert(
1645 os.path.join(
1646 "x509", "custom", "san_registered_id.pem"
1647 ),
1648 x509.load_pem_x509_certificate,
1649 backend
1650 )
1651 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001652 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001653 )
1654 assert ext is not None
1655 assert ext.critical is False
1656
1657 san = ext.value
1658 rid = san.get_values_for_type(x509.RegisteredID)
1659 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001660
1661 def test_uri(self, backend):
1662 cert = _load_cert(
1663 os.path.join(
1664 "x509", "custom", "san_uri_with_port.pem"
1665 ),
1666 x509.load_pem_x509_certificate,
1667 backend
1668 )
1669 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001670 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001671 )
1672 assert ext is not None
1673 uri = ext.value.get_values_for_type(
1674 x509.UniformResourceIdentifier
1675 )
1676 assert uri == [
1677 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1678 u"lo",
1679 u"http://someregulardomain.com",
1680 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001681
1682 def test_ipaddress(self, backend):
1683 cert = _load_cert(
1684 os.path.join(
1685 "x509", "custom", "san_ipaddr.pem"
1686 ),
1687 x509.load_pem_x509_certificate,
1688 backend
1689 )
1690 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001691 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001692 )
1693 assert ext is not None
1694 assert ext.critical is False
1695
1696 san = ext.value
1697
1698 ip = san.get_values_for_type(x509.IPAddress)
1699 assert [
1700 ipaddress.ip_address(u"127.0.0.1"),
1701 ipaddress.ip_address(u"ff::")
1702 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001703
1704 def test_dirname(self, backend):
1705 cert = _load_cert(
1706 os.path.join(
1707 "x509", "custom", "san_dirname.pem"
1708 ),
1709 x509.load_pem_x509_certificate,
1710 backend
1711 )
1712 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001713 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001714 )
1715 assert ext is not None
1716 assert ext.critical is False
1717
1718 san = ext.value
1719
1720 dirname = san.get_values_for_type(x509.DirectoryName)
1721 assert [
1722 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001723 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1724 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1725 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001726 ])
1727 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001728
1729 def test_rfc822name(self, backend):
1730 cert = _load_cert(
1731 os.path.join(
1732 "x509", "custom", "san_rfc822_idna.pem"
1733 ),
1734 x509.load_pem_x509_certificate,
1735 backend
1736 )
1737 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001738 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001739 )
1740 assert ext is not None
1741 assert ext.critical is False
1742
1743 san = ext.value
1744
1745 rfc822name = san.get_values_for_type(x509.RFC822Name)
1746 assert [u"email@em\xe5\xefl.com"] == rfc822name
1747
Paul Kehrerb8968812015-05-15 09:01:34 -07001748 def test_idna2003_invalid(self, backend):
1749 cert = _load_cert(
1750 os.path.join(
1751 "x509", "custom", "san_idna2003_dnsname.pem"
1752 ),
1753 x509.load_pem_x509_certificate,
1754 backend
1755 )
1756 with pytest.raises(UnicodeError):
1757 cert.extensions
1758
Paul Kehrere06cab42015-04-30 10:23:33 -05001759 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1760 cert = _load_cert(
1761 os.path.join(
1762 "x509", "custom", "san_idna_names.pem"
1763 ),
1764 x509.load_pem_x509_certificate,
1765 backend
1766 )
1767 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001768 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001769 )
1770 assert ext is not None
1771 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1772 dns_name = ext.value.get_values_for_type(x509.DNSName)
1773 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1774 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1775 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1776 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1777
1778 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1779 cert = _load_cert(
1780 os.path.join(
1781 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1782 ),
1783 x509.load_pem_x509_certificate,
1784 backend
1785 )
1786 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001787 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001788 )
1789 assert ext is not None
1790 assert ext.critical is False
1791
1792 san = ext.value
1793
1794 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1795 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1796 dns = san.get_values_for_type(x509.DNSName)
1797 ip = san.get_values_for_type(x509.IPAddress)
1798 dirname = san.get_values_for_type(x509.DirectoryName)
1799 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001800 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001801 assert [u"cryptography.io"] == dns
1802 assert [
1803 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001804 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001805 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001806 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001807 ),
1808 ])
1809 ] == dirname
1810 assert [
1811 ipaddress.ip_address(u"127.0.0.1"),
1812 ipaddress.ip_address(u"ff::")
1813 ] == ip
1814
1815 def test_invalid_rfc822name(self, backend):
1816 cert = _load_cert(
1817 os.path.join(
1818 "x509", "custom", "san_rfc822_names.pem"
1819 ),
1820 x509.load_pem_x509_certificate,
1821 backend
1822 )
1823 with pytest.raises(ValueError) as exc:
1824 cert.extensions
1825
1826 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001827
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001828 def test_other_name(self, backend):
1829 cert = _load_cert(
1830 os.path.join(
1831 "x509", "custom", "san_other_name.pem"
1832 ),
1833 x509.load_pem_x509_certificate,
1834 backend
1835 )
1836
1837 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001838 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001839 )
1840 assert ext is not None
1841 assert ext.critical is False
1842
Joshua Taubererd2afad32015-07-06 22:37:53 +00001843 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1844 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001845 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001846 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001847
1848 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001849 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001850
Paul Kehrer94c69602015-05-02 19:29:40 -05001851
1852@pytest.mark.requires_backend_interface(interface=RSABackend)
1853@pytest.mark.requires_backend_interface(interface=X509Backend)
1854class TestExtendedKeyUsageExtension(object):
1855 def test_eku(self, backend):
1856 cert = _load_cert(
1857 os.path.join(
1858 "x509", "custom", "extended_key_usage.pem"
1859 ),
1860 x509.load_pem_x509_certificate,
1861 backend
1862 )
1863 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001864 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001865 )
1866 assert ext is not None
1867 assert ext.critical is False
1868
1869 assert [
1870 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1871 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1872 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1873 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1874 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1875 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1876 x509.ObjectIdentifier("2.5.29.37.0"),
1877 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1878 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001879
1880
1881class TestAccessDescription(object):
1882 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001883 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001884 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1885
1886 def test_invalid_access_location(self):
1887 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001888 x509.AccessDescription(
1889 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1890 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001891
Nick Bastind2ecf862015-12-13 05:44:46 -08001892 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001893 ad = x509.AccessDescription(
1894 ObjectIdentifier("2.999.1"),
1895 x509.UniformResourceIdentifier(u"http://example.com")
1896 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08001897 assert ad is not None
1898
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001899 def test_repr(self):
1900 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001901 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001902 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1903 )
1904 assert repr(ad) == (
1905 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1906 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1907 "(value=http://ocsp.domain.com)>)>"
1908 )
1909
1910 def test_eq(self):
1911 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001912 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001913 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1914 )
1915 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001916 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001917 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1918 )
1919 assert ad == ad2
1920
1921 def test_ne(self):
1922 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001923 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001924 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1925 )
1926 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001927 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001928 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1929 )
1930 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001931 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001932 x509.UniformResourceIdentifier(u"http://notthesame")
1933 )
1934 assert ad != ad2
1935 assert ad != ad3
1936 assert ad != object()
1937
1938
1939class TestAuthorityInformationAccess(object):
1940 def test_invalid_descriptions(self):
1941 with pytest.raises(TypeError):
1942 x509.AuthorityInformationAccess(["notanAccessDescription"])
1943
1944 def test_iter_len(self):
1945 aia = x509.AuthorityInformationAccess([
1946 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001947 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001948 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1949 ),
1950 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001951 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001952 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1953 )
1954 ])
1955 assert len(aia) == 2
1956 assert list(aia) == [
1957 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001958 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001959 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1960 ),
1961 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001962 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001963 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1964 )
1965 ]
1966
1967 def test_repr(self):
1968 aia = x509.AuthorityInformationAccess([
1969 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001970 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001971 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1972 ),
1973 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001974 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001975 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1976 )
1977 ])
1978 assert repr(aia) == (
1979 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1980 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1981 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1982 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1983 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1984 "fier(value=http://domain.com/ca.crt)>)>])>"
1985 )
1986
1987 def test_eq(self):
1988 aia = x509.AuthorityInformationAccess([
1989 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001990 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001991 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1992 ),
1993 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001994 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001995 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1996 )
1997 ])
1998 aia2 = x509.AuthorityInformationAccess([
1999 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002000 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002001 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2002 ),
2003 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002004 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002005 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2006 )
2007 ])
2008 assert aia == aia2
2009
2010 def test_ne(self):
2011 aia = x509.AuthorityInformationAccess([
2012 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002013 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002014 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2015 ),
2016 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002017 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002018 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2019 )
2020 ])
2021 aia2 = x509.AuthorityInformationAccess([
2022 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002023 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002024 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2025 ),
2026 ])
2027
2028 assert aia != aia2
2029 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002030
2031
2032@pytest.mark.requires_backend_interface(interface=RSABackend)
2033@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002034class TestAuthorityInformationAccessExtension(object):
2035 def test_aia_ocsp_ca_issuers(self, backend):
2036 cert = _load_cert(
2037 os.path.join("x509", "cryptography.io.pem"),
2038 x509.load_pem_x509_certificate,
2039 backend
2040 )
2041 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002042 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002043 )
2044 assert ext is not None
2045 assert ext.critical is False
2046
2047 assert ext.value == x509.AuthorityInformationAccess([
2048 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002049 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002050 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2051 ),
2052 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002053 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002054 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2055 ),
2056 ])
2057
2058 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2059 cert = _load_cert(
2060 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2061 x509.load_pem_x509_certificate,
2062 backend
2063 )
2064 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002065 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002066 )
2067 assert ext is not None
2068 assert ext.critical is False
2069
2070 assert ext.value == x509.AuthorityInformationAccess([
2071 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002072 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002073 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2074 ),
2075 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002076 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002077 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2078 ),
2079 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002080 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002081 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002082 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2083 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002084 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002085 ]))
2086 ),
2087 ])
2088
2089 def test_aia_ocsp_only(self, backend):
2090 cert = _load_cert(
2091 os.path.join("x509", "custom", "aia_ocsp.pem"),
2092 x509.load_pem_x509_certificate,
2093 backend
2094 )
2095 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002096 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002097 )
2098 assert ext is not None
2099 assert ext.critical is False
2100
2101 assert ext.value == x509.AuthorityInformationAccess([
2102 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002103 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002104 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2105 ),
2106 ])
2107
2108 def test_aia_ca_issuers_only(self, backend):
2109 cert = _load_cert(
2110 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2111 x509.load_pem_x509_certificate,
2112 backend
2113 )
2114 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002115 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002116 )
2117 assert ext is not None
2118 assert ext.critical is False
2119
2120 assert ext.value == x509.AuthorityInformationAccess([
2121 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002122 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002123 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002124 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2125 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002126 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002127 ]))
2128 ),
2129 ])
2130
2131
2132@pytest.mark.requires_backend_interface(interface=RSABackend)
2133@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002134class TestAuthorityKeyIdentifierExtension(object):
2135 def test_aki_keyid(self, backend):
2136 cert = _load_cert(
2137 os.path.join(
2138 "x509", "cryptography.io.pem"
2139 ),
2140 x509.load_pem_x509_certificate,
2141 backend
2142 )
2143 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002144 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002145 )
2146 assert ext is not None
2147 assert ext.critical is False
2148
2149 assert ext.value.key_identifier == (
2150 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2151 )
2152 assert ext.value.authority_cert_issuer is None
2153 assert ext.value.authority_cert_serial_number is None
2154
2155 def test_aki_all_fields(self, backend):
2156 cert = _load_cert(
2157 os.path.join(
2158 "x509", "custom", "authority_key_identifier.pem"
2159 ),
2160 x509.load_pem_x509_certificate,
2161 backend
2162 )
2163 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002164 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002165 )
2166 assert ext is not None
2167 assert ext.critical is False
2168
2169 assert ext.value.key_identifier == (
2170 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2171 )
2172 assert ext.value.authority_cert_issuer == [
2173 x509.DirectoryName(
2174 x509.Name([
2175 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002176 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002177 ),
2178 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002179 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002180 )
2181 ])
2182 )
2183 ]
2184 assert ext.value.authority_cert_serial_number == 3
2185
2186 def test_aki_no_keyid(self, backend):
2187 cert = _load_cert(
2188 os.path.join(
2189 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2190 ),
2191 x509.load_pem_x509_certificate,
2192 backend
2193 )
2194 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002195 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002196 )
2197 assert ext is not None
2198 assert ext.critical is False
2199
2200 assert ext.value.key_identifier is None
2201 assert ext.value.authority_cert_issuer == [
2202 x509.DirectoryName(
2203 x509.Name([
2204 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002205 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002206 ),
2207 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002208 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002209 )
2210 ])
2211 )
2212 ]
2213 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002214
Paul Kehrer253929a2015-08-05 17:30:39 +01002215 def test_from_certificate(self, backend):
2216 issuer_cert = _load_cert(
2217 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2218 x509.load_pem_x509_certificate,
2219 backend
2220 )
2221 cert = _load_cert(
2222 os.path.join("x509", "cryptography.io.pem"),
2223 x509.load_pem_x509_certificate,
2224 backend
2225 )
2226 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002227 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002228 )
2229 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2230 issuer_cert.public_key()
2231 )
2232 assert ext.value == aki
2233
Paul Kehrer5a485522015-05-06 00:29:12 -05002234
Paul Kehrere0017be2015-05-17 20:39:40 -06002235class TestNameConstraints(object):
2236 def test_ipaddress_wrong_type(self):
2237 with pytest.raises(TypeError):
2238 x509.NameConstraints(
2239 permitted_subtrees=[
2240 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2241 ],
2242 excluded_subtrees=None
2243 )
2244
2245 with pytest.raises(TypeError):
2246 x509.NameConstraints(
2247 permitted_subtrees=None,
2248 excluded_subtrees=[
2249 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2250 ]
2251 )
2252
2253 def test_ipaddress_allowed_type(self):
2254 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2255 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2256 nc = x509.NameConstraints(
2257 permitted_subtrees=permitted,
2258 excluded_subtrees=excluded
2259 )
2260 assert nc.permitted_subtrees == permitted
2261 assert nc.excluded_subtrees == excluded
2262
2263 def test_invalid_permitted_subtrees(self):
2264 with pytest.raises(TypeError):
2265 x509.NameConstraints("badpermitted", None)
2266
2267 def test_invalid_excluded_subtrees(self):
2268 with pytest.raises(TypeError):
2269 x509.NameConstraints(None, "badexcluded")
2270
2271 def test_no_subtrees(self):
2272 with pytest.raises(ValueError):
2273 x509.NameConstraints(None, None)
2274
2275 def test_permitted_none(self):
2276 excluded = [x509.DNSName(u"name.local")]
2277 nc = x509.NameConstraints(
2278 permitted_subtrees=None, excluded_subtrees=excluded
2279 )
2280 assert nc.permitted_subtrees is None
2281 assert nc.excluded_subtrees is not None
2282
2283 def test_excluded_none(self):
2284 permitted = [x509.DNSName(u"name.local")]
2285 nc = x509.NameConstraints(
2286 permitted_subtrees=permitted, excluded_subtrees=None
2287 )
2288 assert nc.permitted_subtrees is not None
2289 assert nc.excluded_subtrees is None
2290
2291 def test_repr(self):
2292 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2293 nc = x509.NameConstraints(
2294 permitted_subtrees=permitted,
2295 excluded_subtrees=None
2296 )
2297 assert repr(nc) == (
2298 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2299 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2300 )
2301
Paul Kehrer31894282015-06-21 21:46:41 -05002302 def test_eq(self):
2303 nc = x509.NameConstraints(
2304 permitted_subtrees=[x509.DNSName(u"name.local")],
2305 excluded_subtrees=[x509.DNSName(u"name2.local")]
2306 )
2307 nc2 = x509.NameConstraints(
2308 permitted_subtrees=[x509.DNSName(u"name.local")],
2309 excluded_subtrees=[x509.DNSName(u"name2.local")]
2310 )
2311 assert nc == nc2
2312
2313 def test_ne(self):
2314 nc = x509.NameConstraints(
2315 permitted_subtrees=[x509.DNSName(u"name.local")],
2316 excluded_subtrees=[x509.DNSName(u"name2.local")]
2317 )
2318 nc2 = x509.NameConstraints(
2319 permitted_subtrees=[x509.DNSName(u"name.local")],
2320 excluded_subtrees=None
2321 )
2322 nc3 = x509.NameConstraints(
2323 permitted_subtrees=None,
2324 excluded_subtrees=[x509.DNSName(u"name2.local")]
2325 )
2326
2327 assert nc != nc2
2328 assert nc != nc3
2329 assert nc != object()
2330
Paul Kehrere0017be2015-05-17 20:39:40 -06002331
Paul Kehrer870d7e82015-06-21 22:20:44 -05002332@pytest.mark.requires_backend_interface(interface=RSABackend)
2333@pytest.mark.requires_backend_interface(interface=X509Backend)
2334class TestNameConstraintsExtension(object):
2335 def test_permitted_excluded(self, backend):
2336 cert = _load_cert(
2337 os.path.join(
2338 "x509", "custom", "nc_permitted_excluded_2.pem"
2339 ),
2340 x509.load_pem_x509_certificate,
2341 backend
2342 )
2343 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002344 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002345 ).value
2346 assert nc == x509.NameConstraints(
2347 permitted_subtrees=[
2348 x509.DNSName(u"zombo.local"),
2349 ],
2350 excluded_subtrees=[
2351 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002352 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002353 ]))
2354 ]
2355 )
2356
2357 def test_permitted(self, backend):
2358 cert = _load_cert(
2359 os.path.join(
2360 "x509", "custom", "nc_permitted_2.pem"
2361 ),
2362 x509.load_pem_x509_certificate,
2363 backend
2364 )
2365 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002366 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002367 ).value
2368 assert nc == x509.NameConstraints(
2369 permitted_subtrees=[
2370 x509.DNSName(u"zombo.local"),
2371 ],
2372 excluded_subtrees=None
2373 )
2374
Paul Kehrer42376832015-07-01 18:10:32 -05002375 def test_permitted_with_leading_period(self, backend):
2376 cert = _load_cert(
2377 os.path.join(
2378 "x509", "custom", "nc_permitted.pem"
2379 ),
2380 x509.load_pem_x509_certificate,
2381 backend
2382 )
2383 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002384 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002385 ).value
2386 assert nc == x509.NameConstraints(
2387 permitted_subtrees=[
2388 x509.DNSName(u".cryptography.io"),
2389 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2390 ],
2391 excluded_subtrees=None
2392 )
2393
2394 def test_excluded_with_leading_period(self, backend):
2395 cert = _load_cert(
2396 os.path.join(
2397 "x509", "custom", "nc_excluded.pem"
2398 ),
2399 x509.load_pem_x509_certificate,
2400 backend
2401 )
2402 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002403 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002404 ).value
2405 assert nc == x509.NameConstraints(
2406 permitted_subtrees=None,
2407 excluded_subtrees=[
2408 x509.DNSName(u".cryptography.io"),
2409 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2410 ]
2411 )
2412
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002413 def test_permitted_excluded_with_ips(self, backend):
2414 cert = _load_cert(
2415 os.path.join(
2416 "x509", "custom", "nc_permitted_excluded.pem"
2417 ),
2418 x509.load_pem_x509_certificate,
2419 backend
2420 )
2421 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002422 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002423 ).value
2424 assert nc == x509.NameConstraints(
2425 permitted_subtrees=[
2426 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2427 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2428 ],
2429 excluded_subtrees=[
2430 x509.DNSName(u".domain.com"),
2431 x509.UniformResourceIdentifier(u"http://test.local"),
2432 ]
2433 )
2434
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002435 def test_single_ip_netmask(self, backend):
2436 cert = _load_cert(
2437 os.path.join(
2438 "x509", "custom", "nc_single_ip_netmask.pem"
2439 ),
2440 x509.load_pem_x509_certificate,
2441 backend
2442 )
2443 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002444 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002445 ).value
2446 assert nc == x509.NameConstraints(
2447 permitted_subtrees=[
2448 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2449 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2450 ],
2451 excluded_subtrees=None
2452 )
2453
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002454 def test_invalid_netmask(self, backend):
2455 cert = _load_cert(
2456 os.path.join(
2457 "x509", "custom", "nc_invalid_ip_netmask.pem"
2458 ),
2459 x509.load_pem_x509_certificate,
2460 backend
2461 )
2462 with pytest.raises(ValueError):
2463 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002464 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002465 )
2466
Paul Kehrer870d7e82015-06-21 22:20:44 -05002467
Paul Kehrer5a485522015-05-06 00:29:12 -05002468class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002469 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002470 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002471 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002472
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002473 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002474 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002475 x509.DistributionPoint(None, "notname", None, None)
2476
2477 def test_distribution_point_full_and_relative_not_none(self):
2478 with pytest.raises(ValueError):
2479 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002480
2481 def test_crl_issuer_not_general_names(self):
2482 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002483 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002484
2485 def test_reason_not_reasonflags(self):
2486 with pytest.raises(TypeError):
2487 x509.DistributionPoint(
2488 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002489 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002490 frozenset(["notreasonflags"]),
2491 None
2492 )
2493
2494 def test_reason_not_frozenset(self):
2495 with pytest.raises(TypeError):
2496 x509.DistributionPoint(
2497 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2498 None,
2499 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002500 None
2501 )
2502
2503 def test_disallowed_reasons(self):
2504 with pytest.raises(ValueError):
2505 x509.DistributionPoint(
2506 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2507 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002508 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002509 None
2510 )
2511
2512 with pytest.raises(ValueError):
2513 x509.DistributionPoint(
2514 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2515 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002516 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002517 None
2518 )
2519
2520 def test_reason_only(self):
2521 with pytest.raises(ValueError):
2522 x509.DistributionPoint(
2523 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002524 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002525 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002526 None
2527 )
2528
2529 def test_eq(self):
2530 dp = x509.DistributionPoint(
2531 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002532 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002533 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002534 [
2535 x509.DirectoryName(
2536 x509.Name([
2537 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002538 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002539 )
2540 ])
2541 )
2542 ],
2543 )
2544 dp2 = x509.DistributionPoint(
2545 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002546 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002547 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002548 [
2549 x509.DirectoryName(
2550 x509.Name([
2551 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002552 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002553 )
2554 ])
2555 )
2556 ],
2557 )
2558 assert dp == dp2
2559
2560 def test_ne(self):
2561 dp = x509.DistributionPoint(
2562 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002563 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002564 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002565 [
2566 x509.DirectoryName(
2567 x509.Name([
2568 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002569 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002570 )
2571 ])
2572 )
2573 ],
2574 )
2575 dp2 = x509.DistributionPoint(
2576 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2577 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002578 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002579 None
2580 )
2581 assert dp != dp2
2582 assert dp != object()
2583
2584 def test_repr(self):
2585 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002586 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002587 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002588 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002589 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002590 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002591 [
2592 x509.DirectoryName(
2593 x509.Name([
2594 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002595 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002596 )
2597 ])
2598 )
2599 ],
2600 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002601 if six.PY3:
2602 assert repr(dp) == (
2603 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2604 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002605 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2606 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2607 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2608 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002609 )
2610 else:
2611 assert repr(dp) == (
2612 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2613 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002614 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2615 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2616 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2617 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002618 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002619
2620
2621class TestCRLDistributionPoints(object):
2622 def test_invalid_distribution_points(self):
2623 with pytest.raises(TypeError):
2624 x509.CRLDistributionPoints(["notadistributionpoint"])
2625
2626 def test_iter_len(self):
2627 cdp = x509.CRLDistributionPoints([
2628 x509.DistributionPoint(
2629 [x509.UniformResourceIdentifier(u"http://domain")],
2630 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002631 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002632 None
2633 ),
2634 x509.DistributionPoint(
2635 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002636 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002637 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002638 x509.ReasonFlags.key_compromise,
2639 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002640 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002641 None
2642 ),
2643 ])
2644 assert len(cdp) == 2
2645 assert list(cdp) == [
2646 x509.DistributionPoint(
2647 [x509.UniformResourceIdentifier(u"http://domain")],
2648 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002649 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002650 None
2651 ),
2652 x509.DistributionPoint(
2653 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002654 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002655 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002656 x509.ReasonFlags.key_compromise,
2657 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002658 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002659 None
2660 ),
2661 ]
2662
2663 def test_repr(self):
2664 cdp = x509.CRLDistributionPoints([
2665 x509.DistributionPoint(
2666 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002667 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002668 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002669 None
2670 ),
2671 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002672 if six.PY3:
2673 assert repr(cdp) == (
2674 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2675 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2676 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2677 "romise'>}), crl_issuer=None)>])>"
2678 )
2679 else:
2680 assert repr(cdp) == (
2681 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2682 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2683 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2684 "romise'>]), crl_issuer=None)>])>"
2685 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002686
2687 def test_eq(self):
2688 cdp = x509.CRLDistributionPoints([
2689 x509.DistributionPoint(
2690 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002691 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002692 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002693 x509.ReasonFlags.key_compromise,
2694 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002695 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002696 [x509.UniformResourceIdentifier(u"uri://thing")],
2697 ),
2698 ])
2699 cdp2 = x509.CRLDistributionPoints([
2700 x509.DistributionPoint(
2701 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002702 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002703 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002704 x509.ReasonFlags.key_compromise,
2705 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002706 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002707 [x509.UniformResourceIdentifier(u"uri://thing")],
2708 ),
2709 ])
2710 assert cdp == cdp2
2711
2712 def test_ne(self):
2713 cdp = x509.CRLDistributionPoints([
2714 x509.DistributionPoint(
2715 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002716 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002717 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002718 x509.ReasonFlags.key_compromise,
2719 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002720 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002721 [x509.UniformResourceIdentifier(u"uri://thing")],
2722 ),
2723 ])
2724 cdp2 = x509.CRLDistributionPoints([
2725 x509.DistributionPoint(
2726 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002727 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002728 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002729 x509.ReasonFlags.key_compromise,
2730 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002731 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002732 [x509.UniformResourceIdentifier(u"uri://thing")],
2733 ),
2734 ])
2735 cdp3 = x509.CRLDistributionPoints([
2736 x509.DistributionPoint(
2737 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002738 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002739 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002740 [x509.UniformResourceIdentifier(u"uri://thing")],
2741 ),
2742 ])
2743 cdp4 = x509.CRLDistributionPoints([
2744 x509.DistributionPoint(
2745 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002746 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002747 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002748 x509.ReasonFlags.key_compromise,
2749 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002750 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002751 [x509.UniformResourceIdentifier(u"uri://thing2")],
2752 ),
2753 ])
2754 assert cdp != cdp2
2755 assert cdp != cdp3
2756 assert cdp != cdp4
2757 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002758
2759
2760@pytest.mark.requires_backend_interface(interface=RSABackend)
2761@pytest.mark.requires_backend_interface(interface=X509Backend)
2762class TestCRLDistributionPointsExtension(object):
2763 def test_fullname_and_crl_issuer(self, backend):
2764 cert = _load_cert(
2765 os.path.join(
2766 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2767 ),
2768 x509.load_der_x509_certificate,
2769 backend
2770 )
2771
2772 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002773 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002774 ).value
2775
2776 assert cdps == x509.CRLDistributionPoints([
2777 x509.DistributionPoint(
2778 full_name=[x509.DirectoryName(
2779 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002780 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002781 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002782 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002783 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002784 ),
2785 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002786 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002787 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002788 ),
2789 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002790 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002791 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002792 ),
2793 ])
2794 )],
2795 relative_name=None,
2796 reasons=None,
2797 crl_issuer=[x509.DirectoryName(
2798 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002799 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002800 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002801 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002802 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002803 ),
2804 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002805 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002806 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002807 ),
2808 ])
2809 )],
2810 )
2811 ])
2812
2813 def test_relativename_and_crl_issuer(self, backend):
2814 cert = _load_cert(
2815 os.path.join(
2816 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2817 ),
2818 x509.load_der_x509_certificate,
2819 backend
2820 )
2821
2822 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002823 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002824 ).value
2825
2826 assert cdps == x509.CRLDistributionPoints([
2827 x509.DistributionPoint(
2828 full_name=None,
2829 relative_name=x509.Name([
2830 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002831 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002832 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002833 ),
2834 ]),
2835 reasons=None,
2836 crl_issuer=[x509.DirectoryName(
2837 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002838 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002839 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002840 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002841 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002842 ),
2843 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002844 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002845 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002846 ),
2847 ])
2848 )],
2849 )
2850 ])
2851
2852 def test_fullname_crl_issuer_reasons(self, backend):
2853 cert = _load_cert(
2854 os.path.join(
2855 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2856 ),
2857 x509.load_pem_x509_certificate,
2858 backend
2859 )
2860
2861 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002862 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002863 ).value
2864
2865 assert cdps == x509.CRLDistributionPoints([
2866 x509.DistributionPoint(
2867 full_name=[x509.UniformResourceIdentifier(
2868 u"http://myhost.com/myca.crl"
2869 )],
2870 relative_name=None,
2871 reasons=frozenset([
2872 x509.ReasonFlags.key_compromise,
2873 x509.ReasonFlags.ca_compromise
2874 ]),
2875 crl_issuer=[x509.DirectoryName(
2876 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002877 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002878 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002879 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002880 ),
2881 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002882 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002883 ),
2884 ])
2885 )],
2886 )
2887 ])
2888
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002889 def test_all_reasons(self, backend):
2890 cert = _load_cert(
2891 os.path.join(
2892 "x509", "custom", "cdp_all_reasons.pem"
2893 ),
2894 x509.load_pem_x509_certificate,
2895 backend
2896 )
2897
2898 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002899 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002900 ).value
2901
2902 assert cdps == x509.CRLDistributionPoints([
2903 x509.DistributionPoint(
2904 full_name=[x509.UniformResourceIdentifier(
2905 u"http://domain.com/some.crl"
2906 )],
2907 relative_name=None,
2908 reasons=frozenset([
2909 x509.ReasonFlags.key_compromise,
2910 x509.ReasonFlags.ca_compromise,
2911 x509.ReasonFlags.affiliation_changed,
2912 x509.ReasonFlags.superseded,
2913 x509.ReasonFlags.privilege_withdrawn,
2914 x509.ReasonFlags.cessation_of_operation,
2915 x509.ReasonFlags.aa_compromise,
2916 x509.ReasonFlags.certificate_hold,
2917 ]),
2918 crl_issuer=None
2919 )
2920 ])
2921
2922 def test_single_reason(self, backend):
2923 cert = _load_cert(
2924 os.path.join(
2925 "x509", "custom", "cdp_reason_aa_compromise.pem"
2926 ),
2927 x509.load_pem_x509_certificate,
2928 backend
2929 )
2930
2931 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002932 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002933 ).value
2934
2935 assert cdps == x509.CRLDistributionPoints([
2936 x509.DistributionPoint(
2937 full_name=[x509.UniformResourceIdentifier(
2938 u"http://domain.com/some.crl"
2939 )],
2940 relative_name=None,
2941 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2942 crl_issuer=None
2943 )
2944 ])
2945
Paul Kehrer9a10d592015-05-10 14:55:51 -05002946 def test_crl_issuer_only(self, backend):
2947 cert = _load_cert(
2948 os.path.join(
2949 "x509", "custom", "cdp_crl_issuer.pem"
2950 ),
2951 x509.load_pem_x509_certificate,
2952 backend
2953 )
2954
2955 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002956 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002957 ).value
2958
2959 assert cdps == x509.CRLDistributionPoints([
2960 x509.DistributionPoint(
2961 full_name=None,
2962 relative_name=None,
2963 reasons=None,
2964 crl_issuer=[x509.DirectoryName(
2965 x509.Name([
2966 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002967 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002968 ),
2969 ])
2970 )],
2971 )
2972 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002973
Dominic Chen87bb9572015-10-09 00:23:07 -04002974 def test_crl_empty_hostname(self, backend):
2975 cert = _load_cert(
2976 os.path.join(
2977 "x509", "custom", "cdp_empty_hostname.pem"
2978 ),
2979 x509.load_pem_x509_certificate,
2980 backend
2981 )
2982
2983 cdps = cert.extensions.get_extension_for_oid(
2984 ExtensionOID.CRL_DISTRIBUTION_POINTS
2985 ).value
2986
2987 assert cdps == x509.CRLDistributionPoints([
2988 x509.DistributionPoint(
2989 full_name=[x509.UniformResourceIdentifier(
2990 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
2991 )],
2992 relative_name=None,
2993 reasons=None,
2994 crl_issuer=None
2995 )
2996 ])
2997
Paul Kehrer16fae762015-05-01 23:14:20 -05002998
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002999@pytest.mark.requires_backend_interface(interface=RSABackend)
3000@pytest.mark.requires_backend_interface(interface=X509Backend)
3001class TestOCSPNoCheckExtension(object):
3002 def test_nocheck(self, backend):
3003 cert = _load_cert(
3004 os.path.join(
3005 "x509", "custom", "ocsp_nocheck.pem"
3006 ),
3007 x509.load_pem_x509_certificate,
3008 backend
3009 )
3010 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003011 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003012 )
3013 assert isinstance(ext.value, x509.OCSPNoCheck)
3014
3015
Paul Kehrer16fae762015-05-01 23:14:20 -05003016class TestInhibitAnyPolicy(object):
3017 def test_not_int(self):
3018 with pytest.raises(TypeError):
3019 x509.InhibitAnyPolicy("notint")
3020
3021 def test_negative_int(self):
3022 with pytest.raises(ValueError):
3023 x509.InhibitAnyPolicy(-1)
3024
3025 def test_repr(self):
3026 iap = x509.InhibitAnyPolicy(0)
3027 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3028
3029 def test_eq(self):
3030 iap = x509.InhibitAnyPolicy(1)
3031 iap2 = x509.InhibitAnyPolicy(1)
3032 assert iap == iap2
3033
3034 def test_ne(self):
3035 iap = x509.InhibitAnyPolicy(1)
3036 iap2 = x509.InhibitAnyPolicy(4)
3037 assert iap != iap2
3038 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003039
3040
3041@pytest.mark.requires_backend_interface(interface=RSABackend)
3042@pytest.mark.requires_backend_interface(interface=X509Backend)
3043class TestInhibitAnyPolicyExtension(object):
3044 def test_nocheck(self, backend):
3045 cert = _load_cert(
3046 os.path.join(
3047 "x509", "custom", "inhibit_any_policy_5.pem"
3048 ),
3049 x509.load_pem_x509_certificate,
3050 backend
3051 )
3052 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003053 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003054 ).value
3055 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003056
3057
3058@pytest.mark.requires_backend_interface(interface=RSABackend)
3059@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003060class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003061 def test_invalid_certificate_policies_data(self, backend):
3062 cert = _load_cert(
3063 os.path.join(
3064 "x509", "custom", "cp_invalid.pem"
3065 ),
3066 x509.load_pem_x509_certificate,
3067 backend
3068 )
3069 with pytest.raises(ValueError):
3070 cert.extensions