blob: 2d3339c309caf2700f18434b4ec347fbfdfeafea [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 (
21 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID, NameOID
22)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050023
Paul Kehrerf22f6122015-08-05 12:57:13 +010024from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050026
27
Paul Kehrer85894662015-03-22 13:19:31 -050028class TestExtension(object):
29 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050030 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050031 with pytest.raises(TypeError):
32 x509.Extension("notanoid", True, bc)
33
34 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050035 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050036 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050037 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050038
39 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050040 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050041 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050042 assert repr(ext) == (
43 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
44 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
45 "_length=None)>)>"
46 )
47
Paul Kehrer58e870c2015-05-17 09:15:30 -070048 def test_eq(self):
49 ext1 = x509.Extension(
50 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
51 )
52 ext2 = x509.Extension(
53 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
54 )
55 assert ext1 == ext2
56
57 def test_ne(self):
58 ext1 = x509.Extension(
59 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
60 )
61 ext2 = x509.Extension(
62 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
63 )
64 ext3 = x509.Extension(
65 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
66 )
67 ext4 = x509.Extension(
68 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
69 )
70 assert ext1 != ext2
71 assert ext1 != ext3
72 assert ext1 != ext4
73 assert ext1 != object()
74
Paul Kehrer85894662015-03-22 13:19:31 -050075
Paul Kehrer2b622582015-04-15 11:04:29 -040076class TestNoticeReference(object):
77 def test_notice_numbers_not_all_int(self):
78 with pytest.raises(TypeError):
79 x509.NoticeReference("org", [1, 2, "three"])
80
81 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -050082 with pytest.raises(TypeError):
83 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -040084
85 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -050086 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -040087
Paul Kehrer73be2ca2015-05-11 21:22:38 -050088 if six.PY3:
89 assert repr(nr) == (
90 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
91 "])>"
92 )
93 else:
94 assert repr(nr) == (
95 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
96 "4])>"
97 )
Paul Kehrer2b622582015-04-15 11:04:29 -040098
Paul Kehrerc56ab622015-05-03 09:56:31 -050099 def test_eq(self):
100 nr = x509.NoticeReference("org", [1, 2])
101 nr2 = x509.NoticeReference("org", [1, 2])
102 assert nr == nr2
103
104 def test_ne(self):
105 nr = x509.NoticeReference("org", [1, 2])
106 nr2 = x509.NoticeReference("org", [1])
107 nr3 = x509.NoticeReference(None, [1, 2])
108 assert nr != nr2
109 assert nr != nr3
110 assert nr != object()
111
Paul Kehrer2b622582015-04-15 11:04:29 -0400112
113class TestUserNotice(object):
114 def test_notice_reference_invalid(self):
115 with pytest.raises(TypeError):
116 x509.UserNotice("invalid", None)
117
118 def test_notice_reference_none(self):
119 un = x509.UserNotice(None, "text")
120 assert un.notice_reference is None
121 assert un.explicit_text == "text"
122
123 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500124 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500125 if six.PY3:
126 assert repr(un) == (
127 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500128 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500129 )
130 else:
131 assert repr(un) == (
132 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500133 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500134 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400135
Paul Kehrerc56ab622015-05-03 09:56:31 -0500136 def test_eq(self):
137 nr = x509.NoticeReference("org", [1, 2])
138 nr2 = x509.NoticeReference("org", [1, 2])
139 un = x509.UserNotice(nr, "text")
140 un2 = x509.UserNotice(nr2, "text")
141 assert un == un2
142
143 def test_ne(self):
144 nr = x509.NoticeReference("org", [1, 2])
145 nr2 = x509.NoticeReference("org", [1])
146 un = x509.UserNotice(nr, "text")
147 un2 = x509.UserNotice(nr2, "text")
148 un3 = x509.UserNotice(nr, "text3")
149 assert un != un2
150 assert un != un3
151 assert un != object()
152
Paul Kehrer2b622582015-04-15 11:04:29 -0400153
Paul Kehrer2b622582015-04-15 11:04:29 -0400154class TestPolicyInformation(object):
155 def test_invalid_policy_identifier(self):
156 with pytest.raises(TypeError):
157 x509.PolicyInformation("notanoid", None)
158
159 def test_none_policy_qualifiers(self):
160 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
161 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
162 assert pi.policy_qualifiers is None
163
164 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500165 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400166 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
167 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
168 assert pi.policy_qualifiers == pq
169
170 def test_invalid_policy_identifiers(self):
171 with pytest.raises(TypeError):
172 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
173
174 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500175 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400176 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500177 if six.PY3:
178 assert repr(pi) == (
179 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
180 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500181 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500182 )
183 else:
184 assert repr(pi) == (
185 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
186 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500187 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500188 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400189
Paul Kehrerc56ab622015-05-03 09:56:31 -0500190 def test_eq(self):
191 pi = x509.PolicyInformation(
192 x509.ObjectIdentifier("1.2.3"),
193 [u"string", x509.UserNotice(None, u"hi")]
194 )
195 pi2 = x509.PolicyInformation(
196 x509.ObjectIdentifier("1.2.3"),
197 [u"string", x509.UserNotice(None, u"hi")]
198 )
199 assert pi == pi2
200
201 def test_ne(self):
202 pi = x509.PolicyInformation(
203 x509.ObjectIdentifier("1.2.3"), [u"string"]
204 )
205 pi2 = x509.PolicyInformation(
206 x509.ObjectIdentifier("1.2.3"), [u"string2"]
207 )
208 pi3 = x509.PolicyInformation(
209 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
210 )
211 assert pi != pi2
212 assert pi != pi3
213 assert pi != object()
214
Paul Kehrer2b622582015-04-15 11:04:29 -0400215
216class TestCertificatePolicies(object):
217 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500218 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400219 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
220 with pytest.raises(TypeError):
221 x509.CertificatePolicies([1, pi])
222
223 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500224 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400225 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
226 cp = x509.CertificatePolicies([pi])
227 assert len(cp) == 1
228 for policyinfo in cp:
229 assert policyinfo == pi
230
231 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500232 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400233 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
234 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500235 if six.PY3:
236 assert repr(cp) == (
237 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
238 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
239 "ers=['string'])>])>"
240 )
241 else:
242 assert repr(cp) == (
243 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
244 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
245 "ers=[u'string'])>])>"
246 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400247
Paul Kehrerc56ab622015-05-03 09:56:31 -0500248 def test_eq(self):
249 pi = x509.PolicyInformation(
250 x509.ObjectIdentifier("1.2.3"), [u"string"]
251 )
252 cp = x509.CertificatePolicies([pi])
253 pi2 = x509.PolicyInformation(
254 x509.ObjectIdentifier("1.2.3"), [u"string"]
255 )
256 cp2 = x509.CertificatePolicies([pi2])
257 assert cp == cp2
258
259 def test_ne(self):
260 pi = x509.PolicyInformation(
261 x509.ObjectIdentifier("1.2.3"), [u"string"]
262 )
263 cp = x509.CertificatePolicies([pi])
264 pi2 = x509.PolicyInformation(
265 x509.ObjectIdentifier("1.2.3"), [u"string2"]
266 )
267 cp2 = x509.CertificatePolicies([pi2])
268 assert cp != cp2
269 assert cp != object()
270
Paul Kehrer2b622582015-04-15 11:04:29 -0400271
Paul Kehrer11026fe2015-05-12 11:23:56 -0500272@pytest.mark.requires_backend_interface(interface=RSABackend)
273@pytest.mark.requires_backend_interface(interface=X509Backend)
274class TestCertificatePoliciesExtension(object):
275 def test_cps_uri_policy_qualifier(self, backend):
276 cert = _load_cert(
277 os.path.join("x509", "custom", "cp_cps_uri.pem"),
278 x509.load_pem_x509_certificate,
279 backend
280 )
281
282 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500283 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500284 ).value
285
286 assert cp == x509.CertificatePolicies([
287 x509.PolicyInformation(
288 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
289 [u"http://other.com/cps"]
290 )
291 ])
292
293 def test_user_notice_with_notice_reference(self, backend):
294 cert = _load_cert(
295 os.path.join(
296 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
297 ),
298 x509.load_pem_x509_certificate,
299 backend
300 )
301
302 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500303 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500304 ).value
305
306 assert cp == x509.CertificatePolicies([
307 x509.PolicyInformation(
308 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
309 [
310 u"http://example.com/cps",
311 u"http://other.com/cps",
312 x509.UserNotice(
313 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
314 u"thing"
315 )
316 ]
317 )
318 ])
319
320 def test_user_notice_with_explicit_text(self, backend):
321 cert = _load_cert(
322 os.path.join(
323 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
324 ),
325 x509.load_pem_x509_certificate,
326 backend
327 )
328
329 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500330 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500331 ).value
332
333 assert cp == x509.CertificatePolicies([
334 x509.PolicyInformation(
335 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
336 [x509.UserNotice(None, u"thing")]
337 )
338 ])
339
340 def test_user_notice_no_explicit_text(self, backend):
341 cert = _load_cert(
342 os.path.join(
343 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
344 ),
345 x509.load_pem_x509_certificate,
346 backend
347 )
348
349 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500350 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500351 ).value
352
353 assert cp == x509.CertificatePolicies([
354 x509.PolicyInformation(
355 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
356 [
357 x509.UserNotice(
358 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
359 None
360 )
361 ]
362 )
363 ])
364
365
Paul Kehrercecbbba2015-03-30 14:58:38 -0500366class TestKeyUsage(object):
367 def test_key_agreement_false_encipher_decipher_true(self):
368 with pytest.raises(ValueError):
369 x509.KeyUsage(
370 digital_signature=False,
371 content_commitment=False,
372 key_encipherment=False,
373 data_encipherment=False,
374 key_agreement=False,
375 key_cert_sign=False,
376 crl_sign=False,
377 encipher_only=True,
378 decipher_only=False
379 )
380
381 with pytest.raises(ValueError):
382 x509.KeyUsage(
383 digital_signature=False,
384 content_commitment=False,
385 key_encipherment=False,
386 data_encipherment=False,
387 key_agreement=False,
388 key_cert_sign=False,
389 crl_sign=False,
390 encipher_only=True,
391 decipher_only=True
392 )
393
394 with pytest.raises(ValueError):
395 x509.KeyUsage(
396 digital_signature=False,
397 content_commitment=False,
398 key_encipherment=False,
399 data_encipherment=False,
400 key_agreement=False,
401 key_cert_sign=False,
402 crl_sign=False,
403 encipher_only=False,
404 decipher_only=True
405 )
406
407 def test_properties_key_agreement_true(self):
408 ku = x509.KeyUsage(
409 digital_signature=True,
410 content_commitment=True,
411 key_encipherment=False,
412 data_encipherment=False,
413 key_agreement=False,
414 key_cert_sign=True,
415 crl_sign=False,
416 encipher_only=False,
417 decipher_only=False
418 )
419 assert ku.digital_signature is True
420 assert ku.content_commitment is True
421 assert ku.key_encipherment is False
422 assert ku.data_encipherment is False
423 assert ku.key_agreement is False
424 assert ku.key_cert_sign is True
425 assert ku.crl_sign is False
426
427 def test_key_agreement_true_properties(self):
428 ku = x509.KeyUsage(
429 digital_signature=False,
430 content_commitment=False,
431 key_encipherment=False,
432 data_encipherment=False,
433 key_agreement=True,
434 key_cert_sign=False,
435 crl_sign=False,
436 encipher_only=False,
437 decipher_only=True
438 )
439 assert ku.key_agreement is True
440 assert ku.encipher_only is False
441 assert ku.decipher_only is True
442
443 def test_key_agreement_false_properties(self):
444 ku = x509.KeyUsage(
445 digital_signature=False,
446 content_commitment=False,
447 key_encipherment=False,
448 data_encipherment=False,
449 key_agreement=False,
450 key_cert_sign=False,
451 crl_sign=False,
452 encipher_only=False,
453 decipher_only=False
454 )
455 assert ku.key_agreement is False
456 with pytest.raises(ValueError):
457 ku.encipher_only
458
459 with pytest.raises(ValueError):
460 ku.decipher_only
461
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500462 def test_repr_key_agreement_false(self):
463 ku = x509.KeyUsage(
464 digital_signature=True,
465 content_commitment=True,
466 key_encipherment=False,
467 data_encipherment=False,
468 key_agreement=False,
469 key_cert_sign=True,
470 crl_sign=False,
471 encipher_only=False,
472 decipher_only=False
473 )
474 assert repr(ku) == (
475 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
476 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400477 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
478 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500479 )
480
481 def test_repr_key_agreement_true(self):
482 ku = x509.KeyUsage(
483 digital_signature=True,
484 content_commitment=True,
485 key_encipherment=False,
486 data_encipherment=False,
487 key_agreement=True,
488 key_cert_sign=True,
489 crl_sign=False,
490 encipher_only=False,
491 decipher_only=False
492 )
493 assert repr(ku) == (
494 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
495 "cipherment=False, data_encipherment=False, key_agreement=True, k"
496 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
497 "only=False)>"
498 )
499
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500500 def test_eq(self):
501 ku = x509.KeyUsage(
502 digital_signature=False,
503 content_commitment=False,
504 key_encipherment=False,
505 data_encipherment=False,
506 key_agreement=True,
507 key_cert_sign=False,
508 crl_sign=False,
509 encipher_only=False,
510 decipher_only=True
511 )
512 ku2 = x509.KeyUsage(
513 digital_signature=False,
514 content_commitment=False,
515 key_encipherment=False,
516 data_encipherment=False,
517 key_agreement=True,
518 key_cert_sign=False,
519 crl_sign=False,
520 encipher_only=False,
521 decipher_only=True
522 )
523 assert ku == ku2
524
525 def test_ne(self):
526 ku = x509.KeyUsage(
527 digital_signature=False,
528 content_commitment=False,
529 key_encipherment=False,
530 data_encipherment=False,
531 key_agreement=True,
532 key_cert_sign=False,
533 crl_sign=False,
534 encipher_only=False,
535 decipher_only=True
536 )
537 ku2 = x509.KeyUsage(
538 digital_signature=False,
539 content_commitment=False,
540 key_encipherment=False,
541 data_encipherment=False,
542 key_agreement=False,
543 key_cert_sign=False,
544 crl_sign=False,
545 encipher_only=False,
546 decipher_only=False
547 )
548 assert ku != ku2
549 assert ku != object()
550
Paul Kehrercecbbba2015-03-30 14:58:38 -0500551
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500552class TestSubjectKeyIdentifier(object):
553 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400554 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500555 ski = x509.SubjectKeyIdentifier(value)
556 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500557
558 def test_repr(self):
559 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500560 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500561 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500562 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400563 if six.PY3:
564 assert repr(ext) == (
565 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
566 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
567 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
568 "\\xf7\\xff:\\xc9\')>)>"
569 )
570 else:
571 assert repr(ext) == (
572 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
573 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
574 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
575 "\\xf7\\xff:\\xc9\')>)>"
576 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500577
578 def test_eq(self):
579 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500580 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500581 )
582 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500583 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500584 )
585 assert ski == ski2
586
587 def test_ne(self):
588 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500589 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500590 )
591 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500592 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500593 )
594 assert ski != ski2
595 assert ski != object()
596
597
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400598class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500599 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400600 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500601 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400602
603 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500604 dirname = x509.DirectoryName(
605 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500606 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
607 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500608 ])
609 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400610 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500611 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400612
613 def test_authority_issuer_none_serial_not_none(self):
614 with pytest.raises(ValueError):
615 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
616
617 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500618 dirname = x509.DirectoryName(
619 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500620 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
621 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500622 ])
623 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400624 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500625 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400626
627 def test_authority_cert_serial_and_issuer_none(self):
628 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
629 assert aki.key_identifier == b"id"
630 assert aki.authority_cert_issuer is None
631 assert aki.authority_cert_serial_number is None
632
633 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500634 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500635 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500636 )
637 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400638
639 if six.PY3:
640 assert repr(aki) == (
641 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500642 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500643 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500644 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400645 )
646 else:
647 assert repr(aki) == (
648 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500649 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500650 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
651 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400652 )
653
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500654 def test_eq(self):
655 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500656 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500657 )
658 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
659 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500660 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500661 )
662 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
663 assert aki == aki2
664
665 def test_ne(self):
666 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500667 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500668 )
669 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500670 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500671 )
672 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
673 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
674 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
675 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
676 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
677 assert aki != aki2
678 assert aki != aki3
679 assert aki != aki4
680 assert aki != aki5
681 assert aki != object()
682
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400683
Paul Kehrer8cf26422015-03-21 09:50:24 -0500684class TestBasicConstraints(object):
685 def test_ca_not_boolean(self):
686 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500687 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500688
689 def test_path_length_not_ca(self):
690 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500691 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500692
693 def test_path_length_not_int(self):
694 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500695 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500696
697 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500698 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500699
700 def test_path_length_negative(self):
701 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500702 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500703
704 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500705 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500706 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500707 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500708 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500709
Paul Kehrer3a69b132015-05-13 10:03:46 -0500710 def test_eq(self):
711 na = x509.BasicConstraints(ca=True, path_length=None)
712 na2 = x509.BasicConstraints(ca=True, path_length=None)
713 assert na == na2
714
715 def test_ne(self):
716 na = x509.BasicConstraints(ca=True, path_length=None)
717 na2 = x509.BasicConstraints(ca=True, path_length=1)
718 na3 = x509.BasicConstraints(ca=False, path_length=None)
719 assert na != na2
720 assert na != na3
721 assert na != object()
722
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500723
Paul Kehrerffa2a152015-03-31 08:18:25 -0500724class TestExtendedKeyUsage(object):
725 def test_not_all_oids(self):
726 with pytest.raises(TypeError):
727 x509.ExtendedKeyUsage(["notoid"])
728
729 def test_iter_len(self):
730 eku = x509.ExtendedKeyUsage([
731 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
732 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
733 ])
734 assert len(eku) == 2
735 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500736 ExtendedKeyUsageOID.SERVER_AUTH,
737 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500738 ]
739
Paul Kehrer23d10c32015-04-02 23:12:32 -0500740 def test_repr(self):
741 eku = x509.ExtendedKeyUsage([
742 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
743 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
744 ])
745 assert repr(eku) == (
746 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
747 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
748 "tAuth)>])>"
749 )
750
Paul Kehrerb0476172015-05-02 19:34:51 -0500751 def test_eq(self):
752 eku = x509.ExtendedKeyUsage([
753 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
754 ])
755 eku2 = x509.ExtendedKeyUsage([
756 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
757 ])
758 assert eku == eku2
759
760 def test_ne(self):
761 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
762 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
763 assert eku != eku2
764 assert eku != object()
765
Paul Kehrerffa2a152015-03-31 08:18:25 -0500766
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500767@pytest.mark.requires_backend_interface(interface=RSABackend)
768@pytest.mark.requires_backend_interface(interface=X509Backend)
769class TestExtensions(object):
770 def test_no_extensions(self, backend):
771 cert = _load_cert(
772 os.path.join("x509", "verisign_md2_root.pem"),
773 x509.load_pem_x509_certificate,
774 backend
775 )
776 ext = cert.extensions
777 assert len(ext) == 0
778 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500779 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500780 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500781
Paul Kehrerd44e4132015-08-10 19:13:13 -0500782 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500783
784 def test_one_extension(self, backend):
785 cert = _load_cert(
786 os.path.join(
787 "x509", "custom", "basic_constraints_not_critical.pem"
788 ),
789 x509.load_pem_x509_certificate,
790 backend
791 )
792 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500793 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500794 assert ext is not None
795 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500796
797 def test_duplicate_extension(self, backend):
798 cert = _load_cert(
799 os.path.join(
800 "x509", "custom", "two_basic_constraints.pem"
801 ),
802 x509.load_pem_x509_certificate,
803 backend
804 )
805 with pytest.raises(x509.DuplicateExtension) as exc:
806 cert.extensions
807
Paul Kehrerd44e4132015-08-10 19:13:13 -0500808 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500809
810 def test_unsupported_critical_extension(self, backend):
811 cert = _load_cert(
812 os.path.join(
813 "x509", "custom", "unsupported_extension_critical.pem"
814 ),
815 x509.load_pem_x509_certificate,
816 backend
817 )
818 with pytest.raises(x509.UnsupportedExtension) as exc:
819 cert.extensions
820
821 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
822
823 def test_unsupported_extension(self, backend):
824 # TODO: this will raise an exception when all extensions are complete
825 cert = _load_cert(
826 os.path.join(
827 "x509", "custom", "unsupported_extension.pem"
828 ),
829 x509.load_pem_x509_certificate,
830 backend
831 )
832 extensions = cert.extensions
833 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500834
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100835 def test_one_extension_get_for_class(self, backend):
836 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100837 os.path.join(
838 "x509", "custom", "basic_constraints_not_critical.pem"
839 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100840 x509.load_pem_x509_certificate,
841 backend
842 )
843 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
844 assert ext is not None
845
846 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500847
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100848
Paul Kehrerfa56a232015-03-17 13:14:03 -0500849@pytest.mark.requires_backend_interface(interface=RSABackend)
850@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500851class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500852 def test_ca_true_pathlen_6(self, backend):
853 cert = _load_cert(
854 os.path.join(
855 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
856 ),
857 x509.load_der_x509_certificate,
858 backend
859 )
860 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500861 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500862 )
863 assert ext is not None
864 assert ext.critical is True
865 assert ext.value.ca is True
866 assert ext.value.path_length == 6
867
868 def test_path_length_zero(self, backend):
869 cert = _load_cert(
870 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
871 x509.load_pem_x509_certificate,
872 backend
873 )
874 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500875 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500876 )
877 assert ext is not None
878 assert ext.critical is True
879 assert ext.value.ca is True
880 assert ext.value.path_length == 0
881
882 def test_ca_true_no_pathlen(self, backend):
883 cert = _load_cert(
884 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
885 x509.load_der_x509_certificate,
886 backend
887 )
888 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500889 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500890 )
891 assert ext is not None
892 assert ext.critical is True
893 assert ext.value.ca is True
894 assert ext.value.path_length is None
895
896 def test_ca_false(self, backend):
897 cert = _load_cert(
898 os.path.join("x509", "cryptography.io.pem"),
899 x509.load_pem_x509_certificate,
900 backend
901 )
902 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500903 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500904 )
905 assert ext is not None
906 assert ext.critical is True
907 assert ext.value.ca is False
908 assert ext.value.path_length is None
909
910 def test_no_basic_constraints(self, backend):
911 cert = _load_cert(
912 os.path.join(
913 "x509",
914 "PKITS_data",
915 "certs",
916 "ValidCertificatePathTest1EE.crt"
917 ),
918 x509.load_der_x509_certificate,
919 backend
920 )
921 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500922 cert.extensions.get_extension_for_oid(
923 ExtensionOID.BASIC_CONSTRAINTS
924 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500925
926 def test_basic_constraint_not_critical(self, backend):
927 cert = _load_cert(
928 os.path.join(
929 "x509", "custom", "basic_constraints_not_critical.pem"
930 ),
931 x509.load_pem_x509_certificate,
932 backend
933 )
934 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500935 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500936 )
937 assert ext is not None
938 assert ext.critical is False
939 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500940
941
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500942class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100943 @pytest.mark.requires_backend_interface(interface=RSABackend)
944 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500945 def test_subject_key_identifier(self, backend):
946 cert = _load_cert(
947 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
948 x509.load_der_x509_certificate,
949 backend
950 )
951 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500952 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500953 )
954 ski = ext.value
955 assert ext is not None
956 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500957 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500958 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500959 )
960
Paul Kehrerf22f6122015-08-05 12:57:13 +0100961 @pytest.mark.requires_backend_interface(interface=RSABackend)
962 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500963 def test_no_subject_key_identifier(self, backend):
964 cert = _load_cert(
965 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
966 x509.load_pem_x509_certificate,
967 backend
968 )
969 with pytest.raises(x509.ExtensionNotFound):
970 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500971 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500972 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500973
Paul Kehrerf22f6122015-08-05 12:57:13 +0100974 @pytest.mark.requires_backend_interface(interface=RSABackend)
975 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100976 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100977 cert = _load_cert(
978 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
979 x509.load_der_x509_certificate,
980 backend
981 )
982 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500983 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +0100984 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100985 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +0100986 cert.public_key()
987 )
988 assert ext.value == ski
989
990 @pytest.mark.requires_backend_interface(interface=DSABackend)
991 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100992 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100993 cert = _load_cert(
994 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
995 x509.load_pem_x509_certificate,
996 backend
997 )
998
999 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001000 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001001 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001002 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001003 cert.public_key()
1004 )
1005 assert ext.value == ski
1006
1007 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1008 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001009 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001010 _skip_curve_unsupported(backend, ec.SECP384R1())
1011 cert = _load_cert(
1012 os.path.join("x509", "ecdsa_root.pem"),
1013 x509.load_pem_x509_certificate,
1014 backend
1015 )
1016
1017 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001018 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001019 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001020 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001021 cert.public_key()
1022 )
1023 assert ext.value == ski
1024
Paul Kehrer5508ee22015-04-02 19:31:03 -05001025
1026@pytest.mark.requires_backend_interface(interface=RSABackend)
1027@pytest.mark.requires_backend_interface(interface=X509Backend)
1028class TestKeyUsageExtension(object):
1029 def test_no_key_usage(self, backend):
1030 cert = _load_cert(
1031 os.path.join("x509", "verisign_md2_root.pem"),
1032 x509.load_pem_x509_certificate,
1033 backend
1034 )
1035 ext = cert.extensions
1036 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001037 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001038
Paul Kehrerd44e4132015-08-10 19:13:13 -05001039 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001040
1041 def test_all_purposes(self, backend):
1042 cert = _load_cert(
1043 os.path.join(
1044 "x509", "custom", "all_key_usages.pem"
1045 ),
1046 x509.load_pem_x509_certificate,
1047 backend
1048 )
1049 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001050 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001051 assert ext is not None
1052
1053 ku = ext.value
1054 assert ku.digital_signature is True
1055 assert ku.content_commitment is True
1056 assert ku.key_encipherment is True
1057 assert ku.data_encipherment is True
1058 assert ku.key_agreement is True
1059 assert ku.key_cert_sign is True
1060 assert ku.crl_sign is True
1061 assert ku.encipher_only is True
1062 assert ku.decipher_only is True
1063
1064 def test_key_cert_sign_crl_sign(self, backend):
1065 cert = _load_cert(
1066 os.path.join(
1067 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1068 ),
1069 x509.load_der_x509_certificate,
1070 backend
1071 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001072 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001073 assert ext is not None
1074 assert ext.critical is True
1075
1076 ku = ext.value
1077 assert ku.digital_signature is False
1078 assert ku.content_commitment is False
1079 assert ku.key_encipherment is False
1080 assert ku.data_encipherment is False
1081 assert ku.key_agreement is False
1082 assert ku.key_cert_sign is True
1083 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001084
1085
1086@pytest.mark.parametrize(
1087 "name", [
1088 x509.RFC822Name,
1089 x509.DNSName,
1090 x509.UniformResourceIdentifier
1091 ]
1092)
1093class TestTextGeneralNames(object):
1094 def test_not_text(self, name):
1095 with pytest.raises(TypeError):
1096 name(b"notaunicodestring")
1097
1098 with pytest.raises(TypeError):
1099 name(1.3)
1100
1101 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301102 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001103 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1104
1105 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301106 gn = name(u"string")
1107 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001108 assert gn == gn2
1109
1110 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301111 gn = name(u"string")
1112 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001113 assert gn != gn2
1114 assert gn != object()
1115
1116
1117class TestDirectoryName(object):
1118 def test_not_name(self):
1119 with pytest.raises(TypeError):
1120 x509.DirectoryName(b"notaname")
1121
1122 with pytest.raises(TypeError):
1123 x509.DirectoryName(1.3)
1124
1125 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001126 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001127 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001128 if six.PY3:
1129 assert repr(gn) == (
1130 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1131 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1132 ">])>)>"
1133 )
1134 else:
1135 assert repr(gn) == (
1136 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1137 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1138 ")>])>)>"
1139 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001140
1141 def test_eq(self):
1142 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001143 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001144 ])
1145 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001146 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001147 ])
1148 gn = x509.DirectoryName(x509.Name([name]))
1149 gn2 = x509.DirectoryName(x509.Name([name2]))
1150 assert gn == gn2
1151
1152 def test_ne(self):
1153 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001154 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001155 ])
1156 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001157 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001158 ])
1159 gn = x509.DirectoryName(x509.Name([name]))
1160 gn2 = x509.DirectoryName(x509.Name([name2]))
1161 assert gn != gn2
1162 assert gn != object()
1163
1164
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001165class TestRFC822Name(object):
1166 def test_invalid_email(self):
1167 with pytest.raises(ValueError):
1168 x509.RFC822Name(u"Name <email>")
1169
1170 with pytest.raises(ValueError):
1171 x509.RFC822Name(u"")
1172
1173 def test_single_label(self):
1174 gn = x509.RFC822Name(u"administrator")
1175 assert gn.value == u"administrator"
1176
1177 def test_idna(self):
1178 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1179 assert gn.value == u"email@em\xe5\xefl.com"
1180 assert gn._encoded == b"email@xn--eml-vla4c.com"
1181
1182
Paul Kehrere28d6c42015-07-12 14:59:37 -05001183class TestUniformResourceIdentifier(object):
1184 def test_no_parsed_hostname(self):
1185 gn = x509.UniformResourceIdentifier(u"singlelabel")
1186 assert gn.value == u"singlelabel"
1187
1188 def test_with_port(self):
1189 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1190 assert gn.value == u"singlelabel:443/test"
1191
1192 def test_idna_no_port(self):
1193 gn = x509.UniformResourceIdentifier(
1194 u"http://\u043f\u044b\u043a\u0430.cryptography"
1195 )
1196 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1197 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1198
1199 def test_idna_with_port(self):
1200 gn = x509.UniformResourceIdentifier(
1201 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1202 )
1203 assert gn.value == (
1204 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1205 )
1206 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1207
1208 def test_query_and_fragment(self):
1209 gn = x509.UniformResourceIdentifier(
1210 u"ldap://cryptography:90/path?query=true#somedata"
1211 )
1212 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1213
1214
Paul Kehrer31bdf792015-03-25 14:11:00 -05001215class TestRegisteredID(object):
1216 def test_not_oid(self):
1217 with pytest.raises(TypeError):
1218 x509.RegisteredID(b"notanoid")
1219
1220 with pytest.raises(TypeError):
1221 x509.RegisteredID(1.3)
1222
1223 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001224 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001225 assert repr(gn) == (
1226 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1227 "e)>)>"
1228 )
1229
1230 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001231 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1232 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001233 assert gn == gn2
1234
1235 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001236 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001237 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001238 assert gn != gn2
1239 assert gn != object()
1240
1241
1242class TestIPAddress(object):
1243 def test_not_ipaddress(self):
1244 with pytest.raises(TypeError):
1245 x509.IPAddress(b"notanipaddress")
1246
1247 with pytest.raises(TypeError):
1248 x509.IPAddress(1.3)
1249
1250 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301251 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001252 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1253
Eeshan Gargf1234152015-04-29 18:41:00 +05301254 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001255 assert repr(gn2) == "<IPAddress(value=ff::)>"
1256
Paul Kehrereb177932015-05-17 18:33:33 -07001257 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1258 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1259
1260 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1261 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1262
Paul Kehrer31bdf792015-03-25 14:11:00 -05001263 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301264 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1265 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001266 assert gn == gn2
1267
1268 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301269 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1270 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001271 assert gn != gn2
1272 assert gn != object()
1273
1274
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001275class TestOtherName(object):
1276 def test_invalid_args(self):
1277 with pytest.raises(TypeError):
1278 x509.OtherName(b"notanobjectidentifier", b"derdata")
1279
1280 with pytest.raises(TypeError):
1281 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1282
1283 def test_repr(self):
1284 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1285 if six.PY3:
1286 assert repr(gn) == (
1287 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1288 "name=Unknown OID)>, value=b'derdata')>"
1289 )
1290 else:
1291 assert repr(gn) == (
1292 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1293 "name=Unknown OID)>, value='derdata')>"
1294 )
1295
1296 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1297 if six.PY3:
1298 assert repr(gn) == (
1299 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1300 "name=pseudonym)>, value=b'derdata')>"
1301 )
1302 else:
1303 assert repr(gn) == (
1304 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1305 "name=pseudonym)>, value='derdata')>"
1306 )
1307
1308 def test_eq(self):
1309 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1310 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1311 assert gn == gn2
1312
1313 def test_ne(self):
1314 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1315 assert gn != object()
1316
1317 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1318 assert gn != gn2
1319
1320 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1321 assert gn != gn2
1322
1323
Erik Trauschke2dcce902015-05-14 16:12:24 -07001324class TestGeneralNames(object):
1325 def test_get_values_for_type(self):
1326 gns = x509.GeneralNames(
1327 [x509.DNSName(u"cryptography.io")]
1328 )
1329 names = gns.get_values_for_type(x509.DNSName)
1330 assert names == [u"cryptography.io"]
1331
1332 def test_iter_names(self):
1333 gns = x509.GeneralNames([
1334 x509.DNSName(u"cryptography.io"),
1335 x509.DNSName(u"crypto.local"),
1336 ])
1337 assert len(gns) == 2
1338 assert list(gns) == [
1339 x509.DNSName(u"cryptography.io"),
1340 x509.DNSName(u"crypto.local"),
1341 ]
1342
1343 def test_invalid_general_names(self):
1344 with pytest.raises(TypeError):
1345 x509.GeneralNames(
1346 [x509.DNSName(u"cryptography.io"), "invalid"]
1347 )
1348
1349 def test_repr(self):
1350 gns = x509.GeneralNames(
1351 [
1352 x509.DNSName(u"cryptography.io")
1353 ]
1354 )
1355 assert repr(gns) == (
1356 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1357 )
1358
1359 def test_eq(self):
1360 gns = x509.GeneralNames(
1361 [x509.DNSName(u"cryptography.io")]
1362 )
1363 gns2 = x509.GeneralNames(
1364 [x509.DNSName(u"cryptography.io")]
1365 )
1366 assert gns == gns2
1367
1368 def test_ne(self):
1369 gns = x509.GeneralNames(
1370 [x509.DNSName(u"cryptography.io")]
1371 )
1372 gns2 = x509.GeneralNames(
1373 [x509.RFC822Name(u"admin@cryptography.io")]
1374 )
1375 assert gns != gns2
1376 assert gns != object()
1377
1378
Paul Kehrer99125c92015-06-07 18:37:10 -05001379class TestIssuerAlternativeName(object):
1380 def test_get_values_for_type(self):
1381 san = x509.IssuerAlternativeName(
1382 [x509.DNSName(u"cryptography.io")]
1383 )
1384 names = san.get_values_for_type(x509.DNSName)
1385 assert names == [u"cryptography.io"]
1386
1387 def test_iter_names(self):
1388 san = x509.IssuerAlternativeName([
1389 x509.DNSName(u"cryptography.io"),
1390 x509.DNSName(u"crypto.local"),
1391 ])
1392 assert len(san) == 2
1393 assert list(san) == [
1394 x509.DNSName(u"cryptography.io"),
1395 x509.DNSName(u"crypto.local"),
1396 ]
1397
1398 def test_invalid_general_names(self):
1399 with pytest.raises(TypeError):
1400 x509.IssuerAlternativeName(
1401 [x509.DNSName(u"cryptography.io"), "invalid"]
1402 )
1403
1404 def test_repr(self):
1405 san = x509.IssuerAlternativeName(
1406 [
1407 x509.DNSName(u"cryptography.io")
1408 ]
1409 )
1410 assert repr(san) == (
1411 "<IssuerAlternativeName("
1412 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1413 )
1414
1415 def test_eq(self):
1416 san = x509.IssuerAlternativeName(
1417 [x509.DNSName(u"cryptography.io")]
1418 )
1419 san2 = x509.IssuerAlternativeName(
1420 [x509.DNSName(u"cryptography.io")]
1421 )
1422 assert san == san2
1423
1424 def test_ne(self):
1425 san = x509.IssuerAlternativeName(
1426 [x509.DNSName(u"cryptography.io")]
1427 )
1428 san2 = x509.IssuerAlternativeName(
1429 [x509.RFC822Name(u"admin@cryptography.io")]
1430 )
1431 assert san != san2
1432 assert san != object()
1433
1434
Alex Gaynorf1c17672015-06-20 14:20:20 -04001435@pytest.mark.requires_backend_interface(interface=RSABackend)
1436@pytest.mark.requires_backend_interface(interface=X509Backend)
1437class TestRSAIssuerAlternativeNameExtension(object):
1438 def test_uri(self, backend):
1439 cert = _load_cert(
1440 os.path.join("x509", "custom", "ian_uri.pem"),
1441 x509.load_pem_x509_certificate,
1442 backend,
1443 )
1444 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001445 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001446 )
1447 assert list(ext.value) == [
1448 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1449 ]
1450
1451
Paul Kehrer31bdf792015-03-25 14:11:00 -05001452class TestSubjectAlternativeName(object):
1453 def test_get_values_for_type(self):
1454 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301455 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001456 )
1457 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301458 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001459
1460 def test_iter_names(self):
1461 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301462 x509.DNSName(u"cryptography.io"),
1463 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001464 ])
1465 assert len(san) == 2
1466 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301467 x509.DNSName(u"cryptography.io"),
1468 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001469 ]
1470
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001471 def test_invalid_general_names(self):
1472 with pytest.raises(TypeError):
1473 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301474 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001475 )
1476
Paul Kehrer31bdf792015-03-25 14:11:00 -05001477 def test_repr(self):
1478 san = x509.SubjectAlternativeName(
1479 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301480 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001481 ]
1482 )
1483 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001484 "<SubjectAlternativeName("
1485 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001486 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001487
Paul Kehrer58cc3972015-05-13 10:00:41 -05001488 def test_eq(self):
1489 san = x509.SubjectAlternativeName(
1490 [x509.DNSName(u"cryptography.io")]
1491 )
1492 san2 = x509.SubjectAlternativeName(
1493 [x509.DNSName(u"cryptography.io")]
1494 )
1495 assert san == san2
1496
1497 def test_ne(self):
1498 san = x509.SubjectAlternativeName(
1499 [x509.DNSName(u"cryptography.io")]
1500 )
1501 san2 = x509.SubjectAlternativeName(
1502 [x509.RFC822Name(u"admin@cryptography.io")]
1503 )
1504 assert san != san2
1505 assert san != object()
1506
Paul Kehrer40f83382015-04-20 15:00:16 -05001507
1508@pytest.mark.requires_backend_interface(interface=RSABackend)
1509@pytest.mark.requires_backend_interface(interface=X509Backend)
1510class TestRSASubjectAlternativeNameExtension(object):
1511 def test_dns_name(self, backend):
1512 cert = _load_cert(
1513 os.path.join("x509", "cryptography.io.pem"),
1514 x509.load_pem_x509_certificate,
1515 backend
1516 )
1517 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001518 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001519 )
1520 assert ext is not None
1521 assert ext.critical is False
1522
1523 san = ext.value
1524
1525 dns = san.get_values_for_type(x509.DNSName)
1526 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001527
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001528 def test_wildcard_dns_name(self, backend):
1529 cert = _load_cert(
1530 os.path.join("x509", "wildcard_san.pem"),
1531 x509.load_pem_x509_certificate,
1532 backend
1533 )
1534 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001535 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001536 )
1537
1538 dns = ext.value.get_values_for_type(x509.DNSName)
1539 assert dns == [
1540 u'*.langui.sh',
1541 u'langui.sh',
1542 u'*.saseliminator.com',
1543 u'saseliminator.com'
1544 ]
1545
1546 def test_san_wildcard_idna_dns_name(self, backend):
1547 cert = _load_cert(
1548 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1549 x509.load_pem_x509_certificate,
1550 backend
1551 )
1552 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001553 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001554 )
1555
1556 dns = ext.value.get_values_for_type(x509.DNSName)
1557 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1558
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001559 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001560 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001561 os.path.join("x509", "san_x400address.der"),
1562 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001563 backend
1564 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001565 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001566 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001567
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001568 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001569
1570 def test_registered_id(self, backend):
1571 cert = _load_cert(
1572 os.path.join(
1573 "x509", "custom", "san_registered_id.pem"
1574 ),
1575 x509.load_pem_x509_certificate,
1576 backend
1577 )
1578 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001579 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001580 )
1581 assert ext is not None
1582 assert ext.critical is False
1583
1584 san = ext.value
1585 rid = san.get_values_for_type(x509.RegisteredID)
1586 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001587
1588 def test_uri(self, backend):
1589 cert = _load_cert(
1590 os.path.join(
1591 "x509", "custom", "san_uri_with_port.pem"
1592 ),
1593 x509.load_pem_x509_certificate,
1594 backend
1595 )
1596 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001597 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001598 )
1599 assert ext is not None
1600 uri = ext.value.get_values_for_type(
1601 x509.UniformResourceIdentifier
1602 )
1603 assert uri == [
1604 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1605 u"lo",
1606 u"http://someregulardomain.com",
1607 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001608
1609 def test_ipaddress(self, backend):
1610 cert = _load_cert(
1611 os.path.join(
1612 "x509", "custom", "san_ipaddr.pem"
1613 ),
1614 x509.load_pem_x509_certificate,
1615 backend
1616 )
1617 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001618 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001619 )
1620 assert ext is not None
1621 assert ext.critical is False
1622
1623 san = ext.value
1624
1625 ip = san.get_values_for_type(x509.IPAddress)
1626 assert [
1627 ipaddress.ip_address(u"127.0.0.1"),
1628 ipaddress.ip_address(u"ff::")
1629 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001630
1631 def test_dirname(self, backend):
1632 cert = _load_cert(
1633 os.path.join(
1634 "x509", "custom", "san_dirname.pem"
1635 ),
1636 x509.load_pem_x509_certificate,
1637 backend
1638 )
1639 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001640 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001641 )
1642 assert ext is not None
1643 assert ext.critical is False
1644
1645 san = ext.value
1646
1647 dirname = san.get_values_for_type(x509.DirectoryName)
1648 assert [
1649 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001650 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1651 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1652 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001653 ])
1654 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001655
1656 def test_rfc822name(self, backend):
1657 cert = _load_cert(
1658 os.path.join(
1659 "x509", "custom", "san_rfc822_idna.pem"
1660 ),
1661 x509.load_pem_x509_certificate,
1662 backend
1663 )
1664 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001665 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001666 )
1667 assert ext is not None
1668 assert ext.critical is False
1669
1670 san = ext.value
1671
1672 rfc822name = san.get_values_for_type(x509.RFC822Name)
1673 assert [u"email@em\xe5\xefl.com"] == rfc822name
1674
Paul Kehrerb8968812015-05-15 09:01:34 -07001675 def test_idna2003_invalid(self, backend):
1676 cert = _load_cert(
1677 os.path.join(
1678 "x509", "custom", "san_idna2003_dnsname.pem"
1679 ),
1680 x509.load_pem_x509_certificate,
1681 backend
1682 )
1683 with pytest.raises(UnicodeError):
1684 cert.extensions
1685
Paul Kehrere06cab42015-04-30 10:23:33 -05001686 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1687 cert = _load_cert(
1688 os.path.join(
1689 "x509", "custom", "san_idna_names.pem"
1690 ),
1691 x509.load_pem_x509_certificate,
1692 backend
1693 )
1694 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001695 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001696 )
1697 assert ext is not None
1698 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1699 dns_name = ext.value.get_values_for_type(x509.DNSName)
1700 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1701 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1702 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1703 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1704
1705 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1706 cert = _load_cert(
1707 os.path.join(
1708 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1709 ),
1710 x509.load_pem_x509_certificate,
1711 backend
1712 )
1713 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001714 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001715 )
1716 assert ext is not None
1717 assert ext.critical is False
1718
1719 san = ext.value
1720
1721 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1722 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1723 dns = san.get_values_for_type(x509.DNSName)
1724 ip = san.get_values_for_type(x509.IPAddress)
1725 dirname = san.get_values_for_type(x509.DirectoryName)
1726 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001727 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001728 assert [u"cryptography.io"] == dns
1729 assert [
1730 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001731 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001732 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001733 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001734 ),
1735 ])
1736 ] == dirname
1737 assert [
1738 ipaddress.ip_address(u"127.0.0.1"),
1739 ipaddress.ip_address(u"ff::")
1740 ] == ip
1741
1742 def test_invalid_rfc822name(self, backend):
1743 cert = _load_cert(
1744 os.path.join(
1745 "x509", "custom", "san_rfc822_names.pem"
1746 ),
1747 x509.load_pem_x509_certificate,
1748 backend
1749 )
1750 with pytest.raises(ValueError) as exc:
1751 cert.extensions
1752
1753 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001754
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001755 def test_other_name(self, backend):
1756 cert = _load_cert(
1757 os.path.join(
1758 "x509", "custom", "san_other_name.pem"
1759 ),
1760 x509.load_pem_x509_certificate,
1761 backend
1762 )
1763
1764 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001765 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001766 )
1767 assert ext is not None
1768 assert ext.critical is False
1769
Joshua Taubererd2afad32015-07-06 22:37:53 +00001770 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1771 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001772 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001773 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001774
1775 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001776 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001777
Paul Kehrer94c69602015-05-02 19:29:40 -05001778
1779@pytest.mark.requires_backend_interface(interface=RSABackend)
1780@pytest.mark.requires_backend_interface(interface=X509Backend)
1781class TestExtendedKeyUsageExtension(object):
1782 def test_eku(self, backend):
1783 cert = _load_cert(
1784 os.path.join(
1785 "x509", "custom", "extended_key_usage.pem"
1786 ),
1787 x509.load_pem_x509_certificate,
1788 backend
1789 )
1790 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001791 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001792 )
1793 assert ext is not None
1794 assert ext.critical is False
1795
1796 assert [
1797 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1798 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1799 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1800 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1801 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1802 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1803 x509.ObjectIdentifier("2.5.29.37.0"),
1804 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1805 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001806
1807
1808class TestAccessDescription(object):
1809 def test_invalid_access_method(self):
Paul Kehrerf506bca2015-05-02 22:31:47 -05001810 with pytest.raises(ValueError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001811 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1812
1813 def test_invalid_access_location(self):
1814 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001815 x509.AccessDescription(
1816 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1817 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001818
1819 def test_repr(self):
1820 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001821 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001822 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1823 )
1824 assert repr(ad) == (
1825 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1826 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1827 "(value=http://ocsp.domain.com)>)>"
1828 )
1829
1830 def test_eq(self):
1831 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001832 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001833 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1834 )
1835 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001836 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001837 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1838 )
1839 assert ad == ad2
1840
1841 def test_ne(self):
1842 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001843 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001844 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1845 )
1846 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001847 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001848 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1849 )
1850 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001851 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001852 x509.UniformResourceIdentifier(u"http://notthesame")
1853 )
1854 assert ad != ad2
1855 assert ad != ad3
1856 assert ad != object()
1857
1858
1859class TestAuthorityInformationAccess(object):
1860 def test_invalid_descriptions(self):
1861 with pytest.raises(TypeError):
1862 x509.AuthorityInformationAccess(["notanAccessDescription"])
1863
1864 def test_iter_len(self):
1865 aia = x509.AuthorityInformationAccess([
1866 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001867 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001868 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1869 ),
1870 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001871 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001872 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1873 )
1874 ])
1875 assert len(aia) == 2
1876 assert list(aia) == [
1877 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001878 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001879 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1880 ),
1881 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001882 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001883 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1884 )
1885 ]
1886
1887 def test_repr(self):
1888 aia = x509.AuthorityInformationAccess([
1889 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001890 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001891 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1892 ),
1893 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001894 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001895 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1896 )
1897 ])
1898 assert repr(aia) == (
1899 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1900 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1901 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1902 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1903 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1904 "fier(value=http://domain.com/ca.crt)>)>])>"
1905 )
1906
1907 def test_eq(self):
1908 aia = x509.AuthorityInformationAccess([
1909 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001910 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001911 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1912 ),
1913 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001914 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001915 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1916 )
1917 ])
1918 aia2 = x509.AuthorityInformationAccess([
1919 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001920 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001921 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1922 ),
1923 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001924 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001925 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1926 )
1927 ])
1928 assert aia == aia2
1929
1930 def test_ne(self):
1931 aia = x509.AuthorityInformationAccess([
1932 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001933 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001934 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1935 ),
1936 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001937 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001938 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1939 )
1940 ])
1941 aia2 = x509.AuthorityInformationAccess([
1942 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001943 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001944 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1945 ),
1946 ])
1947
1948 assert aia != aia2
1949 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001950
1951
1952@pytest.mark.requires_backend_interface(interface=RSABackend)
1953@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001954class TestAuthorityInformationAccessExtension(object):
1955 def test_aia_ocsp_ca_issuers(self, backend):
1956 cert = _load_cert(
1957 os.path.join("x509", "cryptography.io.pem"),
1958 x509.load_pem_x509_certificate,
1959 backend
1960 )
1961 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001962 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001963 )
1964 assert ext is not None
1965 assert ext.critical is False
1966
1967 assert ext.value == x509.AuthorityInformationAccess([
1968 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001969 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001970 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
1971 ),
1972 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001973 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05001974 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
1975 ),
1976 ])
1977
1978 def test_aia_multiple_ocsp_ca_issuers(self, backend):
1979 cert = _load_cert(
1980 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
1981 x509.load_pem_x509_certificate,
1982 backend
1983 )
1984 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001985 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001986 )
1987 assert ext is not None
1988 assert ext.critical is False
1989
1990 assert ext.value == x509.AuthorityInformationAccess([
1991 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001992 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001993 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1994 ),
1995 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001996 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001997 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
1998 ),
1999 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002000 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002001 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002002 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2003 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002004 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002005 ]))
2006 ),
2007 ])
2008
2009 def test_aia_ocsp_only(self, backend):
2010 cert = _load_cert(
2011 os.path.join("x509", "custom", "aia_ocsp.pem"),
2012 x509.load_pem_x509_certificate,
2013 backend
2014 )
2015 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002016 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002017 )
2018 assert ext is not None
2019 assert ext.critical is False
2020
2021 assert ext.value == x509.AuthorityInformationAccess([
2022 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002023 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002024 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2025 ),
2026 ])
2027
2028 def test_aia_ca_issuers_only(self, backend):
2029 cert = _load_cert(
2030 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2031 x509.load_pem_x509_certificate,
2032 backend
2033 )
2034 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002035 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002036 )
2037 assert ext is not None
2038 assert ext.critical is False
2039
2040 assert ext.value == x509.AuthorityInformationAccess([
2041 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002042 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002043 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002044 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2045 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002046 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002047 ]))
2048 ),
2049 ])
2050
2051
2052@pytest.mark.requires_backend_interface(interface=RSABackend)
2053@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002054class TestAuthorityKeyIdentifierExtension(object):
2055 def test_aki_keyid(self, backend):
2056 cert = _load_cert(
2057 os.path.join(
2058 "x509", "cryptography.io.pem"
2059 ),
2060 x509.load_pem_x509_certificate,
2061 backend
2062 )
2063 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002064 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002065 )
2066 assert ext is not None
2067 assert ext.critical is False
2068
2069 assert ext.value.key_identifier == (
2070 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2071 )
2072 assert ext.value.authority_cert_issuer is None
2073 assert ext.value.authority_cert_serial_number is None
2074
2075 def test_aki_all_fields(self, backend):
2076 cert = _load_cert(
2077 os.path.join(
2078 "x509", "custom", "authority_key_identifier.pem"
2079 ),
2080 x509.load_pem_x509_certificate,
2081 backend
2082 )
2083 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002084 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002085 )
2086 assert ext is not None
2087 assert ext.critical is False
2088
2089 assert ext.value.key_identifier == (
2090 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2091 )
2092 assert ext.value.authority_cert_issuer == [
2093 x509.DirectoryName(
2094 x509.Name([
2095 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002096 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002097 ),
2098 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002099 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002100 )
2101 ])
2102 )
2103 ]
2104 assert ext.value.authority_cert_serial_number == 3
2105
2106 def test_aki_no_keyid(self, backend):
2107 cert = _load_cert(
2108 os.path.join(
2109 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2110 ),
2111 x509.load_pem_x509_certificate,
2112 backend
2113 )
2114 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002115 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002116 )
2117 assert ext is not None
2118 assert ext.critical is False
2119
2120 assert ext.value.key_identifier is None
2121 assert ext.value.authority_cert_issuer == [
2122 x509.DirectoryName(
2123 x509.Name([
2124 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002125 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002126 ),
2127 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002128 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002129 )
2130 ])
2131 )
2132 ]
2133 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002134
Paul Kehrer253929a2015-08-05 17:30:39 +01002135 def test_from_certificate(self, backend):
2136 issuer_cert = _load_cert(
2137 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2138 x509.load_pem_x509_certificate,
2139 backend
2140 )
2141 cert = _load_cert(
2142 os.path.join("x509", "cryptography.io.pem"),
2143 x509.load_pem_x509_certificate,
2144 backend
2145 )
2146 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002147 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002148 )
2149 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2150 issuer_cert.public_key()
2151 )
2152 assert ext.value == aki
2153
Paul Kehrer5a485522015-05-06 00:29:12 -05002154
Paul Kehrere0017be2015-05-17 20:39:40 -06002155class TestNameConstraints(object):
2156 def test_ipaddress_wrong_type(self):
2157 with pytest.raises(TypeError):
2158 x509.NameConstraints(
2159 permitted_subtrees=[
2160 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2161 ],
2162 excluded_subtrees=None
2163 )
2164
2165 with pytest.raises(TypeError):
2166 x509.NameConstraints(
2167 permitted_subtrees=None,
2168 excluded_subtrees=[
2169 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2170 ]
2171 )
2172
2173 def test_ipaddress_allowed_type(self):
2174 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2175 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2176 nc = x509.NameConstraints(
2177 permitted_subtrees=permitted,
2178 excluded_subtrees=excluded
2179 )
2180 assert nc.permitted_subtrees == permitted
2181 assert nc.excluded_subtrees == excluded
2182
2183 def test_invalid_permitted_subtrees(self):
2184 with pytest.raises(TypeError):
2185 x509.NameConstraints("badpermitted", None)
2186
2187 def test_invalid_excluded_subtrees(self):
2188 with pytest.raises(TypeError):
2189 x509.NameConstraints(None, "badexcluded")
2190
2191 def test_no_subtrees(self):
2192 with pytest.raises(ValueError):
2193 x509.NameConstraints(None, None)
2194
2195 def test_permitted_none(self):
2196 excluded = [x509.DNSName(u"name.local")]
2197 nc = x509.NameConstraints(
2198 permitted_subtrees=None, excluded_subtrees=excluded
2199 )
2200 assert nc.permitted_subtrees is None
2201 assert nc.excluded_subtrees is not None
2202
2203 def test_excluded_none(self):
2204 permitted = [x509.DNSName(u"name.local")]
2205 nc = x509.NameConstraints(
2206 permitted_subtrees=permitted, excluded_subtrees=None
2207 )
2208 assert nc.permitted_subtrees is not None
2209 assert nc.excluded_subtrees is None
2210
2211 def test_repr(self):
2212 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2213 nc = x509.NameConstraints(
2214 permitted_subtrees=permitted,
2215 excluded_subtrees=None
2216 )
2217 assert repr(nc) == (
2218 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2219 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2220 )
2221
Paul Kehrer31894282015-06-21 21:46:41 -05002222 def test_eq(self):
2223 nc = x509.NameConstraints(
2224 permitted_subtrees=[x509.DNSName(u"name.local")],
2225 excluded_subtrees=[x509.DNSName(u"name2.local")]
2226 )
2227 nc2 = x509.NameConstraints(
2228 permitted_subtrees=[x509.DNSName(u"name.local")],
2229 excluded_subtrees=[x509.DNSName(u"name2.local")]
2230 )
2231 assert nc == nc2
2232
2233 def test_ne(self):
2234 nc = x509.NameConstraints(
2235 permitted_subtrees=[x509.DNSName(u"name.local")],
2236 excluded_subtrees=[x509.DNSName(u"name2.local")]
2237 )
2238 nc2 = x509.NameConstraints(
2239 permitted_subtrees=[x509.DNSName(u"name.local")],
2240 excluded_subtrees=None
2241 )
2242 nc3 = x509.NameConstraints(
2243 permitted_subtrees=None,
2244 excluded_subtrees=[x509.DNSName(u"name2.local")]
2245 )
2246
2247 assert nc != nc2
2248 assert nc != nc3
2249 assert nc != object()
2250
Paul Kehrere0017be2015-05-17 20:39:40 -06002251
Paul Kehrer870d7e82015-06-21 22:20:44 -05002252@pytest.mark.requires_backend_interface(interface=RSABackend)
2253@pytest.mark.requires_backend_interface(interface=X509Backend)
2254class TestNameConstraintsExtension(object):
2255 def test_permitted_excluded(self, backend):
2256 cert = _load_cert(
2257 os.path.join(
2258 "x509", "custom", "nc_permitted_excluded_2.pem"
2259 ),
2260 x509.load_pem_x509_certificate,
2261 backend
2262 )
2263 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002264 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002265 ).value
2266 assert nc == x509.NameConstraints(
2267 permitted_subtrees=[
2268 x509.DNSName(u"zombo.local"),
2269 ],
2270 excluded_subtrees=[
2271 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002272 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002273 ]))
2274 ]
2275 )
2276
2277 def test_permitted(self, backend):
2278 cert = _load_cert(
2279 os.path.join(
2280 "x509", "custom", "nc_permitted_2.pem"
2281 ),
2282 x509.load_pem_x509_certificate,
2283 backend
2284 )
2285 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002286 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002287 ).value
2288 assert nc == x509.NameConstraints(
2289 permitted_subtrees=[
2290 x509.DNSName(u"zombo.local"),
2291 ],
2292 excluded_subtrees=None
2293 )
2294
Paul Kehrer42376832015-07-01 18:10:32 -05002295 def test_permitted_with_leading_period(self, backend):
2296 cert = _load_cert(
2297 os.path.join(
2298 "x509", "custom", "nc_permitted.pem"
2299 ),
2300 x509.load_pem_x509_certificate,
2301 backend
2302 )
2303 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002304 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002305 ).value
2306 assert nc == x509.NameConstraints(
2307 permitted_subtrees=[
2308 x509.DNSName(u".cryptography.io"),
2309 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2310 ],
2311 excluded_subtrees=None
2312 )
2313
2314 def test_excluded_with_leading_period(self, backend):
2315 cert = _load_cert(
2316 os.path.join(
2317 "x509", "custom", "nc_excluded.pem"
2318 ),
2319 x509.load_pem_x509_certificate,
2320 backend
2321 )
2322 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002323 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002324 ).value
2325 assert nc == x509.NameConstraints(
2326 permitted_subtrees=None,
2327 excluded_subtrees=[
2328 x509.DNSName(u".cryptography.io"),
2329 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2330 ]
2331 )
2332
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002333 def test_permitted_excluded_with_ips(self, backend):
2334 cert = _load_cert(
2335 os.path.join(
2336 "x509", "custom", "nc_permitted_excluded.pem"
2337 ),
2338 x509.load_pem_x509_certificate,
2339 backend
2340 )
2341 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002342 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002343 ).value
2344 assert nc == x509.NameConstraints(
2345 permitted_subtrees=[
2346 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2347 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2348 ],
2349 excluded_subtrees=[
2350 x509.DNSName(u".domain.com"),
2351 x509.UniformResourceIdentifier(u"http://test.local"),
2352 ]
2353 )
2354
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002355 def test_single_ip_netmask(self, backend):
2356 cert = _load_cert(
2357 os.path.join(
2358 "x509", "custom", "nc_single_ip_netmask.pem"
2359 ),
2360 x509.load_pem_x509_certificate,
2361 backend
2362 )
2363 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002364 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002365 ).value
2366 assert nc == x509.NameConstraints(
2367 permitted_subtrees=[
2368 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2369 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2370 ],
2371 excluded_subtrees=None
2372 )
2373
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002374 def test_invalid_netmask(self, backend):
2375 cert = _load_cert(
2376 os.path.join(
2377 "x509", "custom", "nc_invalid_ip_netmask.pem"
2378 ),
2379 x509.load_pem_x509_certificate,
2380 backend
2381 )
2382 with pytest.raises(ValueError):
2383 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002384 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002385 )
2386
Paul Kehrer870d7e82015-06-21 22:20:44 -05002387
Paul Kehrer5a485522015-05-06 00:29:12 -05002388class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002389 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002390 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002391 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002392
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002393 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002394 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002395 x509.DistributionPoint(None, "notname", None, None)
2396
2397 def test_distribution_point_full_and_relative_not_none(self):
2398 with pytest.raises(ValueError):
2399 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002400
2401 def test_crl_issuer_not_general_names(self):
2402 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002403 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002404
2405 def test_reason_not_reasonflags(self):
2406 with pytest.raises(TypeError):
2407 x509.DistributionPoint(
2408 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002409 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002410 frozenset(["notreasonflags"]),
2411 None
2412 )
2413
2414 def test_reason_not_frozenset(self):
2415 with pytest.raises(TypeError):
2416 x509.DistributionPoint(
2417 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2418 None,
2419 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002420 None
2421 )
2422
2423 def test_disallowed_reasons(self):
2424 with pytest.raises(ValueError):
2425 x509.DistributionPoint(
2426 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2427 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002428 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002429 None
2430 )
2431
2432 with pytest.raises(ValueError):
2433 x509.DistributionPoint(
2434 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2435 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002436 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002437 None
2438 )
2439
2440 def test_reason_only(self):
2441 with pytest.raises(ValueError):
2442 x509.DistributionPoint(
2443 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002444 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002445 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002446 None
2447 )
2448
2449 def test_eq(self):
2450 dp = x509.DistributionPoint(
2451 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002452 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002453 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002454 [
2455 x509.DirectoryName(
2456 x509.Name([
2457 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002458 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002459 )
2460 ])
2461 )
2462 ],
2463 )
2464 dp2 = x509.DistributionPoint(
2465 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002466 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002467 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002468 [
2469 x509.DirectoryName(
2470 x509.Name([
2471 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002472 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002473 )
2474 ])
2475 )
2476 ],
2477 )
2478 assert dp == dp2
2479
2480 def test_ne(self):
2481 dp = x509.DistributionPoint(
2482 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002483 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002484 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002485 [
2486 x509.DirectoryName(
2487 x509.Name([
2488 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002489 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002490 )
2491 ])
2492 )
2493 ],
2494 )
2495 dp2 = x509.DistributionPoint(
2496 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2497 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002498 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002499 None
2500 )
2501 assert dp != dp2
2502 assert dp != object()
2503
2504 def test_repr(self):
2505 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002506 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002507 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002508 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002509 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002510 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002511 [
2512 x509.DirectoryName(
2513 x509.Name([
2514 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002515 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002516 )
2517 ])
2518 )
2519 ],
2520 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002521 if six.PY3:
2522 assert repr(dp) == (
2523 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2524 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002525 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2526 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2527 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2528 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002529 )
2530 else:
2531 assert repr(dp) == (
2532 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2533 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002534 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2535 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2536 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2537 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002538 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002539
2540
2541class TestCRLDistributionPoints(object):
2542 def test_invalid_distribution_points(self):
2543 with pytest.raises(TypeError):
2544 x509.CRLDistributionPoints(["notadistributionpoint"])
2545
2546 def test_iter_len(self):
2547 cdp = x509.CRLDistributionPoints([
2548 x509.DistributionPoint(
2549 [x509.UniformResourceIdentifier(u"http://domain")],
2550 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002551 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002552 None
2553 ),
2554 x509.DistributionPoint(
2555 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002556 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002557 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002558 x509.ReasonFlags.key_compromise,
2559 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002560 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002561 None
2562 ),
2563 ])
2564 assert len(cdp) == 2
2565 assert list(cdp) == [
2566 x509.DistributionPoint(
2567 [x509.UniformResourceIdentifier(u"http://domain")],
2568 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002569 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002570 None
2571 ),
2572 x509.DistributionPoint(
2573 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002574 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002575 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002576 x509.ReasonFlags.key_compromise,
2577 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002578 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002579 None
2580 ),
2581 ]
2582
2583 def test_repr(self):
2584 cdp = x509.CRLDistributionPoints([
2585 x509.DistributionPoint(
2586 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002587 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002588 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002589 None
2590 ),
2591 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002592 if six.PY3:
2593 assert repr(cdp) == (
2594 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2595 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2596 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2597 "romise'>}), crl_issuer=None)>])>"
2598 )
2599 else:
2600 assert repr(cdp) == (
2601 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2602 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2603 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2604 "romise'>]), crl_issuer=None)>])>"
2605 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002606
2607 def test_eq(self):
2608 cdp = x509.CRLDistributionPoints([
2609 x509.DistributionPoint(
2610 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002611 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002612 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002613 x509.ReasonFlags.key_compromise,
2614 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002615 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002616 [x509.UniformResourceIdentifier(u"uri://thing")],
2617 ),
2618 ])
2619 cdp2 = x509.CRLDistributionPoints([
2620 x509.DistributionPoint(
2621 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002622 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002623 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002624 x509.ReasonFlags.key_compromise,
2625 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002626 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002627 [x509.UniformResourceIdentifier(u"uri://thing")],
2628 ),
2629 ])
2630 assert cdp == cdp2
2631
2632 def test_ne(self):
2633 cdp = x509.CRLDistributionPoints([
2634 x509.DistributionPoint(
2635 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002636 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002637 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002638 x509.ReasonFlags.key_compromise,
2639 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002640 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002641 [x509.UniformResourceIdentifier(u"uri://thing")],
2642 ),
2643 ])
2644 cdp2 = x509.CRLDistributionPoints([
2645 x509.DistributionPoint(
2646 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002647 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002648 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002649 x509.ReasonFlags.key_compromise,
2650 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002651 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002652 [x509.UniformResourceIdentifier(u"uri://thing")],
2653 ),
2654 ])
2655 cdp3 = x509.CRLDistributionPoints([
2656 x509.DistributionPoint(
2657 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002658 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002659 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002660 [x509.UniformResourceIdentifier(u"uri://thing")],
2661 ),
2662 ])
2663 cdp4 = x509.CRLDistributionPoints([
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 [x509.UniformResourceIdentifier(u"uri://thing2")],
2672 ),
2673 ])
2674 assert cdp != cdp2
2675 assert cdp != cdp3
2676 assert cdp != cdp4
2677 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002678
2679
2680@pytest.mark.requires_backend_interface(interface=RSABackend)
2681@pytest.mark.requires_backend_interface(interface=X509Backend)
2682class TestCRLDistributionPointsExtension(object):
2683 def test_fullname_and_crl_issuer(self, backend):
2684 cert = _load_cert(
2685 os.path.join(
2686 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2687 ),
2688 x509.load_der_x509_certificate,
2689 backend
2690 )
2691
2692 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002693 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002694 ).value
2695
2696 assert cdps == x509.CRLDistributionPoints([
2697 x509.DistributionPoint(
2698 full_name=[x509.DirectoryName(
2699 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002700 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002701 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002702 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002703 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002704 ),
2705 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002706 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002707 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002708 ),
2709 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002710 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002711 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002712 ),
2713 ])
2714 )],
2715 relative_name=None,
2716 reasons=None,
2717 crl_issuer=[x509.DirectoryName(
2718 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002719 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002720 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002721 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002722 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002723 ),
2724 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002725 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002726 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002727 ),
2728 ])
2729 )],
2730 )
2731 ])
2732
2733 def test_relativename_and_crl_issuer(self, backend):
2734 cert = _load_cert(
2735 os.path.join(
2736 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2737 ),
2738 x509.load_der_x509_certificate,
2739 backend
2740 )
2741
2742 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002743 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002744 ).value
2745
2746 assert cdps == x509.CRLDistributionPoints([
2747 x509.DistributionPoint(
2748 full_name=None,
2749 relative_name=x509.Name([
2750 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002751 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002752 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002753 ),
2754 ]),
2755 reasons=None,
2756 crl_issuer=[x509.DirectoryName(
2757 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002758 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002759 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002760 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002761 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002762 ),
2763 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002764 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002765 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002766 ),
2767 ])
2768 )],
2769 )
2770 ])
2771
2772 def test_fullname_crl_issuer_reasons(self, backend):
2773 cert = _load_cert(
2774 os.path.join(
2775 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2776 ),
2777 x509.load_pem_x509_certificate,
2778 backend
2779 )
2780
2781 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002782 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002783 ).value
2784
2785 assert cdps == x509.CRLDistributionPoints([
2786 x509.DistributionPoint(
2787 full_name=[x509.UniformResourceIdentifier(
2788 u"http://myhost.com/myca.crl"
2789 )],
2790 relative_name=None,
2791 reasons=frozenset([
2792 x509.ReasonFlags.key_compromise,
2793 x509.ReasonFlags.ca_compromise
2794 ]),
2795 crl_issuer=[x509.DirectoryName(
2796 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002797 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002798 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002799 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002800 ),
2801 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002802 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002803 ),
2804 ])
2805 )],
2806 )
2807 ])
2808
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002809 def test_all_reasons(self, backend):
2810 cert = _load_cert(
2811 os.path.join(
2812 "x509", "custom", "cdp_all_reasons.pem"
2813 ),
2814 x509.load_pem_x509_certificate,
2815 backend
2816 )
2817
2818 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002819 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002820 ).value
2821
2822 assert cdps == x509.CRLDistributionPoints([
2823 x509.DistributionPoint(
2824 full_name=[x509.UniformResourceIdentifier(
2825 u"http://domain.com/some.crl"
2826 )],
2827 relative_name=None,
2828 reasons=frozenset([
2829 x509.ReasonFlags.key_compromise,
2830 x509.ReasonFlags.ca_compromise,
2831 x509.ReasonFlags.affiliation_changed,
2832 x509.ReasonFlags.superseded,
2833 x509.ReasonFlags.privilege_withdrawn,
2834 x509.ReasonFlags.cessation_of_operation,
2835 x509.ReasonFlags.aa_compromise,
2836 x509.ReasonFlags.certificate_hold,
2837 ]),
2838 crl_issuer=None
2839 )
2840 ])
2841
2842 def test_single_reason(self, backend):
2843 cert = _load_cert(
2844 os.path.join(
2845 "x509", "custom", "cdp_reason_aa_compromise.pem"
2846 ),
2847 x509.load_pem_x509_certificate,
2848 backend
2849 )
2850
2851 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002852 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002853 ).value
2854
2855 assert cdps == x509.CRLDistributionPoints([
2856 x509.DistributionPoint(
2857 full_name=[x509.UniformResourceIdentifier(
2858 u"http://domain.com/some.crl"
2859 )],
2860 relative_name=None,
2861 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2862 crl_issuer=None
2863 )
2864 ])
2865
Paul Kehrer9a10d592015-05-10 14:55:51 -05002866 def test_crl_issuer_only(self, backend):
2867 cert = _load_cert(
2868 os.path.join(
2869 "x509", "custom", "cdp_crl_issuer.pem"
2870 ),
2871 x509.load_pem_x509_certificate,
2872 backend
2873 )
2874
2875 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002876 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002877 ).value
2878
2879 assert cdps == x509.CRLDistributionPoints([
2880 x509.DistributionPoint(
2881 full_name=None,
2882 relative_name=None,
2883 reasons=None,
2884 crl_issuer=[x509.DirectoryName(
2885 x509.Name([
2886 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002887 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002888 ),
2889 ])
2890 )],
2891 )
2892 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002893
2894
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002895@pytest.mark.requires_backend_interface(interface=RSABackend)
2896@pytest.mark.requires_backend_interface(interface=X509Backend)
2897class TestOCSPNoCheckExtension(object):
2898 def test_nocheck(self, backend):
2899 cert = _load_cert(
2900 os.path.join(
2901 "x509", "custom", "ocsp_nocheck.pem"
2902 ),
2903 x509.load_pem_x509_certificate,
2904 backend
2905 )
2906 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002907 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002908 )
2909 assert isinstance(ext.value, x509.OCSPNoCheck)
2910
2911
Paul Kehrer16fae762015-05-01 23:14:20 -05002912class TestInhibitAnyPolicy(object):
2913 def test_not_int(self):
2914 with pytest.raises(TypeError):
2915 x509.InhibitAnyPolicy("notint")
2916
2917 def test_negative_int(self):
2918 with pytest.raises(ValueError):
2919 x509.InhibitAnyPolicy(-1)
2920
2921 def test_repr(self):
2922 iap = x509.InhibitAnyPolicy(0)
2923 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2924
2925 def test_eq(self):
2926 iap = x509.InhibitAnyPolicy(1)
2927 iap2 = x509.InhibitAnyPolicy(1)
2928 assert iap == iap2
2929
2930 def test_ne(self):
2931 iap = x509.InhibitAnyPolicy(1)
2932 iap2 = x509.InhibitAnyPolicy(4)
2933 assert iap != iap2
2934 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06002935
2936
2937@pytest.mark.requires_backend_interface(interface=RSABackend)
2938@pytest.mark.requires_backend_interface(interface=X509Backend)
2939class TestInhibitAnyPolicyExtension(object):
2940 def test_nocheck(self, backend):
2941 cert = _load_cert(
2942 os.path.join(
2943 "x509", "custom", "inhibit_any_policy_5.pem"
2944 ),
2945 x509.load_pem_x509_certificate,
2946 backend
2947 )
2948 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002949 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06002950 ).value
2951 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01002952
2953
2954@pytest.mark.requires_backend_interface(interface=RSABackend)
2955@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01002956class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01002957 def test_invalid_certificate_policies_data(self, backend):
2958 cert = _load_cert(
2959 os.path.join(
2960 "x509", "custom", "cp_invalid.pem"
2961 ),
2962 x509.load_pem_x509_certificate,
2963 backend
2964 )
2965 with pytest.raises(ValueError):
2966 cert.extensions