blob: 2c5438a90e6acdf83202321d9b18bde51b257d72 [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
835
836@pytest.mark.requires_backend_interface(interface=RSABackend)
837@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500838class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500839 def test_ca_true_pathlen_6(self, backend):
840 cert = _load_cert(
841 os.path.join(
842 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
843 ),
844 x509.load_der_x509_certificate,
845 backend
846 )
847 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500848 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500849 )
850 assert ext is not None
851 assert ext.critical is True
852 assert ext.value.ca is True
853 assert ext.value.path_length == 6
854
855 def test_path_length_zero(self, backend):
856 cert = _load_cert(
857 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
858 x509.load_pem_x509_certificate,
859 backend
860 )
861 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500862 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500863 )
864 assert ext is not None
865 assert ext.critical is True
866 assert ext.value.ca is True
867 assert ext.value.path_length == 0
868
869 def test_ca_true_no_pathlen(self, backend):
870 cert = _load_cert(
871 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
872 x509.load_der_x509_certificate,
873 backend
874 )
875 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500876 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500877 )
878 assert ext is not None
879 assert ext.critical is True
880 assert ext.value.ca is True
881 assert ext.value.path_length is None
882
883 def test_ca_false(self, backend):
884 cert = _load_cert(
885 os.path.join("x509", "cryptography.io.pem"),
886 x509.load_pem_x509_certificate,
887 backend
888 )
889 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500890 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500891 )
892 assert ext is not None
893 assert ext.critical is True
894 assert ext.value.ca is False
895 assert ext.value.path_length is None
896
897 def test_no_basic_constraints(self, backend):
898 cert = _load_cert(
899 os.path.join(
900 "x509",
901 "PKITS_data",
902 "certs",
903 "ValidCertificatePathTest1EE.crt"
904 ),
905 x509.load_der_x509_certificate,
906 backend
907 )
908 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500909 cert.extensions.get_extension_for_oid(
910 ExtensionOID.BASIC_CONSTRAINTS
911 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500912
913 def test_basic_constraint_not_critical(self, backend):
914 cert = _load_cert(
915 os.path.join(
916 "x509", "custom", "basic_constraints_not_critical.pem"
917 ),
918 x509.load_pem_x509_certificate,
919 backend
920 )
921 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500922 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500923 )
924 assert ext is not None
925 assert ext.critical is False
926 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500927
928
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500929class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100930 @pytest.mark.requires_backend_interface(interface=RSABackend)
931 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500932 def test_subject_key_identifier(self, backend):
933 cert = _load_cert(
934 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
935 x509.load_der_x509_certificate,
936 backend
937 )
938 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500939 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500940 )
941 ski = ext.value
942 assert ext is not None
943 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500944 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500945 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500946 )
947
Paul Kehrerf22f6122015-08-05 12:57:13 +0100948 @pytest.mark.requires_backend_interface(interface=RSABackend)
949 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500950 def test_no_subject_key_identifier(self, backend):
951 cert = _load_cert(
952 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
953 x509.load_pem_x509_certificate,
954 backend
955 )
956 with pytest.raises(x509.ExtensionNotFound):
957 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500958 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500959 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500960
Paul Kehrerf22f6122015-08-05 12:57:13 +0100961 @pytest.mark.requires_backend_interface(interface=RSABackend)
962 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100963 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100964 cert = _load_cert(
965 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
966 x509.load_der_x509_certificate,
967 backend
968 )
969 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500970 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +0100971 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100972 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +0100973 cert.public_key()
974 )
975 assert ext.value == ski
976
977 @pytest.mark.requires_backend_interface(interface=DSABackend)
978 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100979 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100980 cert = _load_cert(
981 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
982 x509.load_pem_x509_certificate,
983 backend
984 )
985
986 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500987 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +0100988 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100989 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +0100990 cert.public_key()
991 )
992 assert ext.value == ski
993
994 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
995 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100996 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100997 _skip_curve_unsupported(backend, ec.SECP384R1())
998 cert = _load_cert(
999 os.path.join("x509", "ecdsa_root.pem"),
1000 x509.load_pem_x509_certificate,
1001 backend
1002 )
1003
1004 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001005 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001006 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001007 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001008 cert.public_key()
1009 )
1010 assert ext.value == ski
1011
Paul Kehrer5508ee22015-04-02 19:31:03 -05001012
1013@pytest.mark.requires_backend_interface(interface=RSABackend)
1014@pytest.mark.requires_backend_interface(interface=X509Backend)
1015class TestKeyUsageExtension(object):
1016 def test_no_key_usage(self, backend):
1017 cert = _load_cert(
1018 os.path.join("x509", "verisign_md2_root.pem"),
1019 x509.load_pem_x509_certificate,
1020 backend
1021 )
1022 ext = cert.extensions
1023 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001024 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001025
Paul Kehrerd44e4132015-08-10 19:13:13 -05001026 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001027
1028 def test_all_purposes(self, backend):
1029 cert = _load_cert(
1030 os.path.join(
1031 "x509", "custom", "all_key_usages.pem"
1032 ),
1033 x509.load_pem_x509_certificate,
1034 backend
1035 )
1036 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001037 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001038 assert ext is not None
1039
1040 ku = ext.value
1041 assert ku.digital_signature is True
1042 assert ku.content_commitment is True
1043 assert ku.key_encipherment is True
1044 assert ku.data_encipherment is True
1045 assert ku.key_agreement is True
1046 assert ku.key_cert_sign is True
1047 assert ku.crl_sign is True
1048 assert ku.encipher_only is True
1049 assert ku.decipher_only is True
1050
1051 def test_key_cert_sign_crl_sign(self, backend):
1052 cert = _load_cert(
1053 os.path.join(
1054 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1055 ),
1056 x509.load_der_x509_certificate,
1057 backend
1058 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001059 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001060 assert ext is not None
1061 assert ext.critical is True
1062
1063 ku = ext.value
1064 assert ku.digital_signature is False
1065 assert ku.content_commitment is False
1066 assert ku.key_encipherment is False
1067 assert ku.data_encipherment is False
1068 assert ku.key_agreement is False
1069 assert ku.key_cert_sign is True
1070 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001071
1072
1073@pytest.mark.parametrize(
1074 "name", [
1075 x509.RFC822Name,
1076 x509.DNSName,
1077 x509.UniformResourceIdentifier
1078 ]
1079)
1080class TestTextGeneralNames(object):
1081 def test_not_text(self, name):
1082 with pytest.raises(TypeError):
1083 name(b"notaunicodestring")
1084
1085 with pytest.raises(TypeError):
1086 name(1.3)
1087
1088 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301089 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001090 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1091
1092 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301093 gn = name(u"string")
1094 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001095 assert gn == gn2
1096
1097 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301098 gn = name(u"string")
1099 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001100 assert gn != gn2
1101 assert gn != object()
1102
1103
1104class TestDirectoryName(object):
1105 def test_not_name(self):
1106 with pytest.raises(TypeError):
1107 x509.DirectoryName(b"notaname")
1108
1109 with pytest.raises(TypeError):
1110 x509.DirectoryName(1.3)
1111
1112 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001113 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001114 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001115 if six.PY3:
1116 assert repr(gn) == (
1117 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1118 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1119 ">])>)>"
1120 )
1121 else:
1122 assert repr(gn) == (
1123 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1124 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1125 ")>])>)>"
1126 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001127
1128 def test_eq(self):
1129 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001130 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001131 ])
1132 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001133 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001134 ])
1135 gn = x509.DirectoryName(x509.Name([name]))
1136 gn2 = x509.DirectoryName(x509.Name([name2]))
1137 assert gn == gn2
1138
1139 def test_ne(self):
1140 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001141 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001142 ])
1143 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001144 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001145 ])
1146 gn = x509.DirectoryName(x509.Name([name]))
1147 gn2 = x509.DirectoryName(x509.Name([name2]))
1148 assert gn != gn2
1149 assert gn != object()
1150
1151
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001152class TestRFC822Name(object):
1153 def test_invalid_email(self):
1154 with pytest.raises(ValueError):
1155 x509.RFC822Name(u"Name <email>")
1156
1157 with pytest.raises(ValueError):
1158 x509.RFC822Name(u"")
1159
1160 def test_single_label(self):
1161 gn = x509.RFC822Name(u"administrator")
1162 assert gn.value == u"administrator"
1163
1164 def test_idna(self):
1165 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1166 assert gn.value == u"email@em\xe5\xefl.com"
1167 assert gn._encoded == b"email@xn--eml-vla4c.com"
1168
1169
Paul Kehrere28d6c42015-07-12 14:59:37 -05001170class TestUniformResourceIdentifier(object):
1171 def test_no_parsed_hostname(self):
1172 gn = x509.UniformResourceIdentifier(u"singlelabel")
1173 assert gn.value == u"singlelabel"
1174
1175 def test_with_port(self):
1176 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1177 assert gn.value == u"singlelabel:443/test"
1178
1179 def test_idna_no_port(self):
1180 gn = x509.UniformResourceIdentifier(
1181 u"http://\u043f\u044b\u043a\u0430.cryptography"
1182 )
1183 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1184 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1185
1186 def test_idna_with_port(self):
1187 gn = x509.UniformResourceIdentifier(
1188 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1189 )
1190 assert gn.value == (
1191 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1192 )
1193 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1194
1195 def test_query_and_fragment(self):
1196 gn = x509.UniformResourceIdentifier(
1197 u"ldap://cryptography:90/path?query=true#somedata"
1198 )
1199 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1200
1201
Paul Kehrer31bdf792015-03-25 14:11:00 -05001202class TestRegisteredID(object):
1203 def test_not_oid(self):
1204 with pytest.raises(TypeError):
1205 x509.RegisteredID(b"notanoid")
1206
1207 with pytest.raises(TypeError):
1208 x509.RegisteredID(1.3)
1209
1210 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001211 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001212 assert repr(gn) == (
1213 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1214 "e)>)>"
1215 )
1216
1217 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001218 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1219 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001220 assert gn == gn2
1221
1222 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001223 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001224 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001225 assert gn != gn2
1226 assert gn != object()
1227
1228
1229class TestIPAddress(object):
1230 def test_not_ipaddress(self):
1231 with pytest.raises(TypeError):
1232 x509.IPAddress(b"notanipaddress")
1233
1234 with pytest.raises(TypeError):
1235 x509.IPAddress(1.3)
1236
1237 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301238 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001239 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1240
Eeshan Gargf1234152015-04-29 18:41:00 +05301241 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001242 assert repr(gn2) == "<IPAddress(value=ff::)>"
1243
Paul Kehrereb177932015-05-17 18:33:33 -07001244 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1245 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1246
1247 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1248 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1249
Paul Kehrer31bdf792015-03-25 14:11:00 -05001250 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301251 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1252 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001253 assert gn == gn2
1254
1255 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301256 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1257 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001258 assert gn != gn2
1259 assert gn != object()
1260
1261
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001262class TestOtherName(object):
1263 def test_invalid_args(self):
1264 with pytest.raises(TypeError):
1265 x509.OtherName(b"notanobjectidentifier", b"derdata")
1266
1267 with pytest.raises(TypeError):
1268 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1269
1270 def test_repr(self):
1271 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1272 if six.PY3:
1273 assert repr(gn) == (
1274 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1275 "name=Unknown OID)>, value=b'derdata')>"
1276 )
1277 else:
1278 assert repr(gn) == (
1279 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1280 "name=Unknown OID)>, value='derdata')>"
1281 )
1282
1283 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1284 if six.PY3:
1285 assert repr(gn) == (
1286 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1287 "name=pseudonym)>, value=b'derdata')>"
1288 )
1289 else:
1290 assert repr(gn) == (
1291 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1292 "name=pseudonym)>, value='derdata')>"
1293 )
1294
1295 def test_eq(self):
1296 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1297 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1298 assert gn == gn2
1299
1300 def test_ne(self):
1301 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1302 assert gn != object()
1303
1304 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1305 assert gn != gn2
1306
1307 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1308 assert gn != gn2
1309
1310
Erik Trauschke2dcce902015-05-14 16:12:24 -07001311class TestGeneralNames(object):
1312 def test_get_values_for_type(self):
1313 gns = x509.GeneralNames(
1314 [x509.DNSName(u"cryptography.io")]
1315 )
1316 names = gns.get_values_for_type(x509.DNSName)
1317 assert names == [u"cryptography.io"]
1318
1319 def test_iter_names(self):
1320 gns = x509.GeneralNames([
1321 x509.DNSName(u"cryptography.io"),
1322 x509.DNSName(u"crypto.local"),
1323 ])
1324 assert len(gns) == 2
1325 assert list(gns) == [
1326 x509.DNSName(u"cryptography.io"),
1327 x509.DNSName(u"crypto.local"),
1328 ]
1329
1330 def test_invalid_general_names(self):
1331 with pytest.raises(TypeError):
1332 x509.GeneralNames(
1333 [x509.DNSName(u"cryptography.io"), "invalid"]
1334 )
1335
1336 def test_repr(self):
1337 gns = x509.GeneralNames(
1338 [
1339 x509.DNSName(u"cryptography.io")
1340 ]
1341 )
1342 assert repr(gns) == (
1343 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1344 )
1345
1346 def test_eq(self):
1347 gns = x509.GeneralNames(
1348 [x509.DNSName(u"cryptography.io")]
1349 )
1350 gns2 = x509.GeneralNames(
1351 [x509.DNSName(u"cryptography.io")]
1352 )
1353 assert gns == gns2
1354
1355 def test_ne(self):
1356 gns = x509.GeneralNames(
1357 [x509.DNSName(u"cryptography.io")]
1358 )
1359 gns2 = x509.GeneralNames(
1360 [x509.RFC822Name(u"admin@cryptography.io")]
1361 )
1362 assert gns != gns2
1363 assert gns != object()
1364
1365
Paul Kehrer99125c92015-06-07 18:37:10 -05001366class TestIssuerAlternativeName(object):
1367 def test_get_values_for_type(self):
1368 san = x509.IssuerAlternativeName(
1369 [x509.DNSName(u"cryptography.io")]
1370 )
1371 names = san.get_values_for_type(x509.DNSName)
1372 assert names == [u"cryptography.io"]
1373
1374 def test_iter_names(self):
1375 san = x509.IssuerAlternativeName([
1376 x509.DNSName(u"cryptography.io"),
1377 x509.DNSName(u"crypto.local"),
1378 ])
1379 assert len(san) == 2
1380 assert list(san) == [
1381 x509.DNSName(u"cryptography.io"),
1382 x509.DNSName(u"crypto.local"),
1383 ]
1384
1385 def test_invalid_general_names(self):
1386 with pytest.raises(TypeError):
1387 x509.IssuerAlternativeName(
1388 [x509.DNSName(u"cryptography.io"), "invalid"]
1389 )
1390
1391 def test_repr(self):
1392 san = x509.IssuerAlternativeName(
1393 [
1394 x509.DNSName(u"cryptography.io")
1395 ]
1396 )
1397 assert repr(san) == (
1398 "<IssuerAlternativeName("
1399 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1400 )
1401
1402 def test_eq(self):
1403 san = x509.IssuerAlternativeName(
1404 [x509.DNSName(u"cryptography.io")]
1405 )
1406 san2 = x509.IssuerAlternativeName(
1407 [x509.DNSName(u"cryptography.io")]
1408 )
1409 assert san == san2
1410
1411 def test_ne(self):
1412 san = x509.IssuerAlternativeName(
1413 [x509.DNSName(u"cryptography.io")]
1414 )
1415 san2 = x509.IssuerAlternativeName(
1416 [x509.RFC822Name(u"admin@cryptography.io")]
1417 )
1418 assert san != san2
1419 assert san != object()
1420
1421
Alex Gaynorf1c17672015-06-20 14:20:20 -04001422@pytest.mark.requires_backend_interface(interface=RSABackend)
1423@pytest.mark.requires_backend_interface(interface=X509Backend)
1424class TestRSAIssuerAlternativeNameExtension(object):
1425 def test_uri(self, backend):
1426 cert = _load_cert(
1427 os.path.join("x509", "custom", "ian_uri.pem"),
1428 x509.load_pem_x509_certificate,
1429 backend,
1430 )
1431 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001432 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001433 )
1434 assert list(ext.value) == [
1435 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1436 ]
1437
1438
Paul Kehrer31bdf792015-03-25 14:11:00 -05001439class TestSubjectAlternativeName(object):
1440 def test_get_values_for_type(self):
1441 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301442 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001443 )
1444 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301445 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001446
1447 def test_iter_names(self):
1448 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301449 x509.DNSName(u"cryptography.io"),
1450 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001451 ])
1452 assert len(san) == 2
1453 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301454 x509.DNSName(u"cryptography.io"),
1455 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001456 ]
1457
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001458 def test_invalid_general_names(self):
1459 with pytest.raises(TypeError):
1460 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301461 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001462 )
1463
Paul Kehrer31bdf792015-03-25 14:11:00 -05001464 def test_repr(self):
1465 san = x509.SubjectAlternativeName(
1466 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301467 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001468 ]
1469 )
1470 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001471 "<SubjectAlternativeName("
1472 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001473 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001474
Paul Kehrer58cc3972015-05-13 10:00:41 -05001475 def test_eq(self):
1476 san = x509.SubjectAlternativeName(
1477 [x509.DNSName(u"cryptography.io")]
1478 )
1479 san2 = x509.SubjectAlternativeName(
1480 [x509.DNSName(u"cryptography.io")]
1481 )
1482 assert san == san2
1483
1484 def test_ne(self):
1485 san = x509.SubjectAlternativeName(
1486 [x509.DNSName(u"cryptography.io")]
1487 )
1488 san2 = x509.SubjectAlternativeName(
1489 [x509.RFC822Name(u"admin@cryptography.io")]
1490 )
1491 assert san != san2
1492 assert san != object()
1493
Paul Kehrer40f83382015-04-20 15:00:16 -05001494
1495@pytest.mark.requires_backend_interface(interface=RSABackend)
1496@pytest.mark.requires_backend_interface(interface=X509Backend)
1497class TestRSASubjectAlternativeNameExtension(object):
1498 def test_dns_name(self, backend):
1499 cert = _load_cert(
1500 os.path.join("x509", "cryptography.io.pem"),
1501 x509.load_pem_x509_certificate,
1502 backend
1503 )
1504 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001505 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001506 )
1507 assert ext is not None
1508 assert ext.critical is False
1509
1510 san = ext.value
1511
1512 dns = san.get_values_for_type(x509.DNSName)
1513 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001514
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001515 def test_wildcard_dns_name(self, backend):
1516 cert = _load_cert(
1517 os.path.join("x509", "wildcard_san.pem"),
1518 x509.load_pem_x509_certificate,
1519 backend
1520 )
1521 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001522 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001523 )
1524
1525 dns = ext.value.get_values_for_type(x509.DNSName)
1526 assert dns == [
1527 u'*.langui.sh',
1528 u'langui.sh',
1529 u'*.saseliminator.com',
1530 u'saseliminator.com'
1531 ]
1532
1533 def test_san_wildcard_idna_dns_name(self, backend):
1534 cert = _load_cert(
1535 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1536 x509.load_pem_x509_certificate,
1537 backend
1538 )
1539 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001540 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001541 )
1542
1543 dns = ext.value.get_values_for_type(x509.DNSName)
1544 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1545
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001546 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001547 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001548 os.path.join("x509", "san_x400address.der"),
1549 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001550 backend
1551 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001552 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001553 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001554
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001555 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001556
1557 def test_registered_id(self, backend):
1558 cert = _load_cert(
1559 os.path.join(
1560 "x509", "custom", "san_registered_id.pem"
1561 ),
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 Kehrer4db96622015-04-20 22:17:39 -05001567 )
1568 assert ext is not None
1569 assert ext.critical is False
1570
1571 san = ext.value
1572 rid = san.get_values_for_type(x509.RegisteredID)
1573 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001574
1575 def test_uri(self, backend):
1576 cert = _load_cert(
1577 os.path.join(
1578 "x509", "custom", "san_uri_with_port.pem"
1579 ),
1580 x509.load_pem_x509_certificate,
1581 backend
1582 )
1583 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001584 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001585 )
1586 assert ext is not None
1587 uri = ext.value.get_values_for_type(
1588 x509.UniformResourceIdentifier
1589 )
1590 assert uri == [
1591 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1592 u"lo",
1593 u"http://someregulardomain.com",
1594 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001595
1596 def test_ipaddress(self, backend):
1597 cert = _load_cert(
1598 os.path.join(
1599 "x509", "custom", "san_ipaddr.pem"
1600 ),
1601 x509.load_pem_x509_certificate,
1602 backend
1603 )
1604 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001605 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001606 )
1607 assert ext is not None
1608 assert ext.critical is False
1609
1610 san = ext.value
1611
1612 ip = san.get_values_for_type(x509.IPAddress)
1613 assert [
1614 ipaddress.ip_address(u"127.0.0.1"),
1615 ipaddress.ip_address(u"ff::")
1616 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001617
1618 def test_dirname(self, backend):
1619 cert = _load_cert(
1620 os.path.join(
1621 "x509", "custom", "san_dirname.pem"
1622 ),
1623 x509.load_pem_x509_certificate,
1624 backend
1625 )
1626 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001627 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001628 )
1629 assert ext is not None
1630 assert ext.critical is False
1631
1632 san = ext.value
1633
1634 dirname = san.get_values_for_type(x509.DirectoryName)
1635 assert [
1636 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001637 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1638 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1639 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001640 ])
1641 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001642
1643 def test_rfc822name(self, backend):
1644 cert = _load_cert(
1645 os.path.join(
1646 "x509", "custom", "san_rfc822_idna.pem"
1647 ),
1648 x509.load_pem_x509_certificate,
1649 backend
1650 )
1651 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001652 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001653 )
1654 assert ext is not None
1655 assert ext.critical is False
1656
1657 san = ext.value
1658
1659 rfc822name = san.get_values_for_type(x509.RFC822Name)
1660 assert [u"email@em\xe5\xefl.com"] == rfc822name
1661
Paul Kehrerb8968812015-05-15 09:01:34 -07001662 def test_idna2003_invalid(self, backend):
1663 cert = _load_cert(
1664 os.path.join(
1665 "x509", "custom", "san_idna2003_dnsname.pem"
1666 ),
1667 x509.load_pem_x509_certificate,
1668 backend
1669 )
1670 with pytest.raises(UnicodeError):
1671 cert.extensions
1672
Paul Kehrere06cab42015-04-30 10:23:33 -05001673 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1674 cert = _load_cert(
1675 os.path.join(
1676 "x509", "custom", "san_idna_names.pem"
1677 ),
1678 x509.load_pem_x509_certificate,
1679 backend
1680 )
1681 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001682 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001683 )
1684 assert ext is not None
1685 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1686 dns_name = ext.value.get_values_for_type(x509.DNSName)
1687 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1688 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1689 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1690 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1691
1692 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1693 cert = _load_cert(
1694 os.path.join(
1695 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1696 ),
1697 x509.load_pem_x509_certificate,
1698 backend
1699 )
1700 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001701 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001702 )
1703 assert ext is not None
1704 assert ext.critical is False
1705
1706 san = ext.value
1707
1708 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1709 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1710 dns = san.get_values_for_type(x509.DNSName)
1711 ip = san.get_values_for_type(x509.IPAddress)
1712 dirname = san.get_values_for_type(x509.DirectoryName)
1713 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001714 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001715 assert [u"cryptography.io"] == dns
1716 assert [
1717 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001718 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001719 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001720 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001721 ),
1722 ])
1723 ] == dirname
1724 assert [
1725 ipaddress.ip_address(u"127.0.0.1"),
1726 ipaddress.ip_address(u"ff::")
1727 ] == ip
1728
1729 def test_invalid_rfc822name(self, backend):
1730 cert = _load_cert(
1731 os.path.join(
1732 "x509", "custom", "san_rfc822_names.pem"
1733 ),
1734 x509.load_pem_x509_certificate,
1735 backend
1736 )
1737 with pytest.raises(ValueError) as exc:
1738 cert.extensions
1739
1740 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001741
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001742 def test_other_name(self, backend):
1743 cert = _load_cert(
1744 os.path.join(
1745 "x509", "custom", "san_other_name.pem"
1746 ),
1747 x509.load_pem_x509_certificate,
1748 backend
1749 )
1750
1751 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001752 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001753 )
1754 assert ext is not None
1755 assert ext.critical is False
1756
Joshua Taubererd2afad32015-07-06 22:37:53 +00001757 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1758 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001759 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001760 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001761
1762 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001763 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001764
Paul Kehrer94c69602015-05-02 19:29:40 -05001765
1766@pytest.mark.requires_backend_interface(interface=RSABackend)
1767@pytest.mark.requires_backend_interface(interface=X509Backend)
1768class TestExtendedKeyUsageExtension(object):
1769 def test_eku(self, backend):
1770 cert = _load_cert(
1771 os.path.join(
1772 "x509", "custom", "extended_key_usage.pem"
1773 ),
1774 x509.load_pem_x509_certificate,
1775 backend
1776 )
1777 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001778 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001779 )
1780 assert ext is not None
1781 assert ext.critical is False
1782
1783 assert [
1784 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1785 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1786 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1787 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1788 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1789 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1790 x509.ObjectIdentifier("2.5.29.37.0"),
1791 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1792 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001793
1794
1795class TestAccessDescription(object):
1796 def test_invalid_access_method(self):
Paul Kehrerf506bca2015-05-02 22:31:47 -05001797 with pytest.raises(ValueError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001798 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1799
1800 def test_invalid_access_location(self):
1801 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001802 x509.AccessDescription(
1803 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1804 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001805
1806 def test_repr(self):
1807 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001808 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001809 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1810 )
1811 assert repr(ad) == (
1812 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1813 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1814 "(value=http://ocsp.domain.com)>)>"
1815 )
1816
1817 def test_eq(self):
1818 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001819 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001820 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1821 )
1822 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001823 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001824 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1825 )
1826 assert ad == ad2
1827
1828 def test_ne(self):
1829 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001830 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001831 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1832 )
1833 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001834 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001835 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1836 )
1837 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001838 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001839 x509.UniformResourceIdentifier(u"http://notthesame")
1840 )
1841 assert ad != ad2
1842 assert ad != ad3
1843 assert ad != object()
1844
1845
1846class TestAuthorityInformationAccess(object):
1847 def test_invalid_descriptions(self):
1848 with pytest.raises(TypeError):
1849 x509.AuthorityInformationAccess(["notanAccessDescription"])
1850
1851 def test_iter_len(self):
1852 aia = x509.AuthorityInformationAccess([
1853 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001854 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001855 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1856 ),
1857 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001858 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001859 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1860 )
1861 ])
1862 assert len(aia) == 2
1863 assert list(aia) == [
1864 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001865 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001866 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1867 ),
1868 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001869 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001870 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1871 )
1872 ]
1873
1874 def test_repr(self):
1875 aia = x509.AuthorityInformationAccess([
1876 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001877 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001878 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1879 ),
1880 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001881 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001882 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1883 )
1884 ])
1885 assert repr(aia) == (
1886 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1887 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1888 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1889 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1890 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1891 "fier(value=http://domain.com/ca.crt)>)>])>"
1892 )
1893
1894 def test_eq(self):
1895 aia = x509.AuthorityInformationAccess([
1896 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001897 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001898 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1899 ),
1900 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001901 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001902 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1903 )
1904 ])
1905 aia2 = x509.AuthorityInformationAccess([
1906 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001907 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001908 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1909 ),
1910 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001911 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001912 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1913 )
1914 ])
1915 assert aia == aia2
1916
1917 def test_ne(self):
1918 aia = x509.AuthorityInformationAccess([
1919 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001920 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001921 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1922 ),
1923 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001924 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001925 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1926 )
1927 ])
1928 aia2 = x509.AuthorityInformationAccess([
1929 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001930 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001931 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1932 ),
1933 ])
1934
1935 assert aia != aia2
1936 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001937
1938
1939@pytest.mark.requires_backend_interface(interface=RSABackend)
1940@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001941class TestAuthorityInformationAccessExtension(object):
1942 def test_aia_ocsp_ca_issuers(self, backend):
1943 cert = _load_cert(
1944 os.path.join("x509", "cryptography.io.pem"),
1945 x509.load_pem_x509_certificate,
1946 backend
1947 )
1948 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001949 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001950 )
1951 assert ext is not None
1952 assert ext.critical is False
1953
1954 assert ext.value == x509.AuthorityInformationAccess([
1955 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001956 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001957 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
1958 ),
1959 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001960 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05001961 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
1962 ),
1963 ])
1964
1965 def test_aia_multiple_ocsp_ca_issuers(self, backend):
1966 cert = _load_cert(
1967 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
1968 x509.load_pem_x509_certificate,
1969 backend
1970 )
1971 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001972 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001973 )
1974 assert ext is not None
1975 assert ext.critical is False
1976
1977 assert ext.value == x509.AuthorityInformationAccess([
1978 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001979 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001980 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1981 ),
1982 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001983 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001984 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
1985 ),
1986 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001987 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05001988 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001989 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
1990 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05001991 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05001992 ]))
1993 ),
1994 ])
1995
1996 def test_aia_ocsp_only(self, backend):
1997 cert = _load_cert(
1998 os.path.join("x509", "custom", "aia_ocsp.pem"),
1999 x509.load_pem_x509_certificate,
2000 backend
2001 )
2002 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002003 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002004 )
2005 assert ext is not None
2006 assert ext.critical is False
2007
2008 assert ext.value == x509.AuthorityInformationAccess([
2009 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002010 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002011 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2012 ),
2013 ])
2014
2015 def test_aia_ca_issuers_only(self, backend):
2016 cert = _load_cert(
2017 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2018 x509.load_pem_x509_certificate,
2019 backend
2020 )
2021 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002022 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002023 )
2024 assert ext is not None
2025 assert ext.critical is False
2026
2027 assert ext.value == x509.AuthorityInformationAccess([
2028 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002029 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002030 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002031 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2032 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002033 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002034 ]))
2035 ),
2036 ])
2037
2038
2039@pytest.mark.requires_backend_interface(interface=RSABackend)
2040@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002041class TestAuthorityKeyIdentifierExtension(object):
2042 def test_aki_keyid(self, backend):
2043 cert = _load_cert(
2044 os.path.join(
2045 "x509", "cryptography.io.pem"
2046 ),
2047 x509.load_pem_x509_certificate,
2048 backend
2049 )
2050 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002051 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002052 )
2053 assert ext is not None
2054 assert ext.critical is False
2055
2056 assert ext.value.key_identifier == (
2057 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2058 )
2059 assert ext.value.authority_cert_issuer is None
2060 assert ext.value.authority_cert_serial_number is None
2061
2062 def test_aki_all_fields(self, backend):
2063 cert = _load_cert(
2064 os.path.join(
2065 "x509", "custom", "authority_key_identifier.pem"
2066 ),
2067 x509.load_pem_x509_certificate,
2068 backend
2069 )
2070 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002071 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002072 )
2073 assert ext is not None
2074 assert ext.critical is False
2075
2076 assert ext.value.key_identifier == (
2077 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2078 )
2079 assert ext.value.authority_cert_issuer == [
2080 x509.DirectoryName(
2081 x509.Name([
2082 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002083 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002084 ),
2085 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002086 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002087 )
2088 ])
2089 )
2090 ]
2091 assert ext.value.authority_cert_serial_number == 3
2092
2093 def test_aki_no_keyid(self, backend):
2094 cert = _load_cert(
2095 os.path.join(
2096 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2097 ),
2098 x509.load_pem_x509_certificate,
2099 backend
2100 )
2101 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002102 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002103 )
2104 assert ext is not None
2105 assert ext.critical is False
2106
2107 assert ext.value.key_identifier is None
2108 assert ext.value.authority_cert_issuer == [
2109 x509.DirectoryName(
2110 x509.Name([
2111 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002112 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002113 ),
2114 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002115 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002116 )
2117 ])
2118 )
2119 ]
2120 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002121
Paul Kehrer253929a2015-08-05 17:30:39 +01002122 def test_from_certificate(self, backend):
2123 issuer_cert = _load_cert(
2124 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2125 x509.load_pem_x509_certificate,
2126 backend
2127 )
2128 cert = _load_cert(
2129 os.path.join("x509", "cryptography.io.pem"),
2130 x509.load_pem_x509_certificate,
2131 backend
2132 )
2133 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002134 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002135 )
2136 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2137 issuer_cert.public_key()
2138 )
2139 assert ext.value == aki
2140
Paul Kehrer5a485522015-05-06 00:29:12 -05002141
Paul Kehrere0017be2015-05-17 20:39:40 -06002142class TestNameConstraints(object):
2143 def test_ipaddress_wrong_type(self):
2144 with pytest.raises(TypeError):
2145 x509.NameConstraints(
2146 permitted_subtrees=[
2147 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2148 ],
2149 excluded_subtrees=None
2150 )
2151
2152 with pytest.raises(TypeError):
2153 x509.NameConstraints(
2154 permitted_subtrees=None,
2155 excluded_subtrees=[
2156 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2157 ]
2158 )
2159
2160 def test_ipaddress_allowed_type(self):
2161 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2162 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2163 nc = x509.NameConstraints(
2164 permitted_subtrees=permitted,
2165 excluded_subtrees=excluded
2166 )
2167 assert nc.permitted_subtrees == permitted
2168 assert nc.excluded_subtrees == excluded
2169
2170 def test_invalid_permitted_subtrees(self):
2171 with pytest.raises(TypeError):
2172 x509.NameConstraints("badpermitted", None)
2173
2174 def test_invalid_excluded_subtrees(self):
2175 with pytest.raises(TypeError):
2176 x509.NameConstraints(None, "badexcluded")
2177
2178 def test_no_subtrees(self):
2179 with pytest.raises(ValueError):
2180 x509.NameConstraints(None, None)
2181
2182 def test_permitted_none(self):
2183 excluded = [x509.DNSName(u"name.local")]
2184 nc = x509.NameConstraints(
2185 permitted_subtrees=None, excluded_subtrees=excluded
2186 )
2187 assert nc.permitted_subtrees is None
2188 assert nc.excluded_subtrees is not None
2189
2190 def test_excluded_none(self):
2191 permitted = [x509.DNSName(u"name.local")]
2192 nc = x509.NameConstraints(
2193 permitted_subtrees=permitted, excluded_subtrees=None
2194 )
2195 assert nc.permitted_subtrees is not None
2196 assert nc.excluded_subtrees is None
2197
2198 def test_repr(self):
2199 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2200 nc = x509.NameConstraints(
2201 permitted_subtrees=permitted,
2202 excluded_subtrees=None
2203 )
2204 assert repr(nc) == (
2205 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2206 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2207 )
2208
Paul Kehrer31894282015-06-21 21:46:41 -05002209 def test_eq(self):
2210 nc = x509.NameConstraints(
2211 permitted_subtrees=[x509.DNSName(u"name.local")],
2212 excluded_subtrees=[x509.DNSName(u"name2.local")]
2213 )
2214 nc2 = x509.NameConstraints(
2215 permitted_subtrees=[x509.DNSName(u"name.local")],
2216 excluded_subtrees=[x509.DNSName(u"name2.local")]
2217 )
2218 assert nc == nc2
2219
2220 def test_ne(self):
2221 nc = x509.NameConstraints(
2222 permitted_subtrees=[x509.DNSName(u"name.local")],
2223 excluded_subtrees=[x509.DNSName(u"name2.local")]
2224 )
2225 nc2 = x509.NameConstraints(
2226 permitted_subtrees=[x509.DNSName(u"name.local")],
2227 excluded_subtrees=None
2228 )
2229 nc3 = x509.NameConstraints(
2230 permitted_subtrees=None,
2231 excluded_subtrees=[x509.DNSName(u"name2.local")]
2232 )
2233
2234 assert nc != nc2
2235 assert nc != nc3
2236 assert nc != object()
2237
Paul Kehrere0017be2015-05-17 20:39:40 -06002238
Paul Kehrer870d7e82015-06-21 22:20:44 -05002239@pytest.mark.requires_backend_interface(interface=RSABackend)
2240@pytest.mark.requires_backend_interface(interface=X509Backend)
2241class TestNameConstraintsExtension(object):
2242 def test_permitted_excluded(self, backend):
2243 cert = _load_cert(
2244 os.path.join(
2245 "x509", "custom", "nc_permitted_excluded_2.pem"
2246 ),
2247 x509.load_pem_x509_certificate,
2248 backend
2249 )
2250 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002251 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002252 ).value
2253 assert nc == x509.NameConstraints(
2254 permitted_subtrees=[
2255 x509.DNSName(u"zombo.local"),
2256 ],
2257 excluded_subtrees=[
2258 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002259 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002260 ]))
2261 ]
2262 )
2263
2264 def test_permitted(self, backend):
2265 cert = _load_cert(
2266 os.path.join(
2267 "x509", "custom", "nc_permitted_2.pem"
2268 ),
2269 x509.load_pem_x509_certificate,
2270 backend
2271 )
2272 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002273 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002274 ).value
2275 assert nc == x509.NameConstraints(
2276 permitted_subtrees=[
2277 x509.DNSName(u"zombo.local"),
2278 ],
2279 excluded_subtrees=None
2280 )
2281
Paul Kehrer42376832015-07-01 18:10:32 -05002282 def test_permitted_with_leading_period(self, backend):
2283 cert = _load_cert(
2284 os.path.join(
2285 "x509", "custom", "nc_permitted.pem"
2286 ),
2287 x509.load_pem_x509_certificate,
2288 backend
2289 )
2290 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002291 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002292 ).value
2293 assert nc == x509.NameConstraints(
2294 permitted_subtrees=[
2295 x509.DNSName(u".cryptography.io"),
2296 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2297 ],
2298 excluded_subtrees=None
2299 )
2300
2301 def test_excluded_with_leading_period(self, backend):
2302 cert = _load_cert(
2303 os.path.join(
2304 "x509", "custom", "nc_excluded.pem"
2305 ),
2306 x509.load_pem_x509_certificate,
2307 backend
2308 )
2309 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002310 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002311 ).value
2312 assert nc == x509.NameConstraints(
2313 permitted_subtrees=None,
2314 excluded_subtrees=[
2315 x509.DNSName(u".cryptography.io"),
2316 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2317 ]
2318 )
2319
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002320 def test_permitted_excluded_with_ips(self, backend):
2321 cert = _load_cert(
2322 os.path.join(
2323 "x509", "custom", "nc_permitted_excluded.pem"
2324 ),
2325 x509.load_pem_x509_certificate,
2326 backend
2327 )
2328 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002329 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002330 ).value
2331 assert nc == x509.NameConstraints(
2332 permitted_subtrees=[
2333 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2334 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2335 ],
2336 excluded_subtrees=[
2337 x509.DNSName(u".domain.com"),
2338 x509.UniformResourceIdentifier(u"http://test.local"),
2339 ]
2340 )
2341
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002342 def test_single_ip_netmask(self, backend):
2343 cert = _load_cert(
2344 os.path.join(
2345 "x509", "custom", "nc_single_ip_netmask.pem"
2346 ),
2347 x509.load_pem_x509_certificate,
2348 backend
2349 )
2350 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002351 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002352 ).value
2353 assert nc == x509.NameConstraints(
2354 permitted_subtrees=[
2355 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2356 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2357 ],
2358 excluded_subtrees=None
2359 )
2360
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002361 def test_invalid_netmask(self, backend):
2362 cert = _load_cert(
2363 os.path.join(
2364 "x509", "custom", "nc_invalid_ip_netmask.pem"
2365 ),
2366 x509.load_pem_x509_certificate,
2367 backend
2368 )
2369 with pytest.raises(ValueError):
2370 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002371 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002372 )
2373
Paul Kehrer870d7e82015-06-21 22:20:44 -05002374
Paul Kehrer5a485522015-05-06 00:29:12 -05002375class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002376 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002377 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002378 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002379
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002380 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002381 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002382 x509.DistributionPoint(None, "notname", None, None)
2383
2384 def test_distribution_point_full_and_relative_not_none(self):
2385 with pytest.raises(ValueError):
2386 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002387
2388 def test_crl_issuer_not_general_names(self):
2389 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002390 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002391
2392 def test_reason_not_reasonflags(self):
2393 with pytest.raises(TypeError):
2394 x509.DistributionPoint(
2395 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002396 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002397 frozenset(["notreasonflags"]),
2398 None
2399 )
2400
2401 def test_reason_not_frozenset(self):
2402 with pytest.raises(TypeError):
2403 x509.DistributionPoint(
2404 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2405 None,
2406 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002407 None
2408 )
2409
2410 def test_disallowed_reasons(self):
2411 with pytest.raises(ValueError):
2412 x509.DistributionPoint(
2413 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2414 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002415 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002416 None
2417 )
2418
2419 with pytest.raises(ValueError):
2420 x509.DistributionPoint(
2421 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2422 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002423 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002424 None
2425 )
2426
2427 def test_reason_only(self):
2428 with pytest.raises(ValueError):
2429 x509.DistributionPoint(
2430 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002431 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002432 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002433 None
2434 )
2435
2436 def test_eq(self):
2437 dp = x509.DistributionPoint(
2438 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002439 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002440 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002441 [
2442 x509.DirectoryName(
2443 x509.Name([
2444 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002445 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002446 )
2447 ])
2448 )
2449 ],
2450 )
2451 dp2 = x509.DistributionPoint(
2452 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002453 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002454 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002455 [
2456 x509.DirectoryName(
2457 x509.Name([
2458 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002459 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002460 )
2461 ])
2462 )
2463 ],
2464 )
2465 assert dp == dp2
2466
2467 def test_ne(self):
2468 dp = x509.DistributionPoint(
2469 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002470 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002471 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002472 [
2473 x509.DirectoryName(
2474 x509.Name([
2475 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002476 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002477 )
2478 ])
2479 )
2480 ],
2481 )
2482 dp2 = x509.DistributionPoint(
2483 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2484 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002485 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002486 None
2487 )
2488 assert dp != dp2
2489 assert dp != object()
2490
2491 def test_repr(self):
2492 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002493 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002494 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002495 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002496 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002497 frozenset([x509.ReasonFlags.ca_compromise]),
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 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002508 if six.PY3:
2509 assert repr(dp) == (
2510 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2511 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002512 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2513 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2514 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2515 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002516 )
2517 else:
2518 assert repr(dp) == (
2519 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2520 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002521 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2522 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2523 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2524 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002525 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002526
2527
2528class TestCRLDistributionPoints(object):
2529 def test_invalid_distribution_points(self):
2530 with pytest.raises(TypeError):
2531 x509.CRLDistributionPoints(["notadistributionpoint"])
2532
2533 def test_iter_len(self):
2534 cdp = x509.CRLDistributionPoints([
2535 x509.DistributionPoint(
2536 [x509.UniformResourceIdentifier(u"http://domain")],
2537 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002538 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002539 None
2540 ),
2541 x509.DistributionPoint(
2542 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002543 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002544 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002545 x509.ReasonFlags.key_compromise,
2546 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002547 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002548 None
2549 ),
2550 ])
2551 assert len(cdp) == 2
2552 assert list(cdp) == [
2553 x509.DistributionPoint(
2554 [x509.UniformResourceIdentifier(u"http://domain")],
2555 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002556 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002557 None
2558 ),
2559 x509.DistributionPoint(
2560 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002561 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002562 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002563 x509.ReasonFlags.key_compromise,
2564 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002565 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002566 None
2567 ),
2568 ]
2569
2570 def test_repr(self):
2571 cdp = x509.CRLDistributionPoints([
2572 x509.DistributionPoint(
2573 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002574 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002575 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002576 None
2577 ),
2578 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002579 if six.PY3:
2580 assert repr(cdp) == (
2581 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2582 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2583 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2584 "romise'>}), crl_issuer=None)>])>"
2585 )
2586 else:
2587 assert repr(cdp) == (
2588 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2589 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2590 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2591 "romise'>]), crl_issuer=None)>])>"
2592 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002593
2594 def test_eq(self):
2595 cdp = x509.CRLDistributionPoints([
2596 x509.DistributionPoint(
2597 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002598 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002599 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002600 x509.ReasonFlags.key_compromise,
2601 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002602 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002603 [x509.UniformResourceIdentifier(u"uri://thing")],
2604 ),
2605 ])
2606 cdp2 = x509.CRLDistributionPoints([
2607 x509.DistributionPoint(
2608 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002609 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002610 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002611 x509.ReasonFlags.key_compromise,
2612 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002613 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002614 [x509.UniformResourceIdentifier(u"uri://thing")],
2615 ),
2616 ])
2617 assert cdp == cdp2
2618
2619 def test_ne(self):
2620 cdp = x509.CRLDistributionPoints([
2621 x509.DistributionPoint(
2622 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002623 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002624 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002625 x509.ReasonFlags.key_compromise,
2626 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002627 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002628 [x509.UniformResourceIdentifier(u"uri://thing")],
2629 ),
2630 ])
2631 cdp2 = x509.CRLDistributionPoints([
2632 x509.DistributionPoint(
2633 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002634 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002635 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002636 x509.ReasonFlags.key_compromise,
2637 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002638 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002639 [x509.UniformResourceIdentifier(u"uri://thing")],
2640 ),
2641 ])
2642 cdp3 = x509.CRLDistributionPoints([
2643 x509.DistributionPoint(
2644 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002645 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002646 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002647 [x509.UniformResourceIdentifier(u"uri://thing")],
2648 ),
2649 ])
2650 cdp4 = x509.CRLDistributionPoints([
2651 x509.DistributionPoint(
2652 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002653 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002654 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002655 x509.ReasonFlags.key_compromise,
2656 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002657 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002658 [x509.UniformResourceIdentifier(u"uri://thing2")],
2659 ),
2660 ])
2661 assert cdp != cdp2
2662 assert cdp != cdp3
2663 assert cdp != cdp4
2664 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002665
2666
2667@pytest.mark.requires_backend_interface(interface=RSABackend)
2668@pytest.mark.requires_backend_interface(interface=X509Backend)
2669class TestCRLDistributionPointsExtension(object):
2670 def test_fullname_and_crl_issuer(self, backend):
2671 cert = _load_cert(
2672 os.path.join(
2673 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2674 ),
2675 x509.load_der_x509_certificate,
2676 backend
2677 )
2678
2679 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002680 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002681 ).value
2682
2683 assert cdps == x509.CRLDistributionPoints([
2684 x509.DistributionPoint(
2685 full_name=[x509.DirectoryName(
2686 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002687 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002688 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002689 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002690 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002691 ),
2692 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002693 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002694 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002695 ),
2696 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002697 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002698 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002699 ),
2700 ])
2701 )],
2702 relative_name=None,
2703 reasons=None,
2704 crl_issuer=[x509.DirectoryName(
2705 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002706 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002707 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002708 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002709 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002710 ),
2711 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002712 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002713 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002714 ),
2715 ])
2716 )],
2717 )
2718 ])
2719
2720 def test_relativename_and_crl_issuer(self, backend):
2721 cert = _load_cert(
2722 os.path.join(
2723 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2724 ),
2725 x509.load_der_x509_certificate,
2726 backend
2727 )
2728
2729 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002730 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002731 ).value
2732
2733 assert cdps == x509.CRLDistributionPoints([
2734 x509.DistributionPoint(
2735 full_name=None,
2736 relative_name=x509.Name([
2737 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002738 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002739 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002740 ),
2741 ]),
2742 reasons=None,
2743 crl_issuer=[x509.DirectoryName(
2744 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002745 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002746 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002747 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002748 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002749 ),
2750 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002751 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002752 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002753 ),
2754 ])
2755 )],
2756 )
2757 ])
2758
2759 def test_fullname_crl_issuer_reasons(self, backend):
2760 cert = _load_cert(
2761 os.path.join(
2762 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2763 ),
2764 x509.load_pem_x509_certificate,
2765 backend
2766 )
2767
2768 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002769 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002770 ).value
2771
2772 assert cdps == x509.CRLDistributionPoints([
2773 x509.DistributionPoint(
2774 full_name=[x509.UniformResourceIdentifier(
2775 u"http://myhost.com/myca.crl"
2776 )],
2777 relative_name=None,
2778 reasons=frozenset([
2779 x509.ReasonFlags.key_compromise,
2780 x509.ReasonFlags.ca_compromise
2781 ]),
2782 crl_issuer=[x509.DirectoryName(
2783 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002784 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002785 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002786 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002787 ),
2788 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002789 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002790 ),
2791 ])
2792 )],
2793 )
2794 ])
2795
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002796 def test_all_reasons(self, backend):
2797 cert = _load_cert(
2798 os.path.join(
2799 "x509", "custom", "cdp_all_reasons.pem"
2800 ),
2801 x509.load_pem_x509_certificate,
2802 backend
2803 )
2804
2805 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002806 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002807 ).value
2808
2809 assert cdps == x509.CRLDistributionPoints([
2810 x509.DistributionPoint(
2811 full_name=[x509.UniformResourceIdentifier(
2812 u"http://domain.com/some.crl"
2813 )],
2814 relative_name=None,
2815 reasons=frozenset([
2816 x509.ReasonFlags.key_compromise,
2817 x509.ReasonFlags.ca_compromise,
2818 x509.ReasonFlags.affiliation_changed,
2819 x509.ReasonFlags.superseded,
2820 x509.ReasonFlags.privilege_withdrawn,
2821 x509.ReasonFlags.cessation_of_operation,
2822 x509.ReasonFlags.aa_compromise,
2823 x509.ReasonFlags.certificate_hold,
2824 ]),
2825 crl_issuer=None
2826 )
2827 ])
2828
2829 def test_single_reason(self, backend):
2830 cert = _load_cert(
2831 os.path.join(
2832 "x509", "custom", "cdp_reason_aa_compromise.pem"
2833 ),
2834 x509.load_pem_x509_certificate,
2835 backend
2836 )
2837
2838 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002839 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002840 ).value
2841
2842 assert cdps == x509.CRLDistributionPoints([
2843 x509.DistributionPoint(
2844 full_name=[x509.UniformResourceIdentifier(
2845 u"http://domain.com/some.crl"
2846 )],
2847 relative_name=None,
2848 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2849 crl_issuer=None
2850 )
2851 ])
2852
Paul Kehrer9a10d592015-05-10 14:55:51 -05002853 def test_crl_issuer_only(self, backend):
2854 cert = _load_cert(
2855 os.path.join(
2856 "x509", "custom", "cdp_crl_issuer.pem"
2857 ),
2858 x509.load_pem_x509_certificate,
2859 backend
2860 )
2861
2862 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002863 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002864 ).value
2865
2866 assert cdps == x509.CRLDistributionPoints([
2867 x509.DistributionPoint(
2868 full_name=None,
2869 relative_name=None,
2870 reasons=None,
2871 crl_issuer=[x509.DirectoryName(
2872 x509.Name([
2873 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002874 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002875 ),
2876 ])
2877 )],
2878 )
2879 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002880
2881
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002882@pytest.mark.requires_backend_interface(interface=RSABackend)
2883@pytest.mark.requires_backend_interface(interface=X509Backend)
2884class TestOCSPNoCheckExtension(object):
2885 def test_nocheck(self, backend):
2886 cert = _load_cert(
2887 os.path.join(
2888 "x509", "custom", "ocsp_nocheck.pem"
2889 ),
2890 x509.load_pem_x509_certificate,
2891 backend
2892 )
2893 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002894 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002895 )
2896 assert isinstance(ext.value, x509.OCSPNoCheck)
2897
2898
Paul Kehrer16fae762015-05-01 23:14:20 -05002899class TestInhibitAnyPolicy(object):
2900 def test_not_int(self):
2901 with pytest.raises(TypeError):
2902 x509.InhibitAnyPolicy("notint")
2903
2904 def test_negative_int(self):
2905 with pytest.raises(ValueError):
2906 x509.InhibitAnyPolicy(-1)
2907
2908 def test_repr(self):
2909 iap = x509.InhibitAnyPolicy(0)
2910 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2911
2912 def test_eq(self):
2913 iap = x509.InhibitAnyPolicy(1)
2914 iap2 = x509.InhibitAnyPolicy(1)
2915 assert iap == iap2
2916
2917 def test_ne(self):
2918 iap = x509.InhibitAnyPolicy(1)
2919 iap2 = x509.InhibitAnyPolicy(4)
2920 assert iap != iap2
2921 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06002922
2923
2924@pytest.mark.requires_backend_interface(interface=RSABackend)
2925@pytest.mark.requires_backend_interface(interface=X509Backend)
2926class TestInhibitAnyPolicyExtension(object):
2927 def test_nocheck(self, backend):
2928 cert = _load_cert(
2929 os.path.join(
2930 "x509", "custom", "inhibit_any_policy_5.pem"
2931 ),
2932 x509.load_pem_x509_certificate,
2933 backend
2934 )
2935 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002936 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06002937 ).value
2938 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01002939
2940
2941@pytest.mark.requires_backend_interface(interface=RSABackend)
2942@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01002943class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01002944 def test_invalid_certificate_policies_data(self, backend):
2945 cert = _load_cert(
2946 os.path.join(
2947 "x509", "custom", "cp_invalid.pem"
2948 ),
2949 x509.load_pem_x509_certificate,
2950 backend
2951 )
2952 with pytest.raises(ValueError):
2953 cert.extensions