blob: 040347db7e83ce450afb5dd99ca0a190541b818a [file] [log] [blame]
Paul Kehrer8cf26422015-03-21 09:50:24 -05001# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import absolute_import, division, print_function
6
Paul Kehrer1eb82a62015-03-31 20:00:33 -05007import binascii
Paul Kehrer31bdf792015-03-25 14:11:00 -05008import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05009import os
10
Paul Kehrer8cf26422015-03-21 09:50:24 -050011import pytest
12
Paul Kehrercbfb1012015-04-10 20:57:20 -040013import six
14
Paul Kehrer8cf26422015-03-21 09:50:24 -050015from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010016from cryptography.hazmat.backends.interfaces import (
17 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
18)
19from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050020from cryptography.x509.oid import (
21 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID, NameOID
22)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050023
Paul Kehrerf22f6122015-08-05 12:57:13 +010024from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050026
27
Paul Kehrer85894662015-03-22 13:19:31 -050028class TestExtension(object):
29 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050030 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050031 with pytest.raises(TypeError):
32 x509.Extension("notanoid", True, bc)
33
34 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050035 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050036 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050037 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050038
39 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050040 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050041 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050042 assert repr(ext) == (
43 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
44 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
45 "_length=None)>)>"
46 )
47
Paul Kehrer58e870c2015-05-17 09:15:30 -070048 def test_eq(self):
49 ext1 = x509.Extension(
50 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
51 )
52 ext2 = x509.Extension(
53 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
54 )
55 assert ext1 == ext2
56
57 def test_ne(self):
58 ext1 = x509.Extension(
59 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
60 )
61 ext2 = x509.Extension(
62 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
63 )
64 ext3 = x509.Extension(
65 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
66 )
67 ext4 = x509.Extension(
68 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
69 )
70 assert ext1 != ext2
71 assert ext1 != ext3
72 assert ext1 != ext4
73 assert ext1 != object()
74
Paul Kehrer85894662015-03-22 13:19:31 -050075
Paul Kehrer2b622582015-04-15 11:04:29 -040076class TestNoticeReference(object):
77 def test_notice_numbers_not_all_int(self):
78 with pytest.raises(TypeError):
79 x509.NoticeReference("org", [1, 2, "three"])
80
81 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -050082 with pytest.raises(TypeError):
83 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -040084
85 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -050086 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -040087
Paul Kehrer73be2ca2015-05-11 21:22:38 -050088 if six.PY3:
89 assert repr(nr) == (
90 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
91 "])>"
92 )
93 else:
94 assert repr(nr) == (
95 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
96 "4])>"
97 )
Paul Kehrer2b622582015-04-15 11:04:29 -040098
Paul Kehrerc56ab622015-05-03 09:56:31 -050099 def test_eq(self):
100 nr = x509.NoticeReference("org", [1, 2])
101 nr2 = x509.NoticeReference("org", [1, 2])
102 assert nr == nr2
103
104 def test_ne(self):
105 nr = x509.NoticeReference("org", [1, 2])
106 nr2 = x509.NoticeReference("org", [1])
107 nr3 = x509.NoticeReference(None, [1, 2])
108 assert nr != nr2
109 assert nr != nr3
110 assert nr != object()
111
Paul Kehrer2b622582015-04-15 11:04:29 -0400112
113class TestUserNotice(object):
114 def test_notice_reference_invalid(self):
115 with pytest.raises(TypeError):
116 x509.UserNotice("invalid", None)
117
118 def test_notice_reference_none(self):
119 un = x509.UserNotice(None, "text")
120 assert un.notice_reference is None
121 assert un.explicit_text == "text"
122
123 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500124 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500125 if six.PY3:
126 assert repr(un) == (
127 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500128 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500129 )
130 else:
131 assert repr(un) == (
132 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500133 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500134 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400135
Paul Kehrerc56ab622015-05-03 09:56:31 -0500136 def test_eq(self):
137 nr = x509.NoticeReference("org", [1, 2])
138 nr2 = x509.NoticeReference("org", [1, 2])
139 un = x509.UserNotice(nr, "text")
140 un2 = x509.UserNotice(nr2, "text")
141 assert un == un2
142
143 def test_ne(self):
144 nr = x509.NoticeReference("org", [1, 2])
145 nr2 = x509.NoticeReference("org", [1])
146 un = x509.UserNotice(nr, "text")
147 un2 = x509.UserNotice(nr2, "text")
148 un3 = x509.UserNotice(nr, "text3")
149 assert un != un2
150 assert un != un3
151 assert un != object()
152
Paul Kehrer2b622582015-04-15 11:04:29 -0400153
Paul Kehrer2b622582015-04-15 11:04:29 -0400154class TestPolicyInformation(object):
155 def test_invalid_policy_identifier(self):
156 with pytest.raises(TypeError):
157 x509.PolicyInformation("notanoid", None)
158
159 def test_none_policy_qualifiers(self):
160 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
161 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
162 assert pi.policy_qualifiers is None
163
164 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500165 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400166 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
167 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
168 assert pi.policy_qualifiers == pq
169
170 def test_invalid_policy_identifiers(self):
171 with pytest.raises(TypeError):
172 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
173
174 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500175 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400176 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500177 if six.PY3:
178 assert repr(pi) == (
179 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
180 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500181 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500182 )
183 else:
184 assert repr(pi) == (
185 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
186 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500187 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500188 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400189
Paul Kehrerc56ab622015-05-03 09:56:31 -0500190 def test_eq(self):
191 pi = x509.PolicyInformation(
192 x509.ObjectIdentifier("1.2.3"),
193 [u"string", x509.UserNotice(None, u"hi")]
194 )
195 pi2 = x509.PolicyInformation(
196 x509.ObjectIdentifier("1.2.3"),
197 [u"string", x509.UserNotice(None, u"hi")]
198 )
199 assert pi == pi2
200
201 def test_ne(self):
202 pi = x509.PolicyInformation(
203 x509.ObjectIdentifier("1.2.3"), [u"string"]
204 )
205 pi2 = x509.PolicyInformation(
206 x509.ObjectIdentifier("1.2.3"), [u"string2"]
207 )
208 pi3 = x509.PolicyInformation(
209 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
210 )
211 assert pi != pi2
212 assert pi != pi3
213 assert pi != object()
214
Paul Kehrer2b622582015-04-15 11:04:29 -0400215
216class TestCertificatePolicies(object):
217 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500218 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400219 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
220 with pytest.raises(TypeError):
221 x509.CertificatePolicies([1, pi])
222
223 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500224 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400225 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
226 cp = x509.CertificatePolicies([pi])
227 assert len(cp) == 1
228 for policyinfo in cp:
229 assert policyinfo == pi
230
231 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500232 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400233 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
234 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500235 if six.PY3:
236 assert repr(cp) == (
237 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
238 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
239 "ers=['string'])>])>"
240 )
241 else:
242 assert repr(cp) == (
243 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
244 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
245 "ers=[u'string'])>])>"
246 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400247
Paul Kehrerc56ab622015-05-03 09:56:31 -0500248 def test_eq(self):
249 pi = x509.PolicyInformation(
250 x509.ObjectIdentifier("1.2.3"), [u"string"]
251 )
252 cp = x509.CertificatePolicies([pi])
253 pi2 = x509.PolicyInformation(
254 x509.ObjectIdentifier("1.2.3"), [u"string"]
255 )
256 cp2 = x509.CertificatePolicies([pi2])
257 assert cp == cp2
258
259 def test_ne(self):
260 pi = x509.PolicyInformation(
261 x509.ObjectIdentifier("1.2.3"), [u"string"]
262 )
263 cp = x509.CertificatePolicies([pi])
264 pi2 = x509.PolicyInformation(
265 x509.ObjectIdentifier("1.2.3"), [u"string2"]
266 )
267 cp2 = x509.CertificatePolicies([pi2])
268 assert cp != cp2
269 assert cp != object()
270
Paul Kehrer2b622582015-04-15 11:04:29 -0400271
Paul Kehrer11026fe2015-05-12 11:23:56 -0500272@pytest.mark.requires_backend_interface(interface=RSABackend)
273@pytest.mark.requires_backend_interface(interface=X509Backend)
274class TestCertificatePoliciesExtension(object):
275 def test_cps_uri_policy_qualifier(self, backend):
276 cert = _load_cert(
277 os.path.join("x509", "custom", "cp_cps_uri.pem"),
278 x509.load_pem_x509_certificate,
279 backend
280 )
281
282 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500283 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500284 ).value
285
286 assert cp == x509.CertificatePolicies([
287 x509.PolicyInformation(
288 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
289 [u"http://other.com/cps"]
290 )
291 ])
292
293 def test_user_notice_with_notice_reference(self, backend):
294 cert = _load_cert(
295 os.path.join(
296 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
297 ),
298 x509.load_pem_x509_certificate,
299 backend
300 )
301
302 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500303 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500304 ).value
305
306 assert cp == x509.CertificatePolicies([
307 x509.PolicyInformation(
308 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
309 [
310 u"http://example.com/cps",
311 u"http://other.com/cps",
312 x509.UserNotice(
313 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
314 u"thing"
315 )
316 ]
317 )
318 ])
319
320 def test_user_notice_with_explicit_text(self, backend):
321 cert = _load_cert(
322 os.path.join(
323 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
324 ),
325 x509.load_pem_x509_certificate,
326 backend
327 )
328
329 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500330 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500331 ).value
332
333 assert cp == x509.CertificatePolicies([
334 x509.PolicyInformation(
335 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
336 [x509.UserNotice(None, u"thing")]
337 )
338 ])
339
340 def test_user_notice_no_explicit_text(self, backend):
341 cert = _load_cert(
342 os.path.join(
343 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
344 ),
345 x509.load_pem_x509_certificate,
346 backend
347 )
348
349 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500350 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500351 ).value
352
353 assert cp == x509.CertificatePolicies([
354 x509.PolicyInformation(
355 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
356 [
357 x509.UserNotice(
358 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
359 None
360 )
361 ]
362 )
363 ])
364
365
Paul Kehrercecbbba2015-03-30 14:58:38 -0500366class TestKeyUsage(object):
367 def test_key_agreement_false_encipher_decipher_true(self):
368 with pytest.raises(ValueError):
369 x509.KeyUsage(
370 digital_signature=False,
371 content_commitment=False,
372 key_encipherment=False,
373 data_encipherment=False,
374 key_agreement=False,
375 key_cert_sign=False,
376 crl_sign=False,
377 encipher_only=True,
378 decipher_only=False
379 )
380
381 with pytest.raises(ValueError):
382 x509.KeyUsage(
383 digital_signature=False,
384 content_commitment=False,
385 key_encipherment=False,
386 data_encipherment=False,
387 key_agreement=False,
388 key_cert_sign=False,
389 crl_sign=False,
390 encipher_only=True,
391 decipher_only=True
392 )
393
394 with pytest.raises(ValueError):
395 x509.KeyUsage(
396 digital_signature=False,
397 content_commitment=False,
398 key_encipherment=False,
399 data_encipherment=False,
400 key_agreement=False,
401 key_cert_sign=False,
402 crl_sign=False,
403 encipher_only=False,
404 decipher_only=True
405 )
406
407 def test_properties_key_agreement_true(self):
408 ku = x509.KeyUsage(
409 digital_signature=True,
410 content_commitment=True,
411 key_encipherment=False,
412 data_encipherment=False,
413 key_agreement=False,
414 key_cert_sign=True,
415 crl_sign=False,
416 encipher_only=False,
417 decipher_only=False
418 )
419 assert ku.digital_signature is True
420 assert ku.content_commitment is True
421 assert ku.key_encipherment is False
422 assert ku.data_encipherment is False
423 assert ku.key_agreement is False
424 assert ku.key_cert_sign is True
425 assert ku.crl_sign is False
426
427 def test_key_agreement_true_properties(self):
428 ku = x509.KeyUsage(
429 digital_signature=False,
430 content_commitment=False,
431 key_encipherment=False,
432 data_encipherment=False,
433 key_agreement=True,
434 key_cert_sign=False,
435 crl_sign=False,
436 encipher_only=False,
437 decipher_only=True
438 )
439 assert ku.key_agreement is True
440 assert ku.encipher_only is False
441 assert ku.decipher_only is True
442
443 def test_key_agreement_false_properties(self):
444 ku = x509.KeyUsage(
445 digital_signature=False,
446 content_commitment=False,
447 key_encipherment=False,
448 data_encipherment=False,
449 key_agreement=False,
450 key_cert_sign=False,
451 crl_sign=False,
452 encipher_only=False,
453 decipher_only=False
454 )
455 assert ku.key_agreement is False
456 with pytest.raises(ValueError):
457 ku.encipher_only
458
459 with pytest.raises(ValueError):
460 ku.decipher_only
461
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500462 def test_repr_key_agreement_false(self):
463 ku = x509.KeyUsage(
464 digital_signature=True,
465 content_commitment=True,
466 key_encipherment=False,
467 data_encipherment=False,
468 key_agreement=False,
469 key_cert_sign=True,
470 crl_sign=False,
471 encipher_only=False,
472 decipher_only=False
473 )
474 assert repr(ku) == (
475 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
476 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400477 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
478 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500479 )
480
481 def test_repr_key_agreement_true(self):
482 ku = x509.KeyUsage(
483 digital_signature=True,
484 content_commitment=True,
485 key_encipherment=False,
486 data_encipherment=False,
487 key_agreement=True,
488 key_cert_sign=True,
489 crl_sign=False,
490 encipher_only=False,
491 decipher_only=False
492 )
493 assert repr(ku) == (
494 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
495 "cipherment=False, data_encipherment=False, key_agreement=True, k"
496 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
497 "only=False)>"
498 )
499
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500500 def test_eq(self):
501 ku = x509.KeyUsage(
502 digital_signature=False,
503 content_commitment=False,
504 key_encipherment=False,
505 data_encipherment=False,
506 key_agreement=True,
507 key_cert_sign=False,
508 crl_sign=False,
509 encipher_only=False,
510 decipher_only=True
511 )
512 ku2 = x509.KeyUsage(
513 digital_signature=False,
514 content_commitment=False,
515 key_encipherment=False,
516 data_encipherment=False,
517 key_agreement=True,
518 key_cert_sign=False,
519 crl_sign=False,
520 encipher_only=False,
521 decipher_only=True
522 )
523 assert ku == ku2
524
525 def test_ne(self):
526 ku = x509.KeyUsage(
527 digital_signature=False,
528 content_commitment=False,
529 key_encipherment=False,
530 data_encipherment=False,
531 key_agreement=True,
532 key_cert_sign=False,
533 crl_sign=False,
534 encipher_only=False,
535 decipher_only=True
536 )
537 ku2 = x509.KeyUsage(
538 digital_signature=False,
539 content_commitment=False,
540 key_encipherment=False,
541 data_encipherment=False,
542 key_agreement=False,
543 key_cert_sign=False,
544 crl_sign=False,
545 encipher_only=False,
546 decipher_only=False
547 )
548 assert ku != ku2
549 assert ku != object()
550
Paul Kehrercecbbba2015-03-30 14:58:38 -0500551
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500552class TestSubjectKeyIdentifier(object):
553 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400554 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500555 ski = x509.SubjectKeyIdentifier(value)
556 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500557
558 def test_repr(self):
559 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500560 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500561 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500562 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400563 if six.PY3:
564 assert repr(ext) == (
565 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
566 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
567 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
568 "\\xf7\\xff:\\xc9\')>)>"
569 )
570 else:
571 assert repr(ext) == (
572 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
573 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
574 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
575 "\\xf7\\xff:\\xc9\')>)>"
576 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500577
578 def test_eq(self):
579 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500580 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500581 )
582 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500583 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500584 )
585 assert ski == ski2
586
587 def test_ne(self):
588 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500589 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500590 )
591 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500592 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500593 )
594 assert ski != ski2
595 assert ski != object()
596
597
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400598class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500599 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400600 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500601 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400602
603 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500604 dirname = x509.DirectoryName(
605 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500606 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
607 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500608 ])
609 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400610 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500611 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400612
613 def test_authority_issuer_none_serial_not_none(self):
614 with pytest.raises(ValueError):
615 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
616
617 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500618 dirname = x509.DirectoryName(
619 x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -0500620 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
621 x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500622 ])
623 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400624 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500625 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400626
627 def test_authority_cert_serial_and_issuer_none(self):
628 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
629 assert aki.key_identifier == b"id"
630 assert aki.authority_cert_issuer is None
631 assert aki.authority_cert_serial_number is None
632
633 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500634 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500635 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500636 )
637 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400638
639 if six.PY3:
640 assert repr(aki) == (
641 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500642 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500643 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500644 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400645 )
646 else:
647 assert repr(aki) == (
648 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500649 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500650 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
651 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400652 )
653
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500654 def test_eq(self):
655 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500656 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500657 )
658 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
659 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500660 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500661 )
662 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
663 assert aki == aki2
664
665 def test_ne(self):
666 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500667 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500668 )
669 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500670 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500671 )
672 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
673 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
674 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
675 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
676 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
677 assert aki != aki2
678 assert aki != aki3
679 assert aki != aki4
680 assert aki != aki5
681 assert aki != object()
682
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400683
Paul Kehrer8cf26422015-03-21 09:50:24 -0500684class TestBasicConstraints(object):
685 def test_ca_not_boolean(self):
686 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500687 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500688
689 def test_path_length_not_ca(self):
690 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500691 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500692
693 def test_path_length_not_int(self):
694 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500695 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500696
697 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500698 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500699
700 def test_path_length_negative(self):
701 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500702 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500703
704 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500705 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500706 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500707 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500708 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500709
Paul Kehrer3a69b132015-05-13 10:03:46 -0500710 def test_eq(self):
711 na = x509.BasicConstraints(ca=True, path_length=None)
712 na2 = x509.BasicConstraints(ca=True, path_length=None)
713 assert na == na2
714
715 def test_ne(self):
716 na = x509.BasicConstraints(ca=True, path_length=None)
717 na2 = x509.BasicConstraints(ca=True, path_length=1)
718 na3 = x509.BasicConstraints(ca=False, path_length=None)
719 assert na != na2
720 assert na != na3
721 assert na != object()
722
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500723
Paul Kehrerffa2a152015-03-31 08:18:25 -0500724class TestExtendedKeyUsage(object):
725 def test_not_all_oids(self):
726 with pytest.raises(TypeError):
727 x509.ExtendedKeyUsage(["notoid"])
728
729 def test_iter_len(self):
730 eku = x509.ExtendedKeyUsage([
731 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
732 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
733 ])
734 assert len(eku) == 2
735 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500736 ExtendedKeyUsageOID.SERVER_AUTH,
737 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500738 ]
739
Paul Kehrer23d10c32015-04-02 23:12:32 -0500740 def test_repr(self):
741 eku = x509.ExtendedKeyUsage([
742 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
743 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
744 ])
745 assert repr(eku) == (
746 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
747 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
748 "tAuth)>])>"
749 )
750
Paul Kehrerb0476172015-05-02 19:34:51 -0500751 def test_eq(self):
752 eku = x509.ExtendedKeyUsage([
753 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
754 ])
755 eku2 = x509.ExtendedKeyUsage([
756 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
757 ])
758 assert eku == eku2
759
760 def test_ne(self):
761 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
762 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
763 assert eku != eku2
764 assert eku != object()
765
Paul Kehrerffa2a152015-03-31 08:18:25 -0500766
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500767@pytest.mark.requires_backend_interface(interface=RSABackend)
768@pytest.mark.requires_backend_interface(interface=X509Backend)
769class TestExtensions(object):
770 def test_no_extensions(self, backend):
771 cert = _load_cert(
772 os.path.join("x509", "verisign_md2_root.pem"),
773 x509.load_pem_x509_certificate,
774 backend
775 )
776 ext = cert.extensions
777 assert len(ext) == 0
778 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500779 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500780 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500781
Paul Kehrerd44e4132015-08-10 19:13:13 -0500782 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500783
784 def test_one_extension(self, backend):
785 cert = _load_cert(
786 os.path.join(
787 "x509", "custom", "basic_constraints_not_critical.pem"
788 ),
789 x509.load_pem_x509_certificate,
790 backend
791 )
792 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500793 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500794 assert ext is not None
795 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500796
797 def test_duplicate_extension(self, backend):
798 cert = _load_cert(
799 os.path.join(
800 "x509", "custom", "two_basic_constraints.pem"
801 ),
802 x509.load_pem_x509_certificate,
803 backend
804 )
805 with pytest.raises(x509.DuplicateExtension) as exc:
806 cert.extensions
807
Paul Kehrerd44e4132015-08-10 19:13:13 -0500808 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500809
810 def test_unsupported_critical_extension(self, backend):
811 cert = _load_cert(
812 os.path.join(
813 "x509", "custom", "unsupported_extension_critical.pem"
814 ),
815 x509.load_pem_x509_certificate,
816 backend
817 )
818 with pytest.raises(x509.UnsupportedExtension) as exc:
819 cert.extensions
820
821 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
822
823 def test_unsupported_extension(self, backend):
824 # TODO: this will raise an exception when all extensions are complete
825 cert = _load_cert(
826 os.path.join(
827 "x509", "custom", "unsupported_extension.pem"
828 ),
829 x509.load_pem_x509_certificate,
830 backend
831 )
832 extensions = cert.extensions
833 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500834
Phoebe Queenecae9812015-08-12 05:00:32 +0100835 def test_no_extensions_get_for_class(self, backend):
836 cert = _load_cert(
837 os.path.join(
838 "x509", "verisign_md2_root.pem"
839 ),
840 x509.load_pem_x509_certificate,
841 backend
842 )
843 ext = cert.extensions
844 assert len(ext) == 0
845 assert list(ext) == []
846 with pytest.raises(x509.ExtensionNotFound) as exc:
847 ext.get_extension_for_class(x509.BasicConstraints)
848
849 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
850
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100851 def test_one_extension_get_for_class(self, backend):
852 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100853 os.path.join(
854 "x509", "custom", "basic_constraints_not_critical.pem"
855 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100856 x509.load_pem_x509_certificate,
857 backend
858 )
859 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
860 assert ext is not None
861
862 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500863
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100864
Paul Kehrerfa56a232015-03-17 13:14:03 -0500865@pytest.mark.requires_backend_interface(interface=RSABackend)
866@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500867class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500868 def test_ca_true_pathlen_6(self, backend):
869 cert = _load_cert(
870 os.path.join(
871 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
872 ),
873 x509.load_der_x509_certificate,
874 backend
875 )
876 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500877 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500878 )
879 assert ext is not None
880 assert ext.critical is True
881 assert ext.value.ca is True
882 assert ext.value.path_length == 6
883
884 def test_path_length_zero(self, backend):
885 cert = _load_cert(
886 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
887 x509.load_pem_x509_certificate,
888 backend
889 )
890 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500891 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500892 )
893 assert ext is not None
894 assert ext.critical is True
895 assert ext.value.ca is True
896 assert ext.value.path_length == 0
897
898 def test_ca_true_no_pathlen(self, backend):
899 cert = _load_cert(
900 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
901 x509.load_der_x509_certificate,
902 backend
903 )
904 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500905 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500906 )
907 assert ext is not None
908 assert ext.critical is True
909 assert ext.value.ca is True
910 assert ext.value.path_length is None
911
912 def test_ca_false(self, backend):
913 cert = _load_cert(
914 os.path.join("x509", "cryptography.io.pem"),
915 x509.load_pem_x509_certificate,
916 backend
917 )
918 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500919 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500920 )
921 assert ext is not None
922 assert ext.critical is True
923 assert ext.value.ca is False
924 assert ext.value.path_length is None
925
926 def test_no_basic_constraints(self, backend):
927 cert = _load_cert(
928 os.path.join(
929 "x509",
930 "PKITS_data",
931 "certs",
932 "ValidCertificatePathTest1EE.crt"
933 ),
934 x509.load_der_x509_certificate,
935 backend
936 )
937 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -0500938 cert.extensions.get_extension_for_oid(
939 ExtensionOID.BASIC_CONSTRAINTS
940 )
Paul Kehrerfa56a232015-03-17 13:14:03 -0500941
942 def test_basic_constraint_not_critical(self, backend):
943 cert = _load_cert(
944 os.path.join(
945 "x509", "custom", "basic_constraints_not_critical.pem"
946 ),
947 x509.load_pem_x509_certificate,
948 backend
949 )
950 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500951 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500952 )
953 assert ext is not None
954 assert ext.critical is False
955 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500956
957
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500958class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100959 @pytest.mark.requires_backend_interface(interface=RSABackend)
960 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500961 def test_subject_key_identifier(self, backend):
962 cert = _load_cert(
963 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
964 x509.load_der_x509_certificate,
965 backend
966 )
967 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500968 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500969 )
970 ski = ext.value
971 assert ext is not None
972 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500973 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -0500974 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500975 )
976
Paul Kehrerf22f6122015-08-05 12:57:13 +0100977 @pytest.mark.requires_backend_interface(interface=RSABackend)
978 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500979 def test_no_subject_key_identifier(self, backend):
980 cert = _load_cert(
981 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
982 x509.load_pem_x509_certificate,
983 backend
984 )
985 with pytest.raises(x509.ExtensionNotFound):
986 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500987 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500988 )
Paul Kehrer5508ee22015-04-02 19:31:03 -0500989
Paul Kehrerf22f6122015-08-05 12:57:13 +0100990 @pytest.mark.requires_backend_interface(interface=RSABackend)
991 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +0100992 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +0100993 cert = _load_cert(
994 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
995 x509.load_der_x509_certificate,
996 backend
997 )
998 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500999 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001000 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001001 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001002 cert.public_key()
1003 )
1004 assert ext.value == ski
1005
1006 @pytest.mark.requires_backend_interface(interface=DSABackend)
1007 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001008 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001009 cert = _load_cert(
1010 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1011 x509.load_pem_x509_certificate,
1012 backend
1013 )
1014
1015 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001016 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001017 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001018 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001019 cert.public_key()
1020 )
1021 assert ext.value == ski
1022
1023 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1024 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001025 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001026 _skip_curve_unsupported(backend, ec.SECP384R1())
1027 cert = _load_cert(
1028 os.path.join("x509", "ecdsa_root.pem"),
1029 x509.load_pem_x509_certificate,
1030 backend
1031 )
1032
1033 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001034 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001035 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001036 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001037 cert.public_key()
1038 )
1039 assert ext.value == ski
1040
Paul Kehrer5508ee22015-04-02 19:31:03 -05001041
1042@pytest.mark.requires_backend_interface(interface=RSABackend)
1043@pytest.mark.requires_backend_interface(interface=X509Backend)
1044class TestKeyUsageExtension(object):
1045 def test_no_key_usage(self, backend):
1046 cert = _load_cert(
1047 os.path.join("x509", "verisign_md2_root.pem"),
1048 x509.load_pem_x509_certificate,
1049 backend
1050 )
1051 ext = cert.extensions
1052 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001053 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001054
Paul Kehrerd44e4132015-08-10 19:13:13 -05001055 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001056
1057 def test_all_purposes(self, backend):
1058 cert = _load_cert(
1059 os.path.join(
1060 "x509", "custom", "all_key_usages.pem"
1061 ),
1062 x509.load_pem_x509_certificate,
1063 backend
1064 )
1065 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001066 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001067 assert ext is not None
1068
1069 ku = ext.value
1070 assert ku.digital_signature is True
1071 assert ku.content_commitment is True
1072 assert ku.key_encipherment is True
1073 assert ku.data_encipherment is True
1074 assert ku.key_agreement is True
1075 assert ku.key_cert_sign is True
1076 assert ku.crl_sign is True
1077 assert ku.encipher_only is True
1078 assert ku.decipher_only is True
1079
1080 def test_key_cert_sign_crl_sign(self, backend):
1081 cert = _load_cert(
1082 os.path.join(
1083 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1084 ),
1085 x509.load_der_x509_certificate,
1086 backend
1087 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001088 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001089 assert ext is not None
1090 assert ext.critical is True
1091
1092 ku = ext.value
1093 assert ku.digital_signature is False
1094 assert ku.content_commitment is False
1095 assert ku.key_encipherment is False
1096 assert ku.data_encipherment is False
1097 assert ku.key_agreement is False
1098 assert ku.key_cert_sign is True
1099 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001100
1101
1102@pytest.mark.parametrize(
1103 "name", [
1104 x509.RFC822Name,
1105 x509.DNSName,
1106 x509.UniformResourceIdentifier
1107 ]
1108)
1109class TestTextGeneralNames(object):
1110 def test_not_text(self, name):
1111 with pytest.raises(TypeError):
1112 name(b"notaunicodestring")
1113
1114 with pytest.raises(TypeError):
1115 name(1.3)
1116
1117 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301118 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001119 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1120
1121 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301122 gn = name(u"string")
1123 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001124 assert gn == gn2
1125
1126 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301127 gn = name(u"string")
1128 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001129 assert gn != gn2
1130 assert gn != object()
1131
1132
1133class TestDirectoryName(object):
1134 def test_not_name(self):
1135 with pytest.raises(TypeError):
1136 x509.DirectoryName(b"notaname")
1137
1138 with pytest.raises(TypeError):
1139 x509.DirectoryName(1.3)
1140
1141 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001142 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001143 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001144 if six.PY3:
1145 assert repr(gn) == (
1146 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1147 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1148 ">])>)>"
1149 )
1150 else:
1151 assert repr(gn) == (
1152 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1153 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1154 ")>])>)>"
1155 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001156
1157 def test_eq(self):
1158 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001159 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001160 ])
1161 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001162 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001163 ])
1164 gn = x509.DirectoryName(x509.Name([name]))
1165 gn2 = x509.DirectoryName(x509.Name([name2]))
1166 assert gn == gn2
1167
1168 def test_ne(self):
1169 name = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001170 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001171 ])
1172 name2 = x509.Name([
Ian Cordasco82fc3762015-06-16 20:59:50 -05001173 x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001174 ])
1175 gn = x509.DirectoryName(x509.Name([name]))
1176 gn2 = x509.DirectoryName(x509.Name([name2]))
1177 assert gn != gn2
1178 assert gn != object()
1179
1180
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001181class TestRFC822Name(object):
1182 def test_invalid_email(self):
1183 with pytest.raises(ValueError):
1184 x509.RFC822Name(u"Name <email>")
1185
1186 with pytest.raises(ValueError):
1187 x509.RFC822Name(u"")
1188
1189 def test_single_label(self):
1190 gn = x509.RFC822Name(u"administrator")
1191 assert gn.value == u"administrator"
1192
1193 def test_idna(self):
1194 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1195 assert gn.value == u"email@em\xe5\xefl.com"
1196 assert gn._encoded == b"email@xn--eml-vla4c.com"
1197
1198
Paul Kehrere28d6c42015-07-12 14:59:37 -05001199class TestUniformResourceIdentifier(object):
1200 def test_no_parsed_hostname(self):
1201 gn = x509.UniformResourceIdentifier(u"singlelabel")
1202 assert gn.value == u"singlelabel"
1203
1204 def test_with_port(self):
1205 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1206 assert gn.value == u"singlelabel:443/test"
1207
1208 def test_idna_no_port(self):
1209 gn = x509.UniformResourceIdentifier(
1210 u"http://\u043f\u044b\u043a\u0430.cryptography"
1211 )
1212 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1213 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1214
1215 def test_idna_with_port(self):
1216 gn = x509.UniformResourceIdentifier(
1217 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1218 )
1219 assert gn.value == (
1220 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1221 )
1222 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1223
1224 def test_query_and_fragment(self):
1225 gn = x509.UniformResourceIdentifier(
1226 u"ldap://cryptography:90/path?query=true#somedata"
1227 )
1228 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1229
1230
Paul Kehrer31bdf792015-03-25 14:11:00 -05001231class TestRegisteredID(object):
1232 def test_not_oid(self):
1233 with pytest.raises(TypeError):
1234 x509.RegisteredID(b"notanoid")
1235
1236 with pytest.raises(TypeError):
1237 x509.RegisteredID(1.3)
1238
1239 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001240 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001241 assert repr(gn) == (
1242 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1243 "e)>)>"
1244 )
1245
1246 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001247 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1248 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001249 assert gn == gn2
1250
1251 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001252 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001253 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001254 assert gn != gn2
1255 assert gn != object()
1256
1257
1258class TestIPAddress(object):
1259 def test_not_ipaddress(self):
1260 with pytest.raises(TypeError):
1261 x509.IPAddress(b"notanipaddress")
1262
1263 with pytest.raises(TypeError):
1264 x509.IPAddress(1.3)
1265
1266 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301267 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001268 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1269
Eeshan Gargf1234152015-04-29 18:41:00 +05301270 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001271 assert repr(gn2) == "<IPAddress(value=ff::)>"
1272
Paul Kehrereb177932015-05-17 18:33:33 -07001273 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1274 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1275
1276 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1277 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1278
Paul Kehrer31bdf792015-03-25 14:11:00 -05001279 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301280 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1281 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001282 assert gn == gn2
1283
1284 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301285 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1286 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001287 assert gn != gn2
1288 assert gn != object()
1289
1290
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001291class TestOtherName(object):
1292 def test_invalid_args(self):
1293 with pytest.raises(TypeError):
1294 x509.OtherName(b"notanobjectidentifier", b"derdata")
1295
1296 with pytest.raises(TypeError):
1297 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1298
1299 def test_repr(self):
1300 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1301 if six.PY3:
1302 assert repr(gn) == (
1303 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1304 "name=Unknown OID)>, value=b'derdata')>"
1305 )
1306 else:
1307 assert repr(gn) == (
1308 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1309 "name=Unknown OID)>, value='derdata')>"
1310 )
1311
1312 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1313 if six.PY3:
1314 assert repr(gn) == (
1315 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1316 "name=pseudonym)>, value=b'derdata')>"
1317 )
1318 else:
1319 assert repr(gn) == (
1320 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1321 "name=pseudonym)>, value='derdata')>"
1322 )
1323
1324 def test_eq(self):
1325 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1326 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1327 assert gn == gn2
1328
1329 def test_ne(self):
1330 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1331 assert gn != object()
1332
1333 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1334 assert gn != gn2
1335
1336 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1337 assert gn != gn2
1338
1339
Erik Trauschke2dcce902015-05-14 16:12:24 -07001340class TestGeneralNames(object):
1341 def test_get_values_for_type(self):
1342 gns = x509.GeneralNames(
1343 [x509.DNSName(u"cryptography.io")]
1344 )
1345 names = gns.get_values_for_type(x509.DNSName)
1346 assert names == [u"cryptography.io"]
1347
1348 def test_iter_names(self):
1349 gns = x509.GeneralNames([
1350 x509.DNSName(u"cryptography.io"),
1351 x509.DNSName(u"crypto.local"),
1352 ])
1353 assert len(gns) == 2
1354 assert list(gns) == [
1355 x509.DNSName(u"cryptography.io"),
1356 x509.DNSName(u"crypto.local"),
1357 ]
1358
1359 def test_invalid_general_names(self):
1360 with pytest.raises(TypeError):
1361 x509.GeneralNames(
1362 [x509.DNSName(u"cryptography.io"), "invalid"]
1363 )
1364
1365 def test_repr(self):
1366 gns = x509.GeneralNames(
1367 [
1368 x509.DNSName(u"cryptography.io")
1369 ]
1370 )
1371 assert repr(gns) == (
1372 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1373 )
1374
1375 def test_eq(self):
1376 gns = x509.GeneralNames(
1377 [x509.DNSName(u"cryptography.io")]
1378 )
1379 gns2 = x509.GeneralNames(
1380 [x509.DNSName(u"cryptography.io")]
1381 )
1382 assert gns == gns2
1383
1384 def test_ne(self):
1385 gns = x509.GeneralNames(
1386 [x509.DNSName(u"cryptography.io")]
1387 )
1388 gns2 = x509.GeneralNames(
1389 [x509.RFC822Name(u"admin@cryptography.io")]
1390 )
1391 assert gns != gns2
1392 assert gns != object()
1393
1394
Paul Kehrer99125c92015-06-07 18:37:10 -05001395class TestIssuerAlternativeName(object):
1396 def test_get_values_for_type(self):
1397 san = x509.IssuerAlternativeName(
1398 [x509.DNSName(u"cryptography.io")]
1399 )
1400 names = san.get_values_for_type(x509.DNSName)
1401 assert names == [u"cryptography.io"]
1402
1403 def test_iter_names(self):
1404 san = x509.IssuerAlternativeName([
1405 x509.DNSName(u"cryptography.io"),
1406 x509.DNSName(u"crypto.local"),
1407 ])
1408 assert len(san) == 2
1409 assert list(san) == [
1410 x509.DNSName(u"cryptography.io"),
1411 x509.DNSName(u"crypto.local"),
1412 ]
1413
1414 def test_invalid_general_names(self):
1415 with pytest.raises(TypeError):
1416 x509.IssuerAlternativeName(
1417 [x509.DNSName(u"cryptography.io"), "invalid"]
1418 )
1419
1420 def test_repr(self):
1421 san = x509.IssuerAlternativeName(
1422 [
1423 x509.DNSName(u"cryptography.io")
1424 ]
1425 )
1426 assert repr(san) == (
1427 "<IssuerAlternativeName("
1428 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1429 )
1430
1431 def test_eq(self):
1432 san = x509.IssuerAlternativeName(
1433 [x509.DNSName(u"cryptography.io")]
1434 )
1435 san2 = x509.IssuerAlternativeName(
1436 [x509.DNSName(u"cryptography.io")]
1437 )
1438 assert san == san2
1439
1440 def test_ne(self):
1441 san = x509.IssuerAlternativeName(
1442 [x509.DNSName(u"cryptography.io")]
1443 )
1444 san2 = x509.IssuerAlternativeName(
1445 [x509.RFC822Name(u"admin@cryptography.io")]
1446 )
1447 assert san != san2
1448 assert san != object()
1449
1450
Alex Gaynorf1c17672015-06-20 14:20:20 -04001451@pytest.mark.requires_backend_interface(interface=RSABackend)
1452@pytest.mark.requires_backend_interface(interface=X509Backend)
1453class TestRSAIssuerAlternativeNameExtension(object):
1454 def test_uri(self, backend):
1455 cert = _load_cert(
1456 os.path.join("x509", "custom", "ian_uri.pem"),
1457 x509.load_pem_x509_certificate,
1458 backend,
1459 )
1460 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001461 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001462 )
1463 assert list(ext.value) == [
1464 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1465 ]
1466
1467
Paul Kehrer31bdf792015-03-25 14:11:00 -05001468class TestSubjectAlternativeName(object):
1469 def test_get_values_for_type(self):
1470 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301471 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001472 )
1473 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301474 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001475
1476 def test_iter_names(self):
1477 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301478 x509.DNSName(u"cryptography.io"),
1479 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001480 ])
1481 assert len(san) == 2
1482 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301483 x509.DNSName(u"cryptography.io"),
1484 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001485 ]
1486
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001487 def test_invalid_general_names(self):
1488 with pytest.raises(TypeError):
1489 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301490 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001491 )
1492
Paul Kehrer31bdf792015-03-25 14:11:00 -05001493 def test_repr(self):
1494 san = x509.SubjectAlternativeName(
1495 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301496 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001497 ]
1498 )
1499 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001500 "<SubjectAlternativeName("
1501 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001502 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001503
Paul Kehrer58cc3972015-05-13 10:00:41 -05001504 def test_eq(self):
1505 san = x509.SubjectAlternativeName(
1506 [x509.DNSName(u"cryptography.io")]
1507 )
1508 san2 = x509.SubjectAlternativeName(
1509 [x509.DNSName(u"cryptography.io")]
1510 )
1511 assert san == san2
1512
1513 def test_ne(self):
1514 san = x509.SubjectAlternativeName(
1515 [x509.DNSName(u"cryptography.io")]
1516 )
1517 san2 = x509.SubjectAlternativeName(
1518 [x509.RFC822Name(u"admin@cryptography.io")]
1519 )
1520 assert san != san2
1521 assert san != object()
1522
Paul Kehrer40f83382015-04-20 15:00:16 -05001523
1524@pytest.mark.requires_backend_interface(interface=RSABackend)
1525@pytest.mark.requires_backend_interface(interface=X509Backend)
1526class TestRSASubjectAlternativeNameExtension(object):
1527 def test_dns_name(self, backend):
1528 cert = _load_cert(
1529 os.path.join("x509", "cryptography.io.pem"),
1530 x509.load_pem_x509_certificate,
1531 backend
1532 )
1533 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001534 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001535 )
1536 assert ext is not None
1537 assert ext.critical is False
1538
1539 san = ext.value
1540
1541 dns = san.get_values_for_type(x509.DNSName)
1542 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001543
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001544 def test_wildcard_dns_name(self, backend):
1545 cert = _load_cert(
1546 os.path.join("x509", "wildcard_san.pem"),
1547 x509.load_pem_x509_certificate,
1548 backend
1549 )
1550 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001551 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001552 )
1553
1554 dns = ext.value.get_values_for_type(x509.DNSName)
1555 assert dns == [
1556 u'*.langui.sh',
1557 u'langui.sh',
1558 u'*.saseliminator.com',
1559 u'saseliminator.com'
1560 ]
1561
1562 def test_san_wildcard_idna_dns_name(self, backend):
1563 cert = _load_cert(
1564 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1565 x509.load_pem_x509_certificate,
1566 backend
1567 )
1568 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001569 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001570 )
1571
1572 dns = ext.value.get_values_for_type(x509.DNSName)
1573 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1574
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001575 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001576 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001577 os.path.join("x509", "san_x400address.der"),
1578 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001579 backend
1580 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001581 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001582 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001583
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001584 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001585
1586 def test_registered_id(self, backend):
1587 cert = _load_cert(
1588 os.path.join(
1589 "x509", "custom", "san_registered_id.pem"
1590 ),
1591 x509.load_pem_x509_certificate,
1592 backend
1593 )
1594 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001595 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001596 )
1597 assert ext is not None
1598 assert ext.critical is False
1599
1600 san = ext.value
1601 rid = san.get_values_for_type(x509.RegisteredID)
1602 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001603
1604 def test_uri(self, backend):
1605 cert = _load_cert(
1606 os.path.join(
1607 "x509", "custom", "san_uri_with_port.pem"
1608 ),
1609 x509.load_pem_x509_certificate,
1610 backend
1611 )
1612 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001613 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001614 )
1615 assert ext is not None
1616 uri = ext.value.get_values_for_type(
1617 x509.UniformResourceIdentifier
1618 )
1619 assert uri == [
1620 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1621 u"lo",
1622 u"http://someregulardomain.com",
1623 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001624
1625 def test_ipaddress(self, backend):
1626 cert = _load_cert(
1627 os.path.join(
1628 "x509", "custom", "san_ipaddr.pem"
1629 ),
1630 x509.load_pem_x509_certificate,
1631 backend
1632 )
1633 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001634 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001635 )
1636 assert ext is not None
1637 assert ext.critical is False
1638
1639 san = ext.value
1640
1641 ip = san.get_values_for_type(x509.IPAddress)
1642 assert [
1643 ipaddress.ip_address(u"127.0.0.1"),
1644 ipaddress.ip_address(u"ff::")
1645 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001646
1647 def test_dirname(self, backend):
1648 cert = _load_cert(
1649 os.path.join(
1650 "x509", "custom", "san_dirname.pem"
1651 ),
1652 x509.load_pem_x509_certificate,
1653 backend
1654 )
1655 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001656 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001657 )
1658 assert ext is not None
1659 assert ext.critical is False
1660
1661 san = ext.value
1662
1663 dirname = san.get_values_for_type(x509.DirectoryName)
1664 assert [
1665 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001666 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1667 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1668 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001669 ])
1670 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001671
1672 def test_rfc822name(self, backend):
1673 cert = _load_cert(
1674 os.path.join(
1675 "x509", "custom", "san_rfc822_idna.pem"
1676 ),
1677 x509.load_pem_x509_certificate,
1678 backend
1679 )
1680 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001681 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001682 )
1683 assert ext is not None
1684 assert ext.critical is False
1685
1686 san = ext.value
1687
1688 rfc822name = san.get_values_for_type(x509.RFC822Name)
1689 assert [u"email@em\xe5\xefl.com"] == rfc822name
1690
Paul Kehrerb8968812015-05-15 09:01:34 -07001691 def test_idna2003_invalid(self, backend):
1692 cert = _load_cert(
1693 os.path.join(
1694 "x509", "custom", "san_idna2003_dnsname.pem"
1695 ),
1696 x509.load_pem_x509_certificate,
1697 backend
1698 )
1699 with pytest.raises(UnicodeError):
1700 cert.extensions
1701
Paul Kehrere06cab42015-04-30 10:23:33 -05001702 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1703 cert = _load_cert(
1704 os.path.join(
1705 "x509", "custom", "san_idna_names.pem"
1706 ),
1707 x509.load_pem_x509_certificate,
1708 backend
1709 )
1710 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001711 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001712 )
1713 assert ext is not None
1714 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1715 dns_name = ext.value.get_values_for_type(x509.DNSName)
1716 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1717 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1718 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1719 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1720
1721 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1722 cert = _load_cert(
1723 os.path.join(
1724 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1725 ),
1726 x509.load_pem_x509_certificate,
1727 backend
1728 )
1729 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001730 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001731 )
1732 assert ext is not None
1733 assert ext.critical is False
1734
1735 san = ext.value
1736
1737 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1738 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1739 dns = san.get_values_for_type(x509.DNSName)
1740 ip = san.get_values_for_type(x509.IPAddress)
1741 dirname = san.get_values_for_type(x509.DirectoryName)
1742 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001743 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001744 assert [u"cryptography.io"] == dns
1745 assert [
1746 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001747 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001748 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001749 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001750 ),
1751 ])
1752 ] == dirname
1753 assert [
1754 ipaddress.ip_address(u"127.0.0.1"),
1755 ipaddress.ip_address(u"ff::")
1756 ] == ip
1757
1758 def test_invalid_rfc822name(self, backend):
1759 cert = _load_cert(
1760 os.path.join(
1761 "x509", "custom", "san_rfc822_names.pem"
1762 ),
1763 x509.load_pem_x509_certificate,
1764 backend
1765 )
1766 with pytest.raises(ValueError) as exc:
1767 cert.extensions
1768
1769 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001770
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001771 def test_other_name(self, backend):
1772 cert = _load_cert(
1773 os.path.join(
1774 "x509", "custom", "san_other_name.pem"
1775 ),
1776 x509.load_pem_x509_certificate,
1777 backend
1778 )
1779
1780 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001781 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001782 )
1783 assert ext is not None
1784 assert ext.critical is False
1785
Joshua Taubererd2afad32015-07-06 22:37:53 +00001786 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1787 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001788 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001789 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001790
1791 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001792 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001793
Paul Kehrer94c69602015-05-02 19:29:40 -05001794
1795@pytest.mark.requires_backend_interface(interface=RSABackend)
1796@pytest.mark.requires_backend_interface(interface=X509Backend)
1797class TestExtendedKeyUsageExtension(object):
1798 def test_eku(self, backend):
1799 cert = _load_cert(
1800 os.path.join(
1801 "x509", "custom", "extended_key_usage.pem"
1802 ),
1803 x509.load_pem_x509_certificate,
1804 backend
1805 )
1806 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001807 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001808 )
1809 assert ext is not None
1810 assert ext.critical is False
1811
1812 assert [
1813 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1814 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1815 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1816 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1817 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1818 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1819 x509.ObjectIdentifier("2.5.29.37.0"),
1820 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1821 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001822
1823
1824class TestAccessDescription(object):
1825 def test_invalid_access_method(self):
Paul Kehrerf506bca2015-05-02 22:31:47 -05001826 with pytest.raises(ValueError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001827 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1828
1829 def test_invalid_access_location(self):
1830 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001831 x509.AccessDescription(
1832 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1833 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001834
1835 def test_repr(self):
1836 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001837 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001838 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1839 )
1840 assert repr(ad) == (
1841 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1842 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1843 "(value=http://ocsp.domain.com)>)>"
1844 )
1845
1846 def test_eq(self):
1847 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001848 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001849 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1850 )
1851 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001852 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001853 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1854 )
1855 assert ad == ad2
1856
1857 def test_ne(self):
1858 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001859 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001860 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1861 )
1862 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001863 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001864 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1865 )
1866 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001867 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001868 x509.UniformResourceIdentifier(u"http://notthesame")
1869 )
1870 assert ad != ad2
1871 assert ad != ad3
1872 assert ad != object()
1873
1874
1875class TestAuthorityInformationAccess(object):
1876 def test_invalid_descriptions(self):
1877 with pytest.raises(TypeError):
1878 x509.AuthorityInformationAccess(["notanAccessDescription"])
1879
1880 def test_iter_len(self):
1881 aia = x509.AuthorityInformationAccess([
1882 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001883 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001884 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1885 ),
1886 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001887 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001888 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1889 )
1890 ])
1891 assert len(aia) == 2
1892 assert list(aia) == [
1893 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001894 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001895 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1896 ),
1897 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001898 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001899 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1900 )
1901 ]
1902
1903 def test_repr(self):
1904 aia = x509.AuthorityInformationAccess([
1905 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001906 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001907 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1908 ),
1909 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001910 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001911 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1912 )
1913 ])
1914 assert repr(aia) == (
1915 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
1916 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
1917 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
1918 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
1919 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
1920 "fier(value=http://domain.com/ca.crt)>)>])>"
1921 )
1922
1923 def test_eq(self):
1924 aia = x509.AuthorityInformationAccess([
1925 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001926 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001927 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1928 ),
1929 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001930 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001931 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1932 )
1933 ])
1934 aia2 = x509.AuthorityInformationAccess([
1935 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001936 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001937 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1938 ),
1939 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001940 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001941 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1942 )
1943 ])
1944 assert aia == aia2
1945
1946 def test_ne(self):
1947 aia = x509.AuthorityInformationAccess([
1948 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001949 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001950 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1951 ),
1952 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001953 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001954 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
1955 )
1956 ])
1957 aia2 = x509.AuthorityInformationAccess([
1958 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001959 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001960 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1961 ),
1962 ])
1963
1964 assert aia != aia2
1965 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05001966
1967
1968@pytest.mark.requires_backend_interface(interface=RSABackend)
1969@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05001970class TestAuthorityInformationAccessExtension(object):
1971 def test_aia_ocsp_ca_issuers(self, backend):
1972 cert = _load_cert(
1973 os.path.join("x509", "cryptography.io.pem"),
1974 x509.load_pem_x509_certificate,
1975 backend
1976 )
1977 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001978 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05001979 )
1980 assert ext is not None
1981 assert ext.critical is False
1982
1983 assert ext.value == x509.AuthorityInformationAccess([
1984 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001985 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05001986 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
1987 ),
1988 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001989 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05001990 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
1991 ),
1992 ])
1993
1994 def test_aia_multiple_ocsp_ca_issuers(self, backend):
1995 cert = _load_cert(
1996 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
1997 x509.load_pem_x509_certificate,
1998 backend
1999 )
2000 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002001 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002002 )
2003 assert ext is not None
2004 assert ext.critical is False
2005
2006 assert ext.value == x509.AuthorityInformationAccess([
2007 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002008 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002009 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2010 ),
2011 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002012 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002013 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2014 ),
2015 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002016 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002017 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002018 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2019 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002020 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002021 ]))
2022 ),
2023 ])
2024
2025 def test_aia_ocsp_only(self, backend):
2026 cert = _load_cert(
2027 os.path.join("x509", "custom", "aia_ocsp.pem"),
2028 x509.load_pem_x509_certificate,
2029 backend
2030 )
2031 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002032 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002033 )
2034 assert ext is not None
2035 assert ext.critical is False
2036
2037 assert ext.value == x509.AuthorityInformationAccess([
2038 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002039 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002040 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2041 ),
2042 ])
2043
2044 def test_aia_ca_issuers_only(self, backend):
2045 cert = _load_cert(
2046 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
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_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002052 )
2053 assert ext is not None
2054 assert ext.critical is False
2055
2056 assert ext.value == x509.AuthorityInformationAccess([
2057 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002058 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002059 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002060 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2061 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002062 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002063 ]))
2064 ),
2065 ])
2066
2067
2068@pytest.mark.requires_backend_interface(interface=RSABackend)
2069@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002070class TestAuthorityKeyIdentifierExtension(object):
2071 def test_aki_keyid(self, backend):
2072 cert = _load_cert(
2073 os.path.join(
2074 "x509", "cryptography.io.pem"
2075 ),
2076 x509.load_pem_x509_certificate,
2077 backend
2078 )
2079 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002080 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002081 )
2082 assert ext is not None
2083 assert ext.critical is False
2084
2085 assert ext.value.key_identifier == (
2086 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2087 )
2088 assert ext.value.authority_cert_issuer is None
2089 assert ext.value.authority_cert_serial_number is None
2090
2091 def test_aki_all_fields(self, backend):
2092 cert = _load_cert(
2093 os.path.join(
2094 "x509", "custom", "authority_key_identifier.pem"
2095 ),
2096 x509.load_pem_x509_certificate,
2097 backend
2098 )
2099 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002100 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002101 )
2102 assert ext is not None
2103 assert ext.critical is False
2104
2105 assert ext.value.key_identifier == (
2106 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2107 )
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
2121
2122 def test_aki_no_keyid(self, backend):
2123 cert = _load_cert(
2124 os.path.join(
2125 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2126 ),
2127 x509.load_pem_x509_certificate,
2128 backend
2129 )
2130 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002131 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002132 )
2133 assert ext is not None
2134 assert ext.critical is False
2135
2136 assert ext.value.key_identifier is None
2137 assert ext.value.authority_cert_issuer == [
2138 x509.DirectoryName(
2139 x509.Name([
2140 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002141 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002142 ),
2143 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002144 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002145 )
2146 ])
2147 )
2148 ]
2149 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002150
Paul Kehrer253929a2015-08-05 17:30:39 +01002151 def test_from_certificate(self, backend):
2152 issuer_cert = _load_cert(
2153 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2154 x509.load_pem_x509_certificate,
2155 backend
2156 )
2157 cert = _load_cert(
2158 os.path.join("x509", "cryptography.io.pem"),
2159 x509.load_pem_x509_certificate,
2160 backend
2161 )
2162 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002163 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002164 )
2165 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2166 issuer_cert.public_key()
2167 )
2168 assert ext.value == aki
2169
Paul Kehrer5a485522015-05-06 00:29:12 -05002170
Paul Kehrere0017be2015-05-17 20:39:40 -06002171class TestNameConstraints(object):
2172 def test_ipaddress_wrong_type(self):
2173 with pytest.raises(TypeError):
2174 x509.NameConstraints(
2175 permitted_subtrees=[
2176 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2177 ],
2178 excluded_subtrees=None
2179 )
2180
2181 with pytest.raises(TypeError):
2182 x509.NameConstraints(
2183 permitted_subtrees=None,
2184 excluded_subtrees=[
2185 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2186 ]
2187 )
2188
2189 def test_ipaddress_allowed_type(self):
2190 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2191 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2192 nc = x509.NameConstraints(
2193 permitted_subtrees=permitted,
2194 excluded_subtrees=excluded
2195 )
2196 assert nc.permitted_subtrees == permitted
2197 assert nc.excluded_subtrees == excluded
2198
2199 def test_invalid_permitted_subtrees(self):
2200 with pytest.raises(TypeError):
2201 x509.NameConstraints("badpermitted", None)
2202
2203 def test_invalid_excluded_subtrees(self):
2204 with pytest.raises(TypeError):
2205 x509.NameConstraints(None, "badexcluded")
2206
2207 def test_no_subtrees(self):
2208 with pytest.raises(ValueError):
2209 x509.NameConstraints(None, None)
2210
2211 def test_permitted_none(self):
2212 excluded = [x509.DNSName(u"name.local")]
2213 nc = x509.NameConstraints(
2214 permitted_subtrees=None, excluded_subtrees=excluded
2215 )
2216 assert nc.permitted_subtrees is None
2217 assert nc.excluded_subtrees is not None
2218
2219 def test_excluded_none(self):
2220 permitted = [x509.DNSName(u"name.local")]
2221 nc = x509.NameConstraints(
2222 permitted_subtrees=permitted, excluded_subtrees=None
2223 )
2224 assert nc.permitted_subtrees is not None
2225 assert nc.excluded_subtrees is None
2226
2227 def test_repr(self):
2228 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2229 nc = x509.NameConstraints(
2230 permitted_subtrees=permitted,
2231 excluded_subtrees=None
2232 )
2233 assert repr(nc) == (
2234 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2235 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2236 )
2237
Paul Kehrer31894282015-06-21 21:46:41 -05002238 def test_eq(self):
2239 nc = x509.NameConstraints(
2240 permitted_subtrees=[x509.DNSName(u"name.local")],
2241 excluded_subtrees=[x509.DNSName(u"name2.local")]
2242 )
2243 nc2 = x509.NameConstraints(
2244 permitted_subtrees=[x509.DNSName(u"name.local")],
2245 excluded_subtrees=[x509.DNSName(u"name2.local")]
2246 )
2247 assert nc == nc2
2248
2249 def test_ne(self):
2250 nc = x509.NameConstraints(
2251 permitted_subtrees=[x509.DNSName(u"name.local")],
2252 excluded_subtrees=[x509.DNSName(u"name2.local")]
2253 )
2254 nc2 = x509.NameConstraints(
2255 permitted_subtrees=[x509.DNSName(u"name.local")],
2256 excluded_subtrees=None
2257 )
2258 nc3 = x509.NameConstraints(
2259 permitted_subtrees=None,
2260 excluded_subtrees=[x509.DNSName(u"name2.local")]
2261 )
2262
2263 assert nc != nc2
2264 assert nc != nc3
2265 assert nc != object()
2266
Paul Kehrere0017be2015-05-17 20:39:40 -06002267
Paul Kehrer870d7e82015-06-21 22:20:44 -05002268@pytest.mark.requires_backend_interface(interface=RSABackend)
2269@pytest.mark.requires_backend_interface(interface=X509Backend)
2270class TestNameConstraintsExtension(object):
2271 def test_permitted_excluded(self, backend):
2272 cert = _load_cert(
2273 os.path.join(
2274 "x509", "custom", "nc_permitted_excluded_2.pem"
2275 ),
2276 x509.load_pem_x509_certificate,
2277 backend
2278 )
2279 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002280 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002281 ).value
2282 assert nc == x509.NameConstraints(
2283 permitted_subtrees=[
2284 x509.DNSName(u"zombo.local"),
2285 ],
2286 excluded_subtrees=[
2287 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002288 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002289 ]))
2290 ]
2291 )
2292
2293 def test_permitted(self, backend):
2294 cert = _load_cert(
2295 os.path.join(
2296 "x509", "custom", "nc_permitted_2.pem"
2297 ),
2298 x509.load_pem_x509_certificate,
2299 backend
2300 )
2301 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002302 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002303 ).value
2304 assert nc == x509.NameConstraints(
2305 permitted_subtrees=[
2306 x509.DNSName(u"zombo.local"),
2307 ],
2308 excluded_subtrees=None
2309 )
2310
Paul Kehrer42376832015-07-01 18:10:32 -05002311 def test_permitted_with_leading_period(self, backend):
2312 cert = _load_cert(
2313 os.path.join(
2314 "x509", "custom", "nc_permitted.pem"
2315 ),
2316 x509.load_pem_x509_certificate,
2317 backend
2318 )
2319 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002320 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002321 ).value
2322 assert nc == x509.NameConstraints(
2323 permitted_subtrees=[
2324 x509.DNSName(u".cryptography.io"),
2325 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2326 ],
2327 excluded_subtrees=None
2328 )
2329
2330 def test_excluded_with_leading_period(self, backend):
2331 cert = _load_cert(
2332 os.path.join(
2333 "x509", "custom", "nc_excluded.pem"
2334 ),
2335 x509.load_pem_x509_certificate,
2336 backend
2337 )
2338 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002339 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002340 ).value
2341 assert nc == x509.NameConstraints(
2342 permitted_subtrees=None,
2343 excluded_subtrees=[
2344 x509.DNSName(u".cryptography.io"),
2345 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2346 ]
2347 )
2348
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002349 def test_permitted_excluded_with_ips(self, backend):
2350 cert = _load_cert(
2351 os.path.join(
2352 "x509", "custom", "nc_permitted_excluded.pem"
2353 ),
2354 x509.load_pem_x509_certificate,
2355 backend
2356 )
2357 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002358 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002359 ).value
2360 assert nc == x509.NameConstraints(
2361 permitted_subtrees=[
2362 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2363 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2364 ],
2365 excluded_subtrees=[
2366 x509.DNSName(u".domain.com"),
2367 x509.UniformResourceIdentifier(u"http://test.local"),
2368 ]
2369 )
2370
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002371 def test_single_ip_netmask(self, backend):
2372 cert = _load_cert(
2373 os.path.join(
2374 "x509", "custom", "nc_single_ip_netmask.pem"
2375 ),
2376 x509.load_pem_x509_certificate,
2377 backend
2378 )
2379 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002380 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002381 ).value
2382 assert nc == x509.NameConstraints(
2383 permitted_subtrees=[
2384 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2385 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2386 ],
2387 excluded_subtrees=None
2388 )
2389
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002390 def test_invalid_netmask(self, backend):
2391 cert = _load_cert(
2392 os.path.join(
2393 "x509", "custom", "nc_invalid_ip_netmask.pem"
2394 ),
2395 x509.load_pem_x509_certificate,
2396 backend
2397 )
2398 with pytest.raises(ValueError):
2399 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002400 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002401 )
2402
Paul Kehrer870d7e82015-06-21 22:20:44 -05002403
Paul Kehrer5a485522015-05-06 00:29:12 -05002404class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002405 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002406 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002407 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002408
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002409 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002410 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002411 x509.DistributionPoint(None, "notname", None, None)
2412
2413 def test_distribution_point_full_and_relative_not_none(self):
2414 with pytest.raises(ValueError):
2415 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002416
2417 def test_crl_issuer_not_general_names(self):
2418 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002419 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002420
2421 def test_reason_not_reasonflags(self):
2422 with pytest.raises(TypeError):
2423 x509.DistributionPoint(
2424 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002425 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002426 frozenset(["notreasonflags"]),
2427 None
2428 )
2429
2430 def test_reason_not_frozenset(self):
2431 with pytest.raises(TypeError):
2432 x509.DistributionPoint(
2433 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2434 None,
2435 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002436 None
2437 )
2438
2439 def test_disallowed_reasons(self):
2440 with pytest.raises(ValueError):
2441 x509.DistributionPoint(
2442 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2443 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002444 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002445 None
2446 )
2447
2448 with pytest.raises(ValueError):
2449 x509.DistributionPoint(
2450 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2451 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002452 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002453 None
2454 )
2455
2456 def test_reason_only(self):
2457 with pytest.raises(ValueError):
2458 x509.DistributionPoint(
2459 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002460 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002461 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002462 None
2463 )
2464
2465 def test_eq(self):
2466 dp = x509.DistributionPoint(
2467 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002468 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002469 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002470 [
2471 x509.DirectoryName(
2472 x509.Name([
2473 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002474 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002475 )
2476 ])
2477 )
2478 ],
2479 )
2480 dp2 = x509.DistributionPoint(
2481 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002482 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002483 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002484 [
2485 x509.DirectoryName(
2486 x509.Name([
2487 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002488 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002489 )
2490 ])
2491 )
2492 ],
2493 )
2494 assert dp == dp2
2495
2496 def test_ne(self):
2497 dp = x509.DistributionPoint(
2498 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002499 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002500 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002501 [
2502 x509.DirectoryName(
2503 x509.Name([
2504 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002505 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002506 )
2507 ])
2508 )
2509 ],
2510 )
2511 dp2 = x509.DistributionPoint(
2512 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2513 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002514 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002515 None
2516 )
2517 assert dp != dp2
2518 assert dp != object()
2519
2520 def test_repr(self):
2521 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002522 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002523 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002524 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002525 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002526 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002527 [
2528 x509.DirectoryName(
2529 x509.Name([
2530 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002531 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002532 )
2533 ])
2534 )
2535 ],
2536 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002537 if six.PY3:
2538 assert repr(dp) == (
2539 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2540 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002541 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2542 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2543 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2544 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002545 )
2546 else:
2547 assert repr(dp) == (
2548 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2549 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002550 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2551 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2552 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2553 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002554 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002555
2556
2557class TestCRLDistributionPoints(object):
2558 def test_invalid_distribution_points(self):
2559 with pytest.raises(TypeError):
2560 x509.CRLDistributionPoints(["notadistributionpoint"])
2561
2562 def test_iter_len(self):
2563 cdp = x509.CRLDistributionPoints([
2564 x509.DistributionPoint(
2565 [x509.UniformResourceIdentifier(u"http://domain")],
2566 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002567 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002568 None
2569 ),
2570 x509.DistributionPoint(
2571 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002572 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002573 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002574 x509.ReasonFlags.key_compromise,
2575 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002576 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002577 None
2578 ),
2579 ])
2580 assert len(cdp) == 2
2581 assert list(cdp) == [
2582 x509.DistributionPoint(
2583 [x509.UniformResourceIdentifier(u"http://domain")],
2584 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002585 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002586 None
2587 ),
2588 x509.DistributionPoint(
2589 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002590 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002591 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002592 x509.ReasonFlags.key_compromise,
2593 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002594 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002595 None
2596 ),
2597 ]
2598
2599 def test_repr(self):
2600 cdp = x509.CRLDistributionPoints([
2601 x509.DistributionPoint(
2602 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002603 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002604 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002605 None
2606 ),
2607 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002608 if six.PY3:
2609 assert repr(cdp) == (
2610 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2611 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2612 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2613 "romise'>}), crl_issuer=None)>])>"
2614 )
2615 else:
2616 assert repr(cdp) == (
2617 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2618 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2619 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2620 "romise'>]), crl_issuer=None)>])>"
2621 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002622
2623 def test_eq(self):
2624 cdp = x509.CRLDistributionPoints([
2625 x509.DistributionPoint(
2626 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002627 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002628 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002629 x509.ReasonFlags.key_compromise,
2630 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002631 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002632 [x509.UniformResourceIdentifier(u"uri://thing")],
2633 ),
2634 ])
2635 cdp2 = x509.CRLDistributionPoints([
2636 x509.DistributionPoint(
2637 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002638 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002639 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002640 x509.ReasonFlags.key_compromise,
2641 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002642 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002643 [x509.UniformResourceIdentifier(u"uri://thing")],
2644 ),
2645 ])
2646 assert cdp == cdp2
2647
2648 def test_ne(self):
2649 cdp = x509.CRLDistributionPoints([
2650 x509.DistributionPoint(
2651 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002652 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002653 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002654 x509.ReasonFlags.key_compromise,
2655 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002656 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002657 [x509.UniformResourceIdentifier(u"uri://thing")],
2658 ),
2659 ])
2660 cdp2 = x509.CRLDistributionPoints([
2661 x509.DistributionPoint(
2662 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002663 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002664 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002665 x509.ReasonFlags.key_compromise,
2666 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002667 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002668 [x509.UniformResourceIdentifier(u"uri://thing")],
2669 ),
2670 ])
2671 cdp3 = x509.CRLDistributionPoints([
2672 x509.DistributionPoint(
2673 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002674 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002675 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002676 [x509.UniformResourceIdentifier(u"uri://thing")],
2677 ),
2678 ])
2679 cdp4 = x509.CRLDistributionPoints([
2680 x509.DistributionPoint(
2681 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002682 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002683 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002684 x509.ReasonFlags.key_compromise,
2685 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002686 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002687 [x509.UniformResourceIdentifier(u"uri://thing2")],
2688 ),
2689 ])
2690 assert cdp != cdp2
2691 assert cdp != cdp3
2692 assert cdp != cdp4
2693 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002694
2695
2696@pytest.mark.requires_backend_interface(interface=RSABackend)
2697@pytest.mark.requires_backend_interface(interface=X509Backend)
2698class TestCRLDistributionPointsExtension(object):
2699 def test_fullname_and_crl_issuer(self, backend):
2700 cert = _load_cert(
2701 os.path.join(
2702 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2703 ),
2704 x509.load_der_x509_certificate,
2705 backend
2706 )
2707
2708 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002709 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002710 ).value
2711
2712 assert cdps == x509.CRLDistributionPoints([
2713 x509.DistributionPoint(
2714 full_name=[x509.DirectoryName(
2715 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002716 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002717 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002718 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002719 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002720 ),
2721 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002722 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002723 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002724 ),
2725 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002726 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002727 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002728 ),
2729 ])
2730 )],
2731 relative_name=None,
2732 reasons=None,
2733 crl_issuer=[x509.DirectoryName(
2734 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002735 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002736 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002737 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002738 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002739 ),
2740 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002741 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002742 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002743 ),
2744 ])
2745 )],
2746 )
2747 ])
2748
2749 def test_relativename_and_crl_issuer(self, backend):
2750 cert = _load_cert(
2751 os.path.join(
2752 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2753 ),
2754 x509.load_der_x509_certificate,
2755 backend
2756 )
2757
2758 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002759 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002760 ).value
2761
2762 assert cdps == x509.CRLDistributionPoints([
2763 x509.DistributionPoint(
2764 full_name=None,
2765 relative_name=x509.Name([
2766 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002767 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002768 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002769 ),
2770 ]),
2771 reasons=None,
2772 crl_issuer=[x509.DirectoryName(
2773 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002774 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002775 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002776 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002777 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002778 ),
2779 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002780 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002781 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002782 ),
2783 ])
2784 )],
2785 )
2786 ])
2787
2788 def test_fullname_crl_issuer_reasons(self, backend):
2789 cert = _load_cert(
2790 os.path.join(
2791 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2792 ),
2793 x509.load_pem_x509_certificate,
2794 backend
2795 )
2796
2797 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002798 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002799 ).value
2800
2801 assert cdps == x509.CRLDistributionPoints([
2802 x509.DistributionPoint(
2803 full_name=[x509.UniformResourceIdentifier(
2804 u"http://myhost.com/myca.crl"
2805 )],
2806 relative_name=None,
2807 reasons=frozenset([
2808 x509.ReasonFlags.key_compromise,
2809 x509.ReasonFlags.ca_compromise
2810 ]),
2811 crl_issuer=[x509.DirectoryName(
2812 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002813 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002814 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002815 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002816 ),
2817 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002818 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002819 ),
2820 ])
2821 )],
2822 )
2823 ])
2824
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002825 def test_all_reasons(self, backend):
2826 cert = _load_cert(
2827 os.path.join(
2828 "x509", "custom", "cdp_all_reasons.pem"
2829 ),
2830 x509.load_pem_x509_certificate,
2831 backend
2832 )
2833
2834 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002835 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002836 ).value
2837
2838 assert cdps == x509.CRLDistributionPoints([
2839 x509.DistributionPoint(
2840 full_name=[x509.UniformResourceIdentifier(
2841 u"http://domain.com/some.crl"
2842 )],
2843 relative_name=None,
2844 reasons=frozenset([
2845 x509.ReasonFlags.key_compromise,
2846 x509.ReasonFlags.ca_compromise,
2847 x509.ReasonFlags.affiliation_changed,
2848 x509.ReasonFlags.superseded,
2849 x509.ReasonFlags.privilege_withdrawn,
2850 x509.ReasonFlags.cessation_of_operation,
2851 x509.ReasonFlags.aa_compromise,
2852 x509.ReasonFlags.certificate_hold,
2853 ]),
2854 crl_issuer=None
2855 )
2856 ])
2857
2858 def test_single_reason(self, backend):
2859 cert = _load_cert(
2860 os.path.join(
2861 "x509", "custom", "cdp_reason_aa_compromise.pem"
2862 ),
2863 x509.load_pem_x509_certificate,
2864 backend
2865 )
2866
2867 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002868 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002869 ).value
2870
2871 assert cdps == x509.CRLDistributionPoints([
2872 x509.DistributionPoint(
2873 full_name=[x509.UniformResourceIdentifier(
2874 u"http://domain.com/some.crl"
2875 )],
2876 relative_name=None,
2877 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
2878 crl_issuer=None
2879 )
2880 ])
2881
Paul Kehrer9a10d592015-05-10 14:55:51 -05002882 def test_crl_issuer_only(self, backend):
2883 cert = _load_cert(
2884 os.path.join(
2885 "x509", "custom", "cdp_crl_issuer.pem"
2886 ),
2887 x509.load_pem_x509_certificate,
2888 backend
2889 )
2890
2891 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002892 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002893 ).value
2894
2895 assert cdps == x509.CRLDistributionPoints([
2896 x509.DistributionPoint(
2897 full_name=None,
2898 relative_name=None,
2899 reasons=None,
2900 crl_issuer=[x509.DirectoryName(
2901 x509.Name([
2902 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002903 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002904 ),
2905 ])
2906 )],
2907 )
2908 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05002909
2910
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002911@pytest.mark.requires_backend_interface(interface=RSABackend)
2912@pytest.mark.requires_backend_interface(interface=X509Backend)
2913class TestOCSPNoCheckExtension(object):
2914 def test_nocheck(self, backend):
2915 cert = _load_cert(
2916 os.path.join(
2917 "x509", "custom", "ocsp_nocheck.pem"
2918 ),
2919 x509.load_pem_x509_certificate,
2920 backend
2921 )
2922 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002923 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06002924 )
2925 assert isinstance(ext.value, x509.OCSPNoCheck)
2926
2927
Paul Kehrer16fae762015-05-01 23:14:20 -05002928class TestInhibitAnyPolicy(object):
2929 def test_not_int(self):
2930 with pytest.raises(TypeError):
2931 x509.InhibitAnyPolicy("notint")
2932
2933 def test_negative_int(self):
2934 with pytest.raises(ValueError):
2935 x509.InhibitAnyPolicy(-1)
2936
2937 def test_repr(self):
2938 iap = x509.InhibitAnyPolicy(0)
2939 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
2940
2941 def test_eq(self):
2942 iap = x509.InhibitAnyPolicy(1)
2943 iap2 = x509.InhibitAnyPolicy(1)
2944 assert iap == iap2
2945
2946 def test_ne(self):
2947 iap = x509.InhibitAnyPolicy(1)
2948 iap2 = x509.InhibitAnyPolicy(4)
2949 assert iap != iap2
2950 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06002951
2952
2953@pytest.mark.requires_backend_interface(interface=RSABackend)
2954@pytest.mark.requires_backend_interface(interface=X509Backend)
2955class TestInhibitAnyPolicyExtension(object):
2956 def test_nocheck(self, backend):
2957 cert = _load_cert(
2958 os.path.join(
2959 "x509", "custom", "inhibit_any_policy_5.pem"
2960 ),
2961 x509.load_pem_x509_certificate,
2962 backend
2963 )
2964 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002965 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06002966 ).value
2967 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01002968
2969
2970@pytest.mark.requires_backend_interface(interface=RSABackend)
2971@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01002972class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01002973 def test_invalid_certificate_policies_data(self, backend):
2974 cert = _load_cert(
2975 os.path.join(
2976 "x509", "custom", "cp_invalid.pem"
2977 ),
2978 x509.load_pem_x509_certificate,
2979 backend
2980 )
2981 with pytest.raises(ValueError):
2982 cert.extensions