blob: 1144d47a815b1ea28c9d3541beaac72c288fcc12 [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
Paul Kehrer5b90c972015-12-26 00:52:58 -0600861 def test_indexing(self, backend):
862 cert = _load_cert(
863 os.path.join("x509", "cryptography.io.pem"),
864 x509.load_pem_x509_certificate,
865 backend
866 )
867 exts = cert.extensions
868 assert exts[-1] == exts[7]
869 assert len(exts[3:5]) == 2
870 assert exts[2:4][0] == exts[2]
871 assert exts[2:4][1] == exts[3]
872
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100873 def test_one_extension_get_for_class(self, backend):
874 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100875 os.path.join(
876 "x509", "custom", "basic_constraints_not_critical.pem"
877 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100878 x509.load_pem_x509_certificate,
879 backend
880 )
881 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
882 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100883 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500884
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500885 def test_repr(self, backend):
886 cert = _load_cert(
887 os.path.join(
888 "x509", "custom", "basic_constraints_not_critical.pem"
889 ),
890 x509.load_pem_x509_certificate,
891 backend
892 )
893 assert repr(cert.extensions) == (
894 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
895 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
896 "alse, path_length=None)>)>])>"
897 )
898
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100899
Paul Kehrerfa56a232015-03-17 13:14:03 -0500900@pytest.mark.requires_backend_interface(interface=RSABackend)
901@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500902class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500903 def test_ca_true_pathlen_6(self, backend):
904 cert = _load_cert(
905 os.path.join(
906 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
907 ),
908 x509.load_der_x509_certificate,
909 backend
910 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100911 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500912 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500913 )
914 assert ext is not None
915 assert ext.critical is True
916 assert ext.value.ca is True
917 assert ext.value.path_length == 6
918
919 def test_path_length_zero(self, backend):
920 cert = _load_cert(
921 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
922 x509.load_pem_x509_certificate,
923 backend
924 )
925 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500926 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500927 )
928 assert ext is not None
929 assert ext.critical is True
930 assert ext.value.ca is True
931 assert ext.value.path_length == 0
932
933 def test_ca_true_no_pathlen(self, backend):
934 cert = _load_cert(
935 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
936 x509.load_der_x509_certificate,
937 backend
938 )
939 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500940 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500941 )
942 assert ext is not None
943 assert ext.critical is True
944 assert ext.value.ca is True
945 assert ext.value.path_length is None
946
947 def test_ca_false(self, backend):
948 cert = _load_cert(
949 os.path.join("x509", "cryptography.io.pem"),
950 x509.load_pem_x509_certificate,
951 backend
952 )
953 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500954 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500955 )
956 assert ext is not None
957 assert ext.critical is True
958 assert ext.value.ca is False
959 assert ext.value.path_length is None
960
961 def test_no_basic_constraints(self, backend):
962 cert = _load_cert(
963 os.path.join(
964 "x509",
965 "PKITS_data",
966 "certs",
967 "ValidCertificatePathTest1EE.crt"
968 ),
969 x509.load_der_x509_certificate,
970 backend
971 )
972 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500973 cert.extensions.get_extension_for_oid(
974 ExtensionOID.BASIC_CONSTRAINTS
975 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500976
977 def test_basic_constraint_not_critical(self, backend):
978 cert = _load_cert(
979 os.path.join(
980 "x509", "custom", "basic_constraints_not_critical.pem"
981 ),
982 x509.load_pem_x509_certificate,
983 backend
984 )
985 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500986 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500987 )
988 assert ext is not None
989 assert ext.critical is False
990 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500991
992
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500993class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100994 @pytest.mark.requires_backend_interface(interface=RSABackend)
995 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500996 def test_subject_key_identifier(self, backend):
997 cert = _load_cert(
998 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
999 x509.load_der_x509_certificate,
1000 backend
1001 )
1002 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001003 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001004 )
1005 ski = ext.value
1006 assert ext is not None
1007 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001008 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001009 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001010 )
1011
Paul Kehrerf22f6122015-08-05 12:57:13 +01001012 @pytest.mark.requires_backend_interface(interface=RSABackend)
1013 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001014 def test_no_subject_key_identifier(self, backend):
1015 cert = _load_cert(
1016 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1017 x509.load_pem_x509_certificate,
1018 backend
1019 )
1020 with pytest.raises(x509.ExtensionNotFound):
1021 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001022 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001023 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001024
Paul Kehrerf22f6122015-08-05 12:57:13 +01001025 @pytest.mark.requires_backend_interface(interface=RSABackend)
1026 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001027 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001028 cert = _load_cert(
1029 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1030 x509.load_der_x509_certificate,
1031 backend
1032 )
1033 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001034 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001035 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001036 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001037 cert.public_key()
1038 )
1039 assert ext.value == ski
1040
1041 @pytest.mark.requires_backend_interface(interface=DSABackend)
1042 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001043 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001044 cert = _load_cert(
1045 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1046 x509.load_pem_x509_certificate,
1047 backend
1048 )
1049
1050 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001051 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001052 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001053 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001054 cert.public_key()
1055 )
1056 assert ext.value == ski
1057
1058 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1059 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001060 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001061 _skip_curve_unsupported(backend, ec.SECP384R1())
1062 cert = _load_cert(
1063 os.path.join("x509", "ecdsa_root.pem"),
1064 x509.load_pem_x509_certificate,
1065 backend
1066 )
1067
1068 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001069 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001070 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001071 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001072 cert.public_key()
1073 )
1074 assert ext.value == ski
1075
Paul Kehrer5508ee22015-04-02 19:31:03 -05001076
1077@pytest.mark.requires_backend_interface(interface=RSABackend)
1078@pytest.mark.requires_backend_interface(interface=X509Backend)
1079class TestKeyUsageExtension(object):
1080 def test_no_key_usage(self, backend):
1081 cert = _load_cert(
1082 os.path.join("x509", "verisign_md2_root.pem"),
1083 x509.load_pem_x509_certificate,
1084 backend
1085 )
1086 ext = cert.extensions
1087 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001088 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001089
Paul Kehrerd44e4132015-08-10 19:13:13 -05001090 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001091
1092 def test_all_purposes(self, backend):
1093 cert = _load_cert(
1094 os.path.join(
1095 "x509", "custom", "all_key_usages.pem"
1096 ),
1097 x509.load_pem_x509_certificate,
1098 backend
1099 )
1100 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001101 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001102 assert ext is not None
1103
1104 ku = ext.value
1105 assert ku.digital_signature is True
1106 assert ku.content_commitment is True
1107 assert ku.key_encipherment is True
1108 assert ku.data_encipherment is True
1109 assert ku.key_agreement is True
1110 assert ku.key_cert_sign is True
1111 assert ku.crl_sign is True
1112 assert ku.encipher_only is True
1113 assert ku.decipher_only is True
1114
1115 def test_key_cert_sign_crl_sign(self, backend):
1116 cert = _load_cert(
1117 os.path.join(
1118 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1119 ),
1120 x509.load_der_x509_certificate,
1121 backend
1122 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001123 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001124 assert ext is not None
1125 assert ext.critical is True
1126
1127 ku = ext.value
1128 assert ku.digital_signature is False
1129 assert ku.content_commitment is False
1130 assert ku.key_encipherment is False
1131 assert ku.data_encipherment is False
1132 assert ku.key_agreement is False
1133 assert ku.key_cert_sign is True
1134 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001135
1136
1137@pytest.mark.parametrize(
1138 "name", [
1139 x509.RFC822Name,
1140 x509.DNSName,
1141 x509.UniformResourceIdentifier
1142 ]
1143)
1144class TestTextGeneralNames(object):
1145 def test_not_text(self, name):
1146 with pytest.raises(TypeError):
1147 name(b"notaunicodestring")
1148
1149 with pytest.raises(TypeError):
1150 name(1.3)
1151
1152 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301153 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001154 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1155
1156 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301157 gn = name(u"string")
1158 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001159 assert gn == gn2
1160
1161 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301162 gn = name(u"string")
1163 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001164 assert gn != gn2
1165 assert gn != object()
1166
1167
1168class TestDirectoryName(object):
1169 def test_not_name(self):
1170 with pytest.raises(TypeError):
1171 x509.DirectoryName(b"notaname")
1172
1173 with pytest.raises(TypeError):
1174 x509.DirectoryName(1.3)
1175
1176 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001177 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001178 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001179 if six.PY3:
1180 assert repr(gn) == (
1181 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1182 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1183 ">])>)>"
1184 )
1185 else:
1186 assert repr(gn) == (
1187 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1188 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1189 ")>])>)>"
1190 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001191
1192 def test_eq(self):
1193 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001194 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001195 ])
1196 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001197 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001198 ])
1199 gn = x509.DirectoryName(x509.Name([name]))
1200 gn2 = x509.DirectoryName(x509.Name([name2]))
1201 assert gn == gn2
1202
1203 def test_ne(self):
1204 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001205 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001206 ])
1207 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001208 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001209 ])
1210 gn = x509.DirectoryName(x509.Name([name]))
1211 gn2 = x509.DirectoryName(x509.Name([name2]))
1212 assert gn != gn2
1213 assert gn != object()
1214
1215
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001216class TestRFC822Name(object):
1217 def test_invalid_email(self):
1218 with pytest.raises(ValueError):
1219 x509.RFC822Name(u"Name <email>")
1220
1221 with pytest.raises(ValueError):
1222 x509.RFC822Name(u"")
1223
1224 def test_single_label(self):
1225 gn = x509.RFC822Name(u"administrator")
1226 assert gn.value == u"administrator"
1227
1228 def test_idna(self):
1229 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1230 assert gn.value == u"email@em\xe5\xefl.com"
1231 assert gn._encoded == b"email@xn--eml-vla4c.com"
1232
1233
Paul Kehrere28d6c42015-07-12 14:59:37 -05001234class TestUniformResourceIdentifier(object):
1235 def test_no_parsed_hostname(self):
1236 gn = x509.UniformResourceIdentifier(u"singlelabel")
1237 assert gn.value == u"singlelabel"
1238
1239 def test_with_port(self):
1240 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1241 assert gn.value == u"singlelabel:443/test"
1242
1243 def test_idna_no_port(self):
1244 gn = x509.UniformResourceIdentifier(
1245 u"http://\u043f\u044b\u043a\u0430.cryptography"
1246 )
1247 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1248 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1249
1250 def test_idna_with_port(self):
1251 gn = x509.UniformResourceIdentifier(
1252 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1253 )
1254 assert gn.value == (
1255 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1256 )
1257 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1258
1259 def test_query_and_fragment(self):
1260 gn = x509.UniformResourceIdentifier(
1261 u"ldap://cryptography:90/path?query=true#somedata"
1262 )
1263 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1264
1265
Paul Kehrer31bdf792015-03-25 14:11:00 -05001266class TestRegisteredID(object):
1267 def test_not_oid(self):
1268 with pytest.raises(TypeError):
1269 x509.RegisteredID(b"notanoid")
1270
1271 with pytest.raises(TypeError):
1272 x509.RegisteredID(1.3)
1273
1274 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001275 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001276 assert repr(gn) == (
1277 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1278 "e)>)>"
1279 )
1280
1281 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001282 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1283 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001284 assert gn == gn2
1285
1286 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001287 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001288 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001289 assert gn != gn2
1290 assert gn != object()
1291
1292
1293class TestIPAddress(object):
1294 def test_not_ipaddress(self):
1295 with pytest.raises(TypeError):
1296 x509.IPAddress(b"notanipaddress")
1297
1298 with pytest.raises(TypeError):
1299 x509.IPAddress(1.3)
1300
1301 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301302 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001303 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1304
Eeshan Gargf1234152015-04-29 18:41:00 +05301305 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001306 assert repr(gn2) == "<IPAddress(value=ff::)>"
1307
Paul Kehrereb177932015-05-17 18:33:33 -07001308 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1309 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1310
1311 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1312 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1313
Paul Kehrer31bdf792015-03-25 14:11:00 -05001314 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301315 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1316 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001317 assert gn == gn2
1318
1319 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301320 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1321 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001322 assert gn != gn2
1323 assert gn != object()
1324
1325
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001326class TestOtherName(object):
1327 def test_invalid_args(self):
1328 with pytest.raises(TypeError):
1329 x509.OtherName(b"notanobjectidentifier", b"derdata")
1330
1331 with pytest.raises(TypeError):
1332 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1333
1334 def test_repr(self):
1335 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1336 if six.PY3:
1337 assert repr(gn) == (
1338 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1339 "name=Unknown OID)>, value=b'derdata')>"
1340 )
1341 else:
1342 assert repr(gn) == (
1343 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1344 "name=Unknown OID)>, value='derdata')>"
1345 )
1346
1347 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1348 if six.PY3:
1349 assert repr(gn) == (
1350 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1351 "name=pseudonym)>, value=b'derdata')>"
1352 )
1353 else:
1354 assert repr(gn) == (
1355 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1356 "name=pseudonym)>, value='derdata')>"
1357 )
1358
1359 def test_eq(self):
1360 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1361 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1362 assert gn == gn2
1363
1364 def test_ne(self):
1365 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1366 assert gn != object()
1367
1368 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1369 assert gn != gn2
1370
1371 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1372 assert gn != gn2
1373
1374
Erik Trauschke2dcce902015-05-14 16:12:24 -07001375class TestGeneralNames(object):
1376 def test_get_values_for_type(self):
1377 gns = x509.GeneralNames(
1378 [x509.DNSName(u"cryptography.io")]
1379 )
1380 names = gns.get_values_for_type(x509.DNSName)
1381 assert names == [u"cryptography.io"]
1382
1383 def test_iter_names(self):
1384 gns = x509.GeneralNames([
1385 x509.DNSName(u"cryptography.io"),
1386 x509.DNSName(u"crypto.local"),
1387 ])
1388 assert len(gns) == 2
1389 assert list(gns) == [
1390 x509.DNSName(u"cryptography.io"),
1391 x509.DNSName(u"crypto.local"),
1392 ]
1393
1394 def test_invalid_general_names(self):
1395 with pytest.raises(TypeError):
1396 x509.GeneralNames(
1397 [x509.DNSName(u"cryptography.io"), "invalid"]
1398 )
1399
1400 def test_repr(self):
1401 gns = x509.GeneralNames(
1402 [
1403 x509.DNSName(u"cryptography.io")
1404 ]
1405 )
1406 assert repr(gns) == (
1407 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1408 )
1409
1410 def test_eq(self):
1411 gns = x509.GeneralNames(
1412 [x509.DNSName(u"cryptography.io")]
1413 )
1414 gns2 = x509.GeneralNames(
1415 [x509.DNSName(u"cryptography.io")]
1416 )
1417 assert gns == gns2
1418
1419 def test_ne(self):
1420 gns = x509.GeneralNames(
1421 [x509.DNSName(u"cryptography.io")]
1422 )
1423 gns2 = x509.GeneralNames(
1424 [x509.RFC822Name(u"admin@cryptography.io")]
1425 )
1426 assert gns != gns2
1427 assert gns != object()
1428
1429
Paul Kehrer99125c92015-06-07 18:37:10 -05001430class TestIssuerAlternativeName(object):
1431 def test_get_values_for_type(self):
1432 san = x509.IssuerAlternativeName(
1433 [x509.DNSName(u"cryptography.io")]
1434 )
1435 names = san.get_values_for_type(x509.DNSName)
1436 assert names == [u"cryptography.io"]
1437
1438 def test_iter_names(self):
1439 san = x509.IssuerAlternativeName([
1440 x509.DNSName(u"cryptography.io"),
1441 x509.DNSName(u"crypto.local"),
1442 ])
1443 assert len(san) == 2
1444 assert list(san) == [
1445 x509.DNSName(u"cryptography.io"),
1446 x509.DNSName(u"crypto.local"),
1447 ]
1448
1449 def test_invalid_general_names(self):
1450 with pytest.raises(TypeError):
1451 x509.IssuerAlternativeName(
1452 [x509.DNSName(u"cryptography.io"), "invalid"]
1453 )
1454
1455 def test_repr(self):
1456 san = x509.IssuerAlternativeName(
1457 [
1458 x509.DNSName(u"cryptography.io")
1459 ]
1460 )
1461 assert repr(san) == (
1462 "<IssuerAlternativeName("
1463 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1464 )
1465
1466 def test_eq(self):
1467 san = x509.IssuerAlternativeName(
1468 [x509.DNSName(u"cryptography.io")]
1469 )
1470 san2 = x509.IssuerAlternativeName(
1471 [x509.DNSName(u"cryptography.io")]
1472 )
1473 assert san == san2
1474
1475 def test_ne(self):
1476 san = x509.IssuerAlternativeName(
1477 [x509.DNSName(u"cryptography.io")]
1478 )
1479 san2 = x509.IssuerAlternativeName(
1480 [x509.RFC822Name(u"admin@cryptography.io")]
1481 )
1482 assert san != san2
1483 assert san != object()
1484
1485
Alex Gaynorf1c17672015-06-20 14:20:20 -04001486@pytest.mark.requires_backend_interface(interface=RSABackend)
1487@pytest.mark.requires_backend_interface(interface=X509Backend)
1488class TestRSAIssuerAlternativeNameExtension(object):
1489 def test_uri(self, backend):
1490 cert = _load_cert(
1491 os.path.join("x509", "custom", "ian_uri.pem"),
1492 x509.load_pem_x509_certificate,
1493 backend,
1494 )
1495 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001496 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001497 )
1498 assert list(ext.value) == [
1499 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1500 ]
1501
1502
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001503class TestCRLNumber(object):
1504 def test_eq(self):
1505 crl_number = x509.CRLNumber(15)
1506 assert crl_number == x509.CRLNumber(15)
1507
1508 def test_ne(self):
1509 crl_number = x509.CRLNumber(15)
1510 assert crl_number != x509.CRLNumber(14)
1511 assert crl_number != object()
1512
1513 def test_repr(self):
1514 crl_number = x509.CRLNumber(15)
1515 assert repr(crl_number) == "<CRLNumber(15)>"
1516
Paul Kehrera9718fc2015-12-22 22:55:35 -06001517 def test_invalid_number(self):
1518 with pytest.raises(TypeError):
1519 x509.CRLNumber("notanumber")
1520
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001521
Paul Kehrer31bdf792015-03-25 14:11:00 -05001522class TestSubjectAlternativeName(object):
1523 def test_get_values_for_type(self):
1524 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301525 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001526 )
1527 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301528 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001529
1530 def test_iter_names(self):
1531 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301532 x509.DNSName(u"cryptography.io"),
1533 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001534 ])
1535 assert len(san) == 2
1536 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301537 x509.DNSName(u"cryptography.io"),
1538 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001539 ]
1540
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001541 def test_invalid_general_names(self):
1542 with pytest.raises(TypeError):
1543 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301544 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001545 )
1546
Paul Kehrer31bdf792015-03-25 14:11:00 -05001547 def test_repr(self):
1548 san = x509.SubjectAlternativeName(
1549 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301550 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001551 ]
1552 )
1553 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001554 "<SubjectAlternativeName("
1555 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001556 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001557
Paul Kehrer58cc3972015-05-13 10:00:41 -05001558 def test_eq(self):
1559 san = x509.SubjectAlternativeName(
1560 [x509.DNSName(u"cryptography.io")]
1561 )
1562 san2 = x509.SubjectAlternativeName(
1563 [x509.DNSName(u"cryptography.io")]
1564 )
1565 assert san == san2
1566
1567 def test_ne(self):
1568 san = x509.SubjectAlternativeName(
1569 [x509.DNSName(u"cryptography.io")]
1570 )
1571 san2 = x509.SubjectAlternativeName(
1572 [x509.RFC822Name(u"admin@cryptography.io")]
1573 )
1574 assert san != san2
1575 assert san != object()
1576
Paul Kehrer40f83382015-04-20 15:00:16 -05001577
1578@pytest.mark.requires_backend_interface(interface=RSABackend)
1579@pytest.mark.requires_backend_interface(interface=X509Backend)
1580class TestRSASubjectAlternativeNameExtension(object):
1581 def test_dns_name(self, backend):
1582 cert = _load_cert(
1583 os.path.join("x509", "cryptography.io.pem"),
1584 x509.load_pem_x509_certificate,
1585 backend
1586 )
1587 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001588 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001589 )
1590 assert ext is not None
1591 assert ext.critical is False
1592
1593 san = ext.value
1594
1595 dns = san.get_values_for_type(x509.DNSName)
1596 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001597
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001598 def test_wildcard_dns_name(self, backend):
1599 cert = _load_cert(
1600 os.path.join("x509", "wildcard_san.pem"),
1601 x509.load_pem_x509_certificate,
1602 backend
1603 )
1604 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001605 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001606 )
1607
1608 dns = ext.value.get_values_for_type(x509.DNSName)
1609 assert dns == [
1610 u'*.langui.sh',
1611 u'langui.sh',
1612 u'*.saseliminator.com',
1613 u'saseliminator.com'
1614 ]
1615
Dominic Chen87bb9572015-10-09 00:23:07 -04001616 def test_san_empty_hostname(self, backend):
1617 cert = _load_cert(
1618 os.path.join(
1619 "x509", "custom", "san_empty_hostname.pem"
1620 ),
1621 x509.load_pem_x509_certificate,
1622 backend
1623 )
1624 san = cert.extensions.get_extension_for_oid(
1625 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1626 )
1627
1628 dns = san.value.get_values_for_type(x509.DNSName)
1629 assert dns == [u'']
1630
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001631 def test_san_wildcard_idna_dns_name(self, backend):
1632 cert = _load_cert(
1633 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1634 x509.load_pem_x509_certificate,
1635 backend
1636 )
1637 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001638 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001639 )
1640
1641 dns = ext.value.get_values_for_type(x509.DNSName)
1642 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1643
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001644 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001645 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001646 os.path.join("x509", "san_x400address.der"),
1647 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001648 backend
1649 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001650 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001651 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001652
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001653 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001654
1655 def test_registered_id(self, backend):
1656 cert = _load_cert(
1657 os.path.join(
1658 "x509", "custom", "san_registered_id.pem"
1659 ),
1660 x509.load_pem_x509_certificate,
1661 backend
1662 )
1663 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001664 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001665 )
1666 assert ext is not None
1667 assert ext.critical is False
1668
1669 san = ext.value
1670 rid = san.get_values_for_type(x509.RegisteredID)
1671 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001672
1673 def test_uri(self, backend):
1674 cert = _load_cert(
1675 os.path.join(
1676 "x509", "custom", "san_uri_with_port.pem"
1677 ),
1678 x509.load_pem_x509_certificate,
1679 backend
1680 )
1681 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001682 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001683 )
1684 assert ext is not None
1685 uri = ext.value.get_values_for_type(
1686 x509.UniformResourceIdentifier
1687 )
1688 assert uri == [
1689 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1690 u"lo",
1691 u"http://someregulardomain.com",
1692 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001693
1694 def test_ipaddress(self, backend):
1695 cert = _load_cert(
1696 os.path.join(
1697 "x509", "custom", "san_ipaddr.pem"
1698 ),
1699 x509.load_pem_x509_certificate,
1700 backend
1701 )
1702 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001703 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001704 )
1705 assert ext is not None
1706 assert ext.critical is False
1707
1708 san = ext.value
1709
1710 ip = san.get_values_for_type(x509.IPAddress)
1711 assert [
1712 ipaddress.ip_address(u"127.0.0.1"),
1713 ipaddress.ip_address(u"ff::")
1714 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001715
1716 def test_dirname(self, backend):
1717 cert = _load_cert(
1718 os.path.join(
1719 "x509", "custom", "san_dirname.pem"
1720 ),
1721 x509.load_pem_x509_certificate,
1722 backend
1723 )
1724 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001725 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001726 )
1727 assert ext is not None
1728 assert ext.critical is False
1729
1730 san = ext.value
1731
1732 dirname = san.get_values_for_type(x509.DirectoryName)
1733 assert [
1734 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001735 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1736 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1737 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001738 ])
1739 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001740
1741 def test_rfc822name(self, backend):
1742 cert = _load_cert(
1743 os.path.join(
1744 "x509", "custom", "san_rfc822_idna.pem"
1745 ),
1746 x509.load_pem_x509_certificate,
1747 backend
1748 )
1749 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001750 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001751 )
1752 assert ext is not None
1753 assert ext.critical is False
1754
1755 san = ext.value
1756
1757 rfc822name = san.get_values_for_type(x509.RFC822Name)
1758 assert [u"email@em\xe5\xefl.com"] == rfc822name
1759
Paul Kehrerb8968812015-05-15 09:01:34 -07001760 def test_idna2003_invalid(self, backend):
1761 cert = _load_cert(
1762 os.path.join(
1763 "x509", "custom", "san_idna2003_dnsname.pem"
1764 ),
1765 x509.load_pem_x509_certificate,
1766 backend
1767 )
1768 with pytest.raises(UnicodeError):
1769 cert.extensions
1770
Paul Kehrere06cab42015-04-30 10:23:33 -05001771 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1772 cert = _load_cert(
1773 os.path.join(
1774 "x509", "custom", "san_idna_names.pem"
1775 ),
1776 x509.load_pem_x509_certificate,
1777 backend
1778 )
1779 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001780 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001781 )
1782 assert ext is not None
1783 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1784 dns_name = ext.value.get_values_for_type(x509.DNSName)
1785 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1786 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1787 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1788 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1789
1790 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1791 cert = _load_cert(
1792 os.path.join(
1793 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1794 ),
1795 x509.load_pem_x509_certificate,
1796 backend
1797 )
1798 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001799 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001800 )
1801 assert ext is not None
1802 assert ext.critical is False
1803
1804 san = ext.value
1805
1806 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1807 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1808 dns = san.get_values_for_type(x509.DNSName)
1809 ip = san.get_values_for_type(x509.IPAddress)
1810 dirname = san.get_values_for_type(x509.DirectoryName)
1811 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001812 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001813 assert [u"cryptography.io"] == dns
1814 assert [
1815 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001816 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001817 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001818 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001819 ),
1820 ])
1821 ] == dirname
1822 assert [
1823 ipaddress.ip_address(u"127.0.0.1"),
1824 ipaddress.ip_address(u"ff::")
1825 ] == ip
1826
1827 def test_invalid_rfc822name(self, backend):
1828 cert = _load_cert(
1829 os.path.join(
1830 "x509", "custom", "san_rfc822_names.pem"
1831 ),
1832 x509.load_pem_x509_certificate,
1833 backend
1834 )
1835 with pytest.raises(ValueError) as exc:
1836 cert.extensions
1837
1838 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001839
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001840 def test_other_name(self, backend):
1841 cert = _load_cert(
1842 os.path.join(
1843 "x509", "custom", "san_other_name.pem"
1844 ),
1845 x509.load_pem_x509_certificate,
1846 backend
1847 )
1848
1849 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001850 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001851 )
1852 assert ext is not None
1853 assert ext.critical is False
1854
Joshua Taubererd2afad32015-07-06 22:37:53 +00001855 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1856 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001857 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001858 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001859
1860 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001861 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001862
Paul Kehrer94c69602015-05-02 19:29:40 -05001863
1864@pytest.mark.requires_backend_interface(interface=RSABackend)
1865@pytest.mark.requires_backend_interface(interface=X509Backend)
1866class TestExtendedKeyUsageExtension(object):
1867 def test_eku(self, backend):
1868 cert = _load_cert(
1869 os.path.join(
1870 "x509", "custom", "extended_key_usage.pem"
1871 ),
1872 x509.load_pem_x509_certificate,
1873 backend
1874 )
1875 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001876 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001877 )
1878 assert ext is not None
1879 assert ext.critical is False
1880
1881 assert [
1882 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1883 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1884 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1885 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1886 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1887 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1888 x509.ObjectIdentifier("2.5.29.37.0"),
1889 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1890 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001891
1892
1893class TestAccessDescription(object):
1894 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001895 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001896 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1897
1898 def test_invalid_access_location(self):
1899 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001900 x509.AccessDescription(
1901 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1902 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001903
Nick Bastind2ecf862015-12-13 05:44:46 -08001904 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001905 ad = x509.AccessDescription(
1906 ObjectIdentifier("2.999.1"),
1907 x509.UniformResourceIdentifier(u"http://example.com")
1908 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08001909 assert ad is not None
1910
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001911 def test_repr(self):
1912 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001913 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001914 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1915 )
1916 assert repr(ad) == (
1917 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1918 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1919 "(value=http://ocsp.domain.com)>)>"
1920 )
1921
1922 def test_eq(self):
1923 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001924 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001925 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1926 )
1927 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001928 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001929 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1930 )
1931 assert ad == ad2
1932
1933 def test_ne(self):
1934 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001935 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001936 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1937 )
1938 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001939 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001940 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1941 )
1942 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001943 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001944 x509.UniformResourceIdentifier(u"http://notthesame")
1945 )
1946 assert ad != ad2
1947 assert ad != ad3
1948 assert ad != object()
1949
1950
1951class TestAuthorityInformationAccess(object):
1952 def test_invalid_descriptions(self):
1953 with pytest.raises(TypeError):
1954 x509.AuthorityInformationAccess(["notanAccessDescription"])
1955
1956 def test_iter_len(self):
1957 aia = x509.AuthorityInformationAccess([
1958 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001959 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001960 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1961 ),
1962 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001963 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001964 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1965 )
1966 ])
1967 assert len(aia) == 2
1968 assert list(aia) == [
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
1979 def test_repr(self):
1980 aia = x509.AuthorityInformationAccess([
1981 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001982 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001983 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1984 ),
1985 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001986 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001987 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1988 )
1989 ])
1990 assert repr(aia) == (
1991 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1992 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1993 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1994 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1995 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1996 "fier(value=http://domain.com/ca.crt)>)>])>"
1997 )
1998
1999 def test_eq(self):
2000 aia = x509.AuthorityInformationAccess([
2001 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002002 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002003 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2004 ),
2005 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002006 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002007 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2008 )
2009 ])
2010 aia2 = x509.AuthorityInformationAccess([
2011 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002012 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002013 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2014 ),
2015 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002016 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002017 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2018 )
2019 ])
2020 assert aia == aia2
2021
2022 def test_ne(self):
2023 aia = x509.AuthorityInformationAccess([
2024 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002025 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002026 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2027 ),
2028 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002029 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002030 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2031 )
2032 ])
2033 aia2 = x509.AuthorityInformationAccess([
2034 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002035 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002036 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2037 ),
2038 ])
2039
2040 assert aia != aia2
2041 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002042
2043
2044@pytest.mark.requires_backend_interface(interface=RSABackend)
2045@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002046class TestAuthorityInformationAccessExtension(object):
2047 def test_aia_ocsp_ca_issuers(self, backend):
2048 cert = _load_cert(
2049 os.path.join("x509", "cryptography.io.pem"),
2050 x509.load_pem_x509_certificate,
2051 backend
2052 )
2053 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002054 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002055 )
2056 assert ext is not None
2057 assert ext.critical is False
2058
2059 assert ext.value == x509.AuthorityInformationAccess([
2060 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002061 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002062 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2063 ),
2064 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002065 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002066 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2067 ),
2068 ])
2069
2070 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2071 cert = _load_cert(
2072 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2073 x509.load_pem_x509_certificate,
2074 backend
2075 )
2076 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002077 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002078 )
2079 assert ext is not None
2080 assert ext.critical is False
2081
2082 assert ext.value == x509.AuthorityInformationAccess([
2083 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002084 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002085 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2086 ),
2087 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002088 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002089 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2090 ),
2091 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002092 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002093 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002094 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2095 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002096 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002097 ]))
2098 ),
2099 ])
2100
2101 def test_aia_ocsp_only(self, backend):
2102 cert = _load_cert(
2103 os.path.join("x509", "custom", "aia_ocsp.pem"),
2104 x509.load_pem_x509_certificate,
2105 backend
2106 )
2107 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002108 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002109 )
2110 assert ext is not None
2111 assert ext.critical is False
2112
2113 assert ext.value == x509.AuthorityInformationAccess([
2114 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002115 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002116 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2117 ),
2118 ])
2119
2120 def test_aia_ca_issuers_only(self, backend):
2121 cert = _load_cert(
2122 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2123 x509.load_pem_x509_certificate,
2124 backend
2125 )
2126 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002127 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002128 )
2129 assert ext is not None
2130 assert ext.critical is False
2131
2132 assert ext.value == x509.AuthorityInformationAccess([
2133 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002134 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002135 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002136 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2137 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002138 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002139 ]))
2140 ),
2141 ])
2142
2143
2144@pytest.mark.requires_backend_interface(interface=RSABackend)
2145@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002146class TestAuthorityKeyIdentifierExtension(object):
2147 def test_aki_keyid(self, backend):
2148 cert = _load_cert(
2149 os.path.join(
2150 "x509", "cryptography.io.pem"
2151 ),
2152 x509.load_pem_x509_certificate,
2153 backend
2154 )
2155 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002156 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002157 )
2158 assert ext is not None
2159 assert ext.critical is False
2160
2161 assert ext.value.key_identifier == (
2162 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2163 )
2164 assert ext.value.authority_cert_issuer is None
2165 assert ext.value.authority_cert_serial_number is None
2166
2167 def test_aki_all_fields(self, backend):
2168 cert = _load_cert(
2169 os.path.join(
2170 "x509", "custom", "authority_key_identifier.pem"
2171 ),
2172 x509.load_pem_x509_certificate,
2173 backend
2174 )
2175 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002176 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002177 )
2178 assert ext is not None
2179 assert ext.critical is False
2180
2181 assert ext.value.key_identifier == (
2182 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2183 )
2184 assert ext.value.authority_cert_issuer == [
2185 x509.DirectoryName(
2186 x509.Name([
2187 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002188 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002189 ),
2190 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002191 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002192 )
2193 ])
2194 )
2195 ]
2196 assert ext.value.authority_cert_serial_number == 3
2197
2198 def test_aki_no_keyid(self, backend):
2199 cert = _load_cert(
2200 os.path.join(
2201 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2202 ),
2203 x509.load_pem_x509_certificate,
2204 backend
2205 )
2206 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002207 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002208 )
2209 assert ext is not None
2210 assert ext.critical is False
2211
2212 assert ext.value.key_identifier is None
2213 assert ext.value.authority_cert_issuer == [
2214 x509.DirectoryName(
2215 x509.Name([
2216 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002217 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002218 ),
2219 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002220 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002221 )
2222 ])
2223 )
2224 ]
2225 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002226
Paul Kehrer253929a2015-08-05 17:30:39 +01002227 def test_from_certificate(self, backend):
2228 issuer_cert = _load_cert(
2229 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2230 x509.load_pem_x509_certificate,
2231 backend
2232 )
2233 cert = _load_cert(
2234 os.path.join("x509", "cryptography.io.pem"),
2235 x509.load_pem_x509_certificate,
2236 backend
2237 )
2238 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002239 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002240 )
2241 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2242 issuer_cert.public_key()
2243 )
2244 assert ext.value == aki
2245
Paul Kehrer5a485522015-05-06 00:29:12 -05002246
Paul Kehrere0017be2015-05-17 20:39:40 -06002247class TestNameConstraints(object):
2248 def test_ipaddress_wrong_type(self):
2249 with pytest.raises(TypeError):
2250 x509.NameConstraints(
2251 permitted_subtrees=[
2252 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2253 ],
2254 excluded_subtrees=None
2255 )
2256
2257 with pytest.raises(TypeError):
2258 x509.NameConstraints(
2259 permitted_subtrees=None,
2260 excluded_subtrees=[
2261 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2262 ]
2263 )
2264
2265 def test_ipaddress_allowed_type(self):
2266 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2267 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2268 nc = x509.NameConstraints(
2269 permitted_subtrees=permitted,
2270 excluded_subtrees=excluded
2271 )
2272 assert nc.permitted_subtrees == permitted
2273 assert nc.excluded_subtrees == excluded
2274
2275 def test_invalid_permitted_subtrees(self):
2276 with pytest.raises(TypeError):
2277 x509.NameConstraints("badpermitted", None)
2278
2279 def test_invalid_excluded_subtrees(self):
2280 with pytest.raises(TypeError):
2281 x509.NameConstraints(None, "badexcluded")
2282
2283 def test_no_subtrees(self):
2284 with pytest.raises(ValueError):
2285 x509.NameConstraints(None, None)
2286
2287 def test_permitted_none(self):
2288 excluded = [x509.DNSName(u"name.local")]
2289 nc = x509.NameConstraints(
2290 permitted_subtrees=None, excluded_subtrees=excluded
2291 )
2292 assert nc.permitted_subtrees is None
2293 assert nc.excluded_subtrees is not None
2294
2295 def test_excluded_none(self):
2296 permitted = [x509.DNSName(u"name.local")]
2297 nc = x509.NameConstraints(
2298 permitted_subtrees=permitted, excluded_subtrees=None
2299 )
2300 assert nc.permitted_subtrees is not None
2301 assert nc.excluded_subtrees is None
2302
2303 def test_repr(self):
2304 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2305 nc = x509.NameConstraints(
2306 permitted_subtrees=permitted,
2307 excluded_subtrees=None
2308 )
2309 assert repr(nc) == (
2310 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2311 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2312 )
2313
Paul Kehrer31894282015-06-21 21:46:41 -05002314 def test_eq(self):
2315 nc = x509.NameConstraints(
2316 permitted_subtrees=[x509.DNSName(u"name.local")],
2317 excluded_subtrees=[x509.DNSName(u"name2.local")]
2318 )
2319 nc2 = x509.NameConstraints(
2320 permitted_subtrees=[x509.DNSName(u"name.local")],
2321 excluded_subtrees=[x509.DNSName(u"name2.local")]
2322 )
2323 assert nc == nc2
2324
2325 def test_ne(self):
2326 nc = x509.NameConstraints(
2327 permitted_subtrees=[x509.DNSName(u"name.local")],
2328 excluded_subtrees=[x509.DNSName(u"name2.local")]
2329 )
2330 nc2 = x509.NameConstraints(
2331 permitted_subtrees=[x509.DNSName(u"name.local")],
2332 excluded_subtrees=None
2333 )
2334 nc3 = x509.NameConstraints(
2335 permitted_subtrees=None,
2336 excluded_subtrees=[x509.DNSName(u"name2.local")]
2337 )
2338
2339 assert nc != nc2
2340 assert nc != nc3
2341 assert nc != object()
2342
Paul Kehrere0017be2015-05-17 20:39:40 -06002343
Paul Kehrer870d7e82015-06-21 22:20:44 -05002344@pytest.mark.requires_backend_interface(interface=RSABackend)
2345@pytest.mark.requires_backend_interface(interface=X509Backend)
2346class TestNameConstraintsExtension(object):
2347 def test_permitted_excluded(self, backend):
2348 cert = _load_cert(
2349 os.path.join(
2350 "x509", "custom", "nc_permitted_excluded_2.pem"
2351 ),
2352 x509.load_pem_x509_certificate,
2353 backend
2354 )
2355 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002356 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002357 ).value
2358 assert nc == x509.NameConstraints(
2359 permitted_subtrees=[
2360 x509.DNSName(u"zombo.local"),
2361 ],
2362 excluded_subtrees=[
2363 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002364 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002365 ]))
2366 ]
2367 )
2368
2369 def test_permitted(self, backend):
2370 cert = _load_cert(
2371 os.path.join(
2372 "x509", "custom", "nc_permitted_2.pem"
2373 ),
2374 x509.load_pem_x509_certificate,
2375 backend
2376 )
2377 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002378 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002379 ).value
2380 assert nc == x509.NameConstraints(
2381 permitted_subtrees=[
2382 x509.DNSName(u"zombo.local"),
2383 ],
2384 excluded_subtrees=None
2385 )
2386
Paul Kehrer42376832015-07-01 18:10:32 -05002387 def test_permitted_with_leading_period(self, backend):
2388 cert = _load_cert(
2389 os.path.join(
2390 "x509", "custom", "nc_permitted.pem"
2391 ),
2392 x509.load_pem_x509_certificate,
2393 backend
2394 )
2395 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002396 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002397 ).value
2398 assert nc == x509.NameConstraints(
2399 permitted_subtrees=[
2400 x509.DNSName(u".cryptography.io"),
2401 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2402 ],
2403 excluded_subtrees=None
2404 )
2405
2406 def test_excluded_with_leading_period(self, backend):
2407 cert = _load_cert(
2408 os.path.join(
2409 "x509", "custom", "nc_excluded.pem"
2410 ),
2411 x509.load_pem_x509_certificate,
2412 backend
2413 )
2414 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002415 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002416 ).value
2417 assert nc == x509.NameConstraints(
2418 permitted_subtrees=None,
2419 excluded_subtrees=[
2420 x509.DNSName(u".cryptography.io"),
2421 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2422 ]
2423 )
2424
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002425 def test_permitted_excluded_with_ips(self, backend):
2426 cert = _load_cert(
2427 os.path.join(
2428 "x509", "custom", "nc_permitted_excluded.pem"
2429 ),
2430 x509.load_pem_x509_certificate,
2431 backend
2432 )
2433 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002434 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002435 ).value
2436 assert nc == x509.NameConstraints(
2437 permitted_subtrees=[
2438 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2439 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2440 ],
2441 excluded_subtrees=[
2442 x509.DNSName(u".domain.com"),
2443 x509.UniformResourceIdentifier(u"http://test.local"),
2444 ]
2445 )
2446
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002447 def test_single_ip_netmask(self, backend):
2448 cert = _load_cert(
2449 os.path.join(
2450 "x509", "custom", "nc_single_ip_netmask.pem"
2451 ),
2452 x509.load_pem_x509_certificate,
2453 backend
2454 )
2455 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002456 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002457 ).value
2458 assert nc == x509.NameConstraints(
2459 permitted_subtrees=[
2460 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2461 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2462 ],
2463 excluded_subtrees=None
2464 )
2465
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002466 def test_invalid_netmask(self, backend):
2467 cert = _load_cert(
2468 os.path.join(
2469 "x509", "custom", "nc_invalid_ip_netmask.pem"
2470 ),
2471 x509.load_pem_x509_certificate,
2472 backend
2473 )
2474 with pytest.raises(ValueError):
2475 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002476 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002477 )
2478
Paul Kehrer870d7e82015-06-21 22:20:44 -05002479
Paul Kehrer5a485522015-05-06 00:29:12 -05002480class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002481 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002482 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002483 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002484
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002485 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002486 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002487 x509.DistributionPoint(None, "notname", None, None)
2488
2489 def test_distribution_point_full_and_relative_not_none(self):
2490 with pytest.raises(ValueError):
2491 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002492
2493 def test_crl_issuer_not_general_names(self):
2494 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002495 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002496
2497 def test_reason_not_reasonflags(self):
2498 with pytest.raises(TypeError):
2499 x509.DistributionPoint(
2500 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002501 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002502 frozenset(["notreasonflags"]),
2503 None
2504 )
2505
2506 def test_reason_not_frozenset(self):
2507 with pytest.raises(TypeError):
2508 x509.DistributionPoint(
2509 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2510 None,
2511 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002512 None
2513 )
2514
2515 def test_disallowed_reasons(self):
2516 with pytest.raises(ValueError):
2517 x509.DistributionPoint(
2518 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2519 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002520 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002521 None
2522 )
2523
2524 with pytest.raises(ValueError):
2525 x509.DistributionPoint(
2526 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2527 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002528 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002529 None
2530 )
2531
2532 def test_reason_only(self):
2533 with pytest.raises(ValueError):
2534 x509.DistributionPoint(
2535 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002536 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002537 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002538 None
2539 )
2540
2541 def test_eq(self):
2542 dp = x509.DistributionPoint(
2543 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002544 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002545 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002546 [
2547 x509.DirectoryName(
2548 x509.Name([
2549 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002550 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002551 )
2552 ])
2553 )
2554 ],
2555 )
2556 dp2 = x509.DistributionPoint(
2557 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002558 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002559 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002560 [
2561 x509.DirectoryName(
2562 x509.Name([
2563 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002564 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002565 )
2566 ])
2567 )
2568 ],
2569 )
2570 assert dp == dp2
2571
2572 def test_ne(self):
2573 dp = x509.DistributionPoint(
2574 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002575 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002576 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002577 [
2578 x509.DirectoryName(
2579 x509.Name([
2580 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002581 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002582 )
2583 ])
2584 )
2585 ],
2586 )
2587 dp2 = x509.DistributionPoint(
2588 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2589 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002590 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002591 None
2592 )
2593 assert dp != dp2
2594 assert dp != object()
2595
2596 def test_repr(self):
2597 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002598 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002599 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002600 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002601 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002602 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002603 [
2604 x509.DirectoryName(
2605 x509.Name([
2606 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002607 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002608 )
2609 ])
2610 )
2611 ],
2612 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002613 if six.PY3:
2614 assert repr(dp) == (
2615 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2616 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002617 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2618 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2619 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2620 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002621 )
2622 else:
2623 assert repr(dp) == (
2624 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2625 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002626 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2627 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2628 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2629 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002630 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002631
2632
2633class TestCRLDistributionPoints(object):
2634 def test_invalid_distribution_points(self):
2635 with pytest.raises(TypeError):
2636 x509.CRLDistributionPoints(["notadistributionpoint"])
2637
2638 def test_iter_len(self):
2639 cdp = x509.CRLDistributionPoints([
2640 x509.DistributionPoint(
2641 [x509.UniformResourceIdentifier(u"http://domain")],
2642 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002643 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002644 None
2645 ),
2646 x509.DistributionPoint(
2647 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002648 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002649 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002650 x509.ReasonFlags.key_compromise,
2651 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002652 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002653 None
2654 ),
2655 ])
2656 assert len(cdp) == 2
2657 assert list(cdp) == [
2658 x509.DistributionPoint(
2659 [x509.UniformResourceIdentifier(u"http://domain")],
2660 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002661 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002662 None
2663 ),
2664 x509.DistributionPoint(
2665 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002666 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002667 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002668 x509.ReasonFlags.key_compromise,
2669 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002670 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002671 None
2672 ),
2673 ]
2674
2675 def test_repr(self):
2676 cdp = x509.CRLDistributionPoints([
2677 x509.DistributionPoint(
2678 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002679 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002680 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002681 None
2682 ),
2683 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002684 if six.PY3:
2685 assert repr(cdp) == (
2686 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2687 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2688 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2689 "romise'>}), crl_issuer=None)>])>"
2690 )
2691 else:
2692 assert repr(cdp) == (
2693 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2694 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2695 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2696 "romise'>]), crl_issuer=None)>])>"
2697 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002698
2699 def test_eq(self):
2700 cdp = x509.CRLDistributionPoints([
2701 x509.DistributionPoint(
2702 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002703 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002704 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002705 x509.ReasonFlags.key_compromise,
2706 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002707 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002708 [x509.UniformResourceIdentifier(u"uri://thing")],
2709 ),
2710 ])
2711 cdp2 = x509.CRLDistributionPoints([
2712 x509.DistributionPoint(
2713 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002714 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002715 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002716 x509.ReasonFlags.key_compromise,
2717 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002718 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002719 [x509.UniformResourceIdentifier(u"uri://thing")],
2720 ),
2721 ])
2722 assert cdp == cdp2
2723
2724 def test_ne(self):
2725 cdp = x509.CRLDistributionPoints([
2726 x509.DistributionPoint(
2727 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002728 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002729 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002730 x509.ReasonFlags.key_compromise,
2731 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002732 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002733 [x509.UniformResourceIdentifier(u"uri://thing")],
2734 ),
2735 ])
2736 cdp2 = x509.CRLDistributionPoints([
2737 x509.DistributionPoint(
2738 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002739 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002740 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002741 x509.ReasonFlags.key_compromise,
2742 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002743 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002744 [x509.UniformResourceIdentifier(u"uri://thing")],
2745 ),
2746 ])
2747 cdp3 = x509.CRLDistributionPoints([
2748 x509.DistributionPoint(
2749 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002750 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002751 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002752 [x509.UniformResourceIdentifier(u"uri://thing")],
2753 ),
2754 ])
2755 cdp4 = x509.CRLDistributionPoints([
2756 x509.DistributionPoint(
2757 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002758 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002759 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002760 x509.ReasonFlags.key_compromise,
2761 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002762 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002763 [x509.UniformResourceIdentifier(u"uri://thing2")],
2764 ),
2765 ])
2766 assert cdp != cdp2
2767 assert cdp != cdp3
2768 assert cdp != cdp4
2769 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002770
2771
2772@pytest.mark.requires_backend_interface(interface=RSABackend)
2773@pytest.mark.requires_backend_interface(interface=X509Backend)
2774class TestCRLDistributionPointsExtension(object):
2775 def test_fullname_and_crl_issuer(self, backend):
2776 cert = _load_cert(
2777 os.path.join(
2778 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2779 ),
2780 x509.load_der_x509_certificate,
2781 backend
2782 )
2783
2784 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002785 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002786 ).value
2787
2788 assert cdps == x509.CRLDistributionPoints([
2789 x509.DistributionPoint(
2790 full_name=[x509.DirectoryName(
2791 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002792 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002793 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002794 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002795 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002796 ),
2797 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002798 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002799 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002800 ),
2801 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002802 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002803 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002804 ),
2805 ])
2806 )],
2807 relative_name=None,
2808 reasons=None,
2809 crl_issuer=[x509.DirectoryName(
2810 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002811 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002812 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002813 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002814 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002815 ),
2816 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002817 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002818 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002819 ),
2820 ])
2821 )],
2822 )
2823 ])
2824
2825 def test_relativename_and_crl_issuer(self, backend):
2826 cert = _load_cert(
2827 os.path.join(
2828 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2829 ),
2830 x509.load_der_x509_certificate,
2831 backend
2832 )
2833
2834 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002835 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002836 ).value
2837
2838 assert cdps == x509.CRLDistributionPoints([
2839 x509.DistributionPoint(
2840 full_name=None,
2841 relative_name=x509.Name([
2842 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002843 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002844 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002845 ),
2846 ]),
2847 reasons=None,
2848 crl_issuer=[x509.DirectoryName(
2849 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002850 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002851 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002852 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002853 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002854 ),
2855 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002856 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002857 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002858 ),
2859 ])
2860 )],
2861 )
2862 ])
2863
2864 def test_fullname_crl_issuer_reasons(self, backend):
2865 cert = _load_cert(
2866 os.path.join(
2867 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2868 ),
2869 x509.load_pem_x509_certificate,
2870 backend
2871 )
2872
2873 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002874 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002875 ).value
2876
2877 assert cdps == x509.CRLDistributionPoints([
2878 x509.DistributionPoint(
2879 full_name=[x509.UniformResourceIdentifier(
2880 u"http://myhost.com/myca.crl"
2881 )],
2882 relative_name=None,
2883 reasons=frozenset([
2884 x509.ReasonFlags.key_compromise,
2885 x509.ReasonFlags.ca_compromise
2886 ]),
2887 crl_issuer=[x509.DirectoryName(
2888 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002889 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002890 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002891 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002892 ),
2893 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002894 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002895 ),
2896 ])
2897 )],
2898 )
2899 ])
2900
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002901 def test_all_reasons(self, backend):
2902 cert = _load_cert(
2903 os.path.join(
2904 "x509", "custom", "cdp_all_reasons.pem"
2905 ),
2906 x509.load_pem_x509_certificate,
2907 backend
2908 )
2909
2910 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002911 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002912 ).value
2913
2914 assert cdps == x509.CRLDistributionPoints([
2915 x509.DistributionPoint(
2916 full_name=[x509.UniformResourceIdentifier(
2917 u"http://domain.com/some.crl"
2918 )],
2919 relative_name=None,
2920 reasons=frozenset([
2921 x509.ReasonFlags.key_compromise,
2922 x509.ReasonFlags.ca_compromise,
2923 x509.ReasonFlags.affiliation_changed,
2924 x509.ReasonFlags.superseded,
2925 x509.ReasonFlags.privilege_withdrawn,
2926 x509.ReasonFlags.cessation_of_operation,
2927 x509.ReasonFlags.aa_compromise,
2928 x509.ReasonFlags.certificate_hold,
2929 ]),
2930 crl_issuer=None
2931 )
2932 ])
2933
2934 def test_single_reason(self, backend):
2935 cert = _load_cert(
2936 os.path.join(
2937 "x509", "custom", "cdp_reason_aa_compromise.pem"
2938 ),
2939 x509.load_pem_x509_certificate,
2940 backend
2941 )
2942
2943 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002944 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002945 ).value
2946
2947 assert cdps == x509.CRLDistributionPoints([
2948 x509.DistributionPoint(
2949 full_name=[x509.UniformResourceIdentifier(
2950 u"http://domain.com/some.crl"
2951 )],
2952 relative_name=None,
2953 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2954 crl_issuer=None
2955 )
2956 ])
2957
Paul Kehrer9a10d592015-05-10 14:55:51 -05002958 def test_crl_issuer_only(self, backend):
2959 cert = _load_cert(
2960 os.path.join(
2961 "x509", "custom", "cdp_crl_issuer.pem"
2962 ),
2963 x509.load_pem_x509_certificate,
2964 backend
2965 )
2966
2967 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002968 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002969 ).value
2970
2971 assert cdps == x509.CRLDistributionPoints([
2972 x509.DistributionPoint(
2973 full_name=None,
2974 relative_name=None,
2975 reasons=None,
2976 crl_issuer=[x509.DirectoryName(
2977 x509.Name([
2978 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002979 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002980 ),
2981 ])
2982 )],
2983 )
2984 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002985
Dominic Chen87bb9572015-10-09 00:23:07 -04002986 def test_crl_empty_hostname(self, backend):
2987 cert = _load_cert(
2988 os.path.join(
2989 "x509", "custom", "cdp_empty_hostname.pem"
2990 ),
2991 x509.load_pem_x509_certificate,
2992 backend
2993 )
2994
2995 cdps = cert.extensions.get_extension_for_oid(
2996 ExtensionOID.CRL_DISTRIBUTION_POINTS
2997 ).value
2998
2999 assert cdps == x509.CRLDistributionPoints([
3000 x509.DistributionPoint(
3001 full_name=[x509.UniformResourceIdentifier(
3002 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3003 )],
3004 relative_name=None,
3005 reasons=None,
3006 crl_issuer=None
3007 )
3008 ])
3009
Paul Kehrer16fae762015-05-01 23:14:20 -05003010
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003011@pytest.mark.requires_backend_interface(interface=RSABackend)
3012@pytest.mark.requires_backend_interface(interface=X509Backend)
3013class TestOCSPNoCheckExtension(object):
3014 def test_nocheck(self, backend):
3015 cert = _load_cert(
3016 os.path.join(
3017 "x509", "custom", "ocsp_nocheck.pem"
3018 ),
3019 x509.load_pem_x509_certificate,
3020 backend
3021 )
3022 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003023 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003024 )
3025 assert isinstance(ext.value, x509.OCSPNoCheck)
3026
3027
Paul Kehrer16fae762015-05-01 23:14:20 -05003028class TestInhibitAnyPolicy(object):
3029 def test_not_int(self):
3030 with pytest.raises(TypeError):
3031 x509.InhibitAnyPolicy("notint")
3032
3033 def test_negative_int(self):
3034 with pytest.raises(ValueError):
3035 x509.InhibitAnyPolicy(-1)
3036
3037 def test_repr(self):
3038 iap = x509.InhibitAnyPolicy(0)
3039 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3040
3041 def test_eq(self):
3042 iap = x509.InhibitAnyPolicy(1)
3043 iap2 = x509.InhibitAnyPolicy(1)
3044 assert iap == iap2
3045
3046 def test_ne(self):
3047 iap = x509.InhibitAnyPolicy(1)
3048 iap2 = x509.InhibitAnyPolicy(4)
3049 assert iap != iap2
3050 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003051
3052
3053@pytest.mark.requires_backend_interface(interface=RSABackend)
3054@pytest.mark.requires_backend_interface(interface=X509Backend)
3055class TestInhibitAnyPolicyExtension(object):
3056 def test_nocheck(self, backend):
3057 cert = _load_cert(
3058 os.path.join(
3059 "x509", "custom", "inhibit_any_policy_5.pem"
3060 ),
3061 x509.load_pem_x509_certificate,
3062 backend
3063 )
3064 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003065 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003066 ).value
3067 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003068
3069
3070@pytest.mark.requires_backend_interface(interface=RSABackend)
3071@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003072class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003073 def test_invalid_certificate_policies_data(self, backend):
3074 cert = _load_cert(
3075 os.path.join(
3076 "x509", "custom", "cp_invalid.pem"
3077 ),
3078 x509.load_pem_x509_certificate,
3079 backend
3080 )
3081 with pytest.raises(ValueError):
3082 cert.extensions