blob: 8cbce10b7c676f9a8c96e6228a722558e5487792 [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([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -0800606 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1'),
607 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), 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([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -0800620 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1'),
621 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), 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
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500860 def test_repr(self, backend):
861 cert = _load_cert(
862 os.path.join(
863 "x509", "custom", "basic_constraints_not_critical.pem"
864 ),
865 x509.load_pem_x509_certificate,
866 backend
867 )
868 assert repr(cert.extensions) == (
869 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
870 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
871 "alse, path_length=None)>)>])>"
872 )
873
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100874
Paul Kehrerfa56a232015-03-17 13:14:03 -0500875@pytest.mark.requires_backend_interface(interface=RSABackend)
876@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500877class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500878 def test_ca_true_pathlen_6(self, backend):
879 cert = _load_cert(
880 os.path.join(
881 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
882 ),
883 x509.load_der_x509_certificate,
884 backend
885 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100886 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 == 6
893
894 def test_path_length_zero(self, backend):
895 cert = _load_cert(
896 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
897 x509.load_pem_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 == 0
907
908 def test_ca_true_no_pathlen(self, backend):
909 cert = _load_cert(
910 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
911 x509.load_der_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 True
920 assert ext.value.path_length is None
921
922 def test_ca_false(self, backend):
923 cert = _load_cert(
924 os.path.join("x509", "cryptography.io.pem"),
925 x509.load_pem_x509_certificate,
926 backend
927 )
928 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500929 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500930 )
931 assert ext is not None
932 assert ext.critical is True
933 assert ext.value.ca is False
934 assert ext.value.path_length is None
935
936 def test_no_basic_constraints(self, backend):
937 cert = _load_cert(
938 os.path.join(
939 "x509",
940 "PKITS_data",
941 "certs",
942 "ValidCertificatePathTest1EE.crt"
943 ),
944 x509.load_der_x509_certificate,
945 backend
946 )
947 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500948 cert.extensions.get_extension_for_oid(
949 ExtensionOID.BASIC_CONSTRAINTS
950 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500951
952 def test_basic_constraint_not_critical(self, backend):
953 cert = _load_cert(
954 os.path.join(
955 "x509", "custom", "basic_constraints_not_critical.pem"
956 ),
957 x509.load_pem_x509_certificate,
958 backend
959 )
960 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500961 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500962 )
963 assert ext is not None
964 assert ext.critical is False
965 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500966
967
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500968class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100969 @pytest.mark.requires_backend_interface(interface=RSABackend)
970 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500971 def test_subject_key_identifier(self, backend):
972 cert = _load_cert(
973 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
974 x509.load_der_x509_certificate,
975 backend
976 )
977 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500978 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500979 )
980 ski = ext.value
981 assert ext is not None
982 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500983 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500984 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500985 )
986
Paul Kehrerf22f6122015-08-05 12:57:13 +0100987 @pytest.mark.requires_backend_interface(interface=RSABackend)
988 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500989 def test_no_subject_key_identifier(self, backend):
990 cert = _load_cert(
991 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
992 x509.load_pem_x509_certificate,
993 backend
994 )
995 with pytest.raises(x509.ExtensionNotFound):
996 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500997 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500998 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500999
Paul Kehrerf22f6122015-08-05 12:57:13 +01001000 @pytest.mark.requires_backend_interface(interface=RSABackend)
1001 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001002 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001003 cert = _load_cert(
1004 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1005 x509.load_der_x509_certificate,
1006 backend
1007 )
1008 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001009 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001010 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001011 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001012 cert.public_key()
1013 )
1014 assert ext.value == ski
1015
1016 @pytest.mark.requires_backend_interface(interface=DSABackend)
1017 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001018 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001019 cert = _load_cert(
1020 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1021 x509.load_pem_x509_certificate,
1022 backend
1023 )
1024
1025 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001026 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001027 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001028 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001029 cert.public_key()
1030 )
1031 assert ext.value == ski
1032
1033 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1034 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001035 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001036 _skip_curve_unsupported(backend, ec.SECP384R1())
1037 cert = _load_cert(
1038 os.path.join("x509", "ecdsa_root.pem"),
1039 x509.load_pem_x509_certificate,
1040 backend
1041 )
1042
1043 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001044 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001045 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001046 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001047 cert.public_key()
1048 )
1049 assert ext.value == ski
1050
Paul Kehrer5508ee22015-04-02 19:31:03 -05001051
1052@pytest.mark.requires_backend_interface(interface=RSABackend)
1053@pytest.mark.requires_backend_interface(interface=X509Backend)
1054class TestKeyUsageExtension(object):
1055 def test_no_key_usage(self, backend):
1056 cert = _load_cert(
1057 os.path.join("x509", "verisign_md2_root.pem"),
1058 x509.load_pem_x509_certificate,
1059 backend
1060 )
1061 ext = cert.extensions
1062 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001063 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001064
Paul Kehrerd44e4132015-08-10 19:13:13 -05001065 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001066
1067 def test_all_purposes(self, backend):
1068 cert = _load_cert(
1069 os.path.join(
1070 "x509", "custom", "all_key_usages.pem"
1071 ),
1072 x509.load_pem_x509_certificate,
1073 backend
1074 )
1075 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001076 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001077 assert ext is not None
1078
1079 ku = ext.value
1080 assert ku.digital_signature is True
1081 assert ku.content_commitment is True
1082 assert ku.key_encipherment is True
1083 assert ku.data_encipherment is True
1084 assert ku.key_agreement is True
1085 assert ku.key_cert_sign is True
1086 assert ku.crl_sign is True
1087 assert ku.encipher_only is True
1088 assert ku.decipher_only is True
1089
1090 def test_key_cert_sign_crl_sign(self, backend):
1091 cert = _load_cert(
1092 os.path.join(
1093 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1094 ),
1095 x509.load_der_x509_certificate,
1096 backend
1097 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001098 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001099 assert ext is not None
1100 assert ext.critical is True
1101
1102 ku = ext.value
1103 assert ku.digital_signature is False
1104 assert ku.content_commitment is False
1105 assert ku.key_encipherment is False
1106 assert ku.data_encipherment is False
1107 assert ku.key_agreement is False
1108 assert ku.key_cert_sign is True
1109 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001110
1111
1112@pytest.mark.parametrize(
1113 "name", [
1114 x509.RFC822Name,
1115 x509.DNSName,
1116 x509.UniformResourceIdentifier
1117 ]
1118)
1119class TestTextGeneralNames(object):
1120 def test_not_text(self, name):
1121 with pytest.raises(TypeError):
1122 name(b"notaunicodestring")
1123
1124 with pytest.raises(TypeError):
1125 name(1.3)
1126
1127 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301128 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001129 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1130
1131 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301132 gn = name(u"string")
1133 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001134 assert gn == gn2
1135
1136 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301137 gn = name(u"string")
1138 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001139 assert gn != gn2
1140 assert gn != object()
1141
1142
1143class TestDirectoryName(object):
1144 def test_not_name(self):
1145 with pytest.raises(TypeError):
1146 x509.DirectoryName(b"notaname")
1147
1148 with pytest.raises(TypeError):
1149 x509.DirectoryName(1.3)
1150
1151 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001152 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001153 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001154 if six.PY3:
1155 assert repr(gn) == (
1156 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1157 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1158 ">])>)>"
1159 )
1160 else:
1161 assert repr(gn) == (
1162 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1163 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1164 ")>])>)>"
1165 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001166
1167 def test_eq(self):
1168 name = x509.Name([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -08001169 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001170 ])
1171 name2 = x509.Name([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -08001172 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001173 ])
1174 gn = x509.DirectoryName(x509.Name([name]))
1175 gn2 = x509.DirectoryName(x509.Name([name2]))
1176 assert gn == gn2
1177
1178 def test_ne(self):
1179 name = x509.Name([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -08001180 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001181 ])
1182 name2 = x509.Name([
Nick Bastin1ebcd1c2015-12-12 18:32:59 -08001183 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001184 ])
1185 gn = x509.DirectoryName(x509.Name([name]))
1186 gn2 = x509.DirectoryName(x509.Name([name2]))
1187 assert gn != gn2
1188 assert gn != object()
1189
1190
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001191class TestRFC822Name(object):
1192 def test_invalid_email(self):
1193 with pytest.raises(ValueError):
1194 x509.RFC822Name(u"Name <email>")
1195
1196 with pytest.raises(ValueError):
1197 x509.RFC822Name(u"")
1198
1199 def test_single_label(self):
1200 gn = x509.RFC822Name(u"administrator")
1201 assert gn.value == u"administrator"
1202
1203 def test_idna(self):
1204 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1205 assert gn.value == u"email@em\xe5\xefl.com"
1206 assert gn._encoded == b"email@xn--eml-vla4c.com"
1207
1208
Paul Kehrere28d6c42015-07-12 14:59:37 -05001209class TestUniformResourceIdentifier(object):
1210 def test_no_parsed_hostname(self):
1211 gn = x509.UniformResourceIdentifier(u"singlelabel")
1212 assert gn.value == u"singlelabel"
1213
1214 def test_with_port(self):
1215 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1216 assert gn.value == u"singlelabel:443/test"
1217
1218 def test_idna_no_port(self):
1219 gn = x509.UniformResourceIdentifier(
1220 u"http://\u043f\u044b\u043a\u0430.cryptography"
1221 )
1222 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1223 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1224
1225 def test_idna_with_port(self):
1226 gn = x509.UniformResourceIdentifier(
1227 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1228 )
1229 assert gn.value == (
1230 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1231 )
1232 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1233
1234 def test_query_and_fragment(self):
1235 gn = x509.UniformResourceIdentifier(
1236 u"ldap://cryptography:90/path?query=true#somedata"
1237 )
1238 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1239
1240
Paul Kehrer31bdf792015-03-25 14:11:00 -05001241class TestRegisteredID(object):
1242 def test_not_oid(self):
1243 with pytest.raises(TypeError):
1244 x509.RegisteredID(b"notanoid")
1245
1246 with pytest.raises(TypeError):
1247 x509.RegisteredID(1.3)
1248
1249 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001250 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001251 assert repr(gn) == (
1252 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1253 "e)>)>"
1254 )
1255
1256 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001257 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1258 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001259 assert gn == gn2
1260
1261 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001262 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001263 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001264 assert gn != gn2
1265 assert gn != object()
1266
1267
1268class TestIPAddress(object):
1269 def test_not_ipaddress(self):
1270 with pytest.raises(TypeError):
1271 x509.IPAddress(b"notanipaddress")
1272
1273 with pytest.raises(TypeError):
1274 x509.IPAddress(1.3)
1275
1276 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301277 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001278 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1279
Eeshan Gargf1234152015-04-29 18:41:00 +05301280 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001281 assert repr(gn2) == "<IPAddress(value=ff::)>"
1282
Paul Kehrereb177932015-05-17 18:33:33 -07001283 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1284 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1285
1286 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1287 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1288
Paul Kehrer31bdf792015-03-25 14:11:00 -05001289 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301290 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1291 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001292 assert gn == gn2
1293
1294 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301295 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1296 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001297 assert gn != gn2
1298 assert gn != object()
1299
1300
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001301class TestOtherName(object):
1302 def test_invalid_args(self):
1303 with pytest.raises(TypeError):
1304 x509.OtherName(b"notanobjectidentifier", b"derdata")
1305
1306 with pytest.raises(TypeError):
1307 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1308
1309 def test_repr(self):
1310 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1311 if six.PY3:
1312 assert repr(gn) == (
1313 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1314 "name=Unknown OID)>, value=b'derdata')>"
1315 )
1316 else:
1317 assert repr(gn) == (
1318 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1319 "name=Unknown OID)>, value='derdata')>"
1320 )
1321
1322 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1323 if six.PY3:
1324 assert repr(gn) == (
1325 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1326 "name=pseudonym)>, value=b'derdata')>"
1327 )
1328 else:
1329 assert repr(gn) == (
1330 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1331 "name=pseudonym)>, value='derdata')>"
1332 )
1333
1334 def test_eq(self):
1335 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1336 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1337 assert gn == gn2
1338
1339 def test_ne(self):
1340 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1341 assert gn != object()
1342
1343 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1344 assert gn != gn2
1345
1346 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1347 assert gn != gn2
1348
1349
Erik Trauschke2dcce902015-05-14 16:12:24 -07001350class TestGeneralNames(object):
1351 def test_get_values_for_type(self):
1352 gns = x509.GeneralNames(
1353 [x509.DNSName(u"cryptography.io")]
1354 )
1355 names = gns.get_values_for_type(x509.DNSName)
1356 assert names == [u"cryptography.io"]
1357
1358 def test_iter_names(self):
1359 gns = x509.GeneralNames([
1360 x509.DNSName(u"cryptography.io"),
1361 x509.DNSName(u"crypto.local"),
1362 ])
1363 assert len(gns) == 2
1364 assert list(gns) == [
1365 x509.DNSName(u"cryptography.io"),
1366 x509.DNSName(u"crypto.local"),
1367 ]
1368
1369 def test_invalid_general_names(self):
1370 with pytest.raises(TypeError):
1371 x509.GeneralNames(
1372 [x509.DNSName(u"cryptography.io"), "invalid"]
1373 )
1374
1375 def test_repr(self):
1376 gns = x509.GeneralNames(
1377 [
1378 x509.DNSName(u"cryptography.io")
1379 ]
1380 )
1381 assert repr(gns) == (
1382 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1383 )
1384
1385 def test_eq(self):
1386 gns = x509.GeneralNames(
1387 [x509.DNSName(u"cryptography.io")]
1388 )
1389 gns2 = x509.GeneralNames(
1390 [x509.DNSName(u"cryptography.io")]
1391 )
1392 assert gns == gns2
1393
1394 def test_ne(self):
1395 gns = x509.GeneralNames(
1396 [x509.DNSName(u"cryptography.io")]
1397 )
1398 gns2 = x509.GeneralNames(
1399 [x509.RFC822Name(u"admin@cryptography.io")]
1400 )
1401 assert gns != gns2
1402 assert gns != object()
1403
1404
Paul Kehrer99125c92015-06-07 18:37:10 -05001405class TestIssuerAlternativeName(object):
1406 def test_get_values_for_type(self):
1407 san = x509.IssuerAlternativeName(
1408 [x509.DNSName(u"cryptography.io")]
1409 )
1410 names = san.get_values_for_type(x509.DNSName)
1411 assert names == [u"cryptography.io"]
1412
1413 def test_iter_names(self):
1414 san = x509.IssuerAlternativeName([
1415 x509.DNSName(u"cryptography.io"),
1416 x509.DNSName(u"crypto.local"),
1417 ])
1418 assert len(san) == 2
1419 assert list(san) == [
1420 x509.DNSName(u"cryptography.io"),
1421 x509.DNSName(u"crypto.local"),
1422 ]
1423
1424 def test_invalid_general_names(self):
1425 with pytest.raises(TypeError):
1426 x509.IssuerAlternativeName(
1427 [x509.DNSName(u"cryptography.io"), "invalid"]
1428 )
1429
1430 def test_repr(self):
1431 san = x509.IssuerAlternativeName(
1432 [
1433 x509.DNSName(u"cryptography.io")
1434 ]
1435 )
1436 assert repr(san) == (
1437 "<IssuerAlternativeName("
1438 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1439 )
1440
1441 def test_eq(self):
1442 san = x509.IssuerAlternativeName(
1443 [x509.DNSName(u"cryptography.io")]
1444 )
1445 san2 = x509.IssuerAlternativeName(
1446 [x509.DNSName(u"cryptography.io")]
1447 )
1448 assert san == san2
1449
1450 def test_ne(self):
1451 san = x509.IssuerAlternativeName(
1452 [x509.DNSName(u"cryptography.io")]
1453 )
1454 san2 = x509.IssuerAlternativeName(
1455 [x509.RFC822Name(u"admin@cryptography.io")]
1456 )
1457 assert san != san2
1458 assert san != object()
1459
1460
Alex Gaynorf1c17672015-06-20 14:20:20 -04001461@pytest.mark.requires_backend_interface(interface=RSABackend)
1462@pytest.mark.requires_backend_interface(interface=X509Backend)
1463class TestRSAIssuerAlternativeNameExtension(object):
1464 def test_uri(self, backend):
1465 cert = _load_cert(
1466 os.path.join("x509", "custom", "ian_uri.pem"),
1467 x509.load_pem_x509_certificate,
1468 backend,
1469 )
1470 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001471 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001472 )
1473 assert list(ext.value) == [
1474 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1475 ]
1476
1477
Paul Kehrer31bdf792015-03-25 14:11:00 -05001478class TestSubjectAlternativeName(object):
1479 def test_get_values_for_type(self):
1480 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301481 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001482 )
1483 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301484 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001485
1486 def test_iter_names(self):
1487 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301488 x509.DNSName(u"cryptography.io"),
1489 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001490 ])
1491 assert len(san) == 2
1492 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301493 x509.DNSName(u"cryptography.io"),
1494 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001495 ]
1496
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001497 def test_invalid_general_names(self):
1498 with pytest.raises(TypeError):
1499 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301500 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001501 )
1502
Paul Kehrer31bdf792015-03-25 14:11:00 -05001503 def test_repr(self):
1504 san = x509.SubjectAlternativeName(
1505 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301506 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001507 ]
1508 )
1509 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001510 "<SubjectAlternativeName("
1511 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001512 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001513
Paul Kehrer58cc3972015-05-13 10:00:41 -05001514 def test_eq(self):
1515 san = x509.SubjectAlternativeName(
1516 [x509.DNSName(u"cryptography.io")]
1517 )
1518 san2 = x509.SubjectAlternativeName(
1519 [x509.DNSName(u"cryptography.io")]
1520 )
1521 assert san == san2
1522
1523 def test_ne(self):
1524 san = x509.SubjectAlternativeName(
1525 [x509.DNSName(u"cryptography.io")]
1526 )
1527 san2 = x509.SubjectAlternativeName(
1528 [x509.RFC822Name(u"admin@cryptography.io")]
1529 )
1530 assert san != san2
1531 assert san != object()
1532
Paul Kehrer40f83382015-04-20 15:00:16 -05001533
1534@pytest.mark.requires_backend_interface(interface=RSABackend)
1535@pytest.mark.requires_backend_interface(interface=X509Backend)
1536class TestRSASubjectAlternativeNameExtension(object):
1537 def test_dns_name(self, backend):
1538 cert = _load_cert(
1539 os.path.join("x509", "cryptography.io.pem"),
1540 x509.load_pem_x509_certificate,
1541 backend
1542 )
1543 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001544 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001545 )
1546 assert ext is not None
1547 assert ext.critical is False
1548
1549 san = ext.value
1550
1551 dns = san.get_values_for_type(x509.DNSName)
1552 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001553
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001554 def test_wildcard_dns_name(self, backend):
1555 cert = _load_cert(
1556 os.path.join("x509", "wildcard_san.pem"),
1557 x509.load_pem_x509_certificate,
1558 backend
1559 )
1560 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001561 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001562 )
1563
1564 dns = ext.value.get_values_for_type(x509.DNSName)
1565 assert dns == [
1566 u'*.langui.sh',
1567 u'langui.sh',
1568 u'*.saseliminator.com',
1569 u'saseliminator.com'
1570 ]
1571
Dominic Chen87bb9572015-10-09 00:23:07 -04001572 def test_san_empty_hostname(self, backend):
1573 cert = _load_cert(
1574 os.path.join(
1575 "x509", "custom", "san_empty_hostname.pem"
1576 ),
1577 x509.load_pem_x509_certificate,
1578 backend
1579 )
1580 san = cert.extensions.get_extension_for_oid(
1581 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1582 )
1583
1584 dns = san.value.get_values_for_type(x509.DNSName)
1585 assert dns == [u'']
1586
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001587 def test_san_wildcard_idna_dns_name(self, backend):
1588 cert = _load_cert(
1589 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1590 x509.load_pem_x509_certificate,
1591 backend
1592 )
1593 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001594 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001595 )
1596
1597 dns = ext.value.get_values_for_type(x509.DNSName)
1598 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1599
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001600 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001601 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001602 os.path.join("x509", "san_x400address.der"),
1603 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001604 backend
1605 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001606 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001607 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001608
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001609 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001610
1611 def test_registered_id(self, backend):
1612 cert = _load_cert(
1613 os.path.join(
1614 "x509", "custom", "san_registered_id.pem"
1615 ),
1616 x509.load_pem_x509_certificate,
1617 backend
1618 )
1619 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001620 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001621 )
1622 assert ext is not None
1623 assert ext.critical is False
1624
1625 san = ext.value
1626 rid = san.get_values_for_type(x509.RegisteredID)
1627 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001628
1629 def test_uri(self, backend):
1630 cert = _load_cert(
1631 os.path.join(
1632 "x509", "custom", "san_uri_with_port.pem"
1633 ),
1634 x509.load_pem_x509_certificate,
1635 backend
1636 )
1637 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001638 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001639 )
1640 assert ext is not None
1641 uri = ext.value.get_values_for_type(
1642 x509.UniformResourceIdentifier
1643 )
1644 assert uri == [
1645 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1646 u"lo",
1647 u"http://someregulardomain.com",
1648 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001649
1650 def test_ipaddress(self, backend):
1651 cert = _load_cert(
1652 os.path.join(
1653 "x509", "custom", "san_ipaddr.pem"
1654 ),
1655 x509.load_pem_x509_certificate,
1656 backend
1657 )
1658 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001659 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001660 )
1661 assert ext is not None
1662 assert ext.critical is False
1663
1664 san = ext.value
1665
1666 ip = san.get_values_for_type(x509.IPAddress)
1667 assert [
1668 ipaddress.ip_address(u"127.0.0.1"),
1669 ipaddress.ip_address(u"ff::")
1670 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001671
1672 def test_dirname(self, backend):
1673 cert = _load_cert(
1674 os.path.join(
1675 "x509", "custom", "san_dirname.pem"
1676 ),
1677 x509.load_pem_x509_certificate,
1678 backend
1679 )
1680 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001681 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001682 )
1683 assert ext is not None
1684 assert ext.critical is False
1685
1686 san = ext.value
1687
1688 dirname = san.get_values_for_type(x509.DirectoryName)
1689 assert [
1690 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001691 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1692 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1693 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001694 ])
1695 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001696
1697 def test_rfc822name(self, backend):
1698 cert = _load_cert(
1699 os.path.join(
1700 "x509", "custom", "san_rfc822_idna.pem"
1701 ),
1702 x509.load_pem_x509_certificate,
1703 backend
1704 )
1705 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001706 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001707 )
1708 assert ext is not None
1709 assert ext.critical is False
1710
1711 san = ext.value
1712
1713 rfc822name = san.get_values_for_type(x509.RFC822Name)
1714 assert [u"email@em\xe5\xefl.com"] == rfc822name
1715
Paul Kehrerb8968812015-05-15 09:01:34 -07001716 def test_idna2003_invalid(self, backend):
1717 cert = _load_cert(
1718 os.path.join(
1719 "x509", "custom", "san_idna2003_dnsname.pem"
1720 ),
1721 x509.load_pem_x509_certificate,
1722 backend
1723 )
1724 with pytest.raises(UnicodeError):
1725 cert.extensions
1726
Paul Kehrere06cab42015-04-30 10:23:33 -05001727 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1728 cert = _load_cert(
1729 os.path.join(
1730 "x509", "custom", "san_idna_names.pem"
1731 ),
1732 x509.load_pem_x509_certificate,
1733 backend
1734 )
1735 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001736 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001737 )
1738 assert ext is not None
1739 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1740 dns_name = ext.value.get_values_for_type(x509.DNSName)
1741 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1742 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1743 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1744 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1745
1746 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1747 cert = _load_cert(
1748 os.path.join(
1749 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1750 ),
1751 x509.load_pem_x509_certificate,
1752 backend
1753 )
1754 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001755 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001756 )
1757 assert ext is not None
1758 assert ext.critical is False
1759
1760 san = ext.value
1761
1762 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1763 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1764 dns = san.get_values_for_type(x509.DNSName)
1765 ip = san.get_values_for_type(x509.IPAddress)
1766 dirname = san.get_values_for_type(x509.DirectoryName)
1767 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001768 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001769 assert [u"cryptography.io"] == dns
1770 assert [
1771 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001772 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001773 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001774 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001775 ),
1776 ])
1777 ] == dirname
1778 assert [
1779 ipaddress.ip_address(u"127.0.0.1"),
1780 ipaddress.ip_address(u"ff::")
1781 ] == ip
1782
1783 def test_invalid_rfc822name(self, backend):
1784 cert = _load_cert(
1785 os.path.join(
1786 "x509", "custom", "san_rfc822_names.pem"
1787 ),
1788 x509.load_pem_x509_certificate,
1789 backend
1790 )
1791 with pytest.raises(ValueError) as exc:
1792 cert.extensions
1793
1794 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001795
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001796 def test_other_name(self, backend):
1797 cert = _load_cert(
1798 os.path.join(
1799 "x509", "custom", "san_other_name.pem"
1800 ),
1801 x509.load_pem_x509_certificate,
1802 backend
1803 )
1804
1805 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001806 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001807 )
1808 assert ext is not None
1809 assert ext.critical is False
1810
Joshua Taubererd2afad32015-07-06 22:37:53 +00001811 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1812 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001813 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001814 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001815
1816 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001817 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001818
Paul Kehrer94c69602015-05-02 19:29:40 -05001819
1820@pytest.mark.requires_backend_interface(interface=RSABackend)
1821@pytest.mark.requires_backend_interface(interface=X509Backend)
1822class TestExtendedKeyUsageExtension(object):
1823 def test_eku(self, backend):
1824 cert = _load_cert(
1825 os.path.join(
1826 "x509", "custom", "extended_key_usage.pem"
1827 ),
1828 x509.load_pem_x509_certificate,
1829 backend
1830 )
1831 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001832 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001833 )
1834 assert ext is not None
1835 assert ext.critical is False
1836
1837 assert [
1838 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1839 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1840 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1841 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1842 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1843 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1844 x509.ObjectIdentifier("2.5.29.37.0"),
1845 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1846 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001847
1848
1849class TestAccessDescription(object):
1850 def test_invalid_access_method(self):
Nick Bastin1ebcd1c2015-12-12 18:32:59 -08001851 # access_method can be *any* valid OID
1852 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001853 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1854
1855 def test_invalid_access_location(self):
1856 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001857 x509.AccessDescription(
1858 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1859 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001860
1861 def test_repr(self):
1862 ad = 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 repr(ad) == (
1867 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1868 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1869 "(value=http://ocsp.domain.com)>)>"
1870 )
1871
1872 def test_eq(self):
1873 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001874 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001875 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1876 )
1877 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001878 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001879 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1880 )
1881 assert ad == ad2
1882
1883 def test_ne(self):
1884 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001885 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001886 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1887 )
1888 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001889 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001890 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1891 )
1892 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001893 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001894 x509.UniformResourceIdentifier(u"http://notthesame")
1895 )
1896 assert ad != ad2
1897 assert ad != ad3
1898 assert ad != object()
1899
1900
1901class TestAuthorityInformationAccess(object):
1902 def test_invalid_descriptions(self):
1903 with pytest.raises(TypeError):
1904 x509.AuthorityInformationAccess(["notanAccessDescription"])
1905
1906 def test_iter_len(self):
1907 aia = x509.AuthorityInformationAccess([
1908 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001909 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001910 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1911 ),
1912 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001913 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001914 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1915 )
1916 ])
1917 assert len(aia) == 2
1918 assert list(aia) == [
1919 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001920 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001921 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1922 ),
1923 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001924 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001925 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1926 )
1927 ]
1928
1929 def test_repr(self):
1930 aia = x509.AuthorityInformationAccess([
1931 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001932 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001933 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1934 ),
1935 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001936 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001937 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1938 )
1939 ])
1940 assert repr(aia) == (
1941 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1942 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1943 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1944 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1945 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1946 "fier(value=http://domain.com/ca.crt)>)>])>"
1947 )
1948
1949 def test_eq(self):
1950 aia = x509.AuthorityInformationAccess([
1951 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001952 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001953 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1954 ),
1955 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001956 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001957 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1958 )
1959 ])
1960 aia2 = x509.AuthorityInformationAccess([
1961 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001962 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001963 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1964 ),
1965 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001966 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001967 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1968 )
1969 ])
1970 assert aia == aia2
1971
1972 def test_ne(self):
1973 aia = x509.AuthorityInformationAccess([
1974 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001975 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001976 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1977 ),
1978 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001979 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001980 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1981 )
1982 ])
1983 aia2 = x509.AuthorityInformationAccess([
1984 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001985 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001986 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1987 ),
1988 ])
1989
1990 assert aia != aia2
1991 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001992
1993
1994@pytest.mark.requires_backend_interface(interface=RSABackend)
1995@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001996class TestAuthorityInformationAccessExtension(object):
1997 def test_aia_ocsp_ca_issuers(self, backend):
1998 cert = _load_cert(
1999 os.path.join("x509", "cryptography.io.pem"),
2000 x509.load_pem_x509_certificate,
2001 backend
2002 )
2003 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002004 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002005 )
2006 assert ext is not None
2007 assert ext.critical is False
2008
2009 assert ext.value == x509.AuthorityInformationAccess([
2010 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002011 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002012 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2013 ),
2014 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002015 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002016 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2017 ),
2018 ])
2019
2020 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2021 cert = _load_cert(
2022 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2023 x509.load_pem_x509_certificate,
2024 backend
2025 )
2026 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002027 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002028 )
2029 assert ext is not None
2030 assert ext.critical is False
2031
2032 assert ext.value == x509.AuthorityInformationAccess([
2033 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002034 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002035 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2036 ),
2037 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002038 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002039 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2040 ),
2041 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002042 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002043 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002044 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2045 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002046 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002047 ]))
2048 ),
2049 ])
2050
2051 def test_aia_ocsp_only(self, backend):
2052 cert = _load_cert(
2053 os.path.join("x509", "custom", "aia_ocsp.pem"),
2054 x509.load_pem_x509_certificate,
2055 backend
2056 )
2057 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002058 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002059 )
2060 assert ext is not None
2061 assert ext.critical is False
2062
2063 assert ext.value == x509.AuthorityInformationAccess([
2064 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002065 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002066 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2067 ),
2068 ])
2069
2070 def test_aia_ca_issuers_only(self, backend):
2071 cert = _load_cert(
2072 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2073 x509.load_pem_x509_certificate,
2074 backend
2075 )
2076 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002077 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002078 )
2079 assert ext is not None
2080 assert ext.critical is False
2081
2082 assert ext.value == x509.AuthorityInformationAccess([
2083 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002084 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002085 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002086 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2087 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002088 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002089 ]))
2090 ),
2091 ])
2092
2093
2094@pytest.mark.requires_backend_interface(interface=RSABackend)
2095@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002096class TestAuthorityKeyIdentifierExtension(object):
2097 def test_aki_keyid(self, backend):
2098 cert = _load_cert(
2099 os.path.join(
2100 "x509", "cryptography.io.pem"
2101 ),
2102 x509.load_pem_x509_certificate,
2103 backend
2104 )
2105 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002106 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002107 )
2108 assert ext is not None
2109 assert ext.critical is False
2110
2111 assert ext.value.key_identifier == (
2112 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2113 )
2114 assert ext.value.authority_cert_issuer is None
2115 assert ext.value.authority_cert_serial_number is None
2116
2117 def test_aki_all_fields(self, backend):
2118 cert = _load_cert(
2119 os.path.join(
2120 "x509", "custom", "authority_key_identifier.pem"
2121 ),
2122 x509.load_pem_x509_certificate,
2123 backend
2124 )
2125 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002126 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002127 )
2128 assert ext is not None
2129 assert ext.critical is False
2130
2131 assert ext.value.key_identifier == (
2132 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2133 )
2134 assert ext.value.authority_cert_issuer == [
2135 x509.DirectoryName(
2136 x509.Name([
2137 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002138 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002139 ),
2140 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002141 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002142 )
2143 ])
2144 )
2145 ]
2146 assert ext.value.authority_cert_serial_number == 3
2147
2148 def test_aki_no_keyid(self, backend):
2149 cert = _load_cert(
2150 os.path.join(
2151 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2152 ),
2153 x509.load_pem_x509_certificate,
2154 backend
2155 )
2156 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002157 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002158 )
2159 assert ext is not None
2160 assert ext.critical is False
2161
2162 assert ext.value.key_identifier is None
2163 assert ext.value.authority_cert_issuer == [
2164 x509.DirectoryName(
2165 x509.Name([
2166 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002167 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002168 ),
2169 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002170 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002171 )
2172 ])
2173 )
2174 ]
2175 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002176
Paul Kehrer253929a2015-08-05 17:30:39 +01002177 def test_from_certificate(self, backend):
2178 issuer_cert = _load_cert(
2179 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2180 x509.load_pem_x509_certificate,
2181 backend
2182 )
2183 cert = _load_cert(
2184 os.path.join("x509", "cryptography.io.pem"),
2185 x509.load_pem_x509_certificate,
2186 backend
2187 )
2188 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002189 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002190 )
2191 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2192 issuer_cert.public_key()
2193 )
2194 assert ext.value == aki
2195
Paul Kehrer5a485522015-05-06 00:29:12 -05002196
Paul Kehrere0017be2015-05-17 20:39:40 -06002197class TestNameConstraints(object):
2198 def test_ipaddress_wrong_type(self):
2199 with pytest.raises(TypeError):
2200 x509.NameConstraints(
2201 permitted_subtrees=[
2202 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2203 ],
2204 excluded_subtrees=None
2205 )
2206
2207 with pytest.raises(TypeError):
2208 x509.NameConstraints(
2209 permitted_subtrees=None,
2210 excluded_subtrees=[
2211 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2212 ]
2213 )
2214
2215 def test_ipaddress_allowed_type(self):
2216 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2217 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2218 nc = x509.NameConstraints(
2219 permitted_subtrees=permitted,
2220 excluded_subtrees=excluded
2221 )
2222 assert nc.permitted_subtrees == permitted
2223 assert nc.excluded_subtrees == excluded
2224
2225 def test_invalid_permitted_subtrees(self):
2226 with pytest.raises(TypeError):
2227 x509.NameConstraints("badpermitted", None)
2228
2229 def test_invalid_excluded_subtrees(self):
2230 with pytest.raises(TypeError):
2231 x509.NameConstraints(None, "badexcluded")
2232
2233 def test_no_subtrees(self):
2234 with pytest.raises(ValueError):
2235 x509.NameConstraints(None, None)
2236
2237 def test_permitted_none(self):
2238 excluded = [x509.DNSName(u"name.local")]
2239 nc = x509.NameConstraints(
2240 permitted_subtrees=None, excluded_subtrees=excluded
2241 )
2242 assert nc.permitted_subtrees is None
2243 assert nc.excluded_subtrees is not None
2244
2245 def test_excluded_none(self):
2246 permitted = [x509.DNSName(u"name.local")]
2247 nc = x509.NameConstraints(
2248 permitted_subtrees=permitted, excluded_subtrees=None
2249 )
2250 assert nc.permitted_subtrees is not None
2251 assert nc.excluded_subtrees is None
2252
2253 def test_repr(self):
2254 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2255 nc = x509.NameConstraints(
2256 permitted_subtrees=permitted,
2257 excluded_subtrees=None
2258 )
2259 assert repr(nc) == (
2260 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2261 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2262 )
2263
Paul Kehrer31894282015-06-21 21:46:41 -05002264 def test_eq(self):
2265 nc = x509.NameConstraints(
2266 permitted_subtrees=[x509.DNSName(u"name.local")],
2267 excluded_subtrees=[x509.DNSName(u"name2.local")]
2268 )
2269 nc2 = x509.NameConstraints(
2270 permitted_subtrees=[x509.DNSName(u"name.local")],
2271 excluded_subtrees=[x509.DNSName(u"name2.local")]
2272 )
2273 assert nc == nc2
2274
2275 def test_ne(self):
2276 nc = x509.NameConstraints(
2277 permitted_subtrees=[x509.DNSName(u"name.local")],
2278 excluded_subtrees=[x509.DNSName(u"name2.local")]
2279 )
2280 nc2 = x509.NameConstraints(
2281 permitted_subtrees=[x509.DNSName(u"name.local")],
2282 excluded_subtrees=None
2283 )
2284 nc3 = x509.NameConstraints(
2285 permitted_subtrees=None,
2286 excluded_subtrees=[x509.DNSName(u"name2.local")]
2287 )
2288
2289 assert nc != nc2
2290 assert nc != nc3
2291 assert nc != object()
2292
Paul Kehrere0017be2015-05-17 20:39:40 -06002293
Paul Kehrer870d7e82015-06-21 22:20:44 -05002294@pytest.mark.requires_backend_interface(interface=RSABackend)
2295@pytest.mark.requires_backend_interface(interface=X509Backend)
2296class TestNameConstraintsExtension(object):
2297 def test_permitted_excluded(self, backend):
2298 cert = _load_cert(
2299 os.path.join(
2300 "x509", "custom", "nc_permitted_excluded_2.pem"
2301 ),
2302 x509.load_pem_x509_certificate,
2303 backend
2304 )
2305 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002306 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002307 ).value
2308 assert nc == x509.NameConstraints(
2309 permitted_subtrees=[
2310 x509.DNSName(u"zombo.local"),
2311 ],
2312 excluded_subtrees=[
2313 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002314 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002315 ]))
2316 ]
2317 )
2318
2319 def test_permitted(self, backend):
2320 cert = _load_cert(
2321 os.path.join(
2322 "x509", "custom", "nc_permitted_2.pem"
2323 ),
2324 x509.load_pem_x509_certificate,
2325 backend
2326 )
2327 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002328 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002329 ).value
2330 assert nc == x509.NameConstraints(
2331 permitted_subtrees=[
2332 x509.DNSName(u"zombo.local"),
2333 ],
2334 excluded_subtrees=None
2335 )
2336
Paul Kehrer42376832015-07-01 18:10:32 -05002337 def test_permitted_with_leading_period(self, backend):
2338 cert = _load_cert(
2339 os.path.join(
2340 "x509", "custom", "nc_permitted.pem"
2341 ),
2342 x509.load_pem_x509_certificate,
2343 backend
2344 )
2345 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002346 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002347 ).value
2348 assert nc == x509.NameConstraints(
2349 permitted_subtrees=[
2350 x509.DNSName(u".cryptography.io"),
2351 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2352 ],
2353 excluded_subtrees=None
2354 )
2355
2356 def test_excluded_with_leading_period(self, backend):
2357 cert = _load_cert(
2358 os.path.join(
2359 "x509", "custom", "nc_excluded.pem"
2360 ),
2361 x509.load_pem_x509_certificate,
2362 backend
2363 )
2364 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002365 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002366 ).value
2367 assert nc == x509.NameConstraints(
2368 permitted_subtrees=None,
2369 excluded_subtrees=[
2370 x509.DNSName(u".cryptography.io"),
2371 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2372 ]
2373 )
2374
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002375 def test_permitted_excluded_with_ips(self, backend):
2376 cert = _load_cert(
2377 os.path.join(
2378 "x509", "custom", "nc_permitted_excluded.pem"
2379 ),
2380 x509.load_pem_x509_certificate,
2381 backend
2382 )
2383 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002384 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002385 ).value
2386 assert nc == x509.NameConstraints(
2387 permitted_subtrees=[
2388 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2389 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2390 ],
2391 excluded_subtrees=[
2392 x509.DNSName(u".domain.com"),
2393 x509.UniformResourceIdentifier(u"http://test.local"),
2394 ]
2395 )
2396
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002397 def test_single_ip_netmask(self, backend):
2398 cert = _load_cert(
2399 os.path.join(
2400 "x509", "custom", "nc_single_ip_netmask.pem"
2401 ),
2402 x509.load_pem_x509_certificate,
2403 backend
2404 )
2405 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002406 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002407 ).value
2408 assert nc == x509.NameConstraints(
2409 permitted_subtrees=[
2410 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2411 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2412 ],
2413 excluded_subtrees=None
2414 )
2415
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002416 def test_invalid_netmask(self, backend):
2417 cert = _load_cert(
2418 os.path.join(
2419 "x509", "custom", "nc_invalid_ip_netmask.pem"
2420 ),
2421 x509.load_pem_x509_certificate,
2422 backend
2423 )
2424 with pytest.raises(ValueError):
2425 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002426 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002427 )
2428
Paul Kehrer870d7e82015-06-21 22:20:44 -05002429
Paul Kehrer5a485522015-05-06 00:29:12 -05002430class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002431 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002432 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002433 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002434
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002435 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002436 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002437 x509.DistributionPoint(None, "notname", None, None)
2438
2439 def test_distribution_point_full_and_relative_not_none(self):
2440 with pytest.raises(ValueError):
2441 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002442
2443 def test_crl_issuer_not_general_names(self):
2444 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002445 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002446
2447 def test_reason_not_reasonflags(self):
2448 with pytest.raises(TypeError):
2449 x509.DistributionPoint(
2450 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002451 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002452 frozenset(["notreasonflags"]),
2453 None
2454 )
2455
2456 def test_reason_not_frozenset(self):
2457 with pytest.raises(TypeError):
2458 x509.DistributionPoint(
2459 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2460 None,
2461 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002462 None
2463 )
2464
2465 def test_disallowed_reasons(self):
2466 with pytest.raises(ValueError):
2467 x509.DistributionPoint(
2468 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2469 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002470 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002471 None
2472 )
2473
2474 with pytest.raises(ValueError):
2475 x509.DistributionPoint(
2476 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2477 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002478 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002479 None
2480 )
2481
2482 def test_reason_only(self):
2483 with pytest.raises(ValueError):
2484 x509.DistributionPoint(
2485 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002486 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002487 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002488 None
2489 )
2490
2491 def test_eq(self):
2492 dp = x509.DistributionPoint(
2493 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002494 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002495 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002496 [
2497 x509.DirectoryName(
2498 x509.Name([
2499 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002500 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002501 )
2502 ])
2503 )
2504 ],
2505 )
2506 dp2 = x509.DistributionPoint(
2507 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002508 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002509 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002510 [
2511 x509.DirectoryName(
2512 x509.Name([
2513 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002514 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002515 )
2516 ])
2517 )
2518 ],
2519 )
2520 assert dp == dp2
2521
2522 def test_ne(self):
2523 dp = x509.DistributionPoint(
2524 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002525 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002526 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002527 [
2528 x509.DirectoryName(
2529 x509.Name([
2530 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002531 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002532 )
2533 ])
2534 )
2535 ],
2536 )
2537 dp2 = x509.DistributionPoint(
2538 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2539 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002540 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002541 None
2542 )
2543 assert dp != dp2
2544 assert dp != object()
2545
2546 def test_repr(self):
2547 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002548 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002549 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002550 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002551 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002552 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002553 [
2554 x509.DirectoryName(
2555 x509.Name([
2556 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002557 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002558 )
2559 ])
2560 )
2561 ],
2562 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002563 if six.PY3:
2564 assert repr(dp) == (
2565 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2566 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002567 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2568 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2569 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2570 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002571 )
2572 else:
2573 assert repr(dp) == (
2574 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2575 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002576 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2577 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2578 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2579 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002580 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002581
2582
2583class TestCRLDistributionPoints(object):
2584 def test_invalid_distribution_points(self):
2585 with pytest.raises(TypeError):
2586 x509.CRLDistributionPoints(["notadistributionpoint"])
2587
2588 def test_iter_len(self):
2589 cdp = x509.CRLDistributionPoints([
2590 x509.DistributionPoint(
2591 [x509.UniformResourceIdentifier(u"http://domain")],
2592 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002593 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002594 None
2595 ),
2596 x509.DistributionPoint(
2597 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002598 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002599 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002600 x509.ReasonFlags.key_compromise,
2601 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002602 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002603 None
2604 ),
2605 ])
2606 assert len(cdp) == 2
2607 assert list(cdp) == [
2608 x509.DistributionPoint(
2609 [x509.UniformResourceIdentifier(u"http://domain")],
2610 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002611 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002612 None
2613 ),
2614 x509.DistributionPoint(
2615 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002616 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002617 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002618 x509.ReasonFlags.key_compromise,
2619 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002620 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002621 None
2622 ),
2623 ]
2624
2625 def test_repr(self):
2626 cdp = x509.CRLDistributionPoints([
2627 x509.DistributionPoint(
2628 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002629 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002630 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002631 None
2632 ),
2633 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002634 if six.PY3:
2635 assert repr(cdp) == (
2636 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2637 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2638 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2639 "romise'>}), crl_issuer=None)>])>"
2640 )
2641 else:
2642 assert repr(cdp) == (
2643 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2644 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2645 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2646 "romise'>]), crl_issuer=None)>])>"
2647 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002648
2649 def test_eq(self):
2650 cdp = x509.CRLDistributionPoints([
2651 x509.DistributionPoint(
2652 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002653 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002654 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002655 x509.ReasonFlags.key_compromise,
2656 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002657 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002658 [x509.UniformResourceIdentifier(u"uri://thing")],
2659 ),
2660 ])
2661 cdp2 = x509.CRLDistributionPoints([
2662 x509.DistributionPoint(
2663 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002664 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002665 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002666 x509.ReasonFlags.key_compromise,
2667 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002668 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002669 [x509.UniformResourceIdentifier(u"uri://thing")],
2670 ),
2671 ])
2672 assert cdp == cdp2
2673
2674 def test_ne(self):
2675 cdp = x509.CRLDistributionPoints([
2676 x509.DistributionPoint(
2677 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002678 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002679 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002680 x509.ReasonFlags.key_compromise,
2681 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002682 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002683 [x509.UniformResourceIdentifier(u"uri://thing")],
2684 ),
2685 ])
2686 cdp2 = x509.CRLDistributionPoints([
2687 x509.DistributionPoint(
2688 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002689 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002690 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002691 x509.ReasonFlags.key_compromise,
2692 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002693 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002694 [x509.UniformResourceIdentifier(u"uri://thing")],
2695 ),
2696 ])
2697 cdp3 = x509.CRLDistributionPoints([
2698 x509.DistributionPoint(
2699 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002700 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002701 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002702 [x509.UniformResourceIdentifier(u"uri://thing")],
2703 ),
2704 ])
2705 cdp4 = x509.CRLDistributionPoints([
2706 x509.DistributionPoint(
2707 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002708 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002709 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002710 x509.ReasonFlags.key_compromise,
2711 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002712 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002713 [x509.UniformResourceIdentifier(u"uri://thing2")],
2714 ),
2715 ])
2716 assert cdp != cdp2
2717 assert cdp != cdp3
2718 assert cdp != cdp4
2719 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002720
2721
2722@pytest.mark.requires_backend_interface(interface=RSABackend)
2723@pytest.mark.requires_backend_interface(interface=X509Backend)
2724class TestCRLDistributionPointsExtension(object):
2725 def test_fullname_and_crl_issuer(self, backend):
2726 cert = _load_cert(
2727 os.path.join(
2728 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2729 ),
2730 x509.load_der_x509_certificate,
2731 backend
2732 )
2733
2734 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002735 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002736 ).value
2737
2738 assert cdps == x509.CRLDistributionPoints([
2739 x509.DistributionPoint(
2740 full_name=[x509.DirectoryName(
2741 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002742 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002743 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002744 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002745 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002746 ),
2747 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002748 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002749 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002750 ),
2751 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002752 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002753 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002754 ),
2755 ])
2756 )],
2757 relative_name=None,
2758 reasons=None,
2759 crl_issuer=[x509.DirectoryName(
2760 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002761 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002762 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002763 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002764 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002765 ),
2766 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002767 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002768 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002769 ),
2770 ])
2771 )],
2772 )
2773 ])
2774
2775 def test_relativename_and_crl_issuer(self, backend):
2776 cert = _load_cert(
2777 os.path.join(
2778 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2779 ),
2780 x509.load_der_x509_certificate,
2781 backend
2782 )
2783
2784 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002785 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002786 ).value
2787
2788 assert cdps == x509.CRLDistributionPoints([
2789 x509.DistributionPoint(
2790 full_name=None,
2791 relative_name=x509.Name([
2792 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002793 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002794 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002795 ),
2796 ]),
2797 reasons=None,
2798 crl_issuer=[x509.DirectoryName(
2799 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002800 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002801 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002802 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002803 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002804 ),
2805 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002806 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002807 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002808 ),
2809 ])
2810 )],
2811 )
2812 ])
2813
2814 def test_fullname_crl_issuer_reasons(self, backend):
2815 cert = _load_cert(
2816 os.path.join(
2817 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2818 ),
2819 x509.load_pem_x509_certificate,
2820 backend
2821 )
2822
2823 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002824 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002825 ).value
2826
2827 assert cdps == x509.CRLDistributionPoints([
2828 x509.DistributionPoint(
2829 full_name=[x509.UniformResourceIdentifier(
2830 u"http://myhost.com/myca.crl"
2831 )],
2832 relative_name=None,
2833 reasons=frozenset([
2834 x509.ReasonFlags.key_compromise,
2835 x509.ReasonFlags.ca_compromise
2836 ]),
2837 crl_issuer=[x509.DirectoryName(
2838 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002839 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002840 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002841 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002842 ),
2843 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002844 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002845 ),
2846 ])
2847 )],
2848 )
2849 ])
2850
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002851 def test_all_reasons(self, backend):
2852 cert = _load_cert(
2853 os.path.join(
2854 "x509", "custom", "cdp_all_reasons.pem"
2855 ),
2856 x509.load_pem_x509_certificate,
2857 backend
2858 )
2859
2860 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002861 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002862 ).value
2863
2864 assert cdps == x509.CRLDistributionPoints([
2865 x509.DistributionPoint(
2866 full_name=[x509.UniformResourceIdentifier(
2867 u"http://domain.com/some.crl"
2868 )],
2869 relative_name=None,
2870 reasons=frozenset([
2871 x509.ReasonFlags.key_compromise,
2872 x509.ReasonFlags.ca_compromise,
2873 x509.ReasonFlags.affiliation_changed,
2874 x509.ReasonFlags.superseded,
2875 x509.ReasonFlags.privilege_withdrawn,
2876 x509.ReasonFlags.cessation_of_operation,
2877 x509.ReasonFlags.aa_compromise,
2878 x509.ReasonFlags.certificate_hold,
2879 ]),
2880 crl_issuer=None
2881 )
2882 ])
2883
2884 def test_single_reason(self, backend):
2885 cert = _load_cert(
2886 os.path.join(
2887 "x509", "custom", "cdp_reason_aa_compromise.pem"
2888 ),
2889 x509.load_pem_x509_certificate,
2890 backend
2891 )
2892
2893 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002894 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002895 ).value
2896
2897 assert cdps == x509.CRLDistributionPoints([
2898 x509.DistributionPoint(
2899 full_name=[x509.UniformResourceIdentifier(
2900 u"http://domain.com/some.crl"
2901 )],
2902 relative_name=None,
2903 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2904 crl_issuer=None
2905 )
2906 ])
2907
Paul Kehrer9a10d592015-05-10 14:55:51 -05002908 def test_crl_issuer_only(self, backend):
2909 cert = _load_cert(
2910 os.path.join(
2911 "x509", "custom", "cdp_crl_issuer.pem"
2912 ),
2913 x509.load_pem_x509_certificate,
2914 backend
2915 )
2916
2917 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002918 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002919 ).value
2920
2921 assert cdps == x509.CRLDistributionPoints([
2922 x509.DistributionPoint(
2923 full_name=None,
2924 relative_name=None,
2925 reasons=None,
2926 crl_issuer=[x509.DirectoryName(
2927 x509.Name([
2928 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002929 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002930 ),
2931 ])
2932 )],
2933 )
2934 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002935
Dominic Chen87bb9572015-10-09 00:23:07 -04002936 def test_crl_empty_hostname(self, backend):
2937 cert = _load_cert(
2938 os.path.join(
2939 "x509", "custom", "cdp_empty_hostname.pem"
2940 ),
2941 x509.load_pem_x509_certificate,
2942 backend
2943 )
2944
2945 cdps = cert.extensions.get_extension_for_oid(
2946 ExtensionOID.CRL_DISTRIBUTION_POINTS
2947 ).value
2948
2949 assert cdps == x509.CRLDistributionPoints([
2950 x509.DistributionPoint(
2951 full_name=[x509.UniformResourceIdentifier(
2952 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
2953 )],
2954 relative_name=None,
2955 reasons=None,
2956 crl_issuer=None
2957 )
2958 ])
2959
Paul Kehrer16fae762015-05-01 23:14:20 -05002960
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002961@pytest.mark.requires_backend_interface(interface=RSABackend)
2962@pytest.mark.requires_backend_interface(interface=X509Backend)
2963class TestOCSPNoCheckExtension(object):
2964 def test_nocheck(self, backend):
2965 cert = _load_cert(
2966 os.path.join(
2967 "x509", "custom", "ocsp_nocheck.pem"
2968 ),
2969 x509.load_pem_x509_certificate,
2970 backend
2971 )
2972 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002973 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002974 )
2975 assert isinstance(ext.value, x509.OCSPNoCheck)
2976
2977
Paul Kehrer16fae762015-05-01 23:14:20 -05002978class TestInhibitAnyPolicy(object):
2979 def test_not_int(self):
2980 with pytest.raises(TypeError):
2981 x509.InhibitAnyPolicy("notint")
2982
2983 def test_negative_int(self):
2984 with pytest.raises(ValueError):
2985 x509.InhibitAnyPolicy(-1)
2986
2987 def test_repr(self):
2988 iap = x509.InhibitAnyPolicy(0)
2989 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2990
2991 def test_eq(self):
2992 iap = x509.InhibitAnyPolicy(1)
2993 iap2 = x509.InhibitAnyPolicy(1)
2994 assert iap == iap2
2995
2996 def test_ne(self):
2997 iap = x509.InhibitAnyPolicy(1)
2998 iap2 = x509.InhibitAnyPolicy(4)
2999 assert iap != iap2
3000 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003001
3002
3003@pytest.mark.requires_backend_interface(interface=RSABackend)
3004@pytest.mark.requires_backend_interface(interface=X509Backend)
3005class TestInhibitAnyPolicyExtension(object):
3006 def test_nocheck(self, backend):
3007 cert = _load_cert(
3008 os.path.join(
3009 "x509", "custom", "inhibit_any_policy_5.pem"
3010 ),
3011 x509.load_pem_x509_certificate,
3012 backend
3013 )
3014 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003015 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003016 ).value
3017 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003018
3019
3020@pytest.mark.requires_backend_interface(interface=RSABackend)
3021@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003022class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003023 def test_invalid_certificate_policies_data(self, backend):
3024 cert = _load_cert(
3025 os.path.join(
3026 "x509", "custom", "cp_invalid.pem"
3027 ),
3028 x509.load_pem_x509_certificate,
3029 backend
3030 )
3031 with pytest.raises(ValueError):
3032 cert.extensions