blob: 14df9a2273d9ec6cf59e0d0dc546a233a53c277d [file] [log] [blame]
Paul Kehrer8cf26422015-03-21 09:50:24 -05001# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import absolute_import, division, print_function
6
Paul Kehrer1eb82a62015-03-31 20:00:33 -05007import binascii
Paul Kehrer31bdf792015-03-25 14:11:00 -05008import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05009import os
10
Paul Kehrer8cf26422015-03-21 09:50:24 -050011import pytest
12
Paul Kehrercbfb1012015-04-10 20:57:20 -040013import six
14
Paul Kehrer8cf26422015-03-21 09:50:24 -050015from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010016from cryptography.hazmat.backends.interfaces import (
17 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
18)
19from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050020from cryptography.x509.oid import (
21 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID, NameOID
22)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050023
Paul Kehrerf22f6122015-08-05 12:57:13 +010024from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050026
27
Paul Kehrer85894662015-03-22 13:19:31 -050028class TestExtension(object):
29 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050030 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050031 with pytest.raises(TypeError):
32 x509.Extension("notanoid", True, bc)
33
34 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050035 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050036 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050037 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050038
39 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050040 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050041 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050042 assert repr(ext) == (
43 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
44 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
45 "_length=None)>)>"
46 )
47
Paul Kehrer58e870c2015-05-17 09:15:30 -070048 def test_eq(self):
49 ext1 = x509.Extension(
50 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
51 )
52 ext2 = x509.Extension(
53 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
54 )
55 assert ext1 == ext2
56
57 def test_ne(self):
58 ext1 = x509.Extension(
59 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
60 )
61 ext2 = x509.Extension(
62 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
63 )
64 ext3 = x509.Extension(
65 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
66 )
67 ext4 = x509.Extension(
68 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
69 )
70 assert ext1 != ext2
71 assert ext1 != ext3
72 assert ext1 != ext4
73 assert ext1 != object()
74
Paul Kehrer85894662015-03-22 13:19:31 -050075
Paul Kehrer2b622582015-04-15 11:04:29 -040076class TestNoticeReference(object):
77 def test_notice_numbers_not_all_int(self):
78 with pytest.raises(TypeError):
79 x509.NoticeReference("org", [1, 2, "three"])
80
81 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -050082 with pytest.raises(TypeError):
83 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -040084
85 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -050086 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -040087
Paul Kehrer73be2ca2015-05-11 21:22:38 -050088 if six.PY3:
89 assert repr(nr) == (
90 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
91 "])>"
92 )
93 else:
94 assert repr(nr) == (
95 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
96 "4])>"
97 )
Paul Kehrer2b622582015-04-15 11:04:29 -040098
Paul Kehrerc56ab622015-05-03 09:56:31 -050099 def test_eq(self):
100 nr = x509.NoticeReference("org", [1, 2])
101 nr2 = x509.NoticeReference("org", [1, 2])
102 assert nr == nr2
103
104 def test_ne(self):
105 nr = x509.NoticeReference("org", [1, 2])
106 nr2 = x509.NoticeReference("org", [1])
107 nr3 = x509.NoticeReference(None, [1, 2])
108 assert nr != nr2
109 assert nr != nr3
110 assert nr != object()
111
Paul Kehrer2b622582015-04-15 11:04:29 -0400112
113class TestUserNotice(object):
114 def test_notice_reference_invalid(self):
115 with pytest.raises(TypeError):
116 x509.UserNotice("invalid", None)
117
118 def test_notice_reference_none(self):
119 un = x509.UserNotice(None, "text")
120 assert un.notice_reference is None
121 assert un.explicit_text == "text"
122
123 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500124 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500125 if six.PY3:
126 assert repr(un) == (
127 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500128 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500129 )
130 else:
131 assert repr(un) == (
132 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500133 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500134 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400135
Paul Kehrerc56ab622015-05-03 09:56:31 -0500136 def test_eq(self):
137 nr = x509.NoticeReference("org", [1, 2])
138 nr2 = x509.NoticeReference("org", [1, 2])
139 un = x509.UserNotice(nr, "text")
140 un2 = x509.UserNotice(nr2, "text")
141 assert un == un2
142
143 def test_ne(self):
144 nr = x509.NoticeReference("org", [1, 2])
145 nr2 = x509.NoticeReference("org", [1])
146 un = x509.UserNotice(nr, "text")
147 un2 = x509.UserNotice(nr2, "text")
148 un3 = x509.UserNotice(nr, "text3")
149 assert un != un2
150 assert un != un3
151 assert un != object()
152
Paul Kehrer2b622582015-04-15 11:04:29 -0400153
Paul Kehrer2b622582015-04-15 11:04:29 -0400154class TestPolicyInformation(object):
155 def test_invalid_policy_identifier(self):
156 with pytest.raises(TypeError):
157 x509.PolicyInformation("notanoid", None)
158
159 def test_none_policy_qualifiers(self):
160 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
161 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
162 assert pi.policy_qualifiers is None
163
164 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500165 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400166 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
167 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
168 assert pi.policy_qualifiers == pq
169
170 def test_invalid_policy_identifiers(self):
171 with pytest.raises(TypeError):
172 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
173
174 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500175 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400176 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500177 if six.PY3:
178 assert repr(pi) == (
179 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
180 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500181 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500182 )
183 else:
184 assert repr(pi) == (
185 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
186 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500187 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500188 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400189
Paul Kehrerc56ab622015-05-03 09:56:31 -0500190 def test_eq(self):
191 pi = x509.PolicyInformation(
192 x509.ObjectIdentifier("1.2.3"),
193 [u"string", x509.UserNotice(None, u"hi")]
194 )
195 pi2 = x509.PolicyInformation(
196 x509.ObjectIdentifier("1.2.3"),
197 [u"string", x509.UserNotice(None, u"hi")]
198 )
199 assert pi == pi2
200
201 def test_ne(self):
202 pi = x509.PolicyInformation(
203 x509.ObjectIdentifier("1.2.3"), [u"string"]
204 )
205 pi2 = x509.PolicyInformation(
206 x509.ObjectIdentifier("1.2.3"), [u"string2"]
207 )
208 pi3 = x509.PolicyInformation(
209 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
210 )
211 assert pi != pi2
212 assert pi != pi3
213 assert pi != object()
214
Paul Kehrer2b622582015-04-15 11:04:29 -0400215
216class TestCertificatePolicies(object):
217 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500218 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400219 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
220 with pytest.raises(TypeError):
221 x509.CertificatePolicies([1, pi])
222
223 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500224 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400225 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
226 cp = x509.CertificatePolicies([pi])
227 assert len(cp) == 1
228 for policyinfo in cp:
229 assert policyinfo == pi
230
231 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500232 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400233 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
234 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500235 if six.PY3:
236 assert repr(cp) == (
237 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
238 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
239 "ers=['string'])>])>"
240 )
241 else:
242 assert repr(cp) == (
243 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
244 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
245 "ers=[u'string'])>])>"
246 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400247
Paul Kehrerc56ab622015-05-03 09:56:31 -0500248 def test_eq(self):
249 pi = x509.PolicyInformation(
250 x509.ObjectIdentifier("1.2.3"), [u"string"]
251 )
252 cp = x509.CertificatePolicies([pi])
253 pi2 = x509.PolicyInformation(
254 x509.ObjectIdentifier("1.2.3"), [u"string"]
255 )
256 cp2 = x509.CertificatePolicies([pi2])
257 assert cp == cp2
258
259 def test_ne(self):
260 pi = x509.PolicyInformation(
261 x509.ObjectIdentifier("1.2.3"), [u"string"]
262 )
263 cp = x509.CertificatePolicies([pi])
264 pi2 = x509.PolicyInformation(
265 x509.ObjectIdentifier("1.2.3"), [u"string2"]
266 )
267 cp2 = x509.CertificatePolicies([pi2])
268 assert cp != cp2
269 assert cp != object()
270
Paul Kehrer2b622582015-04-15 11:04:29 -0400271
Paul Kehrer11026fe2015-05-12 11:23:56 -0500272@pytest.mark.requires_backend_interface(interface=RSABackend)
273@pytest.mark.requires_backend_interface(interface=X509Backend)
274class TestCertificatePoliciesExtension(object):
275 def test_cps_uri_policy_qualifier(self, backend):
276 cert = _load_cert(
277 os.path.join("x509", "custom", "cp_cps_uri.pem"),
278 x509.load_pem_x509_certificate,
279 backend
280 )
281
282 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500283 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500284 ).value
285
286 assert cp == x509.CertificatePolicies([
287 x509.PolicyInformation(
288 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
289 [u"http://other.com/cps"]
290 )
291 ])
292
293 def test_user_notice_with_notice_reference(self, backend):
294 cert = _load_cert(
295 os.path.join(
296 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
297 ),
298 x509.load_pem_x509_certificate,
299 backend
300 )
301
302 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500303 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500304 ).value
305
306 assert cp == x509.CertificatePolicies([
307 x509.PolicyInformation(
308 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
309 [
310 u"http://example.com/cps",
311 u"http://other.com/cps",
312 x509.UserNotice(
313 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
314 u"thing"
315 )
316 ]
317 )
318 ])
319
320 def test_user_notice_with_explicit_text(self, backend):
321 cert = _load_cert(
322 os.path.join(
323 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
324 ),
325 x509.load_pem_x509_certificate,
326 backend
327 )
328
329 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500330 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500331 ).value
332
333 assert cp == x509.CertificatePolicies([
334 x509.PolicyInformation(
335 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
336 [x509.UserNotice(None, u"thing")]
337 )
338 ])
339
340 def test_user_notice_no_explicit_text(self, backend):
341 cert = _load_cert(
342 os.path.join(
343 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
344 ),
345 x509.load_pem_x509_certificate,
346 backend
347 )
348
349 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500350 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500351 ).value
352
353 assert cp == x509.CertificatePolicies([
354 x509.PolicyInformation(
355 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
356 [
357 x509.UserNotice(
358 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
359 None
360 )
361 ]
362 )
363 ])
364
365
Paul Kehrercecbbba2015-03-30 14:58:38 -0500366class TestKeyUsage(object):
367 def test_key_agreement_false_encipher_decipher_true(self):
368 with pytest.raises(ValueError):
369 x509.KeyUsage(
370 digital_signature=False,
371 content_commitment=False,
372 key_encipherment=False,
373 data_encipherment=False,
374 key_agreement=False,
375 key_cert_sign=False,
376 crl_sign=False,
377 encipher_only=True,
378 decipher_only=False
379 )
380
381 with pytest.raises(ValueError):
382 x509.KeyUsage(
383 digital_signature=False,
384 content_commitment=False,
385 key_encipherment=False,
386 data_encipherment=False,
387 key_agreement=False,
388 key_cert_sign=False,
389 crl_sign=False,
390 encipher_only=True,
391 decipher_only=True
392 )
393
394 with pytest.raises(ValueError):
395 x509.KeyUsage(
396 digital_signature=False,
397 content_commitment=False,
398 key_encipherment=False,
399 data_encipherment=False,
400 key_agreement=False,
401 key_cert_sign=False,
402 crl_sign=False,
403 encipher_only=False,
404 decipher_only=True
405 )
406
407 def test_properties_key_agreement_true(self):
408 ku = x509.KeyUsage(
409 digital_signature=True,
410 content_commitment=True,
411 key_encipherment=False,
412 data_encipherment=False,
413 key_agreement=False,
414 key_cert_sign=True,
415 crl_sign=False,
416 encipher_only=False,
417 decipher_only=False
418 )
419 assert ku.digital_signature is True
420 assert ku.content_commitment is True
421 assert ku.key_encipherment is False
422 assert ku.data_encipherment is False
423 assert ku.key_agreement is False
424 assert ku.key_cert_sign is True
425 assert ku.crl_sign is False
426
427 def test_key_agreement_true_properties(self):
428 ku = x509.KeyUsage(
429 digital_signature=False,
430 content_commitment=False,
431 key_encipherment=False,
432 data_encipherment=False,
433 key_agreement=True,
434 key_cert_sign=False,
435 crl_sign=False,
436 encipher_only=False,
437 decipher_only=True
438 )
439 assert ku.key_agreement is True
440 assert ku.encipher_only is False
441 assert ku.decipher_only is True
442
443 def test_key_agreement_false_properties(self):
444 ku = x509.KeyUsage(
445 digital_signature=False,
446 content_commitment=False,
447 key_encipherment=False,
448 data_encipherment=False,
449 key_agreement=False,
450 key_cert_sign=False,
451 crl_sign=False,
452 encipher_only=False,
453 decipher_only=False
454 )
455 assert ku.key_agreement is False
456 with pytest.raises(ValueError):
457 ku.encipher_only
458
459 with pytest.raises(ValueError):
460 ku.decipher_only
461
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500462 def test_repr_key_agreement_false(self):
463 ku = x509.KeyUsage(
464 digital_signature=True,
465 content_commitment=True,
466 key_encipherment=False,
467 data_encipherment=False,
468 key_agreement=False,
469 key_cert_sign=True,
470 crl_sign=False,
471 encipher_only=False,
472 decipher_only=False
473 )
474 assert repr(ku) == (
475 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
476 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400477 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
478 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500479 )
480
481 def test_repr_key_agreement_true(self):
482 ku = x509.KeyUsage(
483 digital_signature=True,
484 content_commitment=True,
485 key_encipherment=False,
486 data_encipherment=False,
487 key_agreement=True,
488 key_cert_sign=True,
489 crl_sign=False,
490 encipher_only=False,
491 decipher_only=False
492 )
493 assert repr(ku) == (
494 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
495 "cipherment=False, data_encipherment=False, key_agreement=True, k"
496 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
497 "only=False)>"
498 )
499
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500500 def test_eq(self):
501 ku = x509.KeyUsage(
502 digital_signature=False,
503 content_commitment=False,
504 key_encipherment=False,
505 data_encipherment=False,
506 key_agreement=True,
507 key_cert_sign=False,
508 crl_sign=False,
509 encipher_only=False,
510 decipher_only=True
511 )
512 ku2 = x509.KeyUsage(
513 digital_signature=False,
514 content_commitment=False,
515 key_encipherment=False,
516 data_encipherment=False,
517 key_agreement=True,
518 key_cert_sign=False,
519 crl_sign=False,
520 encipher_only=False,
521 decipher_only=True
522 )
523 assert ku == ku2
524
525 def test_ne(self):
526 ku = x509.KeyUsage(
527 digital_signature=False,
528 content_commitment=False,
529 key_encipherment=False,
530 data_encipherment=False,
531 key_agreement=True,
532 key_cert_sign=False,
533 crl_sign=False,
534 encipher_only=False,
535 decipher_only=True
536 )
537 ku2 = x509.KeyUsage(
538 digital_signature=False,
539 content_commitment=False,
540 key_encipherment=False,
541 data_encipherment=False,
542 key_agreement=False,
543 key_cert_sign=False,
544 crl_sign=False,
545 encipher_only=False,
546 decipher_only=False
547 )
548 assert ku != ku2
549 assert ku != object()
550
Paul Kehrercecbbba2015-03-30 14:58:38 -0500551
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500552class TestSubjectKeyIdentifier(object):
553 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400554 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500555 ski = x509.SubjectKeyIdentifier(value)
556 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500557
558 def test_repr(self):
559 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500560 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500561 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500562 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400563 if six.PY3:
564 assert repr(ext) == (
565 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
566 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
567 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
568 "\\xf7\\xff:\\xc9\')>)>"
569 )
570 else:
571 assert repr(ext) == (
572 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
573 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
574 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
575 "\\xf7\\xff:\\xc9\')>)>"
576 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500577
578 def test_eq(self):
579 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500580 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500581 )
582 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500583 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500584 )
585 assert ski == ski2
586
587 def test_ne(self):
588 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500589 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500590 )
591 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500592 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500593 )
594 assert ski != ski2
595 assert ski != object()
596
597
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400598class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500599 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400600 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500601 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400602
603 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500604 dirname = x509.DirectoryName(
605 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500606 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
607 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500608 ])
609 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400610 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500611 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400612
613 def test_authority_issuer_none_serial_not_none(self):
614 with pytest.raises(ValueError):
615 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
616
617 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500618 dirname = x509.DirectoryName(
619 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500620 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
621 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500622 ])
623 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400624 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500625 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400626
627 def test_authority_cert_serial_and_issuer_none(self):
628 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
629 assert aki.key_identifier == b"id"
630 assert aki.authority_cert_issuer is None
631 assert aki.authority_cert_serial_number is None
632
633 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500634 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500635 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500636 )
637 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400638
639 if six.PY3:
640 assert repr(aki) == (
641 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500642 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500643 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500644 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400645 )
646 else:
647 assert repr(aki) == (
648 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500649 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500650 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
651 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400652 )
653
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500654 def test_eq(self):
655 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500656 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500657 )
658 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
659 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500660 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500661 )
662 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
663 assert aki == aki2
664
665 def test_ne(self):
666 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500667 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500668 )
669 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500670 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500671 )
672 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
673 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
674 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
675 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
676 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
677 assert aki != aki2
678 assert aki != aki3
679 assert aki != aki4
680 assert aki != aki5
681 assert aki != object()
682
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400683
Paul Kehrer8cf26422015-03-21 09:50:24 -0500684class TestBasicConstraints(object):
685 def test_ca_not_boolean(self):
686 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500687 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500688
689 def test_path_length_not_ca(self):
690 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500691 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500692
693 def test_path_length_not_int(self):
694 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500695 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500696
697 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500698 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500699
700 def test_path_length_negative(self):
701 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500702 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500703
704 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500705 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500706 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500707 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500708 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500709
Paul Kehrer3a69b132015-05-13 10:03:46 -0500710 def test_eq(self):
711 na = x509.BasicConstraints(ca=True, path_length=None)
712 na2 = x509.BasicConstraints(ca=True, path_length=None)
713 assert na == na2
714
715 def test_ne(self):
716 na = x509.BasicConstraints(ca=True, path_length=None)
717 na2 = x509.BasicConstraints(ca=True, path_length=1)
718 na3 = x509.BasicConstraints(ca=False, path_length=None)
719 assert na != na2
720 assert na != na3
721 assert na != object()
722
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500723
Paul Kehrerffa2a152015-03-31 08:18:25 -0500724class TestExtendedKeyUsage(object):
725 def test_not_all_oids(self):
726 with pytest.raises(TypeError):
727 x509.ExtendedKeyUsage(["notoid"])
728
729 def test_iter_len(self):
730 eku = x509.ExtendedKeyUsage([
731 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
732 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
733 ])
734 assert len(eku) == 2
735 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500736 ExtendedKeyUsageOID.SERVER_AUTH,
737 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500738 ]
739
Paul Kehrer23d10c32015-04-02 23:12:32 -0500740 def test_repr(self):
741 eku = x509.ExtendedKeyUsage([
742 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
743 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
744 ])
745 assert repr(eku) == (
746 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
747 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
748 "tAuth)>])>"
749 )
750
Paul Kehrerb0476172015-05-02 19:34:51 -0500751 def test_eq(self):
752 eku = x509.ExtendedKeyUsage([
753 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
754 ])
755 eku2 = x509.ExtendedKeyUsage([
756 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
757 ])
758 assert eku == eku2
759
760 def test_ne(self):
761 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
762 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
763 assert eku != eku2
764 assert eku != object()
765
Paul Kehrerffa2a152015-03-31 08:18:25 -0500766
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500767@pytest.mark.requires_backend_interface(interface=RSABackend)
768@pytest.mark.requires_backend_interface(interface=X509Backend)
769class TestExtensions(object):
770 def test_no_extensions(self, backend):
771 cert = _load_cert(
772 os.path.join("x509", "verisign_md2_root.pem"),
773 x509.load_pem_x509_certificate,
774 backend
775 )
776 ext = cert.extensions
777 assert len(ext) == 0
778 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500779 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500780 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500781
Paul Kehrerd44e4132015-08-10 19:13:13 -0500782 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500783
784 def test_one_extension(self, backend):
785 cert = _load_cert(
786 os.path.join(
787 "x509", "custom", "basic_constraints_not_critical.pem"
788 ),
789 x509.load_pem_x509_certificate,
790 backend
791 )
792 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500793 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500794 assert ext is not None
795 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500796
797 def test_duplicate_extension(self, backend):
798 cert = _load_cert(
799 os.path.join(
800 "x509", "custom", "two_basic_constraints.pem"
801 ),
802 x509.load_pem_x509_certificate,
803 backend
804 )
805 with pytest.raises(x509.DuplicateExtension) as exc:
806 cert.extensions
807
Paul Kehrerd44e4132015-08-10 19:13:13 -0500808 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500809
810 def test_unsupported_critical_extension(self, backend):
811 cert = _load_cert(
812 os.path.join(
813 "x509", "custom", "unsupported_extension_critical.pem"
814 ),
815 x509.load_pem_x509_certificate,
816 backend
817 )
818 with pytest.raises(x509.UnsupportedExtension) as exc:
819 cert.extensions
820
821 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
822
823 def test_unsupported_extension(self, backend):
824 # TODO: this will raise an exception when all extensions are complete
825 cert = _load_cert(
826 os.path.join(
827 "x509", "custom", "unsupported_extension.pem"
828 ),
829 x509.load_pem_x509_certificate,
830 backend
831 )
832 extensions = cert.extensions
833 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500834
Phoebe Queenecae9812015-08-12 05:00:32 +0100835 def test_no_extensions_get_for_class(self, backend):
836 cert = _load_cert(
837 os.path.join(
838 "x509", "verisign_md2_root.pem"
839 ),
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 Queenc93752b2015-08-12 10:54:46 +0100845 ext = exts.get_extension_for_class(x509.BasicConstraints)
846 assert ext is None
Phoebe Queenecae9812015-08-12 05:00:32 +0100847 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
848
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100849 def test_one_extension_get_for_class(self, backend):
850 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100851 os.path.join(
852 "x509", "custom", "basic_constraints_not_critical.pem"
853 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100854 x509.load_pem_x509_certificate,
855 backend
856 )
857 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
858 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100859 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500860
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100861
Paul Kehrerfa56a232015-03-17 13:14:03 -0500862@pytest.mark.requires_backend_interface(interface=RSABackend)
863@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500864class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500865 def test_ca_true_pathlen_6(self, backend):
866 cert = _load_cert(
867 os.path.join(
868 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
869 ),
870 x509.load_der_x509_certificate,
871 backend
872 )
873 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500874 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500875 )
876 assert ext is not None
877 assert ext.critical is True
878 assert ext.value.ca is True
879 assert ext.value.path_length == 6
880
881 def test_path_length_zero(self, backend):
882 cert = _load_cert(
883 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
884 x509.load_pem_x509_certificate,
885 backend
886 )
887 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500888 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500889 )
890 assert ext is not None
891 assert ext.critical is True
892 assert ext.value.ca is True
893 assert ext.value.path_length == 0
894
895 def test_ca_true_no_pathlen(self, backend):
896 cert = _load_cert(
897 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
898 x509.load_der_x509_certificate,
899 backend
900 )
901 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500902 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500903 )
904 assert ext is not None
905 assert ext.critical is True
906 assert ext.value.ca is True
907 assert ext.value.path_length is None
908
909 def test_ca_false(self, backend):
910 cert = _load_cert(
911 os.path.join("x509", "cryptography.io.pem"),
912 x509.load_pem_x509_certificate,
913 backend
914 )
915 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500916 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500917 )
918 assert ext is not None
919 assert ext.critical is True
920 assert ext.value.ca is False
921 assert ext.value.path_length is None
922
923 def test_no_basic_constraints(self, backend):
924 cert = _load_cert(
925 os.path.join(
926 "x509",
927 "PKITS_data",
928 "certs",
929 "ValidCertificatePathTest1EE.crt"
930 ),
931 x509.load_der_x509_certificate,
932 backend
933 )
934 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500935 cert.extensions.get_extension_for_oid(
936 ExtensionOID.BASIC_CONSTRAINTS
937 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500938
939 def test_basic_constraint_not_critical(self, backend):
940 cert = _load_cert(
941 os.path.join(
942 "x509", "custom", "basic_constraints_not_critical.pem"
943 ),
944 x509.load_pem_x509_certificate,
945 backend
946 )
947 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500948 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500949 )
950 assert ext is not None
951 assert ext.critical is False
952 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500953
954
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500955class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100956 @pytest.mark.requires_backend_interface(interface=RSABackend)
957 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500958 def test_subject_key_identifier(self, backend):
959 cert = _load_cert(
960 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
961 x509.load_der_x509_certificate,
962 backend
963 )
964 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500965 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500966 )
967 ski = ext.value
968 assert ext is not None
969 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500970 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500971 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500972 )
973
Paul Kehrerf22f6122015-08-05 12:57:13 +0100974 @pytest.mark.requires_backend_interface(interface=RSABackend)
975 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500976 def test_no_subject_key_identifier(self, backend):
977 cert = _load_cert(
978 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
979 x509.load_pem_x509_certificate,
980 backend
981 )
982 with pytest.raises(x509.ExtensionNotFound):
983 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500984 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500985 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500986
Paul Kehrerf22f6122015-08-05 12:57:13 +0100987 @pytest.mark.requires_backend_interface(interface=RSABackend)
988 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100989 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100990 cert = _load_cert(
991 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
992 x509.load_der_x509_certificate,
993 backend
994 )
995 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500996 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +0100997 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100998 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +0100999 cert.public_key()
1000 )
1001 assert ext.value == ski
1002
1003 @pytest.mark.requires_backend_interface(interface=DSABackend)
1004 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001005 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001006 cert = _load_cert(
1007 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1008 x509.load_pem_x509_certificate,
1009 backend
1010 )
1011
1012 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001013 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001014 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001015 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001016 cert.public_key()
1017 )
1018 assert ext.value == ski
1019
1020 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1021 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001022 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001023 _skip_curve_unsupported(backend, ec.SECP384R1())
1024 cert = _load_cert(
1025 os.path.join("x509", "ecdsa_root.pem"),
1026 x509.load_pem_x509_certificate,
1027 backend
1028 )
1029
1030 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001031 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001032 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001033 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001034 cert.public_key()
1035 )
1036 assert ext.value == ski
1037
Paul Kehrer5508ee22015-04-02 19:31:03 -05001038
1039@pytest.mark.requires_backend_interface(interface=RSABackend)
1040@pytest.mark.requires_backend_interface(interface=X509Backend)
1041class TestKeyUsageExtension(object):
1042 def test_no_key_usage(self, backend):
1043 cert = _load_cert(
1044 os.path.join("x509", "verisign_md2_root.pem"),
1045 x509.load_pem_x509_certificate,
1046 backend
1047 )
1048 ext = cert.extensions
1049 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001050 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001051
Paul Kehrerd44e4132015-08-10 19:13:13 -05001052 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001053
1054 def test_all_purposes(self, backend):
1055 cert = _load_cert(
1056 os.path.join(
1057 "x509", "custom", "all_key_usages.pem"
1058 ),
1059 x509.load_pem_x509_certificate,
1060 backend
1061 )
1062 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001063 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001064 assert ext is not None
1065
1066 ku = ext.value
1067 assert ku.digital_signature is True
1068 assert ku.content_commitment is True
1069 assert ku.key_encipherment is True
1070 assert ku.data_encipherment is True
1071 assert ku.key_agreement is True
1072 assert ku.key_cert_sign is True
1073 assert ku.crl_sign is True
1074 assert ku.encipher_only is True
1075 assert ku.decipher_only is True
1076
1077 def test_key_cert_sign_crl_sign(self, backend):
1078 cert = _load_cert(
1079 os.path.join(
1080 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1081 ),
1082 x509.load_der_x509_certificate,
1083 backend
1084 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001085 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001086 assert ext is not None
1087 assert ext.critical is True
1088
1089 ku = ext.value
1090 assert ku.digital_signature is False
1091 assert ku.content_commitment is False
1092 assert ku.key_encipherment is False
1093 assert ku.data_encipherment is False
1094 assert ku.key_agreement is False
1095 assert ku.key_cert_sign is True
1096 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001097
1098
1099@pytest.mark.parametrize(
1100 "name", [
1101 x509.RFC822Name,
1102 x509.DNSName,
1103 x509.UniformResourceIdentifier
1104 ]
1105)
1106class TestTextGeneralNames(object):
1107 def test_not_text(self, name):
1108 with pytest.raises(TypeError):
1109 name(b"notaunicodestring")
1110
1111 with pytest.raises(TypeError):
1112 name(1.3)
1113
1114 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301115 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001116 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1117
1118 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301119 gn = name(u"string")
1120 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001121 assert gn == gn2
1122
1123 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301124 gn = name(u"string")
1125 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001126 assert gn != gn2
1127 assert gn != object()
1128
1129
1130class TestDirectoryName(object):
1131 def test_not_name(self):
1132 with pytest.raises(TypeError):
1133 x509.DirectoryName(b"notaname")
1134
1135 with pytest.raises(TypeError):
1136 x509.DirectoryName(1.3)
1137
1138 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001139 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001140 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001141 if six.PY3:
1142 assert repr(gn) == (
1143 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1144 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1145 ">])>)>"
1146 )
1147 else:
1148 assert repr(gn) == (
1149 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1150 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1151 ")>])>)>"
1152 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001153
1154 def test_eq(self):
1155 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001156 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001157 ])
1158 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001159 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001160 ])
1161 gn = x509.DirectoryName(x509.Name([name]))
1162 gn2 = x509.DirectoryName(x509.Name([name2]))
1163 assert gn == gn2
1164
1165 def test_ne(self):
1166 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001167 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001168 ])
1169 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001170 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001171 ])
1172 gn = x509.DirectoryName(x509.Name([name]))
1173 gn2 = x509.DirectoryName(x509.Name([name2]))
1174 assert gn != gn2
1175 assert gn != object()
1176
1177
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001178class TestRFC822Name(object):
1179 def test_invalid_email(self):
1180 with pytest.raises(ValueError):
1181 x509.RFC822Name(u"Name <email>")
1182
1183 with pytest.raises(ValueError):
1184 x509.RFC822Name(u"")
1185
1186 def test_single_label(self):
1187 gn = x509.RFC822Name(u"administrator")
1188 assert gn.value == u"administrator"
1189
1190 def test_idna(self):
1191 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1192 assert gn.value == u"email@em\xe5\xefl.com"
1193 assert gn._encoded == b"email@xn--eml-vla4c.com"
1194
1195
Paul Kehrere28d6c42015-07-12 14:59:37 -05001196class TestUniformResourceIdentifier(object):
1197 def test_no_parsed_hostname(self):
1198 gn = x509.UniformResourceIdentifier(u"singlelabel")
1199 assert gn.value == u"singlelabel"
1200
1201 def test_with_port(self):
1202 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1203 assert gn.value == u"singlelabel:443/test"
1204
1205 def test_idna_no_port(self):
1206 gn = x509.UniformResourceIdentifier(
1207 u"http://\u043f\u044b\u043a\u0430.cryptography"
1208 )
1209 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1210 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1211
1212 def test_idna_with_port(self):
1213 gn = x509.UniformResourceIdentifier(
1214 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1215 )
1216 assert gn.value == (
1217 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1218 )
1219 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1220
1221 def test_query_and_fragment(self):
1222 gn = x509.UniformResourceIdentifier(
1223 u"ldap://cryptography:90/path?query=true#somedata"
1224 )
1225 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1226
1227
Paul Kehrer31bdf792015-03-25 14:11:00 -05001228class TestRegisteredID(object):
1229 def test_not_oid(self):
1230 with pytest.raises(TypeError):
1231 x509.RegisteredID(b"notanoid")
1232
1233 with pytest.raises(TypeError):
1234 x509.RegisteredID(1.3)
1235
1236 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001237 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001238 assert repr(gn) == (
1239 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1240 "e)>)>"
1241 )
1242
1243 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001244 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1245 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001246 assert gn == gn2
1247
1248 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001249 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001250 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001251 assert gn != gn2
1252 assert gn != object()
1253
1254
1255class TestIPAddress(object):
1256 def test_not_ipaddress(self):
1257 with pytest.raises(TypeError):
1258 x509.IPAddress(b"notanipaddress")
1259
1260 with pytest.raises(TypeError):
1261 x509.IPAddress(1.3)
1262
1263 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301264 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001265 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1266
Eeshan Gargf1234152015-04-29 18:41:00 +05301267 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001268 assert repr(gn2) == "<IPAddress(value=ff::)>"
1269
Paul Kehrereb177932015-05-17 18:33:33 -07001270 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1271 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1272
1273 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1274 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1275
Paul Kehrer31bdf792015-03-25 14:11:00 -05001276 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301277 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1278 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001279 assert gn == gn2
1280
1281 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301282 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1283 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001284 assert gn != gn2
1285 assert gn != object()
1286
1287
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001288class TestOtherName(object):
1289 def test_invalid_args(self):
1290 with pytest.raises(TypeError):
1291 x509.OtherName(b"notanobjectidentifier", b"derdata")
1292
1293 with pytest.raises(TypeError):
1294 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1295
1296 def test_repr(self):
1297 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1298 if six.PY3:
1299 assert repr(gn) == (
1300 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1301 "name=Unknown OID)>, value=b'derdata')>"
1302 )
1303 else:
1304 assert repr(gn) == (
1305 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1306 "name=Unknown OID)>, value='derdata')>"
1307 )
1308
1309 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1310 if six.PY3:
1311 assert repr(gn) == (
1312 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1313 "name=pseudonym)>, value=b'derdata')>"
1314 )
1315 else:
1316 assert repr(gn) == (
1317 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1318 "name=pseudonym)>, value='derdata')>"
1319 )
1320
1321 def test_eq(self):
1322 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1323 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1324 assert gn == gn2
1325
1326 def test_ne(self):
1327 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1328 assert gn != object()
1329
1330 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1331 assert gn != gn2
1332
1333 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1334 assert gn != gn2
1335
1336
Erik Trauschke2dcce902015-05-14 16:12:24 -07001337class TestGeneralNames(object):
1338 def test_get_values_for_type(self):
1339 gns = x509.GeneralNames(
1340 [x509.DNSName(u"cryptography.io")]
1341 )
1342 names = gns.get_values_for_type(x509.DNSName)
1343 assert names == [u"cryptography.io"]
1344
1345 def test_iter_names(self):
1346 gns = x509.GeneralNames([
1347 x509.DNSName(u"cryptography.io"),
1348 x509.DNSName(u"crypto.local"),
1349 ])
1350 assert len(gns) == 2
1351 assert list(gns) == [
1352 x509.DNSName(u"cryptography.io"),
1353 x509.DNSName(u"crypto.local"),
1354 ]
1355
1356 def test_invalid_general_names(self):
1357 with pytest.raises(TypeError):
1358 x509.GeneralNames(
1359 [x509.DNSName(u"cryptography.io"), "invalid"]
1360 )
1361
1362 def test_repr(self):
1363 gns = x509.GeneralNames(
1364 [
1365 x509.DNSName(u"cryptography.io")
1366 ]
1367 )
1368 assert repr(gns) == (
1369 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1370 )
1371
1372 def test_eq(self):
1373 gns = x509.GeneralNames(
1374 [x509.DNSName(u"cryptography.io")]
1375 )
1376 gns2 = x509.GeneralNames(
1377 [x509.DNSName(u"cryptography.io")]
1378 )
1379 assert gns == gns2
1380
1381 def test_ne(self):
1382 gns = x509.GeneralNames(
1383 [x509.DNSName(u"cryptography.io")]
1384 )
1385 gns2 = x509.GeneralNames(
1386 [x509.RFC822Name(u"admin@cryptography.io")]
1387 )
1388 assert gns != gns2
1389 assert gns != object()
1390
1391
Paul Kehrer99125c92015-06-07 18:37:10 -05001392class TestIssuerAlternativeName(object):
1393 def test_get_values_for_type(self):
1394 san = x509.IssuerAlternativeName(
1395 [x509.DNSName(u"cryptography.io")]
1396 )
1397 names = san.get_values_for_type(x509.DNSName)
1398 assert names == [u"cryptography.io"]
1399
1400 def test_iter_names(self):
1401 san = x509.IssuerAlternativeName([
1402 x509.DNSName(u"cryptography.io"),
1403 x509.DNSName(u"crypto.local"),
1404 ])
1405 assert len(san) == 2
1406 assert list(san) == [
1407 x509.DNSName(u"cryptography.io"),
1408 x509.DNSName(u"crypto.local"),
1409 ]
1410
1411 def test_invalid_general_names(self):
1412 with pytest.raises(TypeError):
1413 x509.IssuerAlternativeName(
1414 [x509.DNSName(u"cryptography.io"), "invalid"]
1415 )
1416
1417 def test_repr(self):
1418 san = x509.IssuerAlternativeName(
1419 [
1420 x509.DNSName(u"cryptography.io")
1421 ]
1422 )
1423 assert repr(san) == (
1424 "<IssuerAlternativeName("
1425 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1426 )
1427
1428 def test_eq(self):
1429 san = x509.IssuerAlternativeName(
1430 [x509.DNSName(u"cryptography.io")]
1431 )
1432 san2 = x509.IssuerAlternativeName(
1433 [x509.DNSName(u"cryptography.io")]
1434 )
1435 assert san == san2
1436
1437 def test_ne(self):
1438 san = x509.IssuerAlternativeName(
1439 [x509.DNSName(u"cryptography.io")]
1440 )
1441 san2 = x509.IssuerAlternativeName(
1442 [x509.RFC822Name(u"admin@cryptography.io")]
1443 )
1444 assert san != san2
1445 assert san != object()
1446
1447
Alex Gaynorf1c17672015-06-20 14:20:20 -04001448@pytest.mark.requires_backend_interface(interface=RSABackend)
1449@pytest.mark.requires_backend_interface(interface=X509Backend)
1450class TestRSAIssuerAlternativeNameExtension(object):
1451 def test_uri(self, backend):
1452 cert = _load_cert(
1453 os.path.join("x509", "custom", "ian_uri.pem"),
1454 x509.load_pem_x509_certificate,
1455 backend,
1456 )
1457 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001458 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001459 )
1460 assert list(ext.value) == [
1461 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1462 ]
1463
1464
Paul Kehrer31bdf792015-03-25 14:11:00 -05001465class TestSubjectAlternativeName(object):
1466 def test_get_values_for_type(self):
1467 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301468 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001469 )
1470 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301471 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001472
1473 def test_iter_names(self):
1474 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301475 x509.DNSName(u"cryptography.io"),
1476 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001477 ])
1478 assert len(san) == 2
1479 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301480 x509.DNSName(u"cryptography.io"),
1481 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001482 ]
1483
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001484 def test_invalid_general_names(self):
1485 with pytest.raises(TypeError):
1486 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301487 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001488 )
1489
Paul Kehrer31bdf792015-03-25 14:11:00 -05001490 def test_repr(self):
1491 san = x509.SubjectAlternativeName(
1492 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301493 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001494 ]
1495 )
1496 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001497 "<SubjectAlternativeName("
1498 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001499 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001500
Paul Kehrer58cc3972015-05-13 10:00:41 -05001501 def test_eq(self):
1502 san = x509.SubjectAlternativeName(
1503 [x509.DNSName(u"cryptography.io")]
1504 )
1505 san2 = x509.SubjectAlternativeName(
1506 [x509.DNSName(u"cryptography.io")]
1507 )
1508 assert san == san2
1509
1510 def test_ne(self):
1511 san = x509.SubjectAlternativeName(
1512 [x509.DNSName(u"cryptography.io")]
1513 )
1514 san2 = x509.SubjectAlternativeName(
1515 [x509.RFC822Name(u"admin@cryptography.io")]
1516 )
1517 assert san != san2
1518 assert san != object()
1519
Paul Kehrer40f83382015-04-20 15:00:16 -05001520
1521@pytest.mark.requires_backend_interface(interface=RSABackend)
1522@pytest.mark.requires_backend_interface(interface=X509Backend)
1523class TestRSASubjectAlternativeNameExtension(object):
1524 def test_dns_name(self, backend):
1525 cert = _load_cert(
1526 os.path.join("x509", "cryptography.io.pem"),
1527 x509.load_pem_x509_certificate,
1528 backend
1529 )
1530 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001531 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001532 )
1533 assert ext is not None
1534 assert ext.critical is False
1535
1536 san = ext.value
1537
1538 dns = san.get_values_for_type(x509.DNSName)
1539 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001540
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001541 def test_wildcard_dns_name(self, backend):
1542 cert = _load_cert(
1543 os.path.join("x509", "wildcard_san.pem"),
1544 x509.load_pem_x509_certificate,
1545 backend
1546 )
1547 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001548 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001549 )
1550
1551 dns = ext.value.get_values_for_type(x509.DNSName)
1552 assert dns == [
1553 u'*.langui.sh',
1554 u'langui.sh',
1555 u'*.saseliminator.com',
1556 u'saseliminator.com'
1557 ]
1558
1559 def test_san_wildcard_idna_dns_name(self, backend):
1560 cert = _load_cert(
1561 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1562 x509.load_pem_x509_certificate,
1563 backend
1564 )
1565 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001566 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001567 )
1568
1569 dns = ext.value.get_values_for_type(x509.DNSName)
1570 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1571
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001572 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001573 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001574 os.path.join("x509", "san_x400address.der"),
1575 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001576 backend
1577 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001578 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001579 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001580
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001581 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001582
1583 def test_registered_id(self, backend):
1584 cert = _load_cert(
1585 os.path.join(
1586 "x509", "custom", "san_registered_id.pem"
1587 ),
1588 x509.load_pem_x509_certificate,
1589 backend
1590 )
1591 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001592 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001593 )
1594 assert ext is not None
1595 assert ext.critical is False
1596
1597 san = ext.value
1598 rid = san.get_values_for_type(x509.RegisteredID)
1599 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001600
1601 def test_uri(self, backend):
1602 cert = _load_cert(
1603 os.path.join(
1604 "x509", "custom", "san_uri_with_port.pem"
1605 ),
1606 x509.load_pem_x509_certificate,
1607 backend
1608 )
1609 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001610 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001611 )
1612 assert ext is not None
1613 uri = ext.value.get_values_for_type(
1614 x509.UniformResourceIdentifier
1615 )
1616 assert uri == [
1617 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1618 u"lo",
1619 u"http://someregulardomain.com",
1620 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001621
1622 def test_ipaddress(self, backend):
1623 cert = _load_cert(
1624 os.path.join(
1625 "x509", "custom", "san_ipaddr.pem"
1626 ),
1627 x509.load_pem_x509_certificate,
1628 backend
1629 )
1630 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001631 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001632 )
1633 assert ext is not None
1634 assert ext.critical is False
1635
1636 san = ext.value
1637
1638 ip = san.get_values_for_type(x509.IPAddress)
1639 assert [
1640 ipaddress.ip_address(u"127.0.0.1"),
1641 ipaddress.ip_address(u"ff::")
1642 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001643
1644 def test_dirname(self, backend):
1645 cert = _load_cert(
1646 os.path.join(
1647 "x509", "custom", "san_dirname.pem"
1648 ),
1649 x509.load_pem_x509_certificate,
1650 backend
1651 )
1652 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001653 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001654 )
1655 assert ext is not None
1656 assert ext.critical is False
1657
1658 san = ext.value
1659
1660 dirname = san.get_values_for_type(x509.DirectoryName)
1661 assert [
1662 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001663 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1664 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1665 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001666 ])
1667 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001668
1669 def test_rfc822name(self, backend):
1670 cert = _load_cert(
1671 os.path.join(
1672 "x509", "custom", "san_rfc822_idna.pem"
1673 ),
1674 x509.load_pem_x509_certificate,
1675 backend
1676 )
1677 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001678 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001679 )
1680 assert ext is not None
1681 assert ext.critical is False
1682
1683 san = ext.value
1684
1685 rfc822name = san.get_values_for_type(x509.RFC822Name)
1686 assert [u"email@em\xe5\xefl.com"] == rfc822name
1687
Paul Kehrerb8968812015-05-15 09:01:34 -07001688 def test_idna2003_invalid(self, backend):
1689 cert = _load_cert(
1690 os.path.join(
1691 "x509", "custom", "san_idna2003_dnsname.pem"
1692 ),
1693 x509.load_pem_x509_certificate,
1694 backend
1695 )
1696 with pytest.raises(UnicodeError):
1697 cert.extensions
1698
Paul Kehrere06cab42015-04-30 10:23:33 -05001699 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1700 cert = _load_cert(
1701 os.path.join(
1702 "x509", "custom", "san_idna_names.pem"
1703 ),
1704 x509.load_pem_x509_certificate,
1705 backend
1706 )
1707 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001708 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001709 )
1710 assert ext is not None
1711 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1712 dns_name = ext.value.get_values_for_type(x509.DNSName)
1713 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1714 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1715 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1716 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1717
1718 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1719 cert = _load_cert(
1720 os.path.join(
1721 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1722 ),
1723 x509.load_pem_x509_certificate,
1724 backend
1725 )
1726 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001727 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001728 )
1729 assert ext is not None
1730 assert ext.critical is False
1731
1732 san = ext.value
1733
1734 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1735 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1736 dns = san.get_values_for_type(x509.DNSName)
1737 ip = san.get_values_for_type(x509.IPAddress)
1738 dirname = san.get_values_for_type(x509.DirectoryName)
1739 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001740 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001741 assert [u"cryptography.io"] == dns
1742 assert [
1743 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001744 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001745 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001746 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001747 ),
1748 ])
1749 ] == dirname
1750 assert [
1751 ipaddress.ip_address(u"127.0.0.1"),
1752 ipaddress.ip_address(u"ff::")
1753 ] == ip
1754
1755 def test_invalid_rfc822name(self, backend):
1756 cert = _load_cert(
1757 os.path.join(
1758 "x509", "custom", "san_rfc822_names.pem"
1759 ),
1760 x509.load_pem_x509_certificate,
1761 backend
1762 )
1763 with pytest.raises(ValueError) as exc:
1764 cert.extensions
1765
1766 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001767
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001768 def test_other_name(self, backend):
1769 cert = _load_cert(
1770 os.path.join(
1771 "x509", "custom", "san_other_name.pem"
1772 ),
1773 x509.load_pem_x509_certificate,
1774 backend
1775 )
1776
1777 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001778 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001779 )
1780 assert ext is not None
1781 assert ext.critical is False
1782
Joshua Taubererd2afad32015-07-06 22:37:53 +00001783 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1784 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001785 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001786 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001787
1788 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001789 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001790
Paul Kehrer94c69602015-05-02 19:29:40 -05001791
1792@pytest.mark.requires_backend_interface(interface=RSABackend)
1793@pytest.mark.requires_backend_interface(interface=X509Backend)
1794class TestExtendedKeyUsageExtension(object):
1795 def test_eku(self, backend):
1796 cert = _load_cert(
1797 os.path.join(
1798 "x509", "custom", "extended_key_usage.pem"
1799 ),
1800 x509.load_pem_x509_certificate,
1801 backend
1802 )
1803 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001804 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001805 )
1806 assert ext is not None
1807 assert ext.critical is False
1808
1809 assert [
1810 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1811 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1812 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1813 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1814 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1815 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1816 x509.ObjectIdentifier("2.5.29.37.0"),
1817 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1818 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001819
1820
1821class TestAccessDescription(object):
1822 def test_invalid_access_method(self):
Paul Kehrerf506bca2015-05-02 22:31:47 -05001823 with pytest.raises(ValueError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001824 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1825
1826 def test_invalid_access_location(self):
1827 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001828 x509.AccessDescription(
1829 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1830 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001831
1832 def test_repr(self):
1833 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001834 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001835 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1836 )
1837 assert repr(ad) == (
1838 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1839 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1840 "(value=http://ocsp.domain.com)>)>"
1841 )
1842
1843 def test_eq(self):
1844 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001845 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001846 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1847 )
1848 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001849 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001850 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1851 )
1852 assert ad == ad2
1853
1854 def test_ne(self):
1855 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001856 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001857 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1858 )
1859 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001860 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001861 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1862 )
1863 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001864 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001865 x509.UniformResourceIdentifier(u"http://notthesame")
1866 )
1867 assert ad != ad2
1868 assert ad != ad3
1869 assert ad != object()
1870
1871
1872class TestAuthorityInformationAccess(object):
1873 def test_invalid_descriptions(self):
1874 with pytest.raises(TypeError):
1875 x509.AuthorityInformationAccess(["notanAccessDescription"])
1876
1877 def test_iter_len(self):
1878 aia = x509.AuthorityInformationAccess([
1879 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001880 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001881 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1882 ),
1883 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001884 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001885 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1886 )
1887 ])
1888 assert len(aia) == 2
1889 assert list(aia) == [
1890 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001891 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001892 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1893 ),
1894 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001895 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001896 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1897 )
1898 ]
1899
1900 def test_repr(self):
1901 aia = x509.AuthorityInformationAccess([
1902 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001903 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001904 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1905 ),
1906 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001907 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001908 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1909 )
1910 ])
1911 assert repr(aia) == (
1912 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1913 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1914 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1915 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1916 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1917 "fier(value=http://domain.com/ca.crt)>)>])>"
1918 )
1919
1920 def test_eq(self):
1921 aia = x509.AuthorityInformationAccess([
1922 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001923 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001924 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1925 ),
1926 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001927 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001928 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1929 )
1930 ])
1931 aia2 = x509.AuthorityInformationAccess([
1932 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001933 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001934 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1935 ),
1936 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001937 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001938 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1939 )
1940 ])
1941 assert aia == aia2
1942
1943 def test_ne(self):
1944 aia = x509.AuthorityInformationAccess([
1945 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001946 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001947 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1948 ),
1949 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001950 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001951 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1952 )
1953 ])
1954 aia2 = x509.AuthorityInformationAccess([
1955 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001956 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001957 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1958 ),
1959 ])
1960
1961 assert aia != aia2
1962 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001963
1964
1965@pytest.mark.requires_backend_interface(interface=RSABackend)
1966@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001967class TestAuthorityInformationAccessExtension(object):
1968 def test_aia_ocsp_ca_issuers(self, backend):
1969 cert = _load_cert(
1970 os.path.join("x509", "cryptography.io.pem"),
1971 x509.load_pem_x509_certificate,
1972 backend
1973 )
1974 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001975 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001976 )
1977 assert ext is not None
1978 assert ext.critical is False
1979
1980 assert ext.value == x509.AuthorityInformationAccess([
1981 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001982 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001983 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
1984 ),
1985 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001986 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05001987 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
1988 ),
1989 ])
1990
1991 def test_aia_multiple_ocsp_ca_issuers(self, backend):
1992 cert = _load_cert(
1993 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
1994 x509.load_pem_x509_certificate,
1995 backend
1996 )
1997 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001998 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001999 )
2000 assert ext is not None
2001 assert ext.critical is False
2002
2003 assert ext.value == x509.AuthorityInformationAccess([
2004 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002005 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002006 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2007 ),
2008 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002009 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002010 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2011 ),
2012 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002013 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002014 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002015 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2016 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002017 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002018 ]))
2019 ),
2020 ])
2021
2022 def test_aia_ocsp_only(self, backend):
2023 cert = _load_cert(
2024 os.path.join("x509", "custom", "aia_ocsp.pem"),
2025 x509.load_pem_x509_certificate,
2026 backend
2027 )
2028 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002029 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002030 )
2031 assert ext is not None
2032 assert ext.critical is False
2033
2034 assert ext.value == x509.AuthorityInformationAccess([
2035 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002036 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002037 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2038 ),
2039 ])
2040
2041 def test_aia_ca_issuers_only(self, backend):
2042 cert = _load_cert(
2043 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2044 x509.load_pem_x509_certificate,
2045 backend
2046 )
2047 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002048 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002049 )
2050 assert ext is not None
2051 assert ext.critical is False
2052
2053 assert ext.value == x509.AuthorityInformationAccess([
2054 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002055 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002056 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002057 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2058 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002059 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002060 ]))
2061 ),
2062 ])
2063
2064
2065@pytest.mark.requires_backend_interface(interface=RSABackend)
2066@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002067class TestAuthorityKeyIdentifierExtension(object):
2068 def test_aki_keyid(self, backend):
2069 cert = _load_cert(
2070 os.path.join(
2071 "x509", "cryptography.io.pem"
2072 ),
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_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002078 )
2079 assert ext is not None
2080 assert ext.critical is False
2081
2082 assert ext.value.key_identifier == (
2083 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2084 )
2085 assert ext.value.authority_cert_issuer is None
2086 assert ext.value.authority_cert_serial_number is None
2087
2088 def test_aki_all_fields(self, backend):
2089 cert = _load_cert(
2090 os.path.join(
2091 "x509", "custom", "authority_key_identifier.pem"
2092 ),
2093 x509.load_pem_x509_certificate,
2094 backend
2095 )
2096 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002097 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002098 )
2099 assert ext is not None
2100 assert ext.critical is False
2101
2102 assert ext.value.key_identifier == (
2103 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2104 )
2105 assert ext.value.authority_cert_issuer == [
2106 x509.DirectoryName(
2107 x509.Name([
2108 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002109 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002110 ),
2111 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002112 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002113 )
2114 ])
2115 )
2116 ]
2117 assert ext.value.authority_cert_serial_number == 3
2118
2119 def test_aki_no_keyid(self, backend):
2120 cert = _load_cert(
2121 os.path.join(
2122 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2123 ),
2124 x509.load_pem_x509_certificate,
2125 backend
2126 )
2127 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002128 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002129 )
2130 assert ext is not None
2131 assert ext.critical is False
2132
2133 assert ext.value.key_identifier is None
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
Paul Kehrer5a485522015-05-06 00:29:12 -05002147
Paul Kehrer253929a2015-08-05 17:30:39 +01002148 def test_from_certificate(self, backend):
2149 issuer_cert = _load_cert(
2150 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2151 x509.load_pem_x509_certificate,
2152 backend
2153 )
2154 cert = _load_cert(
2155 os.path.join("x509", "cryptography.io.pem"),
2156 x509.load_pem_x509_certificate,
2157 backend
2158 )
2159 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002160 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002161 )
2162 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2163 issuer_cert.public_key()
2164 )
2165 assert ext.value == aki
2166
Paul Kehrer5a485522015-05-06 00:29:12 -05002167
Paul Kehrere0017be2015-05-17 20:39:40 -06002168class TestNameConstraints(object):
2169 def test_ipaddress_wrong_type(self):
2170 with pytest.raises(TypeError):
2171 x509.NameConstraints(
2172 permitted_subtrees=[
2173 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2174 ],
2175 excluded_subtrees=None
2176 )
2177
2178 with pytest.raises(TypeError):
2179 x509.NameConstraints(
2180 permitted_subtrees=None,
2181 excluded_subtrees=[
2182 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2183 ]
2184 )
2185
2186 def test_ipaddress_allowed_type(self):
2187 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2188 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2189 nc = x509.NameConstraints(
2190 permitted_subtrees=permitted,
2191 excluded_subtrees=excluded
2192 )
2193 assert nc.permitted_subtrees == permitted
2194 assert nc.excluded_subtrees == excluded
2195
2196 def test_invalid_permitted_subtrees(self):
2197 with pytest.raises(TypeError):
2198 x509.NameConstraints("badpermitted", None)
2199
2200 def test_invalid_excluded_subtrees(self):
2201 with pytest.raises(TypeError):
2202 x509.NameConstraints(None, "badexcluded")
2203
2204 def test_no_subtrees(self):
2205 with pytest.raises(ValueError):
2206 x509.NameConstraints(None, None)
2207
2208 def test_permitted_none(self):
2209 excluded = [x509.DNSName(u"name.local")]
2210 nc = x509.NameConstraints(
2211 permitted_subtrees=None, excluded_subtrees=excluded
2212 )
2213 assert nc.permitted_subtrees is None
2214 assert nc.excluded_subtrees is not None
2215
2216 def test_excluded_none(self):
2217 permitted = [x509.DNSName(u"name.local")]
2218 nc = x509.NameConstraints(
2219 permitted_subtrees=permitted, excluded_subtrees=None
2220 )
2221 assert nc.permitted_subtrees is not None
2222 assert nc.excluded_subtrees is None
2223
2224 def test_repr(self):
2225 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2226 nc = x509.NameConstraints(
2227 permitted_subtrees=permitted,
2228 excluded_subtrees=None
2229 )
2230 assert repr(nc) == (
2231 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2232 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2233 )
2234
Paul Kehrer31894282015-06-21 21:46:41 -05002235 def test_eq(self):
2236 nc = x509.NameConstraints(
2237 permitted_subtrees=[x509.DNSName(u"name.local")],
2238 excluded_subtrees=[x509.DNSName(u"name2.local")]
2239 )
2240 nc2 = x509.NameConstraints(
2241 permitted_subtrees=[x509.DNSName(u"name.local")],
2242 excluded_subtrees=[x509.DNSName(u"name2.local")]
2243 )
2244 assert nc == nc2
2245
2246 def test_ne(self):
2247 nc = x509.NameConstraints(
2248 permitted_subtrees=[x509.DNSName(u"name.local")],
2249 excluded_subtrees=[x509.DNSName(u"name2.local")]
2250 )
2251 nc2 = x509.NameConstraints(
2252 permitted_subtrees=[x509.DNSName(u"name.local")],
2253 excluded_subtrees=None
2254 )
2255 nc3 = x509.NameConstraints(
2256 permitted_subtrees=None,
2257 excluded_subtrees=[x509.DNSName(u"name2.local")]
2258 )
2259
2260 assert nc != nc2
2261 assert nc != nc3
2262 assert nc != object()
2263
Paul Kehrere0017be2015-05-17 20:39:40 -06002264
Paul Kehrer870d7e82015-06-21 22:20:44 -05002265@pytest.mark.requires_backend_interface(interface=RSABackend)
2266@pytest.mark.requires_backend_interface(interface=X509Backend)
2267class TestNameConstraintsExtension(object):
2268 def test_permitted_excluded(self, backend):
2269 cert = _load_cert(
2270 os.path.join(
2271 "x509", "custom", "nc_permitted_excluded_2.pem"
2272 ),
2273 x509.load_pem_x509_certificate,
2274 backend
2275 )
2276 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002277 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002278 ).value
2279 assert nc == x509.NameConstraints(
2280 permitted_subtrees=[
2281 x509.DNSName(u"zombo.local"),
2282 ],
2283 excluded_subtrees=[
2284 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002285 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002286 ]))
2287 ]
2288 )
2289
2290 def test_permitted(self, backend):
2291 cert = _load_cert(
2292 os.path.join(
2293 "x509", "custom", "nc_permitted_2.pem"
2294 ),
2295 x509.load_pem_x509_certificate,
2296 backend
2297 )
2298 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002299 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002300 ).value
2301 assert nc == x509.NameConstraints(
2302 permitted_subtrees=[
2303 x509.DNSName(u"zombo.local"),
2304 ],
2305 excluded_subtrees=None
2306 )
2307
Paul Kehrer42376832015-07-01 18:10:32 -05002308 def test_permitted_with_leading_period(self, backend):
2309 cert = _load_cert(
2310 os.path.join(
2311 "x509", "custom", "nc_permitted.pem"
2312 ),
2313 x509.load_pem_x509_certificate,
2314 backend
2315 )
2316 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002317 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002318 ).value
2319 assert nc == x509.NameConstraints(
2320 permitted_subtrees=[
2321 x509.DNSName(u".cryptography.io"),
2322 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2323 ],
2324 excluded_subtrees=None
2325 )
2326
2327 def test_excluded_with_leading_period(self, backend):
2328 cert = _load_cert(
2329 os.path.join(
2330 "x509", "custom", "nc_excluded.pem"
2331 ),
2332 x509.load_pem_x509_certificate,
2333 backend
2334 )
2335 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002336 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002337 ).value
2338 assert nc == x509.NameConstraints(
2339 permitted_subtrees=None,
2340 excluded_subtrees=[
2341 x509.DNSName(u".cryptography.io"),
2342 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2343 ]
2344 )
2345
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002346 def test_permitted_excluded_with_ips(self, backend):
2347 cert = _load_cert(
2348 os.path.join(
2349 "x509", "custom", "nc_permitted_excluded.pem"
2350 ),
2351 x509.load_pem_x509_certificate,
2352 backend
2353 )
2354 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002355 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002356 ).value
2357 assert nc == x509.NameConstraints(
2358 permitted_subtrees=[
2359 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2360 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2361 ],
2362 excluded_subtrees=[
2363 x509.DNSName(u".domain.com"),
2364 x509.UniformResourceIdentifier(u"http://test.local"),
2365 ]
2366 )
2367
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002368 def test_single_ip_netmask(self, backend):
2369 cert = _load_cert(
2370 os.path.join(
2371 "x509", "custom", "nc_single_ip_netmask.pem"
2372 ),
2373 x509.load_pem_x509_certificate,
2374 backend
2375 )
2376 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002377 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002378 ).value
2379 assert nc == x509.NameConstraints(
2380 permitted_subtrees=[
2381 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2382 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2383 ],
2384 excluded_subtrees=None
2385 )
2386
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002387 def test_invalid_netmask(self, backend):
2388 cert = _load_cert(
2389 os.path.join(
2390 "x509", "custom", "nc_invalid_ip_netmask.pem"
2391 ),
2392 x509.load_pem_x509_certificate,
2393 backend
2394 )
2395 with pytest.raises(ValueError):
2396 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002397 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002398 )
2399
Paul Kehrer870d7e82015-06-21 22:20:44 -05002400
Paul Kehrer5a485522015-05-06 00:29:12 -05002401class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002402 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002403 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002404 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002405
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002406 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002407 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002408 x509.DistributionPoint(None, "notname", None, None)
2409
2410 def test_distribution_point_full_and_relative_not_none(self):
2411 with pytest.raises(ValueError):
2412 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002413
2414 def test_crl_issuer_not_general_names(self):
2415 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002416 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002417
2418 def test_reason_not_reasonflags(self):
2419 with pytest.raises(TypeError):
2420 x509.DistributionPoint(
2421 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002422 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002423 frozenset(["notreasonflags"]),
2424 None
2425 )
2426
2427 def test_reason_not_frozenset(self):
2428 with pytest.raises(TypeError):
2429 x509.DistributionPoint(
2430 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2431 None,
2432 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002433 None
2434 )
2435
2436 def test_disallowed_reasons(self):
2437 with pytest.raises(ValueError):
2438 x509.DistributionPoint(
2439 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2440 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002441 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002442 None
2443 )
2444
2445 with pytest.raises(ValueError):
2446 x509.DistributionPoint(
2447 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2448 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002449 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002450 None
2451 )
2452
2453 def test_reason_only(self):
2454 with pytest.raises(ValueError):
2455 x509.DistributionPoint(
2456 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002457 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002458 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002459 None
2460 )
2461
2462 def test_eq(self):
2463 dp = x509.DistributionPoint(
2464 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002465 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002466 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002467 [
2468 x509.DirectoryName(
2469 x509.Name([
2470 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002471 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002472 )
2473 ])
2474 )
2475 ],
2476 )
2477 dp2 = x509.DistributionPoint(
2478 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002479 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002480 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002481 [
2482 x509.DirectoryName(
2483 x509.Name([
2484 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002485 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002486 )
2487 ])
2488 )
2489 ],
2490 )
2491 assert dp == dp2
2492
2493 def test_ne(self):
2494 dp = x509.DistributionPoint(
2495 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002496 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002497 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002498 [
2499 x509.DirectoryName(
2500 x509.Name([
2501 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002502 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002503 )
2504 ])
2505 )
2506 ],
2507 )
2508 dp2 = x509.DistributionPoint(
2509 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2510 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002511 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002512 None
2513 )
2514 assert dp != dp2
2515 assert dp != object()
2516
2517 def test_repr(self):
2518 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002519 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002520 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002521 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002522 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002523 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002524 [
2525 x509.DirectoryName(
2526 x509.Name([
2527 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002528 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002529 )
2530 ])
2531 )
2532 ],
2533 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002534 if six.PY3:
2535 assert repr(dp) == (
2536 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2537 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002538 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2539 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2540 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2541 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002542 )
2543 else:
2544 assert repr(dp) == (
2545 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2546 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002547 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2548 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2549 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2550 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002551 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002552
2553
2554class TestCRLDistributionPoints(object):
2555 def test_invalid_distribution_points(self):
2556 with pytest.raises(TypeError):
2557 x509.CRLDistributionPoints(["notadistributionpoint"])
2558
2559 def test_iter_len(self):
2560 cdp = x509.CRLDistributionPoints([
2561 x509.DistributionPoint(
2562 [x509.UniformResourceIdentifier(u"http://domain")],
2563 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002564 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002565 None
2566 ),
2567 x509.DistributionPoint(
2568 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002569 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002570 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002571 x509.ReasonFlags.key_compromise,
2572 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002573 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002574 None
2575 ),
2576 ])
2577 assert len(cdp) == 2
2578 assert list(cdp) == [
2579 x509.DistributionPoint(
2580 [x509.UniformResourceIdentifier(u"http://domain")],
2581 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002582 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002583 None
2584 ),
2585 x509.DistributionPoint(
2586 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002587 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002588 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002589 x509.ReasonFlags.key_compromise,
2590 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002591 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002592 None
2593 ),
2594 ]
2595
2596 def test_repr(self):
2597 cdp = x509.CRLDistributionPoints([
2598 x509.DistributionPoint(
2599 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002600 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002601 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002602 None
2603 ),
2604 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002605 if six.PY3:
2606 assert repr(cdp) == (
2607 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2608 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2609 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2610 "romise'>}), crl_issuer=None)>])>"
2611 )
2612 else:
2613 assert repr(cdp) == (
2614 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2615 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2616 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2617 "romise'>]), crl_issuer=None)>])>"
2618 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002619
2620 def test_eq(self):
2621 cdp = x509.CRLDistributionPoints([
2622 x509.DistributionPoint(
2623 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002624 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002625 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002626 x509.ReasonFlags.key_compromise,
2627 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002628 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002629 [x509.UniformResourceIdentifier(u"uri://thing")],
2630 ),
2631 ])
2632 cdp2 = x509.CRLDistributionPoints([
2633 x509.DistributionPoint(
2634 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002635 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002636 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002637 x509.ReasonFlags.key_compromise,
2638 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002639 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002640 [x509.UniformResourceIdentifier(u"uri://thing")],
2641 ),
2642 ])
2643 assert cdp == cdp2
2644
2645 def test_ne(self):
2646 cdp = x509.CRLDistributionPoints([
2647 x509.DistributionPoint(
2648 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002649 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002650 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002651 x509.ReasonFlags.key_compromise,
2652 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002653 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002654 [x509.UniformResourceIdentifier(u"uri://thing")],
2655 ),
2656 ])
2657 cdp2 = x509.CRLDistributionPoints([
2658 x509.DistributionPoint(
2659 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002660 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002661 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002662 x509.ReasonFlags.key_compromise,
2663 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002664 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002665 [x509.UniformResourceIdentifier(u"uri://thing")],
2666 ),
2667 ])
2668 cdp3 = x509.CRLDistributionPoints([
2669 x509.DistributionPoint(
2670 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002671 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002672 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002673 [x509.UniformResourceIdentifier(u"uri://thing")],
2674 ),
2675 ])
2676 cdp4 = x509.CRLDistributionPoints([
2677 x509.DistributionPoint(
2678 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002679 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002680 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002681 x509.ReasonFlags.key_compromise,
2682 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002683 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002684 [x509.UniformResourceIdentifier(u"uri://thing2")],
2685 ),
2686 ])
2687 assert cdp != cdp2
2688 assert cdp != cdp3
2689 assert cdp != cdp4
2690 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002691
2692
2693@pytest.mark.requires_backend_interface(interface=RSABackend)
2694@pytest.mark.requires_backend_interface(interface=X509Backend)
2695class TestCRLDistributionPointsExtension(object):
2696 def test_fullname_and_crl_issuer(self, backend):
2697 cert = _load_cert(
2698 os.path.join(
2699 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2700 ),
2701 x509.load_der_x509_certificate,
2702 backend
2703 )
2704
2705 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002706 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002707 ).value
2708
2709 assert cdps == x509.CRLDistributionPoints([
2710 x509.DistributionPoint(
2711 full_name=[x509.DirectoryName(
2712 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002713 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002714 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002715 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002716 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002717 ),
2718 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002719 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002720 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002721 ),
2722 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002723 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002724 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002725 ),
2726 ])
2727 )],
2728 relative_name=None,
2729 reasons=None,
2730 crl_issuer=[x509.DirectoryName(
2731 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002732 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002733 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002734 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002735 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002736 ),
2737 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002738 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002739 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002740 ),
2741 ])
2742 )],
2743 )
2744 ])
2745
2746 def test_relativename_and_crl_issuer(self, backend):
2747 cert = _load_cert(
2748 os.path.join(
2749 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2750 ),
2751 x509.load_der_x509_certificate,
2752 backend
2753 )
2754
2755 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002756 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002757 ).value
2758
2759 assert cdps == x509.CRLDistributionPoints([
2760 x509.DistributionPoint(
2761 full_name=None,
2762 relative_name=x509.Name([
2763 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002764 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002765 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002766 ),
2767 ]),
2768 reasons=None,
2769 crl_issuer=[x509.DirectoryName(
2770 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002771 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002772 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002773 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002774 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002775 ),
2776 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002777 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002778 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002779 ),
2780 ])
2781 )],
2782 )
2783 ])
2784
2785 def test_fullname_crl_issuer_reasons(self, backend):
2786 cert = _load_cert(
2787 os.path.join(
2788 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2789 ),
2790 x509.load_pem_x509_certificate,
2791 backend
2792 )
2793
2794 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002795 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002796 ).value
2797
2798 assert cdps == x509.CRLDistributionPoints([
2799 x509.DistributionPoint(
2800 full_name=[x509.UniformResourceIdentifier(
2801 u"http://myhost.com/myca.crl"
2802 )],
2803 relative_name=None,
2804 reasons=frozenset([
2805 x509.ReasonFlags.key_compromise,
2806 x509.ReasonFlags.ca_compromise
2807 ]),
2808 crl_issuer=[x509.DirectoryName(
2809 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002810 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002811 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002812 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002813 ),
2814 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002815 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002816 ),
2817 ])
2818 )],
2819 )
2820 ])
2821
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002822 def test_all_reasons(self, backend):
2823 cert = _load_cert(
2824 os.path.join(
2825 "x509", "custom", "cdp_all_reasons.pem"
2826 ),
2827 x509.load_pem_x509_certificate,
2828 backend
2829 )
2830
2831 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002832 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002833 ).value
2834
2835 assert cdps == x509.CRLDistributionPoints([
2836 x509.DistributionPoint(
2837 full_name=[x509.UniformResourceIdentifier(
2838 u"http://domain.com/some.crl"
2839 )],
2840 relative_name=None,
2841 reasons=frozenset([
2842 x509.ReasonFlags.key_compromise,
2843 x509.ReasonFlags.ca_compromise,
2844 x509.ReasonFlags.affiliation_changed,
2845 x509.ReasonFlags.superseded,
2846 x509.ReasonFlags.privilege_withdrawn,
2847 x509.ReasonFlags.cessation_of_operation,
2848 x509.ReasonFlags.aa_compromise,
2849 x509.ReasonFlags.certificate_hold,
2850 ]),
2851 crl_issuer=None
2852 )
2853 ])
2854
2855 def test_single_reason(self, backend):
2856 cert = _load_cert(
2857 os.path.join(
2858 "x509", "custom", "cdp_reason_aa_compromise.pem"
2859 ),
2860 x509.load_pem_x509_certificate,
2861 backend
2862 )
2863
2864 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002865 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002866 ).value
2867
2868 assert cdps == x509.CRLDistributionPoints([
2869 x509.DistributionPoint(
2870 full_name=[x509.UniformResourceIdentifier(
2871 u"http://domain.com/some.crl"
2872 )],
2873 relative_name=None,
2874 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2875 crl_issuer=None
2876 )
2877 ])
2878
Paul Kehrer9a10d592015-05-10 14:55:51 -05002879 def test_crl_issuer_only(self, backend):
2880 cert = _load_cert(
2881 os.path.join(
2882 "x509", "custom", "cdp_crl_issuer.pem"
2883 ),
2884 x509.load_pem_x509_certificate,
2885 backend
2886 )
2887
2888 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002889 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002890 ).value
2891
2892 assert cdps == x509.CRLDistributionPoints([
2893 x509.DistributionPoint(
2894 full_name=None,
2895 relative_name=None,
2896 reasons=None,
2897 crl_issuer=[x509.DirectoryName(
2898 x509.Name([
2899 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002900 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002901 ),
2902 ])
2903 )],
2904 )
2905 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002906
2907
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002908@pytest.mark.requires_backend_interface(interface=RSABackend)
2909@pytest.mark.requires_backend_interface(interface=X509Backend)
2910class TestOCSPNoCheckExtension(object):
2911 def test_nocheck(self, backend):
2912 cert = _load_cert(
2913 os.path.join(
2914 "x509", "custom", "ocsp_nocheck.pem"
2915 ),
2916 x509.load_pem_x509_certificate,
2917 backend
2918 )
2919 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002920 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002921 )
2922 assert isinstance(ext.value, x509.OCSPNoCheck)
2923
2924
Paul Kehrer16fae762015-05-01 23:14:20 -05002925class TestInhibitAnyPolicy(object):
2926 def test_not_int(self):
2927 with pytest.raises(TypeError):
2928 x509.InhibitAnyPolicy("notint")
2929
2930 def test_negative_int(self):
2931 with pytest.raises(ValueError):
2932 x509.InhibitAnyPolicy(-1)
2933
2934 def test_repr(self):
2935 iap = x509.InhibitAnyPolicy(0)
2936 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2937
2938 def test_eq(self):
2939 iap = x509.InhibitAnyPolicy(1)
2940 iap2 = x509.InhibitAnyPolicy(1)
2941 assert iap == iap2
2942
2943 def test_ne(self):
2944 iap = x509.InhibitAnyPolicy(1)
2945 iap2 = x509.InhibitAnyPolicy(4)
2946 assert iap != iap2
2947 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06002948
2949
2950@pytest.mark.requires_backend_interface(interface=RSABackend)
2951@pytest.mark.requires_backend_interface(interface=X509Backend)
2952class TestInhibitAnyPolicyExtension(object):
2953 def test_nocheck(self, backend):
2954 cert = _load_cert(
2955 os.path.join(
2956 "x509", "custom", "inhibit_any_policy_5.pem"
2957 ),
2958 x509.load_pem_x509_certificate,
2959 backend
2960 )
2961 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002962 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06002963 ).value
2964 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01002965
2966
2967@pytest.mark.requires_backend_interface(interface=RSABackend)
2968@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01002969class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01002970 def test_invalid_certificate_policies_data(self, backend):
2971 cert = _load_cert(
2972 os.path.join(
2973 "x509", "custom", "cp_invalid.pem"
2974 ),
2975 x509.load_pem_x509_certificate,
2976 backend
2977 )
2978 with pytest.raises(ValueError):
2979 cert.extensions