blob: 1bc14620bcde26a3e59ea8b2b6649272114265d4 [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 Queenecae9812015-08-12 05:00:32 +0100835 def test_no_extensions_get_for_class(self, backend):
836 cert = _load_cert(
837 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100838 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100839 ),
840 x509.load_pem_x509_certificate,
841 backend
842 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100843 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100844 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100845 exts.get_extension_for_class(x509.IssuerAlternativeName)
846 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100847
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100848 def test_one_extension_get_for_class(self, backend):
849 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100850 os.path.join(
851 "x509", "custom", "basic_constraints_not_critical.pem"
852 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100853 x509.load_pem_x509_certificate,
854 backend
855 )
856 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
857 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100858 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500859
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100860
Paul Kehrerfa56a232015-03-17 13:14:03 -0500861@pytest.mark.requires_backend_interface(interface=RSABackend)
862@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500863class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500864 def test_ca_true_pathlen_6(self, backend):
865 cert = _load_cert(
866 os.path.join(
867 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
868 ),
869 x509.load_der_x509_certificate,
870 backend
871 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100872 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500873 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500874 )
875 assert ext is not None
876 assert ext.critical is True
877 assert ext.value.ca is True
878 assert ext.value.path_length == 6
879
880 def test_path_length_zero(self, backend):
881 cert = _load_cert(
882 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
883 x509.load_pem_x509_certificate,
884 backend
885 )
886 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500887 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500888 )
889 assert ext is not None
890 assert ext.critical is True
891 assert ext.value.ca is True
892 assert ext.value.path_length == 0
893
894 def test_ca_true_no_pathlen(self, backend):
895 cert = _load_cert(
896 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
897 x509.load_der_x509_certificate,
898 backend
899 )
900 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500901 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500902 )
903 assert ext is not None
904 assert ext.critical is True
905 assert ext.value.ca is True
906 assert ext.value.path_length is None
907
908 def test_ca_false(self, backend):
909 cert = _load_cert(
910 os.path.join("x509", "cryptography.io.pem"),
911 x509.load_pem_x509_certificate,
912 backend
913 )
914 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500915 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500916 )
917 assert ext is not None
918 assert ext.critical is True
919 assert ext.value.ca is False
920 assert ext.value.path_length is None
921
922 def test_no_basic_constraints(self, backend):
923 cert = _load_cert(
924 os.path.join(
925 "x509",
926 "PKITS_data",
927 "certs",
928 "ValidCertificatePathTest1EE.crt"
929 ),
930 x509.load_der_x509_certificate,
931 backend
932 )
933 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500934 cert.extensions.get_extension_for_oid(
935 ExtensionOID.BASIC_CONSTRAINTS
936 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500937
938 def test_basic_constraint_not_critical(self, backend):
939 cert = _load_cert(
940 os.path.join(
941 "x509", "custom", "basic_constraints_not_critical.pem"
942 ),
943 x509.load_pem_x509_certificate,
944 backend
945 )
946 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500947 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500948 )
949 assert ext is not None
950 assert ext.critical is False
951 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500952
953
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500954class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100955 @pytest.mark.requires_backend_interface(interface=RSABackend)
956 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500957 def test_subject_key_identifier(self, backend):
958 cert = _load_cert(
959 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
960 x509.load_der_x509_certificate,
961 backend
962 )
963 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500964 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500965 )
966 ski = ext.value
967 assert ext is not None
968 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500969 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500970 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500971 )
972
Paul Kehrerf22f6122015-08-05 12:57:13 +0100973 @pytest.mark.requires_backend_interface(interface=RSABackend)
974 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500975 def test_no_subject_key_identifier(self, backend):
976 cert = _load_cert(
977 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
978 x509.load_pem_x509_certificate,
979 backend
980 )
981 with pytest.raises(x509.ExtensionNotFound):
982 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500983 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500984 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500985
Paul Kehrerf22f6122015-08-05 12:57:13 +0100986 @pytest.mark.requires_backend_interface(interface=RSABackend)
987 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100988 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100989 cert = _load_cert(
990 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
991 x509.load_der_x509_certificate,
992 backend
993 )
994 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500995 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +0100996 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100997 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +0100998 cert.public_key()
999 )
1000 assert ext.value == ski
1001
1002 @pytest.mark.requires_backend_interface(interface=DSABackend)
1003 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001004 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001005 cert = _load_cert(
1006 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1007 x509.load_pem_x509_certificate,
1008 backend
1009 )
1010
1011 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001012 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001013 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001014 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001015 cert.public_key()
1016 )
1017 assert ext.value == ski
1018
1019 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1020 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001021 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001022 _skip_curve_unsupported(backend, ec.SECP384R1())
1023 cert = _load_cert(
1024 os.path.join("x509", "ecdsa_root.pem"),
1025 x509.load_pem_x509_certificate,
1026 backend
1027 )
1028
1029 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001030 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001031 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001032 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001033 cert.public_key()
1034 )
1035 assert ext.value == ski
1036
Paul Kehrer5508ee22015-04-02 19:31:03 -05001037
1038@pytest.mark.requires_backend_interface(interface=RSABackend)
1039@pytest.mark.requires_backend_interface(interface=X509Backend)
1040class TestKeyUsageExtension(object):
1041 def test_no_key_usage(self, backend):
1042 cert = _load_cert(
1043 os.path.join("x509", "verisign_md2_root.pem"),
1044 x509.load_pem_x509_certificate,
1045 backend
1046 )
1047 ext = cert.extensions
1048 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001049 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001050
Paul Kehrerd44e4132015-08-10 19:13:13 -05001051 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001052
1053 def test_all_purposes(self, backend):
1054 cert = _load_cert(
1055 os.path.join(
1056 "x509", "custom", "all_key_usages.pem"
1057 ),
1058 x509.load_pem_x509_certificate,
1059 backend
1060 )
1061 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001062 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001063 assert ext is not None
1064
1065 ku = ext.value
1066 assert ku.digital_signature is True
1067 assert ku.content_commitment is True
1068 assert ku.key_encipherment is True
1069 assert ku.data_encipherment is True
1070 assert ku.key_agreement is True
1071 assert ku.key_cert_sign is True
1072 assert ku.crl_sign is True
1073 assert ku.encipher_only is True
1074 assert ku.decipher_only is True
1075
1076 def test_key_cert_sign_crl_sign(self, backend):
1077 cert = _load_cert(
1078 os.path.join(
1079 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1080 ),
1081 x509.load_der_x509_certificate,
1082 backend
1083 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001084 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001085 assert ext is not None
1086 assert ext.critical is True
1087
1088 ku = ext.value
1089 assert ku.digital_signature is False
1090 assert ku.content_commitment is False
1091 assert ku.key_encipherment is False
1092 assert ku.data_encipherment is False
1093 assert ku.key_agreement is False
1094 assert ku.key_cert_sign is True
1095 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001096
1097
1098@pytest.mark.parametrize(
1099 "name", [
1100 x509.RFC822Name,
1101 x509.DNSName,
1102 x509.UniformResourceIdentifier
1103 ]
1104)
1105class TestTextGeneralNames(object):
1106 def test_not_text(self, name):
1107 with pytest.raises(TypeError):
1108 name(b"notaunicodestring")
1109
1110 with pytest.raises(TypeError):
1111 name(1.3)
1112
1113 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301114 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001115 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1116
1117 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301118 gn = name(u"string")
1119 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001120 assert gn == gn2
1121
1122 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301123 gn = name(u"string")
1124 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001125 assert gn != gn2
1126 assert gn != object()
1127
1128
1129class TestDirectoryName(object):
1130 def test_not_name(self):
1131 with pytest.raises(TypeError):
1132 x509.DirectoryName(b"notaname")
1133
1134 with pytest.raises(TypeError):
1135 x509.DirectoryName(1.3)
1136
1137 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001138 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001139 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001140 if six.PY3:
1141 assert repr(gn) == (
1142 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1143 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1144 ">])>)>"
1145 )
1146 else:
1147 assert repr(gn) == (
1148 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1149 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1150 ")>])>)>"
1151 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001152
1153 def test_eq(self):
1154 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001155 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001156 ])
1157 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001158 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001159 ])
1160 gn = x509.DirectoryName(x509.Name([name]))
1161 gn2 = x509.DirectoryName(x509.Name([name2]))
1162 assert gn == gn2
1163
1164 def test_ne(self):
1165 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001166 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001167 ])
1168 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001169 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001170 ])
1171 gn = x509.DirectoryName(x509.Name([name]))
1172 gn2 = x509.DirectoryName(x509.Name([name2]))
1173 assert gn != gn2
1174 assert gn != object()
1175
1176
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001177class TestRFC822Name(object):
1178 def test_invalid_email(self):
1179 with pytest.raises(ValueError):
1180 x509.RFC822Name(u"Name <email>")
1181
1182 with pytest.raises(ValueError):
1183 x509.RFC822Name(u"")
1184
1185 def test_single_label(self):
1186 gn = x509.RFC822Name(u"administrator")
1187 assert gn.value == u"administrator"
1188
1189 def test_idna(self):
1190 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1191 assert gn.value == u"email@em\xe5\xefl.com"
1192 assert gn._encoded == b"email@xn--eml-vla4c.com"
1193
1194
Paul Kehrere28d6c42015-07-12 14:59:37 -05001195class TestUniformResourceIdentifier(object):
1196 def test_no_parsed_hostname(self):
1197 gn = x509.UniformResourceIdentifier(u"singlelabel")
1198 assert gn.value == u"singlelabel"
1199
1200 def test_with_port(self):
1201 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1202 assert gn.value == u"singlelabel:443/test"
1203
1204 def test_idna_no_port(self):
1205 gn = x509.UniformResourceIdentifier(
1206 u"http://\u043f\u044b\u043a\u0430.cryptography"
1207 )
1208 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1209 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1210
1211 def test_idna_with_port(self):
1212 gn = x509.UniformResourceIdentifier(
1213 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1214 )
1215 assert gn.value == (
1216 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1217 )
1218 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1219
1220 def test_query_and_fragment(self):
1221 gn = x509.UniformResourceIdentifier(
1222 u"ldap://cryptography:90/path?query=true#somedata"
1223 )
1224 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1225
1226
Paul Kehrer31bdf792015-03-25 14:11:00 -05001227class TestRegisteredID(object):
1228 def test_not_oid(self):
1229 with pytest.raises(TypeError):
1230 x509.RegisteredID(b"notanoid")
1231
1232 with pytest.raises(TypeError):
1233 x509.RegisteredID(1.3)
1234
1235 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001236 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001237 assert repr(gn) == (
1238 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1239 "e)>)>"
1240 )
1241
1242 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001243 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1244 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001245 assert gn == gn2
1246
1247 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001248 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001249 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001250 assert gn != gn2
1251 assert gn != object()
1252
1253
1254class TestIPAddress(object):
1255 def test_not_ipaddress(self):
1256 with pytest.raises(TypeError):
1257 x509.IPAddress(b"notanipaddress")
1258
1259 with pytest.raises(TypeError):
1260 x509.IPAddress(1.3)
1261
1262 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301263 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001264 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1265
Eeshan Gargf1234152015-04-29 18:41:00 +05301266 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001267 assert repr(gn2) == "<IPAddress(value=ff::)>"
1268
Paul Kehrereb177932015-05-17 18:33:33 -07001269 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1270 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1271
1272 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1273 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1274
Paul Kehrer31bdf792015-03-25 14:11:00 -05001275 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301276 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1277 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001278 assert gn == gn2
1279
1280 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301281 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1282 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001283 assert gn != gn2
1284 assert gn != object()
1285
1286
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001287class TestOtherName(object):
1288 def test_invalid_args(self):
1289 with pytest.raises(TypeError):
1290 x509.OtherName(b"notanobjectidentifier", b"derdata")
1291
1292 with pytest.raises(TypeError):
1293 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1294
1295 def test_repr(self):
1296 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1297 if six.PY3:
1298 assert repr(gn) == (
1299 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1300 "name=Unknown OID)>, value=b'derdata')>"
1301 )
1302 else:
1303 assert repr(gn) == (
1304 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1305 "name=Unknown OID)>, value='derdata')>"
1306 )
1307
1308 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1309 if six.PY3:
1310 assert repr(gn) == (
1311 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1312 "name=pseudonym)>, value=b'derdata')>"
1313 )
1314 else:
1315 assert repr(gn) == (
1316 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1317 "name=pseudonym)>, value='derdata')>"
1318 )
1319
1320 def test_eq(self):
1321 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1322 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1323 assert gn == gn2
1324
1325 def test_ne(self):
1326 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1327 assert gn != object()
1328
1329 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1330 assert gn != gn2
1331
1332 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1333 assert gn != gn2
1334
1335
Erik Trauschke2dcce902015-05-14 16:12:24 -07001336class TestGeneralNames(object):
1337 def test_get_values_for_type(self):
1338 gns = x509.GeneralNames(
1339 [x509.DNSName(u"cryptography.io")]
1340 )
1341 names = gns.get_values_for_type(x509.DNSName)
1342 assert names == [u"cryptography.io"]
1343
1344 def test_iter_names(self):
1345 gns = x509.GeneralNames([
1346 x509.DNSName(u"cryptography.io"),
1347 x509.DNSName(u"crypto.local"),
1348 ])
1349 assert len(gns) == 2
1350 assert list(gns) == [
1351 x509.DNSName(u"cryptography.io"),
1352 x509.DNSName(u"crypto.local"),
1353 ]
1354
1355 def test_invalid_general_names(self):
1356 with pytest.raises(TypeError):
1357 x509.GeneralNames(
1358 [x509.DNSName(u"cryptography.io"), "invalid"]
1359 )
1360
1361 def test_repr(self):
1362 gns = x509.GeneralNames(
1363 [
1364 x509.DNSName(u"cryptography.io")
1365 ]
1366 )
1367 assert repr(gns) == (
1368 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1369 )
1370
1371 def test_eq(self):
1372 gns = x509.GeneralNames(
1373 [x509.DNSName(u"cryptography.io")]
1374 )
1375 gns2 = x509.GeneralNames(
1376 [x509.DNSName(u"cryptography.io")]
1377 )
1378 assert gns == gns2
1379
1380 def test_ne(self):
1381 gns = x509.GeneralNames(
1382 [x509.DNSName(u"cryptography.io")]
1383 )
1384 gns2 = x509.GeneralNames(
1385 [x509.RFC822Name(u"admin@cryptography.io")]
1386 )
1387 assert gns != gns2
1388 assert gns != object()
1389
1390
Paul Kehrer99125c92015-06-07 18:37:10 -05001391class TestIssuerAlternativeName(object):
1392 def test_get_values_for_type(self):
1393 san = x509.IssuerAlternativeName(
1394 [x509.DNSName(u"cryptography.io")]
1395 )
1396 names = san.get_values_for_type(x509.DNSName)
1397 assert names == [u"cryptography.io"]
1398
1399 def test_iter_names(self):
1400 san = x509.IssuerAlternativeName([
1401 x509.DNSName(u"cryptography.io"),
1402 x509.DNSName(u"crypto.local"),
1403 ])
1404 assert len(san) == 2
1405 assert list(san) == [
1406 x509.DNSName(u"cryptography.io"),
1407 x509.DNSName(u"crypto.local"),
1408 ]
1409
1410 def test_invalid_general_names(self):
1411 with pytest.raises(TypeError):
1412 x509.IssuerAlternativeName(
1413 [x509.DNSName(u"cryptography.io"), "invalid"]
1414 )
1415
1416 def test_repr(self):
1417 san = x509.IssuerAlternativeName(
1418 [
1419 x509.DNSName(u"cryptography.io")
1420 ]
1421 )
1422 assert repr(san) == (
1423 "<IssuerAlternativeName("
1424 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1425 )
1426
1427 def test_eq(self):
1428 san = x509.IssuerAlternativeName(
1429 [x509.DNSName(u"cryptography.io")]
1430 )
1431 san2 = x509.IssuerAlternativeName(
1432 [x509.DNSName(u"cryptography.io")]
1433 )
1434 assert san == san2
1435
1436 def test_ne(self):
1437 san = x509.IssuerAlternativeName(
1438 [x509.DNSName(u"cryptography.io")]
1439 )
1440 san2 = x509.IssuerAlternativeName(
1441 [x509.RFC822Name(u"admin@cryptography.io")]
1442 )
1443 assert san != san2
1444 assert san != object()
1445
1446
Alex Gaynorf1c17672015-06-20 14:20:20 -04001447@pytest.mark.requires_backend_interface(interface=RSABackend)
1448@pytest.mark.requires_backend_interface(interface=X509Backend)
1449class TestRSAIssuerAlternativeNameExtension(object):
1450 def test_uri(self, backend):
1451 cert = _load_cert(
1452 os.path.join("x509", "custom", "ian_uri.pem"),
1453 x509.load_pem_x509_certificate,
1454 backend,
1455 )
1456 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001457 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001458 )
1459 assert list(ext.value) == [
1460 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1461 ]
1462
1463
Paul Kehrer31bdf792015-03-25 14:11:00 -05001464class TestSubjectAlternativeName(object):
1465 def test_get_values_for_type(self):
1466 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301467 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001468 )
1469 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301470 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001471
1472 def test_iter_names(self):
1473 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301474 x509.DNSName(u"cryptography.io"),
1475 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001476 ])
1477 assert len(san) == 2
1478 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301479 x509.DNSName(u"cryptography.io"),
1480 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001481 ]
1482
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001483 def test_invalid_general_names(self):
1484 with pytest.raises(TypeError):
1485 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301486 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001487 )
1488
Paul Kehrer31bdf792015-03-25 14:11:00 -05001489 def test_repr(self):
1490 san = x509.SubjectAlternativeName(
1491 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301492 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001493 ]
1494 )
1495 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001496 "<SubjectAlternativeName("
1497 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001498 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001499
Paul Kehrer58cc3972015-05-13 10:00:41 -05001500 def test_eq(self):
1501 san = x509.SubjectAlternativeName(
1502 [x509.DNSName(u"cryptography.io")]
1503 )
1504 san2 = x509.SubjectAlternativeName(
1505 [x509.DNSName(u"cryptography.io")]
1506 )
1507 assert san == san2
1508
1509 def test_ne(self):
1510 san = x509.SubjectAlternativeName(
1511 [x509.DNSName(u"cryptography.io")]
1512 )
1513 san2 = x509.SubjectAlternativeName(
1514 [x509.RFC822Name(u"admin@cryptography.io")]
1515 )
1516 assert san != san2
1517 assert san != object()
1518
Paul Kehrer40f83382015-04-20 15:00:16 -05001519
1520@pytest.mark.requires_backend_interface(interface=RSABackend)
1521@pytest.mark.requires_backend_interface(interface=X509Backend)
1522class TestRSASubjectAlternativeNameExtension(object):
1523 def test_dns_name(self, backend):
1524 cert = _load_cert(
1525 os.path.join("x509", "cryptography.io.pem"),
1526 x509.load_pem_x509_certificate,
1527 backend
1528 )
1529 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001530 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001531 )
1532 assert ext is not None
1533 assert ext.critical is False
1534
1535 san = ext.value
1536
1537 dns = san.get_values_for_type(x509.DNSName)
1538 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001539
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001540 def test_wildcard_dns_name(self, backend):
1541 cert = _load_cert(
1542 os.path.join("x509", "wildcard_san.pem"),
1543 x509.load_pem_x509_certificate,
1544 backend
1545 )
1546 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001547 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001548 )
1549
1550 dns = ext.value.get_values_for_type(x509.DNSName)
1551 assert dns == [
1552 u'*.langui.sh',
1553 u'langui.sh',
1554 u'*.saseliminator.com',
1555 u'saseliminator.com'
1556 ]
1557
Dominic Chen87bb9572015-10-09 00:23:07 -04001558 def test_san_empty_hostname(self, backend):
1559 cert = _load_cert(
1560 os.path.join(
1561 "x509", "custom", "san_empty_hostname.pem"
1562 ),
1563 x509.load_pem_x509_certificate,
1564 backend
1565 )
1566 san = cert.extensions.get_extension_for_oid(
1567 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1568 )
1569
1570 dns = san.value.get_values_for_type(x509.DNSName)
1571 assert dns == [u'']
1572
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001573 def test_san_wildcard_idna_dns_name(self, backend):
1574 cert = _load_cert(
1575 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1576 x509.load_pem_x509_certificate,
1577 backend
1578 )
1579 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001580 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001581 )
1582
1583 dns = ext.value.get_values_for_type(x509.DNSName)
1584 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1585
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001586 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001587 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001588 os.path.join("x509", "san_x400address.der"),
1589 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001590 backend
1591 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001592 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001593 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001594
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001595 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001596
1597 def test_registered_id(self, backend):
1598 cert = _load_cert(
1599 os.path.join(
1600 "x509", "custom", "san_registered_id.pem"
1601 ),
1602 x509.load_pem_x509_certificate,
1603 backend
1604 )
1605 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001606 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001607 )
1608 assert ext is not None
1609 assert ext.critical is False
1610
1611 san = ext.value
1612 rid = san.get_values_for_type(x509.RegisteredID)
1613 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001614
1615 def test_uri(self, backend):
1616 cert = _load_cert(
1617 os.path.join(
1618 "x509", "custom", "san_uri_with_port.pem"
1619 ),
1620 x509.load_pem_x509_certificate,
1621 backend
1622 )
1623 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001624 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001625 )
1626 assert ext is not None
1627 uri = ext.value.get_values_for_type(
1628 x509.UniformResourceIdentifier
1629 )
1630 assert uri == [
1631 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1632 u"lo",
1633 u"http://someregulardomain.com",
1634 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001635
1636 def test_ipaddress(self, backend):
1637 cert = _load_cert(
1638 os.path.join(
1639 "x509", "custom", "san_ipaddr.pem"
1640 ),
1641 x509.load_pem_x509_certificate,
1642 backend
1643 )
1644 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001645 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001646 )
1647 assert ext is not None
1648 assert ext.critical is False
1649
1650 san = ext.value
1651
1652 ip = san.get_values_for_type(x509.IPAddress)
1653 assert [
1654 ipaddress.ip_address(u"127.0.0.1"),
1655 ipaddress.ip_address(u"ff::")
1656 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001657
1658 def test_dirname(self, backend):
1659 cert = _load_cert(
1660 os.path.join(
1661 "x509", "custom", "san_dirname.pem"
1662 ),
1663 x509.load_pem_x509_certificate,
1664 backend
1665 )
1666 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001667 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001668 )
1669 assert ext is not None
1670 assert ext.critical is False
1671
1672 san = ext.value
1673
1674 dirname = san.get_values_for_type(x509.DirectoryName)
1675 assert [
1676 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001677 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1678 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1679 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001680 ])
1681 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001682
1683 def test_rfc822name(self, backend):
1684 cert = _load_cert(
1685 os.path.join(
1686 "x509", "custom", "san_rfc822_idna.pem"
1687 ),
1688 x509.load_pem_x509_certificate,
1689 backend
1690 )
1691 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001692 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001693 )
1694 assert ext is not None
1695 assert ext.critical is False
1696
1697 san = ext.value
1698
1699 rfc822name = san.get_values_for_type(x509.RFC822Name)
1700 assert [u"email@em\xe5\xefl.com"] == rfc822name
1701
Paul Kehrerb8968812015-05-15 09:01:34 -07001702 def test_idna2003_invalid(self, backend):
1703 cert = _load_cert(
1704 os.path.join(
1705 "x509", "custom", "san_idna2003_dnsname.pem"
1706 ),
1707 x509.load_pem_x509_certificate,
1708 backend
1709 )
1710 with pytest.raises(UnicodeError):
1711 cert.extensions
1712
Paul Kehrere06cab42015-04-30 10:23:33 -05001713 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1714 cert = _load_cert(
1715 os.path.join(
1716 "x509", "custom", "san_idna_names.pem"
1717 ),
1718 x509.load_pem_x509_certificate,
1719 backend
1720 )
1721 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001722 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001723 )
1724 assert ext is not None
1725 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1726 dns_name = ext.value.get_values_for_type(x509.DNSName)
1727 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1728 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1729 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1730 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1731
1732 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1733 cert = _load_cert(
1734 os.path.join(
1735 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1736 ),
1737 x509.load_pem_x509_certificate,
1738 backend
1739 )
1740 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001741 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001742 )
1743 assert ext is not None
1744 assert ext.critical is False
1745
1746 san = ext.value
1747
1748 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1749 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1750 dns = san.get_values_for_type(x509.DNSName)
1751 ip = san.get_values_for_type(x509.IPAddress)
1752 dirname = san.get_values_for_type(x509.DirectoryName)
1753 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001754 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001755 assert [u"cryptography.io"] == dns
1756 assert [
1757 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001758 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001759 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001760 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001761 ),
1762 ])
1763 ] == dirname
1764 assert [
1765 ipaddress.ip_address(u"127.0.0.1"),
1766 ipaddress.ip_address(u"ff::")
1767 ] == ip
1768
1769 def test_invalid_rfc822name(self, backend):
1770 cert = _load_cert(
1771 os.path.join(
1772 "x509", "custom", "san_rfc822_names.pem"
1773 ),
1774 x509.load_pem_x509_certificate,
1775 backend
1776 )
1777 with pytest.raises(ValueError) as exc:
1778 cert.extensions
1779
1780 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001781
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001782 def test_other_name(self, backend):
1783 cert = _load_cert(
1784 os.path.join(
1785 "x509", "custom", "san_other_name.pem"
1786 ),
1787 x509.load_pem_x509_certificate,
1788 backend
1789 )
1790
1791 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001792 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001793 )
1794 assert ext is not None
1795 assert ext.critical is False
1796
Joshua Taubererd2afad32015-07-06 22:37:53 +00001797 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1798 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001799 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001800 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001801
1802 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001803 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001804
Paul Kehrer94c69602015-05-02 19:29:40 -05001805
1806@pytest.mark.requires_backend_interface(interface=RSABackend)
1807@pytest.mark.requires_backend_interface(interface=X509Backend)
1808class TestExtendedKeyUsageExtension(object):
1809 def test_eku(self, backend):
1810 cert = _load_cert(
1811 os.path.join(
1812 "x509", "custom", "extended_key_usage.pem"
1813 ),
1814 x509.load_pem_x509_certificate,
1815 backend
1816 )
1817 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001818 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001819 )
1820 assert ext is not None
1821 assert ext.critical is False
1822
1823 assert [
1824 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1825 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1826 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1827 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1828 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1829 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1830 x509.ObjectIdentifier("2.5.29.37.0"),
1831 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1832 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001833
1834
1835class TestAccessDescription(object):
1836 def test_invalid_access_method(self):
Paul Kehrerf506bca2015-05-02 22:31:47 -05001837 with pytest.raises(ValueError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001838 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1839
1840 def test_invalid_access_location(self):
1841 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001842 x509.AccessDescription(
1843 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1844 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001845
1846 def test_repr(self):
1847 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001848 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001849 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1850 )
1851 assert repr(ad) == (
1852 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1853 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1854 "(value=http://ocsp.domain.com)>)>"
1855 )
1856
1857 def test_eq(self):
1858 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001859 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001860 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1861 )
1862 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001863 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001864 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1865 )
1866 assert ad == ad2
1867
1868 def test_ne(self):
1869 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001870 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001871 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1872 )
1873 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001874 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001875 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1876 )
1877 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001878 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001879 x509.UniformResourceIdentifier(u"http://notthesame")
1880 )
1881 assert ad != ad2
1882 assert ad != ad3
1883 assert ad != object()
1884
1885
1886class TestAuthorityInformationAccess(object):
1887 def test_invalid_descriptions(self):
1888 with pytest.raises(TypeError):
1889 x509.AuthorityInformationAccess(["notanAccessDescription"])
1890
1891 def test_iter_len(self):
1892 aia = x509.AuthorityInformationAccess([
1893 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001894 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001895 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1896 ),
1897 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001898 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001899 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1900 )
1901 ])
1902 assert len(aia) == 2
1903 assert list(aia) == [
1904 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001905 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001906 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1907 ),
1908 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001909 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001910 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1911 )
1912 ]
1913
1914 def test_repr(self):
1915 aia = x509.AuthorityInformationAccess([
1916 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001917 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001918 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1919 ),
1920 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001921 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001922 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1923 )
1924 ])
1925 assert repr(aia) == (
1926 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1927 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1928 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1929 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1930 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1931 "fier(value=http://domain.com/ca.crt)>)>])>"
1932 )
1933
1934 def test_eq(self):
1935 aia = x509.AuthorityInformationAccess([
1936 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001937 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001938 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1939 ),
1940 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001941 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001942 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1943 )
1944 ])
1945 aia2 = x509.AuthorityInformationAccess([
1946 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001947 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001948 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1949 ),
1950 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001951 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001952 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1953 )
1954 ])
1955 assert aia == aia2
1956
1957 def test_ne(self):
1958 aia = x509.AuthorityInformationAccess([
1959 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001960 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001961 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1962 ),
1963 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001964 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001965 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1966 )
1967 ])
1968 aia2 = x509.AuthorityInformationAccess([
1969 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001970 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001971 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1972 ),
1973 ])
1974
1975 assert aia != aia2
1976 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001977
1978
1979@pytest.mark.requires_backend_interface(interface=RSABackend)
1980@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001981class TestAuthorityInformationAccessExtension(object):
1982 def test_aia_ocsp_ca_issuers(self, backend):
1983 cert = _load_cert(
1984 os.path.join("x509", "cryptography.io.pem"),
1985 x509.load_pem_x509_certificate,
1986 backend
1987 )
1988 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001989 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001990 )
1991 assert ext is not None
1992 assert ext.critical is False
1993
1994 assert ext.value == x509.AuthorityInformationAccess([
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://gv.symcd.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.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2002 ),
2003 ])
2004
2005 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2006 cert = _load_cert(
2007 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2008 x509.load_pem_x509_certificate,
2009 backend
2010 )
2011 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002012 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002013 )
2014 assert ext is not None
2015 assert ext.critical is False
2016
2017 assert ext.value == x509.AuthorityInformationAccess([
2018 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002019 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002020 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2021 ),
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://ocsp2.domain.com")
2025 ),
2026 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002027 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002028 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002029 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2030 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002031 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002032 ]))
2033 ),
2034 ])
2035
2036 def test_aia_ocsp_only(self, backend):
2037 cert = _load_cert(
2038 os.path.join("x509", "custom", "aia_ocsp.pem"),
2039 x509.load_pem_x509_certificate,
2040 backend
2041 )
2042 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002043 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002044 )
2045 assert ext is not None
2046 assert ext.critical is False
2047
2048 assert ext.value == x509.AuthorityInformationAccess([
2049 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002050 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002051 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2052 ),
2053 ])
2054
2055 def test_aia_ca_issuers_only(self, backend):
2056 cert = _load_cert(
2057 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2058 x509.load_pem_x509_certificate,
2059 backend
2060 )
2061 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002062 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002063 )
2064 assert ext is not None
2065 assert ext.critical is False
2066
2067 assert ext.value == x509.AuthorityInformationAccess([
2068 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002069 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002070 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002071 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2072 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002073 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002074 ]))
2075 ),
2076 ])
2077
2078
2079@pytest.mark.requires_backend_interface(interface=RSABackend)
2080@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002081class TestAuthorityKeyIdentifierExtension(object):
2082 def test_aki_keyid(self, backend):
2083 cert = _load_cert(
2084 os.path.join(
2085 "x509", "cryptography.io.pem"
2086 ),
2087 x509.load_pem_x509_certificate,
2088 backend
2089 )
2090 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002091 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002092 )
2093 assert ext is not None
2094 assert ext.critical is False
2095
2096 assert ext.value.key_identifier == (
2097 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2098 )
2099 assert ext.value.authority_cert_issuer is None
2100 assert ext.value.authority_cert_serial_number is None
2101
2102 def test_aki_all_fields(self, backend):
2103 cert = _load_cert(
2104 os.path.join(
2105 "x509", "custom", "authority_key_identifier.pem"
2106 ),
2107 x509.load_pem_x509_certificate,
2108 backend
2109 )
2110 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002111 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002112 )
2113 assert ext is not None
2114 assert ext.critical is False
2115
2116 assert ext.value.key_identifier == (
2117 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2118 )
2119 assert ext.value.authority_cert_issuer == [
2120 x509.DirectoryName(
2121 x509.Name([
2122 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002123 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002124 ),
2125 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002126 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002127 )
2128 ])
2129 )
2130 ]
2131 assert ext.value.authority_cert_serial_number == 3
2132
2133 def test_aki_no_keyid(self, backend):
2134 cert = _load_cert(
2135 os.path.join(
2136 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2137 ),
2138 x509.load_pem_x509_certificate,
2139 backend
2140 )
2141 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002142 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002143 )
2144 assert ext is not None
2145 assert ext.critical is False
2146
2147 assert ext.value.key_identifier is None
2148 assert ext.value.authority_cert_issuer == [
2149 x509.DirectoryName(
2150 x509.Name([
2151 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002152 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002153 ),
2154 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002155 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002156 )
2157 ])
2158 )
2159 ]
2160 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002161
Paul Kehrer253929a2015-08-05 17:30:39 +01002162 def test_from_certificate(self, backend):
2163 issuer_cert = _load_cert(
2164 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2165 x509.load_pem_x509_certificate,
2166 backend
2167 )
2168 cert = _load_cert(
2169 os.path.join("x509", "cryptography.io.pem"),
2170 x509.load_pem_x509_certificate,
2171 backend
2172 )
2173 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002174 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002175 )
2176 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2177 issuer_cert.public_key()
2178 )
2179 assert ext.value == aki
2180
Paul Kehrer5a485522015-05-06 00:29:12 -05002181
Paul Kehrere0017be2015-05-17 20:39:40 -06002182class TestNameConstraints(object):
2183 def test_ipaddress_wrong_type(self):
2184 with pytest.raises(TypeError):
2185 x509.NameConstraints(
2186 permitted_subtrees=[
2187 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2188 ],
2189 excluded_subtrees=None
2190 )
2191
2192 with pytest.raises(TypeError):
2193 x509.NameConstraints(
2194 permitted_subtrees=None,
2195 excluded_subtrees=[
2196 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2197 ]
2198 )
2199
2200 def test_ipaddress_allowed_type(self):
2201 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2202 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2203 nc = x509.NameConstraints(
2204 permitted_subtrees=permitted,
2205 excluded_subtrees=excluded
2206 )
2207 assert nc.permitted_subtrees == permitted
2208 assert nc.excluded_subtrees == excluded
2209
2210 def test_invalid_permitted_subtrees(self):
2211 with pytest.raises(TypeError):
2212 x509.NameConstraints("badpermitted", None)
2213
2214 def test_invalid_excluded_subtrees(self):
2215 with pytest.raises(TypeError):
2216 x509.NameConstraints(None, "badexcluded")
2217
2218 def test_no_subtrees(self):
2219 with pytest.raises(ValueError):
2220 x509.NameConstraints(None, None)
2221
2222 def test_permitted_none(self):
2223 excluded = [x509.DNSName(u"name.local")]
2224 nc = x509.NameConstraints(
2225 permitted_subtrees=None, excluded_subtrees=excluded
2226 )
2227 assert nc.permitted_subtrees is None
2228 assert nc.excluded_subtrees is not None
2229
2230 def test_excluded_none(self):
2231 permitted = [x509.DNSName(u"name.local")]
2232 nc = x509.NameConstraints(
2233 permitted_subtrees=permitted, excluded_subtrees=None
2234 )
2235 assert nc.permitted_subtrees is not None
2236 assert nc.excluded_subtrees is None
2237
2238 def test_repr(self):
2239 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2240 nc = x509.NameConstraints(
2241 permitted_subtrees=permitted,
2242 excluded_subtrees=None
2243 )
2244 assert repr(nc) == (
2245 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2246 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2247 )
2248
Paul Kehrer31894282015-06-21 21:46:41 -05002249 def test_eq(self):
2250 nc = x509.NameConstraints(
2251 permitted_subtrees=[x509.DNSName(u"name.local")],
2252 excluded_subtrees=[x509.DNSName(u"name2.local")]
2253 )
2254 nc2 = x509.NameConstraints(
2255 permitted_subtrees=[x509.DNSName(u"name.local")],
2256 excluded_subtrees=[x509.DNSName(u"name2.local")]
2257 )
2258 assert nc == nc2
2259
2260 def test_ne(self):
2261 nc = x509.NameConstraints(
2262 permitted_subtrees=[x509.DNSName(u"name.local")],
2263 excluded_subtrees=[x509.DNSName(u"name2.local")]
2264 )
2265 nc2 = x509.NameConstraints(
2266 permitted_subtrees=[x509.DNSName(u"name.local")],
2267 excluded_subtrees=None
2268 )
2269 nc3 = x509.NameConstraints(
2270 permitted_subtrees=None,
2271 excluded_subtrees=[x509.DNSName(u"name2.local")]
2272 )
2273
2274 assert nc != nc2
2275 assert nc != nc3
2276 assert nc != object()
2277
Paul Kehrere0017be2015-05-17 20:39:40 -06002278
Paul Kehrer870d7e82015-06-21 22:20:44 -05002279@pytest.mark.requires_backend_interface(interface=RSABackend)
2280@pytest.mark.requires_backend_interface(interface=X509Backend)
2281class TestNameConstraintsExtension(object):
2282 def test_permitted_excluded(self, backend):
2283 cert = _load_cert(
2284 os.path.join(
2285 "x509", "custom", "nc_permitted_excluded_2.pem"
2286 ),
2287 x509.load_pem_x509_certificate,
2288 backend
2289 )
2290 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002291 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002292 ).value
2293 assert nc == x509.NameConstraints(
2294 permitted_subtrees=[
2295 x509.DNSName(u"zombo.local"),
2296 ],
2297 excluded_subtrees=[
2298 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002299 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002300 ]))
2301 ]
2302 )
2303
2304 def test_permitted(self, backend):
2305 cert = _load_cert(
2306 os.path.join(
2307 "x509", "custom", "nc_permitted_2.pem"
2308 ),
2309 x509.load_pem_x509_certificate,
2310 backend
2311 )
2312 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002313 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002314 ).value
2315 assert nc == x509.NameConstraints(
2316 permitted_subtrees=[
2317 x509.DNSName(u"zombo.local"),
2318 ],
2319 excluded_subtrees=None
2320 )
2321
Paul Kehrer42376832015-07-01 18:10:32 -05002322 def test_permitted_with_leading_period(self, backend):
2323 cert = _load_cert(
2324 os.path.join(
2325 "x509", "custom", "nc_permitted.pem"
2326 ),
2327 x509.load_pem_x509_certificate,
2328 backend
2329 )
2330 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002331 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002332 ).value
2333 assert nc == x509.NameConstraints(
2334 permitted_subtrees=[
2335 x509.DNSName(u".cryptography.io"),
2336 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2337 ],
2338 excluded_subtrees=None
2339 )
2340
2341 def test_excluded_with_leading_period(self, backend):
2342 cert = _load_cert(
2343 os.path.join(
2344 "x509", "custom", "nc_excluded.pem"
2345 ),
2346 x509.load_pem_x509_certificate,
2347 backend
2348 )
2349 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002350 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002351 ).value
2352 assert nc == x509.NameConstraints(
2353 permitted_subtrees=None,
2354 excluded_subtrees=[
2355 x509.DNSName(u".cryptography.io"),
2356 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2357 ]
2358 )
2359
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002360 def test_permitted_excluded_with_ips(self, backend):
2361 cert = _load_cert(
2362 os.path.join(
2363 "x509", "custom", "nc_permitted_excluded.pem"
2364 ),
2365 x509.load_pem_x509_certificate,
2366 backend
2367 )
2368 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002369 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002370 ).value
2371 assert nc == x509.NameConstraints(
2372 permitted_subtrees=[
2373 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2374 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2375 ],
2376 excluded_subtrees=[
2377 x509.DNSName(u".domain.com"),
2378 x509.UniformResourceIdentifier(u"http://test.local"),
2379 ]
2380 )
2381
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002382 def test_single_ip_netmask(self, backend):
2383 cert = _load_cert(
2384 os.path.join(
2385 "x509", "custom", "nc_single_ip_netmask.pem"
2386 ),
2387 x509.load_pem_x509_certificate,
2388 backend
2389 )
2390 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002391 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002392 ).value
2393 assert nc == x509.NameConstraints(
2394 permitted_subtrees=[
2395 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2396 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2397 ],
2398 excluded_subtrees=None
2399 )
2400
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002401 def test_invalid_netmask(self, backend):
2402 cert = _load_cert(
2403 os.path.join(
2404 "x509", "custom", "nc_invalid_ip_netmask.pem"
2405 ),
2406 x509.load_pem_x509_certificate,
2407 backend
2408 )
2409 with pytest.raises(ValueError):
2410 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002411 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002412 )
2413
Paul Kehrer870d7e82015-06-21 22:20:44 -05002414
Paul Kehrer5a485522015-05-06 00:29:12 -05002415class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002416 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002417 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002418 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002419
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002420 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002421 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002422 x509.DistributionPoint(None, "notname", None, None)
2423
2424 def test_distribution_point_full_and_relative_not_none(self):
2425 with pytest.raises(ValueError):
2426 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002427
2428 def test_crl_issuer_not_general_names(self):
2429 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002430 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002431
2432 def test_reason_not_reasonflags(self):
2433 with pytest.raises(TypeError):
2434 x509.DistributionPoint(
2435 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002436 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002437 frozenset(["notreasonflags"]),
2438 None
2439 )
2440
2441 def test_reason_not_frozenset(self):
2442 with pytest.raises(TypeError):
2443 x509.DistributionPoint(
2444 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2445 None,
2446 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002447 None
2448 )
2449
2450 def test_disallowed_reasons(self):
2451 with pytest.raises(ValueError):
2452 x509.DistributionPoint(
2453 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2454 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002455 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002456 None
2457 )
2458
2459 with pytest.raises(ValueError):
2460 x509.DistributionPoint(
2461 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2462 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002463 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002464 None
2465 )
2466
2467 def test_reason_only(self):
2468 with pytest.raises(ValueError):
2469 x509.DistributionPoint(
2470 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002471 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002472 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002473 None
2474 )
2475
2476 def test_eq(self):
2477 dp = x509.DistributionPoint(
2478 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002479 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002480 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002481 [
2482 x509.DirectoryName(
2483 x509.Name([
2484 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002485 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002486 )
2487 ])
2488 )
2489 ],
2490 )
2491 dp2 = x509.DistributionPoint(
2492 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002493 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002494 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002495 [
2496 x509.DirectoryName(
2497 x509.Name([
2498 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002499 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002500 )
2501 ])
2502 )
2503 ],
2504 )
2505 assert dp == dp2
2506
2507 def test_ne(self):
2508 dp = x509.DistributionPoint(
2509 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002510 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002511 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002512 [
2513 x509.DirectoryName(
2514 x509.Name([
2515 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002516 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002517 )
2518 ])
2519 )
2520 ],
2521 )
2522 dp2 = x509.DistributionPoint(
2523 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2524 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002525 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002526 None
2527 )
2528 assert dp != dp2
2529 assert dp != object()
2530
2531 def test_repr(self):
2532 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002533 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002534 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002535 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002536 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002537 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002538 [
2539 x509.DirectoryName(
2540 x509.Name([
2541 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002542 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002543 )
2544 ])
2545 )
2546 ],
2547 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002548 if six.PY3:
2549 assert repr(dp) == (
2550 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2551 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002552 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2553 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2554 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2555 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002556 )
2557 else:
2558 assert repr(dp) == (
2559 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2560 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002561 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2562 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2563 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2564 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002565 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002566
2567
2568class TestCRLDistributionPoints(object):
2569 def test_invalid_distribution_points(self):
2570 with pytest.raises(TypeError):
2571 x509.CRLDistributionPoints(["notadistributionpoint"])
2572
2573 def test_iter_len(self):
2574 cdp = x509.CRLDistributionPoints([
2575 x509.DistributionPoint(
2576 [x509.UniformResourceIdentifier(u"http://domain")],
2577 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002578 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002579 None
2580 ),
2581 x509.DistributionPoint(
2582 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002583 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002584 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002585 x509.ReasonFlags.key_compromise,
2586 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002587 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002588 None
2589 ),
2590 ])
2591 assert len(cdp) == 2
2592 assert list(cdp) == [
2593 x509.DistributionPoint(
2594 [x509.UniformResourceIdentifier(u"http://domain")],
2595 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002596 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002597 None
2598 ),
2599 x509.DistributionPoint(
2600 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002601 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002602 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002603 x509.ReasonFlags.key_compromise,
2604 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002605 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002606 None
2607 ),
2608 ]
2609
2610 def test_repr(self):
2611 cdp = x509.CRLDistributionPoints([
2612 x509.DistributionPoint(
2613 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002614 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002615 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002616 None
2617 ),
2618 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002619 if six.PY3:
2620 assert repr(cdp) == (
2621 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2622 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2623 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2624 "romise'>}), crl_issuer=None)>])>"
2625 )
2626 else:
2627 assert repr(cdp) == (
2628 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2629 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2630 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2631 "romise'>]), crl_issuer=None)>])>"
2632 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002633
2634 def test_eq(self):
2635 cdp = x509.CRLDistributionPoints([
2636 x509.DistributionPoint(
2637 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002638 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002639 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002640 x509.ReasonFlags.key_compromise,
2641 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002642 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002643 [x509.UniformResourceIdentifier(u"uri://thing")],
2644 ),
2645 ])
2646 cdp2 = x509.CRLDistributionPoints([
2647 x509.DistributionPoint(
2648 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002649 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002650 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002651 x509.ReasonFlags.key_compromise,
2652 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002653 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002654 [x509.UniformResourceIdentifier(u"uri://thing")],
2655 ),
2656 ])
2657 assert cdp == cdp2
2658
2659 def test_ne(self):
2660 cdp = x509.CRLDistributionPoints([
2661 x509.DistributionPoint(
2662 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002663 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002664 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002665 x509.ReasonFlags.key_compromise,
2666 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002667 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002668 [x509.UniformResourceIdentifier(u"uri://thing")],
2669 ),
2670 ])
2671 cdp2 = x509.CRLDistributionPoints([
2672 x509.DistributionPoint(
2673 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002674 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002675 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002676 x509.ReasonFlags.key_compromise,
2677 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002678 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002679 [x509.UniformResourceIdentifier(u"uri://thing")],
2680 ),
2681 ])
2682 cdp3 = x509.CRLDistributionPoints([
2683 x509.DistributionPoint(
2684 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002685 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002686 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002687 [x509.UniformResourceIdentifier(u"uri://thing")],
2688 ),
2689 ])
2690 cdp4 = x509.CRLDistributionPoints([
2691 x509.DistributionPoint(
2692 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002693 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002694 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002695 x509.ReasonFlags.key_compromise,
2696 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002697 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002698 [x509.UniformResourceIdentifier(u"uri://thing2")],
2699 ),
2700 ])
2701 assert cdp != cdp2
2702 assert cdp != cdp3
2703 assert cdp != cdp4
2704 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002705
2706
2707@pytest.mark.requires_backend_interface(interface=RSABackend)
2708@pytest.mark.requires_backend_interface(interface=X509Backend)
2709class TestCRLDistributionPointsExtension(object):
2710 def test_fullname_and_crl_issuer(self, backend):
2711 cert = _load_cert(
2712 os.path.join(
2713 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2714 ),
2715 x509.load_der_x509_certificate,
2716 backend
2717 )
2718
2719 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002720 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002721 ).value
2722
2723 assert cdps == x509.CRLDistributionPoints([
2724 x509.DistributionPoint(
2725 full_name=[x509.DirectoryName(
2726 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002727 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002728 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002729 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002730 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002731 ),
2732 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002733 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002734 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002735 ),
2736 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002737 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002738 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002739 ),
2740 ])
2741 )],
2742 relative_name=None,
2743 reasons=None,
2744 crl_issuer=[x509.DirectoryName(
2745 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002746 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002747 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002748 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002749 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002750 ),
2751 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002752 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002753 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002754 ),
2755 ])
2756 )],
2757 )
2758 ])
2759
2760 def test_relativename_and_crl_issuer(self, backend):
2761 cert = _load_cert(
2762 os.path.join(
2763 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2764 ),
2765 x509.load_der_x509_certificate,
2766 backend
2767 )
2768
2769 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002770 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002771 ).value
2772
2773 assert cdps == x509.CRLDistributionPoints([
2774 x509.DistributionPoint(
2775 full_name=None,
2776 relative_name=x509.Name([
2777 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002778 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002779 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002780 ),
2781 ]),
2782 reasons=None,
2783 crl_issuer=[x509.DirectoryName(
2784 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002785 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002786 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002787 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002788 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002789 ),
2790 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002791 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002792 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002793 ),
2794 ])
2795 )],
2796 )
2797 ])
2798
2799 def test_fullname_crl_issuer_reasons(self, backend):
2800 cert = _load_cert(
2801 os.path.join(
2802 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2803 ),
2804 x509.load_pem_x509_certificate,
2805 backend
2806 )
2807
2808 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002809 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002810 ).value
2811
2812 assert cdps == x509.CRLDistributionPoints([
2813 x509.DistributionPoint(
2814 full_name=[x509.UniformResourceIdentifier(
2815 u"http://myhost.com/myca.crl"
2816 )],
2817 relative_name=None,
2818 reasons=frozenset([
2819 x509.ReasonFlags.key_compromise,
2820 x509.ReasonFlags.ca_compromise
2821 ]),
2822 crl_issuer=[x509.DirectoryName(
2823 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002824 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002825 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002826 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002827 ),
2828 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002829 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002830 ),
2831 ])
2832 )],
2833 )
2834 ])
2835
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002836 def test_all_reasons(self, backend):
2837 cert = _load_cert(
2838 os.path.join(
2839 "x509", "custom", "cdp_all_reasons.pem"
2840 ),
2841 x509.load_pem_x509_certificate,
2842 backend
2843 )
2844
2845 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002846 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002847 ).value
2848
2849 assert cdps == x509.CRLDistributionPoints([
2850 x509.DistributionPoint(
2851 full_name=[x509.UniformResourceIdentifier(
2852 u"http://domain.com/some.crl"
2853 )],
2854 relative_name=None,
2855 reasons=frozenset([
2856 x509.ReasonFlags.key_compromise,
2857 x509.ReasonFlags.ca_compromise,
2858 x509.ReasonFlags.affiliation_changed,
2859 x509.ReasonFlags.superseded,
2860 x509.ReasonFlags.privilege_withdrawn,
2861 x509.ReasonFlags.cessation_of_operation,
2862 x509.ReasonFlags.aa_compromise,
2863 x509.ReasonFlags.certificate_hold,
2864 ]),
2865 crl_issuer=None
2866 )
2867 ])
2868
2869 def test_single_reason(self, backend):
2870 cert = _load_cert(
2871 os.path.join(
2872 "x509", "custom", "cdp_reason_aa_compromise.pem"
2873 ),
2874 x509.load_pem_x509_certificate,
2875 backend
2876 )
2877
2878 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002879 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002880 ).value
2881
2882 assert cdps == x509.CRLDistributionPoints([
2883 x509.DistributionPoint(
2884 full_name=[x509.UniformResourceIdentifier(
2885 u"http://domain.com/some.crl"
2886 )],
2887 relative_name=None,
2888 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2889 crl_issuer=None
2890 )
2891 ])
2892
Paul Kehrer9a10d592015-05-10 14:55:51 -05002893 def test_crl_issuer_only(self, backend):
2894 cert = _load_cert(
2895 os.path.join(
2896 "x509", "custom", "cdp_crl_issuer.pem"
2897 ),
2898 x509.load_pem_x509_certificate,
2899 backend
2900 )
2901
2902 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002903 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002904 ).value
2905
2906 assert cdps == x509.CRLDistributionPoints([
2907 x509.DistributionPoint(
2908 full_name=None,
2909 relative_name=None,
2910 reasons=None,
2911 crl_issuer=[x509.DirectoryName(
2912 x509.Name([
2913 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002914 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002915 ),
2916 ])
2917 )],
2918 )
2919 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002920
Dominic Chen87bb9572015-10-09 00:23:07 -04002921 def test_crl_empty_hostname(self, backend):
2922 cert = _load_cert(
2923 os.path.join(
2924 "x509", "custom", "cdp_empty_hostname.pem"
2925 ),
2926 x509.load_pem_x509_certificate,
2927 backend
2928 )
2929
2930 cdps = cert.extensions.get_extension_for_oid(
2931 ExtensionOID.CRL_DISTRIBUTION_POINTS
2932 ).value
2933
2934 assert cdps == x509.CRLDistributionPoints([
2935 x509.DistributionPoint(
2936 full_name=[x509.UniformResourceIdentifier(
2937 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
2938 )],
2939 relative_name=None,
2940 reasons=None,
2941 crl_issuer=None
2942 )
2943 ])
2944
Paul Kehrer16fae762015-05-01 23:14:20 -05002945
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002946@pytest.mark.requires_backend_interface(interface=RSABackend)
2947@pytest.mark.requires_backend_interface(interface=X509Backend)
2948class TestOCSPNoCheckExtension(object):
2949 def test_nocheck(self, backend):
2950 cert = _load_cert(
2951 os.path.join(
2952 "x509", "custom", "ocsp_nocheck.pem"
2953 ),
2954 x509.load_pem_x509_certificate,
2955 backend
2956 )
2957 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002958 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002959 )
2960 assert isinstance(ext.value, x509.OCSPNoCheck)
2961
2962
Paul Kehrer16fae762015-05-01 23:14:20 -05002963class TestInhibitAnyPolicy(object):
2964 def test_not_int(self):
2965 with pytest.raises(TypeError):
2966 x509.InhibitAnyPolicy("notint")
2967
2968 def test_negative_int(self):
2969 with pytest.raises(ValueError):
2970 x509.InhibitAnyPolicy(-1)
2971
2972 def test_repr(self):
2973 iap = x509.InhibitAnyPolicy(0)
2974 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2975
2976 def test_eq(self):
2977 iap = x509.InhibitAnyPolicy(1)
2978 iap2 = x509.InhibitAnyPolicy(1)
2979 assert iap == iap2
2980
2981 def test_ne(self):
2982 iap = x509.InhibitAnyPolicy(1)
2983 iap2 = x509.InhibitAnyPolicy(4)
2984 assert iap != iap2
2985 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06002986
2987
2988@pytest.mark.requires_backend_interface(interface=RSABackend)
2989@pytest.mark.requires_backend_interface(interface=X509Backend)
2990class TestInhibitAnyPolicyExtension(object):
2991 def test_nocheck(self, backend):
2992 cert = _load_cert(
2993 os.path.join(
2994 "x509", "custom", "inhibit_any_policy_5.pem"
2995 ),
2996 x509.load_pem_x509_certificate,
2997 backend
2998 )
2999 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003000 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003001 ).value
3002 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003003
3004
3005@pytest.mark.requires_backend_interface(interface=RSABackend)
3006@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003007class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003008 def test_invalid_certificate_policies_data(self, backend):
3009 cert = _load_cert(
3010 os.path.join(
3011 "x509", "custom", "cp_invalid.pem"
3012 ),
3013 x509.load_pem_x509_certificate,
3014 backend
3015 )
3016 with pytest.raises(ValueError):
3017 cert.extensions