blob: bfa94ec25e0e049eb30e51c271818d42d1797e1b [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 Kehrer23c0bbc2015-12-25 22:35:19 -06008import datetime
Paul Kehrer31bdf792015-03-25 14:11:00 -05009import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050010import os
11
Paul Kehrer8cf26422015-03-21 09:50:24 -050012import pytest
13
Paul Kehrercbfb1012015-04-10 20:57:20 -040014import six
15
Paul Kehrer8cf26422015-03-21 09:50:24 -050016from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010017from cryptography.hazmat.backends.interfaces import (
18 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
19)
20from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050021from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080022 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
23 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050024)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025
Paul Kehrerf22f6122015-08-05 12:57:13 +010026from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050027from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050028
29
Paul Kehrer85894662015-03-22 13:19:31 -050030class TestExtension(object):
31 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050032 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050033 with pytest.raises(TypeError):
34 x509.Extension("notanoid", True, bc)
35
36 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050037 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050038 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050039 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050040
41 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050042 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050043 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050044 assert repr(ext) == (
45 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
46 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
47 "_length=None)>)>"
48 )
49
Paul Kehrer58e870c2015-05-17 09:15:30 -070050 def test_eq(self):
51 ext1 = x509.Extension(
52 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
53 )
54 ext2 = x509.Extension(
55 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
56 )
57 assert ext1 == ext2
58
59 def test_ne(self):
60 ext1 = x509.Extension(
61 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
62 )
63 ext2 = x509.Extension(
64 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
65 )
66 ext3 = x509.Extension(
67 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
68 )
69 ext4 = x509.Extension(
70 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
71 )
72 assert ext1 != ext2
73 assert ext1 != ext3
74 assert ext1 != ext4
75 assert ext1 != object()
76
Paul Kehrer85894662015-03-22 13:19:31 -050077
Paul Kehrer49bb7562015-12-25 16:17:40 -060078class TestCertificateIssuer(object):
79 def test_iter_names(self):
80 ci = x509.CertificateIssuer([
81 x509.DNSName(u"cryptography.io"),
82 x509.DNSName(u"crypto.local"),
83 ])
84 assert len(ci) == 2
85 assert list(ci) == [
86 x509.DNSName(u"cryptography.io"),
87 x509.DNSName(u"crypto.local"),
88 ]
89
90 def test_eq(self):
91 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
92 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
93 assert ci1 == ci2
94
95 def test_ne(self):
96 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
97 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
98 assert ci1 != ci2
99 assert ci1 != object()
100
101 def test_repr(self):
102 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
103 assert repr(ci) == (
104 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
105 ")>])>)>"
106 )
107
108 def test_get_values_for_type(self):
109 ci = x509.CertificateIssuer(
110 [x509.DNSName(u"cryptography.io")]
111 )
112 names = ci.get_values_for_type(x509.DNSName)
113 assert names == [u"cryptography.io"]
114
115
Paul Kehrer7058ece2015-12-25 22:28:29 -0600116class TestCRLReason(object):
117 def test_invalid_reason_flags(self):
118 with pytest.raises(TypeError):
119 x509.CRLReason("notareason")
120
121 def test_eq(self):
122 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
123 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
124 assert reason1 == reason2
125
126 def test_ne(self):
127 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
128 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
129 assert reason1 != reason2
130 assert reason1 != object()
131
132 def test_repr(self):
133 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
134 assert repr(reason1) == (
135 "<CRLReason(reason=ReasonFlags.unspecified)>"
136 )
137
138
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600139class TestInvalidityDate(object):
140 def test_invalid_invalidity_date(self):
141 with pytest.raises(TypeError):
142 x509.InvalidityDate("notadate")
143
144 def test_eq(self):
145 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
146 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
147 assert invalid1 == invalid2
148
149 def test_ne(self):
150 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
151 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
152 assert invalid1 != invalid2
153 assert invalid1 != object()
154
155 def test_repr(self):
156 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
157 assert repr(invalid1) == (
158 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
159 )
160
Paul Kehrer67cde762015-12-26 11:37:14 -0600161 def test_hash(self):
162 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
163 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
164 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
165 assert hash(invalid1) == hash(invalid2)
166 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600167
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600168
Paul Kehrer2b622582015-04-15 11:04:29 -0400169class TestNoticeReference(object):
170 def test_notice_numbers_not_all_int(self):
171 with pytest.raises(TypeError):
172 x509.NoticeReference("org", [1, 2, "three"])
173
174 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500175 with pytest.raises(TypeError):
176 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400177
178 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500179 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400180
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500181 if six.PY3:
182 assert repr(nr) == (
183 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
184 "])>"
185 )
186 else:
187 assert repr(nr) == (
188 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
189 "4])>"
190 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400191
Paul Kehrerc56ab622015-05-03 09:56:31 -0500192 def test_eq(self):
193 nr = x509.NoticeReference("org", [1, 2])
194 nr2 = x509.NoticeReference("org", [1, 2])
195 assert nr == nr2
196
197 def test_ne(self):
198 nr = x509.NoticeReference("org", [1, 2])
199 nr2 = x509.NoticeReference("org", [1])
200 nr3 = x509.NoticeReference(None, [1, 2])
201 assert nr != nr2
202 assert nr != nr3
203 assert nr != object()
204
Paul Kehrer2b622582015-04-15 11:04:29 -0400205
206class TestUserNotice(object):
207 def test_notice_reference_invalid(self):
208 with pytest.raises(TypeError):
209 x509.UserNotice("invalid", None)
210
211 def test_notice_reference_none(self):
212 un = x509.UserNotice(None, "text")
213 assert un.notice_reference is None
214 assert un.explicit_text == "text"
215
216 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500217 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500218 if six.PY3:
219 assert repr(un) == (
220 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500221 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500222 )
223 else:
224 assert repr(un) == (
225 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500226 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500227 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400228
Paul Kehrerc56ab622015-05-03 09:56:31 -0500229 def test_eq(self):
230 nr = x509.NoticeReference("org", [1, 2])
231 nr2 = x509.NoticeReference("org", [1, 2])
232 un = x509.UserNotice(nr, "text")
233 un2 = x509.UserNotice(nr2, "text")
234 assert un == un2
235
236 def test_ne(self):
237 nr = x509.NoticeReference("org", [1, 2])
238 nr2 = x509.NoticeReference("org", [1])
239 un = x509.UserNotice(nr, "text")
240 un2 = x509.UserNotice(nr2, "text")
241 un3 = x509.UserNotice(nr, "text3")
242 assert un != un2
243 assert un != un3
244 assert un != object()
245
Paul Kehrer2b622582015-04-15 11:04:29 -0400246
Paul Kehrer2b622582015-04-15 11:04:29 -0400247class TestPolicyInformation(object):
248 def test_invalid_policy_identifier(self):
249 with pytest.raises(TypeError):
250 x509.PolicyInformation("notanoid", None)
251
252 def test_none_policy_qualifiers(self):
253 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
254 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
255 assert pi.policy_qualifiers is None
256
257 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500258 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400259 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
260 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
261 assert pi.policy_qualifiers == pq
262
263 def test_invalid_policy_identifiers(self):
264 with pytest.raises(TypeError):
265 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
266
267 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500268 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400269 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500270 if six.PY3:
271 assert repr(pi) == (
272 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
273 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500274 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500275 )
276 else:
277 assert repr(pi) == (
278 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
279 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500280 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500281 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400282
Paul Kehrerc56ab622015-05-03 09:56:31 -0500283 def test_eq(self):
284 pi = x509.PolicyInformation(
285 x509.ObjectIdentifier("1.2.3"),
286 [u"string", x509.UserNotice(None, u"hi")]
287 )
288 pi2 = x509.PolicyInformation(
289 x509.ObjectIdentifier("1.2.3"),
290 [u"string", x509.UserNotice(None, u"hi")]
291 )
292 assert pi == pi2
293
294 def test_ne(self):
295 pi = x509.PolicyInformation(
296 x509.ObjectIdentifier("1.2.3"), [u"string"]
297 )
298 pi2 = x509.PolicyInformation(
299 x509.ObjectIdentifier("1.2.3"), [u"string2"]
300 )
301 pi3 = x509.PolicyInformation(
302 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
303 )
304 assert pi != pi2
305 assert pi != pi3
306 assert pi != object()
307
Paul Kehrer2b622582015-04-15 11:04:29 -0400308
309class TestCertificatePolicies(object):
310 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500311 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400312 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
313 with pytest.raises(TypeError):
314 x509.CertificatePolicies([1, pi])
315
316 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500317 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400318 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
319 cp = x509.CertificatePolicies([pi])
320 assert len(cp) == 1
321 for policyinfo in cp:
322 assert policyinfo == pi
323
324 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500325 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400326 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
327 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500328 if six.PY3:
329 assert repr(cp) == (
330 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
331 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
332 "ers=['string'])>])>"
333 )
334 else:
335 assert repr(cp) == (
336 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
337 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
338 "ers=[u'string'])>])>"
339 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400340
Paul Kehrerc56ab622015-05-03 09:56:31 -0500341 def test_eq(self):
342 pi = x509.PolicyInformation(
343 x509.ObjectIdentifier("1.2.3"), [u"string"]
344 )
345 cp = x509.CertificatePolicies([pi])
346 pi2 = x509.PolicyInformation(
347 x509.ObjectIdentifier("1.2.3"), [u"string"]
348 )
349 cp2 = x509.CertificatePolicies([pi2])
350 assert cp == cp2
351
352 def test_ne(self):
353 pi = x509.PolicyInformation(
354 x509.ObjectIdentifier("1.2.3"), [u"string"]
355 )
356 cp = x509.CertificatePolicies([pi])
357 pi2 = x509.PolicyInformation(
358 x509.ObjectIdentifier("1.2.3"), [u"string2"]
359 )
360 cp2 = x509.CertificatePolicies([pi2])
361 assert cp != cp2
362 assert cp != object()
363
Paul Kehrer2b622582015-04-15 11:04:29 -0400364
Paul Kehrer11026fe2015-05-12 11:23:56 -0500365@pytest.mark.requires_backend_interface(interface=RSABackend)
366@pytest.mark.requires_backend_interface(interface=X509Backend)
367class TestCertificatePoliciesExtension(object):
368 def test_cps_uri_policy_qualifier(self, backend):
369 cert = _load_cert(
370 os.path.join("x509", "custom", "cp_cps_uri.pem"),
371 x509.load_pem_x509_certificate,
372 backend
373 )
374
375 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500376 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500377 ).value
378
379 assert cp == x509.CertificatePolicies([
380 x509.PolicyInformation(
381 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
382 [u"http://other.com/cps"]
383 )
384 ])
385
386 def test_user_notice_with_notice_reference(self, backend):
387 cert = _load_cert(
388 os.path.join(
389 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
390 ),
391 x509.load_pem_x509_certificate,
392 backend
393 )
394
395 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500396 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500397 ).value
398
399 assert cp == x509.CertificatePolicies([
400 x509.PolicyInformation(
401 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
402 [
403 u"http://example.com/cps",
404 u"http://other.com/cps",
405 x509.UserNotice(
406 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
407 u"thing"
408 )
409 ]
410 )
411 ])
412
413 def test_user_notice_with_explicit_text(self, backend):
414 cert = _load_cert(
415 os.path.join(
416 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
417 ),
418 x509.load_pem_x509_certificate,
419 backend
420 )
421
422 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500423 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500424 ).value
425
426 assert cp == x509.CertificatePolicies([
427 x509.PolicyInformation(
428 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
429 [x509.UserNotice(None, u"thing")]
430 )
431 ])
432
433 def test_user_notice_no_explicit_text(self, backend):
434 cert = _load_cert(
435 os.path.join(
436 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
437 ),
438 x509.load_pem_x509_certificate,
439 backend
440 )
441
442 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500443 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500444 ).value
445
446 assert cp == x509.CertificatePolicies([
447 x509.PolicyInformation(
448 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
449 [
450 x509.UserNotice(
451 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
452 None
453 )
454 ]
455 )
456 ])
457
458
Paul Kehrercecbbba2015-03-30 14:58:38 -0500459class TestKeyUsage(object):
460 def test_key_agreement_false_encipher_decipher_true(self):
461 with pytest.raises(ValueError):
462 x509.KeyUsage(
463 digital_signature=False,
464 content_commitment=False,
465 key_encipherment=False,
466 data_encipherment=False,
467 key_agreement=False,
468 key_cert_sign=False,
469 crl_sign=False,
470 encipher_only=True,
471 decipher_only=False
472 )
473
474 with pytest.raises(ValueError):
475 x509.KeyUsage(
476 digital_signature=False,
477 content_commitment=False,
478 key_encipherment=False,
479 data_encipherment=False,
480 key_agreement=False,
481 key_cert_sign=False,
482 crl_sign=False,
483 encipher_only=True,
484 decipher_only=True
485 )
486
487 with pytest.raises(ValueError):
488 x509.KeyUsage(
489 digital_signature=False,
490 content_commitment=False,
491 key_encipherment=False,
492 data_encipherment=False,
493 key_agreement=False,
494 key_cert_sign=False,
495 crl_sign=False,
496 encipher_only=False,
497 decipher_only=True
498 )
499
500 def test_properties_key_agreement_true(self):
501 ku = x509.KeyUsage(
502 digital_signature=True,
503 content_commitment=True,
504 key_encipherment=False,
505 data_encipherment=False,
506 key_agreement=False,
507 key_cert_sign=True,
508 crl_sign=False,
509 encipher_only=False,
510 decipher_only=False
511 )
512 assert ku.digital_signature is True
513 assert ku.content_commitment is True
514 assert ku.key_encipherment is False
515 assert ku.data_encipherment is False
516 assert ku.key_agreement is False
517 assert ku.key_cert_sign is True
518 assert ku.crl_sign is False
519
520 def test_key_agreement_true_properties(self):
521 ku = x509.KeyUsage(
522 digital_signature=False,
523 content_commitment=False,
524 key_encipherment=False,
525 data_encipherment=False,
526 key_agreement=True,
527 key_cert_sign=False,
528 crl_sign=False,
529 encipher_only=False,
530 decipher_only=True
531 )
532 assert ku.key_agreement is True
533 assert ku.encipher_only is False
534 assert ku.decipher_only is True
535
536 def test_key_agreement_false_properties(self):
537 ku = 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.key_agreement is False
549 with pytest.raises(ValueError):
550 ku.encipher_only
551
552 with pytest.raises(ValueError):
553 ku.decipher_only
554
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500555 def test_repr_key_agreement_false(self):
556 ku = x509.KeyUsage(
557 digital_signature=True,
558 content_commitment=True,
559 key_encipherment=False,
560 data_encipherment=False,
561 key_agreement=False,
562 key_cert_sign=True,
563 crl_sign=False,
564 encipher_only=False,
565 decipher_only=False
566 )
567 assert repr(ku) == (
568 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
569 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400570 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
571 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500572 )
573
574 def test_repr_key_agreement_true(self):
575 ku = x509.KeyUsage(
576 digital_signature=True,
577 content_commitment=True,
578 key_encipherment=False,
579 data_encipherment=False,
580 key_agreement=True,
581 key_cert_sign=True,
582 crl_sign=False,
583 encipher_only=False,
584 decipher_only=False
585 )
586 assert repr(ku) == (
587 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
588 "cipherment=False, data_encipherment=False, key_agreement=True, k"
589 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
590 "only=False)>"
591 )
592
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500593 def test_eq(self):
594 ku = x509.KeyUsage(
595 digital_signature=False,
596 content_commitment=False,
597 key_encipherment=False,
598 data_encipherment=False,
599 key_agreement=True,
600 key_cert_sign=False,
601 crl_sign=False,
602 encipher_only=False,
603 decipher_only=True
604 )
605 ku2 = x509.KeyUsage(
606 digital_signature=False,
607 content_commitment=False,
608 key_encipherment=False,
609 data_encipherment=False,
610 key_agreement=True,
611 key_cert_sign=False,
612 crl_sign=False,
613 encipher_only=False,
614 decipher_only=True
615 )
616 assert ku == ku2
617
618 def test_ne(self):
619 ku = x509.KeyUsage(
620 digital_signature=False,
621 content_commitment=False,
622 key_encipherment=False,
623 data_encipherment=False,
624 key_agreement=True,
625 key_cert_sign=False,
626 crl_sign=False,
627 encipher_only=False,
628 decipher_only=True
629 )
630 ku2 = x509.KeyUsage(
631 digital_signature=False,
632 content_commitment=False,
633 key_encipherment=False,
634 data_encipherment=False,
635 key_agreement=False,
636 key_cert_sign=False,
637 crl_sign=False,
638 encipher_only=False,
639 decipher_only=False
640 )
641 assert ku != ku2
642 assert ku != object()
643
Paul Kehrercecbbba2015-03-30 14:58:38 -0500644
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500645class TestSubjectKeyIdentifier(object):
646 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400647 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500648 ski = x509.SubjectKeyIdentifier(value)
649 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500650
651 def test_repr(self):
652 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500653 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500654 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500655 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400656 if six.PY3:
657 assert repr(ext) == (
658 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
659 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
660 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
661 "\\xf7\\xff:\\xc9\')>)>"
662 )
663 else:
664 assert repr(ext) == (
665 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
666 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
667 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
668 "\\xf7\\xff:\\xc9\')>)>"
669 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500670
671 def test_eq(self):
672 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500673 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500674 )
675 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500676 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500677 )
678 assert ski == ski2
679
680 def test_ne(self):
681 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500682 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500683 )
684 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500685 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500686 )
687 assert ski != ski2
688 assert ski != object()
689
Alex Gaynor410fe352015-12-26 15:01:25 -0500690 def test_hash(self):
691 ski1 = x509.SubjectKeyIdentifier(
692 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
693 )
694 ski2 = x509.SubjectKeyIdentifier(
695 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
696 )
697 ski3 = x509.SubjectKeyIdentifier(
698 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
699 )
700
701 assert hash(ski1) == hash(ski2)
702 assert hash(ski1) != hash(ski3)
703
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500704
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400705class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500706 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400707 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500708 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400709
710 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500711 dirname = x509.DirectoryName(
712 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800713 x509.NameAttribute(
714 x509.ObjectIdentifier('2.999.1'),
715 u'value1'
716 ),
717 x509.NameAttribute(
718 x509.ObjectIdentifier('2.999.2'),
719 u'value2'
720 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500721 ])
722 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400723 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500724 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400725
726 def test_authority_issuer_none_serial_not_none(self):
727 with pytest.raises(ValueError):
728 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
729
730 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500731 dirname = x509.DirectoryName(
732 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800733 x509.NameAttribute(
734 x509.ObjectIdentifier('2.999.1'),
735 u'value1'
736 ),
737 x509.NameAttribute(
738 x509.ObjectIdentifier('2.999.2'),
739 u'value2'
740 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500741 ])
742 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400743 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500744 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400745
746 def test_authority_cert_serial_and_issuer_none(self):
747 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
748 assert aki.key_identifier == b"id"
749 assert aki.authority_cert_issuer is None
750 assert aki.authority_cert_serial_number is None
751
752 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500753 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500754 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500755 )
756 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400757
758 if six.PY3:
759 assert repr(aki) == (
760 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500761 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500762 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500763 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400764 )
765 else:
766 assert repr(aki) == (
767 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500768 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500769 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
770 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400771 )
772
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500773 def test_eq(self):
774 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500775 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500776 )
777 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
778 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500779 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500780 )
781 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
782 assert aki == aki2
783
784 def test_ne(self):
785 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500786 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500787 )
788 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500789 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500790 )
791 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
792 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
793 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
794 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
795 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
796 assert aki != aki2
797 assert aki != aki3
798 assert aki != aki4
799 assert aki != aki5
800 assert aki != object()
801
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400802
Paul Kehrer8cf26422015-03-21 09:50:24 -0500803class TestBasicConstraints(object):
804 def test_ca_not_boolean(self):
805 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500806 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500807
808 def test_path_length_not_ca(self):
809 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500810 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500811
812 def test_path_length_not_int(self):
813 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500814 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500815
816 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500817 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500818
819 def test_path_length_negative(self):
820 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500821 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500822
823 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500824 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500825 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500826 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500827 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500828
Paul Kehrer3a69b132015-05-13 10:03:46 -0500829 def test_eq(self):
830 na = x509.BasicConstraints(ca=True, path_length=None)
831 na2 = x509.BasicConstraints(ca=True, path_length=None)
832 assert na == na2
833
834 def test_ne(self):
835 na = x509.BasicConstraints(ca=True, path_length=None)
836 na2 = x509.BasicConstraints(ca=True, path_length=1)
837 na3 = x509.BasicConstraints(ca=False, path_length=None)
838 assert na != na2
839 assert na != na3
840 assert na != object()
841
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500842
Paul Kehrerffa2a152015-03-31 08:18:25 -0500843class TestExtendedKeyUsage(object):
844 def test_not_all_oids(self):
845 with pytest.raises(TypeError):
846 x509.ExtendedKeyUsage(["notoid"])
847
848 def test_iter_len(self):
849 eku = x509.ExtendedKeyUsage([
850 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
851 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
852 ])
853 assert len(eku) == 2
854 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500855 ExtendedKeyUsageOID.SERVER_AUTH,
856 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500857 ]
858
Paul Kehrer23d10c32015-04-02 23:12:32 -0500859 def test_repr(self):
860 eku = x509.ExtendedKeyUsage([
861 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
862 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
863 ])
864 assert repr(eku) == (
865 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
866 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
867 "tAuth)>])>"
868 )
869
Paul Kehrerb0476172015-05-02 19:34:51 -0500870 def test_eq(self):
871 eku = x509.ExtendedKeyUsage([
872 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
873 ])
874 eku2 = x509.ExtendedKeyUsage([
875 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
876 ])
877 assert eku == eku2
878
879 def test_ne(self):
880 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
881 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
882 assert eku != eku2
883 assert eku != object()
884
Paul Kehrerffa2a152015-03-31 08:18:25 -0500885
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500886@pytest.mark.requires_backend_interface(interface=RSABackend)
887@pytest.mark.requires_backend_interface(interface=X509Backend)
888class TestExtensions(object):
889 def test_no_extensions(self, backend):
890 cert = _load_cert(
891 os.path.join("x509", "verisign_md2_root.pem"),
892 x509.load_pem_x509_certificate,
893 backend
894 )
895 ext = cert.extensions
896 assert len(ext) == 0
897 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500898 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500899 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500900
Paul Kehrerd44e4132015-08-10 19:13:13 -0500901 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500902
903 def test_one_extension(self, backend):
904 cert = _load_cert(
905 os.path.join(
906 "x509", "custom", "basic_constraints_not_critical.pem"
907 ),
908 x509.load_pem_x509_certificate,
909 backend
910 )
911 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500912 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500913 assert ext is not None
914 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500915
916 def test_duplicate_extension(self, backend):
917 cert = _load_cert(
918 os.path.join(
919 "x509", "custom", "two_basic_constraints.pem"
920 ),
921 x509.load_pem_x509_certificate,
922 backend
923 )
924 with pytest.raises(x509.DuplicateExtension) as exc:
925 cert.extensions
926
Paul Kehrerd44e4132015-08-10 19:13:13 -0500927 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500928
929 def test_unsupported_critical_extension(self, backend):
930 cert = _load_cert(
931 os.path.join(
932 "x509", "custom", "unsupported_extension_critical.pem"
933 ),
934 x509.load_pem_x509_certificate,
935 backend
936 )
937 with pytest.raises(x509.UnsupportedExtension) as exc:
938 cert.extensions
939
940 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
941
942 def test_unsupported_extension(self, backend):
943 # TODO: this will raise an exception when all extensions are complete
944 cert = _load_cert(
945 os.path.join(
946 "x509", "custom", "unsupported_extension.pem"
947 ),
948 x509.load_pem_x509_certificate,
949 backend
950 )
951 extensions = cert.extensions
952 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500953
Phoebe Queenecae9812015-08-12 05:00:32 +0100954 def test_no_extensions_get_for_class(self, backend):
955 cert = _load_cert(
956 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100957 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100958 ),
959 x509.load_pem_x509_certificate,
960 backend
961 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100962 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100963 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100964 exts.get_extension_for_class(x509.IssuerAlternativeName)
965 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100966
Paul Kehrer5b90c972015-12-26 00:52:58 -0600967 def test_indexing(self, backend):
968 cert = _load_cert(
969 os.path.join("x509", "cryptography.io.pem"),
970 x509.load_pem_x509_certificate,
971 backend
972 )
973 exts = cert.extensions
974 assert exts[-1] == exts[7]
975 assert len(exts[3:5]) == 2
976 assert exts[2:4][0] == exts[2]
977 assert exts[2:4][1] == exts[3]
978
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100979 def test_one_extension_get_for_class(self, backend):
980 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100981 os.path.join(
982 "x509", "custom", "basic_constraints_not_critical.pem"
983 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100984 x509.load_pem_x509_certificate,
985 backend
986 )
987 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
988 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100989 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500990
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500991 def test_repr(self, backend):
992 cert = _load_cert(
993 os.path.join(
994 "x509", "custom", "basic_constraints_not_critical.pem"
995 ),
996 x509.load_pem_x509_certificate,
997 backend
998 )
999 assert repr(cert.extensions) == (
1000 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1001 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1002 "alse, path_length=None)>)>])>"
1003 )
1004
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001005
Paul Kehrerfa56a232015-03-17 13:14:03 -05001006@pytest.mark.requires_backend_interface(interface=RSABackend)
1007@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001008class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001009 def test_ca_true_pathlen_6(self, backend):
1010 cert = _load_cert(
1011 os.path.join(
1012 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1013 ),
1014 x509.load_der_x509_certificate,
1015 backend
1016 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001017 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001018 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001019 )
1020 assert ext is not None
1021 assert ext.critical is True
1022 assert ext.value.ca is True
1023 assert ext.value.path_length == 6
1024
1025 def test_path_length_zero(self, backend):
1026 cert = _load_cert(
1027 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1028 x509.load_pem_x509_certificate,
1029 backend
1030 )
1031 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001032 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001033 )
1034 assert ext is not None
1035 assert ext.critical is True
1036 assert ext.value.ca is True
1037 assert ext.value.path_length == 0
1038
1039 def test_ca_true_no_pathlen(self, backend):
1040 cert = _load_cert(
1041 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1042 x509.load_der_x509_certificate,
1043 backend
1044 )
1045 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001046 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001047 )
1048 assert ext is not None
1049 assert ext.critical is True
1050 assert ext.value.ca is True
1051 assert ext.value.path_length is None
1052
1053 def test_ca_false(self, backend):
1054 cert = _load_cert(
1055 os.path.join("x509", "cryptography.io.pem"),
1056 x509.load_pem_x509_certificate,
1057 backend
1058 )
1059 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001060 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001061 )
1062 assert ext is not None
1063 assert ext.critical is True
1064 assert ext.value.ca is False
1065 assert ext.value.path_length is None
1066
1067 def test_no_basic_constraints(self, backend):
1068 cert = _load_cert(
1069 os.path.join(
1070 "x509",
1071 "PKITS_data",
1072 "certs",
1073 "ValidCertificatePathTest1EE.crt"
1074 ),
1075 x509.load_der_x509_certificate,
1076 backend
1077 )
1078 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001079 cert.extensions.get_extension_for_oid(
1080 ExtensionOID.BASIC_CONSTRAINTS
1081 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001082
1083 def test_basic_constraint_not_critical(self, backend):
1084 cert = _load_cert(
1085 os.path.join(
1086 "x509", "custom", "basic_constraints_not_critical.pem"
1087 ),
1088 x509.load_pem_x509_certificate,
1089 backend
1090 )
1091 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001092 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001093 )
1094 assert ext is not None
1095 assert ext.critical is False
1096 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001097
1098
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001099class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001100 @pytest.mark.requires_backend_interface(interface=RSABackend)
1101 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001102 def test_subject_key_identifier(self, backend):
1103 cert = _load_cert(
1104 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1105 x509.load_der_x509_certificate,
1106 backend
1107 )
1108 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001109 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001110 )
1111 ski = ext.value
1112 assert ext is not None
1113 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001114 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001115 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001116 )
1117
Paul Kehrerf22f6122015-08-05 12:57:13 +01001118 @pytest.mark.requires_backend_interface(interface=RSABackend)
1119 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001120 def test_no_subject_key_identifier(self, backend):
1121 cert = _load_cert(
1122 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1123 x509.load_pem_x509_certificate,
1124 backend
1125 )
1126 with pytest.raises(x509.ExtensionNotFound):
1127 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001128 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001129 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001130
Paul Kehrerf22f6122015-08-05 12:57:13 +01001131 @pytest.mark.requires_backend_interface(interface=RSABackend)
1132 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001133 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001134 cert = _load_cert(
1135 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1136 x509.load_der_x509_certificate,
1137 backend
1138 )
1139 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001140 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001141 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001142 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001143 cert.public_key()
1144 )
1145 assert ext.value == ski
1146
1147 @pytest.mark.requires_backend_interface(interface=DSABackend)
1148 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001149 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001150 cert = _load_cert(
1151 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1152 x509.load_pem_x509_certificate,
1153 backend
1154 )
1155
1156 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001157 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001158 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001159 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001160 cert.public_key()
1161 )
1162 assert ext.value == ski
1163
1164 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1165 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001166 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001167 _skip_curve_unsupported(backend, ec.SECP384R1())
1168 cert = _load_cert(
1169 os.path.join("x509", "ecdsa_root.pem"),
1170 x509.load_pem_x509_certificate,
1171 backend
1172 )
1173
1174 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001175 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001176 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001177 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001178 cert.public_key()
1179 )
1180 assert ext.value == ski
1181
Paul Kehrer5508ee22015-04-02 19:31:03 -05001182
1183@pytest.mark.requires_backend_interface(interface=RSABackend)
1184@pytest.mark.requires_backend_interface(interface=X509Backend)
1185class TestKeyUsageExtension(object):
1186 def test_no_key_usage(self, backend):
1187 cert = _load_cert(
1188 os.path.join("x509", "verisign_md2_root.pem"),
1189 x509.load_pem_x509_certificate,
1190 backend
1191 )
1192 ext = cert.extensions
1193 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001194 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001195
Paul Kehrerd44e4132015-08-10 19:13:13 -05001196 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001197
1198 def test_all_purposes(self, backend):
1199 cert = _load_cert(
1200 os.path.join(
1201 "x509", "custom", "all_key_usages.pem"
1202 ),
1203 x509.load_pem_x509_certificate,
1204 backend
1205 )
1206 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001207 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001208 assert ext is not None
1209
1210 ku = ext.value
1211 assert ku.digital_signature is True
1212 assert ku.content_commitment is True
1213 assert ku.key_encipherment is True
1214 assert ku.data_encipherment is True
1215 assert ku.key_agreement is True
1216 assert ku.key_cert_sign is True
1217 assert ku.crl_sign is True
1218 assert ku.encipher_only is True
1219 assert ku.decipher_only is True
1220
1221 def test_key_cert_sign_crl_sign(self, backend):
1222 cert = _load_cert(
1223 os.path.join(
1224 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1225 ),
1226 x509.load_der_x509_certificate,
1227 backend
1228 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001229 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001230 assert ext is not None
1231 assert ext.critical is True
1232
1233 ku = ext.value
1234 assert ku.digital_signature is False
1235 assert ku.content_commitment is False
1236 assert ku.key_encipherment is False
1237 assert ku.data_encipherment is False
1238 assert ku.key_agreement is False
1239 assert ku.key_cert_sign is True
1240 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001241
1242
1243@pytest.mark.parametrize(
1244 "name", [
1245 x509.RFC822Name,
1246 x509.DNSName,
1247 x509.UniformResourceIdentifier
1248 ]
1249)
1250class TestTextGeneralNames(object):
1251 def test_not_text(self, name):
1252 with pytest.raises(TypeError):
1253 name(b"notaunicodestring")
1254
1255 with pytest.raises(TypeError):
1256 name(1.3)
1257
1258 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301259 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001260 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1261
1262 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301263 gn = name(u"string")
1264 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001265 assert gn == gn2
1266
1267 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301268 gn = name(u"string")
1269 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001270 assert gn != gn2
1271 assert gn != object()
1272
1273
1274class TestDirectoryName(object):
1275 def test_not_name(self):
1276 with pytest.raises(TypeError):
1277 x509.DirectoryName(b"notaname")
1278
1279 with pytest.raises(TypeError):
1280 x509.DirectoryName(1.3)
1281
1282 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001283 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001284 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001285 if six.PY3:
1286 assert repr(gn) == (
1287 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1288 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1289 ">])>)>"
1290 )
1291 else:
1292 assert repr(gn) == (
1293 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1294 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1295 ")>])>)>"
1296 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001297
1298 def test_eq(self):
1299 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001300 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001301 ])
1302 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001303 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001304 ])
1305 gn = x509.DirectoryName(x509.Name([name]))
1306 gn2 = x509.DirectoryName(x509.Name([name2]))
1307 assert gn == gn2
1308
1309 def test_ne(self):
1310 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001311 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001312 ])
1313 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001314 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001315 ])
1316 gn = x509.DirectoryName(x509.Name([name]))
1317 gn2 = x509.DirectoryName(x509.Name([name2]))
1318 assert gn != gn2
1319 assert gn != object()
1320
1321
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001322class TestRFC822Name(object):
1323 def test_invalid_email(self):
1324 with pytest.raises(ValueError):
1325 x509.RFC822Name(u"Name <email>")
1326
1327 with pytest.raises(ValueError):
1328 x509.RFC822Name(u"")
1329
1330 def test_single_label(self):
1331 gn = x509.RFC822Name(u"administrator")
1332 assert gn.value == u"administrator"
1333
1334 def test_idna(self):
1335 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1336 assert gn.value == u"email@em\xe5\xefl.com"
1337 assert gn._encoded == b"email@xn--eml-vla4c.com"
1338
1339
Paul Kehrere28d6c42015-07-12 14:59:37 -05001340class TestUniformResourceIdentifier(object):
1341 def test_no_parsed_hostname(self):
1342 gn = x509.UniformResourceIdentifier(u"singlelabel")
1343 assert gn.value == u"singlelabel"
1344
1345 def test_with_port(self):
1346 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1347 assert gn.value == u"singlelabel:443/test"
1348
1349 def test_idna_no_port(self):
1350 gn = x509.UniformResourceIdentifier(
1351 u"http://\u043f\u044b\u043a\u0430.cryptography"
1352 )
1353 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1354 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1355
1356 def test_idna_with_port(self):
1357 gn = x509.UniformResourceIdentifier(
1358 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1359 )
1360 assert gn.value == (
1361 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1362 )
1363 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1364
1365 def test_query_and_fragment(self):
1366 gn = x509.UniformResourceIdentifier(
1367 u"ldap://cryptography:90/path?query=true#somedata"
1368 )
1369 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1370
1371
Paul Kehrer31bdf792015-03-25 14:11:00 -05001372class TestRegisteredID(object):
1373 def test_not_oid(self):
1374 with pytest.raises(TypeError):
1375 x509.RegisteredID(b"notanoid")
1376
1377 with pytest.raises(TypeError):
1378 x509.RegisteredID(1.3)
1379
1380 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001381 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001382 assert repr(gn) == (
1383 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1384 "e)>)>"
1385 )
1386
1387 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001388 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1389 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001390 assert gn == gn2
1391
1392 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001393 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001394 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001395 assert gn != gn2
1396 assert gn != object()
1397
1398
1399class TestIPAddress(object):
1400 def test_not_ipaddress(self):
1401 with pytest.raises(TypeError):
1402 x509.IPAddress(b"notanipaddress")
1403
1404 with pytest.raises(TypeError):
1405 x509.IPAddress(1.3)
1406
1407 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301408 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001409 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1410
Eeshan Gargf1234152015-04-29 18:41:00 +05301411 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001412 assert repr(gn2) == "<IPAddress(value=ff::)>"
1413
Paul Kehrereb177932015-05-17 18:33:33 -07001414 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1415 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1416
1417 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1418 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1419
Paul Kehrer31bdf792015-03-25 14:11:00 -05001420 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301421 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1422 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001423 assert gn == gn2
1424
1425 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301426 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1427 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001428 assert gn != gn2
1429 assert gn != object()
1430
1431
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001432class TestOtherName(object):
1433 def test_invalid_args(self):
1434 with pytest.raises(TypeError):
1435 x509.OtherName(b"notanobjectidentifier", b"derdata")
1436
1437 with pytest.raises(TypeError):
1438 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1439
1440 def test_repr(self):
1441 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1442 if six.PY3:
1443 assert repr(gn) == (
1444 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1445 "name=Unknown OID)>, value=b'derdata')>"
1446 )
1447 else:
1448 assert repr(gn) == (
1449 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1450 "name=Unknown OID)>, value='derdata')>"
1451 )
1452
1453 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1454 if six.PY3:
1455 assert repr(gn) == (
1456 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1457 "name=pseudonym)>, value=b'derdata')>"
1458 )
1459 else:
1460 assert repr(gn) == (
1461 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1462 "name=pseudonym)>, value='derdata')>"
1463 )
1464
1465 def test_eq(self):
1466 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1467 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1468 assert gn == gn2
1469
1470 def test_ne(self):
1471 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1472 assert gn != object()
1473
1474 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1475 assert gn != gn2
1476
1477 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1478 assert gn != gn2
1479
1480
Erik Trauschke2dcce902015-05-14 16:12:24 -07001481class TestGeneralNames(object):
1482 def test_get_values_for_type(self):
1483 gns = x509.GeneralNames(
1484 [x509.DNSName(u"cryptography.io")]
1485 )
1486 names = gns.get_values_for_type(x509.DNSName)
1487 assert names == [u"cryptography.io"]
1488
1489 def test_iter_names(self):
1490 gns = x509.GeneralNames([
1491 x509.DNSName(u"cryptography.io"),
1492 x509.DNSName(u"crypto.local"),
1493 ])
1494 assert len(gns) == 2
1495 assert list(gns) == [
1496 x509.DNSName(u"cryptography.io"),
1497 x509.DNSName(u"crypto.local"),
1498 ]
1499
Paul Kehrer8adb5962015-12-26 14:46:58 -06001500 def test_indexing(self):
1501 gn = x509.GeneralNames([
1502 x509.DNSName(u"cryptography.io"),
1503 x509.DNSName(u"crypto.local"),
1504 x509.DNSName(u"another.local"),
1505 x509.RFC822Name(u"email@another.local"),
1506 x509.UniformResourceIdentifier(u"http://another.local"),
1507 ])
1508 assert gn[-1] == gn[4]
1509 assert len(gn[1:3]) == 2
1510 assert gn[2:4][0] == gn[2]
1511 assert gn[2:5:2][1] == gn[4]
1512
Erik Trauschke2dcce902015-05-14 16:12:24 -07001513 def test_invalid_general_names(self):
1514 with pytest.raises(TypeError):
1515 x509.GeneralNames(
1516 [x509.DNSName(u"cryptography.io"), "invalid"]
1517 )
1518
1519 def test_repr(self):
1520 gns = x509.GeneralNames(
1521 [
1522 x509.DNSName(u"cryptography.io")
1523 ]
1524 )
1525 assert repr(gns) == (
1526 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1527 )
1528
1529 def test_eq(self):
1530 gns = x509.GeneralNames(
1531 [x509.DNSName(u"cryptography.io")]
1532 )
1533 gns2 = x509.GeneralNames(
1534 [x509.DNSName(u"cryptography.io")]
1535 )
1536 assert gns == gns2
1537
1538 def test_ne(self):
1539 gns = x509.GeneralNames(
1540 [x509.DNSName(u"cryptography.io")]
1541 )
1542 gns2 = x509.GeneralNames(
1543 [x509.RFC822Name(u"admin@cryptography.io")]
1544 )
1545 assert gns != gns2
1546 assert gns != object()
1547
1548
Paul Kehrer99125c92015-06-07 18:37:10 -05001549class TestIssuerAlternativeName(object):
1550 def test_get_values_for_type(self):
1551 san = x509.IssuerAlternativeName(
1552 [x509.DNSName(u"cryptography.io")]
1553 )
1554 names = san.get_values_for_type(x509.DNSName)
1555 assert names == [u"cryptography.io"]
1556
1557 def test_iter_names(self):
1558 san = x509.IssuerAlternativeName([
1559 x509.DNSName(u"cryptography.io"),
1560 x509.DNSName(u"crypto.local"),
1561 ])
1562 assert len(san) == 2
1563 assert list(san) == [
1564 x509.DNSName(u"cryptography.io"),
1565 x509.DNSName(u"crypto.local"),
1566 ]
1567
1568 def test_invalid_general_names(self):
1569 with pytest.raises(TypeError):
1570 x509.IssuerAlternativeName(
1571 [x509.DNSName(u"cryptography.io"), "invalid"]
1572 )
1573
1574 def test_repr(self):
1575 san = x509.IssuerAlternativeName(
1576 [
1577 x509.DNSName(u"cryptography.io")
1578 ]
1579 )
1580 assert repr(san) == (
1581 "<IssuerAlternativeName("
1582 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1583 )
1584
1585 def test_eq(self):
1586 san = x509.IssuerAlternativeName(
1587 [x509.DNSName(u"cryptography.io")]
1588 )
1589 san2 = x509.IssuerAlternativeName(
1590 [x509.DNSName(u"cryptography.io")]
1591 )
1592 assert san == san2
1593
1594 def test_ne(self):
1595 san = x509.IssuerAlternativeName(
1596 [x509.DNSName(u"cryptography.io")]
1597 )
1598 san2 = x509.IssuerAlternativeName(
1599 [x509.RFC822Name(u"admin@cryptography.io")]
1600 )
1601 assert san != san2
1602 assert san != object()
1603
1604
Alex Gaynorf1c17672015-06-20 14:20:20 -04001605@pytest.mark.requires_backend_interface(interface=RSABackend)
1606@pytest.mark.requires_backend_interface(interface=X509Backend)
1607class TestRSAIssuerAlternativeNameExtension(object):
1608 def test_uri(self, backend):
1609 cert = _load_cert(
1610 os.path.join("x509", "custom", "ian_uri.pem"),
1611 x509.load_pem_x509_certificate,
1612 backend,
1613 )
1614 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001615 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001616 )
1617 assert list(ext.value) == [
1618 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1619 ]
1620
1621
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001622class TestCRLNumber(object):
1623 def test_eq(self):
1624 crl_number = x509.CRLNumber(15)
1625 assert crl_number == x509.CRLNumber(15)
1626
1627 def test_ne(self):
1628 crl_number = x509.CRLNumber(15)
1629 assert crl_number != x509.CRLNumber(14)
1630 assert crl_number != object()
1631
1632 def test_repr(self):
1633 crl_number = x509.CRLNumber(15)
1634 assert repr(crl_number) == "<CRLNumber(15)>"
1635
Paul Kehrera9718fc2015-12-22 22:55:35 -06001636 def test_invalid_number(self):
1637 with pytest.raises(TypeError):
1638 x509.CRLNumber("notanumber")
1639
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001640 def test_hash(self):
1641 c1 = x509.CRLNumber(1)
1642 c2 = x509.CRLNumber(1)
1643 c3 = x509.CRLNumber(2)
1644 assert hash(c1) == hash(c2)
1645 assert hash(c1) != hash(c3)
1646
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001647
Paul Kehrer31bdf792015-03-25 14:11:00 -05001648class TestSubjectAlternativeName(object):
1649 def test_get_values_for_type(self):
1650 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301651 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001652 )
1653 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301654 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001655
1656 def test_iter_names(self):
1657 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301658 x509.DNSName(u"cryptography.io"),
1659 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001660 ])
1661 assert len(san) == 2
1662 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301663 x509.DNSName(u"cryptography.io"),
1664 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001665 ]
1666
Paul Kehrer8adb5962015-12-26 14:46:58 -06001667 def test_indexing(self):
1668 san = x509.SubjectAlternativeName([
1669 x509.DNSName(u"cryptography.io"),
1670 x509.DNSName(u"crypto.local"),
1671 x509.DNSName(u"another.local"),
1672 x509.RFC822Name(u"email@another.local"),
1673 x509.UniformResourceIdentifier(u"http://another.local"),
1674 ])
1675 assert san[-1] == san[4]
1676 assert len(san[1:3]) == 2
1677 assert san[2:4][0] == san[2]
1678 assert san[2:5:2][1] == san[4]
1679
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001680 def test_invalid_general_names(self):
1681 with pytest.raises(TypeError):
1682 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301683 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001684 )
1685
Paul Kehrer31bdf792015-03-25 14:11:00 -05001686 def test_repr(self):
1687 san = x509.SubjectAlternativeName(
1688 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301689 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001690 ]
1691 )
1692 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001693 "<SubjectAlternativeName("
1694 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001695 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001696
Paul Kehrer58cc3972015-05-13 10:00:41 -05001697 def test_eq(self):
1698 san = x509.SubjectAlternativeName(
1699 [x509.DNSName(u"cryptography.io")]
1700 )
1701 san2 = x509.SubjectAlternativeName(
1702 [x509.DNSName(u"cryptography.io")]
1703 )
1704 assert san == san2
1705
1706 def test_ne(self):
1707 san = x509.SubjectAlternativeName(
1708 [x509.DNSName(u"cryptography.io")]
1709 )
1710 san2 = x509.SubjectAlternativeName(
1711 [x509.RFC822Name(u"admin@cryptography.io")]
1712 )
1713 assert san != san2
1714 assert san != object()
1715
Paul Kehrer40f83382015-04-20 15:00:16 -05001716
1717@pytest.mark.requires_backend_interface(interface=RSABackend)
1718@pytest.mark.requires_backend_interface(interface=X509Backend)
1719class TestRSASubjectAlternativeNameExtension(object):
1720 def test_dns_name(self, backend):
1721 cert = _load_cert(
1722 os.path.join("x509", "cryptography.io.pem"),
1723 x509.load_pem_x509_certificate,
1724 backend
1725 )
1726 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001727 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001728 )
1729 assert ext is not None
1730 assert ext.critical is False
1731
1732 san = ext.value
1733
1734 dns = san.get_values_for_type(x509.DNSName)
1735 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001736
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001737 def test_wildcard_dns_name(self, backend):
1738 cert = _load_cert(
1739 os.path.join("x509", "wildcard_san.pem"),
1740 x509.load_pem_x509_certificate,
1741 backend
1742 )
1743 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001744 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001745 )
1746
1747 dns = ext.value.get_values_for_type(x509.DNSName)
1748 assert dns == [
1749 u'*.langui.sh',
1750 u'langui.sh',
1751 u'*.saseliminator.com',
1752 u'saseliminator.com'
1753 ]
1754
Dominic Chen87bb9572015-10-09 00:23:07 -04001755 def test_san_empty_hostname(self, backend):
1756 cert = _load_cert(
1757 os.path.join(
1758 "x509", "custom", "san_empty_hostname.pem"
1759 ),
1760 x509.load_pem_x509_certificate,
1761 backend
1762 )
1763 san = cert.extensions.get_extension_for_oid(
1764 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1765 )
1766
1767 dns = san.value.get_values_for_type(x509.DNSName)
1768 assert dns == [u'']
1769
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001770 def test_san_wildcard_idna_dns_name(self, backend):
1771 cert = _load_cert(
1772 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1773 x509.load_pem_x509_certificate,
1774 backend
1775 )
1776 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001777 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001778 )
1779
1780 dns = ext.value.get_values_for_type(x509.DNSName)
1781 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1782
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001783 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001784 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001785 os.path.join("x509", "san_x400address.der"),
1786 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001787 backend
1788 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001789 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001790 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001791
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001792 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001793
1794 def test_registered_id(self, backend):
1795 cert = _load_cert(
1796 os.path.join(
1797 "x509", "custom", "san_registered_id.pem"
1798 ),
1799 x509.load_pem_x509_certificate,
1800 backend
1801 )
1802 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001803 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001804 )
1805 assert ext is not None
1806 assert ext.critical is False
1807
1808 san = ext.value
1809 rid = san.get_values_for_type(x509.RegisteredID)
1810 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001811
1812 def test_uri(self, backend):
1813 cert = _load_cert(
1814 os.path.join(
1815 "x509", "custom", "san_uri_with_port.pem"
1816 ),
1817 x509.load_pem_x509_certificate,
1818 backend
1819 )
1820 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001821 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001822 )
1823 assert ext is not None
1824 uri = ext.value.get_values_for_type(
1825 x509.UniformResourceIdentifier
1826 )
1827 assert uri == [
1828 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1829 u"lo",
1830 u"http://someregulardomain.com",
1831 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001832
1833 def test_ipaddress(self, backend):
1834 cert = _load_cert(
1835 os.path.join(
1836 "x509", "custom", "san_ipaddr.pem"
1837 ),
1838 x509.load_pem_x509_certificate,
1839 backend
1840 )
1841 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001842 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001843 )
1844 assert ext is not None
1845 assert ext.critical is False
1846
1847 san = ext.value
1848
1849 ip = san.get_values_for_type(x509.IPAddress)
1850 assert [
1851 ipaddress.ip_address(u"127.0.0.1"),
1852 ipaddress.ip_address(u"ff::")
1853 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001854
1855 def test_dirname(self, backend):
1856 cert = _load_cert(
1857 os.path.join(
1858 "x509", "custom", "san_dirname.pem"
1859 ),
1860 x509.load_pem_x509_certificate,
1861 backend
1862 )
1863 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001864 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001865 )
1866 assert ext is not None
1867 assert ext.critical is False
1868
1869 san = ext.value
1870
1871 dirname = san.get_values_for_type(x509.DirectoryName)
1872 assert [
1873 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001874 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1875 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1876 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001877 ])
1878 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001879
1880 def test_rfc822name(self, backend):
1881 cert = _load_cert(
1882 os.path.join(
1883 "x509", "custom", "san_rfc822_idna.pem"
1884 ),
1885 x509.load_pem_x509_certificate,
1886 backend
1887 )
1888 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001889 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001890 )
1891 assert ext is not None
1892 assert ext.critical is False
1893
1894 san = ext.value
1895
1896 rfc822name = san.get_values_for_type(x509.RFC822Name)
1897 assert [u"email@em\xe5\xefl.com"] == rfc822name
1898
Paul Kehrerb8968812015-05-15 09:01:34 -07001899 def test_idna2003_invalid(self, backend):
1900 cert = _load_cert(
1901 os.path.join(
1902 "x509", "custom", "san_idna2003_dnsname.pem"
1903 ),
1904 x509.load_pem_x509_certificate,
1905 backend
1906 )
1907 with pytest.raises(UnicodeError):
1908 cert.extensions
1909
Paul Kehrere06cab42015-04-30 10:23:33 -05001910 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1911 cert = _load_cert(
1912 os.path.join(
1913 "x509", "custom", "san_idna_names.pem"
1914 ),
1915 x509.load_pem_x509_certificate,
1916 backend
1917 )
1918 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001919 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001920 )
1921 assert ext is not None
1922 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1923 dns_name = ext.value.get_values_for_type(x509.DNSName)
1924 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1925 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1926 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1927 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1928
1929 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1930 cert = _load_cert(
1931 os.path.join(
1932 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1933 ),
1934 x509.load_pem_x509_certificate,
1935 backend
1936 )
1937 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001938 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001939 )
1940 assert ext is not None
1941 assert ext.critical is False
1942
1943 san = ext.value
1944
1945 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1946 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1947 dns = san.get_values_for_type(x509.DNSName)
1948 ip = san.get_values_for_type(x509.IPAddress)
1949 dirname = san.get_values_for_type(x509.DirectoryName)
1950 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001951 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001952 assert [u"cryptography.io"] == dns
1953 assert [
1954 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001955 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001956 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001957 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001958 ),
1959 ])
1960 ] == dirname
1961 assert [
1962 ipaddress.ip_address(u"127.0.0.1"),
1963 ipaddress.ip_address(u"ff::")
1964 ] == ip
1965
1966 def test_invalid_rfc822name(self, backend):
1967 cert = _load_cert(
1968 os.path.join(
1969 "x509", "custom", "san_rfc822_names.pem"
1970 ),
1971 x509.load_pem_x509_certificate,
1972 backend
1973 )
1974 with pytest.raises(ValueError) as exc:
1975 cert.extensions
1976
1977 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001978
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001979 def test_other_name(self, backend):
1980 cert = _load_cert(
1981 os.path.join(
1982 "x509", "custom", "san_other_name.pem"
1983 ),
1984 x509.load_pem_x509_certificate,
1985 backend
1986 )
1987
1988 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001989 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001990 )
1991 assert ext is not None
1992 assert ext.critical is False
1993
Joshua Taubererd2afad32015-07-06 22:37:53 +00001994 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1995 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001996 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001997 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001998
1999 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002000 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002001
Paul Kehrer94c69602015-05-02 19:29:40 -05002002
2003@pytest.mark.requires_backend_interface(interface=RSABackend)
2004@pytest.mark.requires_backend_interface(interface=X509Backend)
2005class TestExtendedKeyUsageExtension(object):
2006 def test_eku(self, backend):
2007 cert = _load_cert(
2008 os.path.join(
2009 "x509", "custom", "extended_key_usage.pem"
2010 ),
2011 x509.load_pem_x509_certificate,
2012 backend
2013 )
2014 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002015 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002016 )
2017 assert ext is not None
2018 assert ext.critical is False
2019
2020 assert [
2021 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2022 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2023 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2024 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2025 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2026 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2027 x509.ObjectIdentifier("2.5.29.37.0"),
2028 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2029 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002030
2031
2032class TestAccessDescription(object):
2033 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002034 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002035 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2036
2037 def test_invalid_access_location(self):
2038 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002039 x509.AccessDescription(
2040 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2041 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002042
Nick Bastind2ecf862015-12-13 05:44:46 -08002043 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002044 ad = x509.AccessDescription(
2045 ObjectIdentifier("2.999.1"),
2046 x509.UniformResourceIdentifier(u"http://example.com")
2047 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002048 assert ad is not None
2049
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002050 def test_repr(self):
2051 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002052 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002053 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2054 )
2055 assert repr(ad) == (
2056 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2057 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2058 "(value=http://ocsp.domain.com)>)>"
2059 )
2060
2061 def test_eq(self):
2062 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002063 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002064 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2065 )
2066 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002067 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002068 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2069 )
2070 assert ad == ad2
2071
2072 def test_ne(self):
2073 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002074 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002075 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2076 )
2077 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002078 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002079 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2080 )
2081 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002082 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002083 x509.UniformResourceIdentifier(u"http://notthesame")
2084 )
2085 assert ad != ad2
2086 assert ad != ad3
2087 assert ad != object()
2088
2089
2090class TestAuthorityInformationAccess(object):
2091 def test_invalid_descriptions(self):
2092 with pytest.raises(TypeError):
2093 x509.AuthorityInformationAccess(["notanAccessDescription"])
2094
2095 def test_iter_len(self):
2096 aia = x509.AuthorityInformationAccess([
2097 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002098 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002099 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2100 ),
2101 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002102 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002103 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2104 )
2105 ])
2106 assert len(aia) == 2
2107 assert list(aia) == [
2108 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002109 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002110 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2111 ),
2112 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002113 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002114 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2115 )
2116 ]
2117
2118 def test_repr(self):
2119 aia = x509.AuthorityInformationAccess([
2120 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002121 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002122 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2123 ),
2124 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002125 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002126 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2127 )
2128 ])
2129 assert repr(aia) == (
2130 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2131 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2132 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2133 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2134 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2135 "fier(value=http://domain.com/ca.crt)>)>])>"
2136 )
2137
2138 def test_eq(self):
2139 aia = x509.AuthorityInformationAccess([
2140 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002141 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002142 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2143 ),
2144 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002145 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002146 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2147 )
2148 ])
2149 aia2 = x509.AuthorityInformationAccess([
2150 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002151 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002152 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2153 ),
2154 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002155 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002156 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2157 )
2158 ])
2159 assert aia == aia2
2160
2161 def test_ne(self):
2162 aia = x509.AuthorityInformationAccess([
2163 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002164 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002165 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2166 ),
2167 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002168 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002169 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2170 )
2171 ])
2172 aia2 = x509.AuthorityInformationAccess([
2173 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002174 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002175 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2176 ),
2177 ])
2178
2179 assert aia != aia2
2180 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002181
2182
2183@pytest.mark.requires_backend_interface(interface=RSABackend)
2184@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002185class TestAuthorityInformationAccessExtension(object):
2186 def test_aia_ocsp_ca_issuers(self, backend):
2187 cert = _load_cert(
2188 os.path.join("x509", "cryptography.io.pem"),
2189 x509.load_pem_x509_certificate,
2190 backend
2191 )
2192 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002193 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002194 )
2195 assert ext is not None
2196 assert ext.critical is False
2197
2198 assert ext.value == x509.AuthorityInformationAccess([
2199 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002200 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002201 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2202 ),
2203 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002204 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002205 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2206 ),
2207 ])
2208
2209 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2210 cert = _load_cert(
2211 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2212 x509.load_pem_x509_certificate,
2213 backend
2214 )
2215 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002216 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002217 )
2218 assert ext is not None
2219 assert ext.critical is False
2220
2221 assert ext.value == x509.AuthorityInformationAccess([
2222 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002223 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002224 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2225 ),
2226 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002227 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002228 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2229 ),
2230 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002231 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002232 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002233 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2234 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002235 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002236 ]))
2237 ),
2238 ])
2239
2240 def test_aia_ocsp_only(self, backend):
2241 cert = _load_cert(
2242 os.path.join("x509", "custom", "aia_ocsp.pem"),
2243 x509.load_pem_x509_certificate,
2244 backend
2245 )
2246 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002247 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002248 )
2249 assert ext is not None
2250 assert ext.critical is False
2251
2252 assert ext.value == x509.AuthorityInformationAccess([
2253 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002254 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002255 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2256 ),
2257 ])
2258
2259 def test_aia_ca_issuers_only(self, backend):
2260 cert = _load_cert(
2261 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2262 x509.load_pem_x509_certificate,
2263 backend
2264 )
2265 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002266 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002267 )
2268 assert ext is not None
2269 assert ext.critical is False
2270
2271 assert ext.value == x509.AuthorityInformationAccess([
2272 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002273 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002274 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002275 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2276 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002277 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002278 ]))
2279 ),
2280 ])
2281
2282
2283@pytest.mark.requires_backend_interface(interface=RSABackend)
2284@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002285class TestAuthorityKeyIdentifierExtension(object):
2286 def test_aki_keyid(self, backend):
2287 cert = _load_cert(
2288 os.path.join(
2289 "x509", "cryptography.io.pem"
2290 ),
2291 x509.load_pem_x509_certificate,
2292 backend
2293 )
2294 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002295 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002296 )
2297 assert ext is not None
2298 assert ext.critical is False
2299
2300 assert ext.value.key_identifier == (
2301 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2302 )
2303 assert ext.value.authority_cert_issuer is None
2304 assert ext.value.authority_cert_serial_number is None
2305
2306 def test_aki_all_fields(self, backend):
2307 cert = _load_cert(
2308 os.path.join(
2309 "x509", "custom", "authority_key_identifier.pem"
2310 ),
2311 x509.load_pem_x509_certificate,
2312 backend
2313 )
2314 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002315 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002316 )
2317 assert ext is not None
2318 assert ext.critical is False
2319
2320 assert ext.value.key_identifier == (
2321 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2322 )
2323 assert ext.value.authority_cert_issuer == [
2324 x509.DirectoryName(
2325 x509.Name([
2326 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002327 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002328 ),
2329 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002330 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002331 )
2332 ])
2333 )
2334 ]
2335 assert ext.value.authority_cert_serial_number == 3
2336
2337 def test_aki_no_keyid(self, backend):
2338 cert = _load_cert(
2339 os.path.join(
2340 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2341 ),
2342 x509.load_pem_x509_certificate,
2343 backend
2344 )
2345 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002346 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002347 )
2348 assert ext is not None
2349 assert ext.critical is False
2350
2351 assert ext.value.key_identifier is None
2352 assert ext.value.authority_cert_issuer == [
2353 x509.DirectoryName(
2354 x509.Name([
2355 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002356 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002357 ),
2358 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002359 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002360 )
2361 ])
2362 )
2363 ]
2364 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002365
Paul Kehrer253929a2015-08-05 17:30:39 +01002366 def test_from_certificate(self, backend):
2367 issuer_cert = _load_cert(
2368 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2369 x509.load_pem_x509_certificate,
2370 backend
2371 )
2372 cert = _load_cert(
2373 os.path.join("x509", "cryptography.io.pem"),
2374 x509.load_pem_x509_certificate,
2375 backend
2376 )
2377 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002378 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002379 )
2380 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2381 issuer_cert.public_key()
2382 )
2383 assert ext.value == aki
2384
Paul Kehrer5a485522015-05-06 00:29:12 -05002385
Paul Kehrere0017be2015-05-17 20:39:40 -06002386class TestNameConstraints(object):
2387 def test_ipaddress_wrong_type(self):
2388 with pytest.raises(TypeError):
2389 x509.NameConstraints(
2390 permitted_subtrees=[
2391 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2392 ],
2393 excluded_subtrees=None
2394 )
2395
2396 with pytest.raises(TypeError):
2397 x509.NameConstraints(
2398 permitted_subtrees=None,
2399 excluded_subtrees=[
2400 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2401 ]
2402 )
2403
2404 def test_ipaddress_allowed_type(self):
2405 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2406 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2407 nc = x509.NameConstraints(
2408 permitted_subtrees=permitted,
2409 excluded_subtrees=excluded
2410 )
2411 assert nc.permitted_subtrees == permitted
2412 assert nc.excluded_subtrees == excluded
2413
2414 def test_invalid_permitted_subtrees(self):
2415 with pytest.raises(TypeError):
2416 x509.NameConstraints("badpermitted", None)
2417
2418 def test_invalid_excluded_subtrees(self):
2419 with pytest.raises(TypeError):
2420 x509.NameConstraints(None, "badexcluded")
2421
2422 def test_no_subtrees(self):
2423 with pytest.raises(ValueError):
2424 x509.NameConstraints(None, None)
2425
2426 def test_permitted_none(self):
2427 excluded = [x509.DNSName(u"name.local")]
2428 nc = x509.NameConstraints(
2429 permitted_subtrees=None, excluded_subtrees=excluded
2430 )
2431 assert nc.permitted_subtrees is None
2432 assert nc.excluded_subtrees is not None
2433
2434 def test_excluded_none(self):
2435 permitted = [x509.DNSName(u"name.local")]
2436 nc = x509.NameConstraints(
2437 permitted_subtrees=permitted, excluded_subtrees=None
2438 )
2439 assert nc.permitted_subtrees is not None
2440 assert nc.excluded_subtrees is None
2441
2442 def test_repr(self):
2443 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2444 nc = x509.NameConstraints(
2445 permitted_subtrees=permitted,
2446 excluded_subtrees=None
2447 )
2448 assert repr(nc) == (
2449 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2450 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2451 )
2452
Paul Kehrer31894282015-06-21 21:46:41 -05002453 def test_eq(self):
2454 nc = x509.NameConstraints(
2455 permitted_subtrees=[x509.DNSName(u"name.local")],
2456 excluded_subtrees=[x509.DNSName(u"name2.local")]
2457 )
2458 nc2 = x509.NameConstraints(
2459 permitted_subtrees=[x509.DNSName(u"name.local")],
2460 excluded_subtrees=[x509.DNSName(u"name2.local")]
2461 )
2462 assert nc == nc2
2463
2464 def test_ne(self):
2465 nc = x509.NameConstraints(
2466 permitted_subtrees=[x509.DNSName(u"name.local")],
2467 excluded_subtrees=[x509.DNSName(u"name2.local")]
2468 )
2469 nc2 = x509.NameConstraints(
2470 permitted_subtrees=[x509.DNSName(u"name.local")],
2471 excluded_subtrees=None
2472 )
2473 nc3 = x509.NameConstraints(
2474 permitted_subtrees=None,
2475 excluded_subtrees=[x509.DNSName(u"name2.local")]
2476 )
2477
2478 assert nc != nc2
2479 assert nc != nc3
2480 assert nc != object()
2481
Paul Kehrere0017be2015-05-17 20:39:40 -06002482
Paul Kehrer870d7e82015-06-21 22:20:44 -05002483@pytest.mark.requires_backend_interface(interface=RSABackend)
2484@pytest.mark.requires_backend_interface(interface=X509Backend)
2485class TestNameConstraintsExtension(object):
2486 def test_permitted_excluded(self, backend):
2487 cert = _load_cert(
2488 os.path.join(
2489 "x509", "custom", "nc_permitted_excluded_2.pem"
2490 ),
2491 x509.load_pem_x509_certificate,
2492 backend
2493 )
2494 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002495 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002496 ).value
2497 assert nc == x509.NameConstraints(
2498 permitted_subtrees=[
2499 x509.DNSName(u"zombo.local"),
2500 ],
2501 excluded_subtrees=[
2502 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002503 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002504 ]))
2505 ]
2506 )
2507
2508 def test_permitted(self, backend):
2509 cert = _load_cert(
2510 os.path.join(
2511 "x509", "custom", "nc_permitted_2.pem"
2512 ),
2513 x509.load_pem_x509_certificate,
2514 backend
2515 )
2516 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002517 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002518 ).value
2519 assert nc == x509.NameConstraints(
2520 permitted_subtrees=[
2521 x509.DNSName(u"zombo.local"),
2522 ],
2523 excluded_subtrees=None
2524 )
2525
Paul Kehrer42376832015-07-01 18:10:32 -05002526 def test_permitted_with_leading_period(self, backend):
2527 cert = _load_cert(
2528 os.path.join(
2529 "x509", "custom", "nc_permitted.pem"
2530 ),
2531 x509.load_pem_x509_certificate,
2532 backend
2533 )
2534 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002535 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002536 ).value
2537 assert nc == x509.NameConstraints(
2538 permitted_subtrees=[
2539 x509.DNSName(u".cryptography.io"),
2540 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2541 ],
2542 excluded_subtrees=None
2543 )
2544
2545 def test_excluded_with_leading_period(self, backend):
2546 cert = _load_cert(
2547 os.path.join(
2548 "x509", "custom", "nc_excluded.pem"
2549 ),
2550 x509.load_pem_x509_certificate,
2551 backend
2552 )
2553 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002554 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002555 ).value
2556 assert nc == x509.NameConstraints(
2557 permitted_subtrees=None,
2558 excluded_subtrees=[
2559 x509.DNSName(u".cryptography.io"),
2560 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2561 ]
2562 )
2563
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002564 def test_permitted_excluded_with_ips(self, backend):
2565 cert = _load_cert(
2566 os.path.join(
2567 "x509", "custom", "nc_permitted_excluded.pem"
2568 ),
2569 x509.load_pem_x509_certificate,
2570 backend
2571 )
2572 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002573 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002574 ).value
2575 assert nc == x509.NameConstraints(
2576 permitted_subtrees=[
2577 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2578 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2579 ],
2580 excluded_subtrees=[
2581 x509.DNSName(u".domain.com"),
2582 x509.UniformResourceIdentifier(u"http://test.local"),
2583 ]
2584 )
2585
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002586 def test_single_ip_netmask(self, backend):
2587 cert = _load_cert(
2588 os.path.join(
2589 "x509", "custom", "nc_single_ip_netmask.pem"
2590 ),
2591 x509.load_pem_x509_certificate,
2592 backend
2593 )
2594 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002595 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002596 ).value
2597 assert nc == x509.NameConstraints(
2598 permitted_subtrees=[
2599 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2600 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2601 ],
2602 excluded_subtrees=None
2603 )
2604
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002605 def test_invalid_netmask(self, backend):
2606 cert = _load_cert(
2607 os.path.join(
2608 "x509", "custom", "nc_invalid_ip_netmask.pem"
2609 ),
2610 x509.load_pem_x509_certificate,
2611 backend
2612 )
2613 with pytest.raises(ValueError):
2614 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002615 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002616 )
2617
Paul Kehrer870d7e82015-06-21 22:20:44 -05002618
Paul Kehrer5a485522015-05-06 00:29:12 -05002619class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002620 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002621 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002622 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002623
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002624 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002625 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002626 x509.DistributionPoint(None, "notname", None, None)
2627
2628 def test_distribution_point_full_and_relative_not_none(self):
2629 with pytest.raises(ValueError):
2630 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002631
2632 def test_crl_issuer_not_general_names(self):
2633 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002634 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002635
2636 def test_reason_not_reasonflags(self):
2637 with pytest.raises(TypeError):
2638 x509.DistributionPoint(
2639 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002640 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002641 frozenset(["notreasonflags"]),
2642 None
2643 )
2644
2645 def test_reason_not_frozenset(self):
2646 with pytest.raises(TypeError):
2647 x509.DistributionPoint(
2648 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2649 None,
2650 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002651 None
2652 )
2653
2654 def test_disallowed_reasons(self):
2655 with pytest.raises(ValueError):
2656 x509.DistributionPoint(
2657 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2658 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002659 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002660 None
2661 )
2662
2663 with pytest.raises(ValueError):
2664 x509.DistributionPoint(
2665 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2666 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002667 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002668 None
2669 )
2670
2671 def test_reason_only(self):
2672 with pytest.raises(ValueError):
2673 x509.DistributionPoint(
2674 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002675 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002676 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002677 None
2678 )
2679
2680 def test_eq(self):
2681 dp = x509.DistributionPoint(
2682 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002683 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002684 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002685 [
2686 x509.DirectoryName(
2687 x509.Name([
2688 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002689 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002690 )
2691 ])
2692 )
2693 ],
2694 )
2695 dp2 = x509.DistributionPoint(
2696 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002697 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002698 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002699 [
2700 x509.DirectoryName(
2701 x509.Name([
2702 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002703 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002704 )
2705 ])
2706 )
2707 ],
2708 )
2709 assert dp == dp2
2710
2711 def test_ne(self):
2712 dp = x509.DistributionPoint(
2713 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002714 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002715 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002716 [
2717 x509.DirectoryName(
2718 x509.Name([
2719 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002720 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002721 )
2722 ])
2723 )
2724 ],
2725 )
2726 dp2 = x509.DistributionPoint(
2727 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2728 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002729 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002730 None
2731 )
2732 assert dp != dp2
2733 assert dp != object()
2734
2735 def test_repr(self):
2736 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002737 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002738 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002739 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002740 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002741 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002742 [
2743 x509.DirectoryName(
2744 x509.Name([
2745 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002746 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002747 )
2748 ])
2749 )
2750 ],
2751 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002752 if six.PY3:
2753 assert repr(dp) == (
2754 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2755 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002756 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2757 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2758 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2759 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002760 )
2761 else:
2762 assert repr(dp) == (
2763 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2764 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002765 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2766 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2767 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2768 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002769 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002770
2771
2772class TestCRLDistributionPoints(object):
2773 def test_invalid_distribution_points(self):
2774 with pytest.raises(TypeError):
2775 x509.CRLDistributionPoints(["notadistributionpoint"])
2776
2777 def test_iter_len(self):
2778 cdp = x509.CRLDistributionPoints([
2779 x509.DistributionPoint(
2780 [x509.UniformResourceIdentifier(u"http://domain")],
2781 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002782 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002783 None
2784 ),
2785 x509.DistributionPoint(
2786 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002787 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002788 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002789 x509.ReasonFlags.key_compromise,
2790 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002791 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002792 None
2793 ),
2794 ])
2795 assert len(cdp) == 2
2796 assert list(cdp) == [
2797 x509.DistributionPoint(
2798 [x509.UniformResourceIdentifier(u"http://domain")],
2799 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002800 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002801 None
2802 ),
2803 x509.DistributionPoint(
2804 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002805 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002806 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002807 x509.ReasonFlags.key_compromise,
2808 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002809 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002810 None
2811 ),
2812 ]
2813
2814 def test_repr(self):
2815 cdp = x509.CRLDistributionPoints([
2816 x509.DistributionPoint(
2817 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002818 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002819 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002820 None
2821 ),
2822 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002823 if six.PY3:
2824 assert repr(cdp) == (
2825 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2826 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2827 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2828 "romise'>}), crl_issuer=None)>])>"
2829 )
2830 else:
2831 assert repr(cdp) == (
2832 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2833 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2834 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2835 "romise'>]), crl_issuer=None)>])>"
2836 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002837
2838 def test_eq(self):
2839 cdp = x509.CRLDistributionPoints([
2840 x509.DistributionPoint(
2841 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002842 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002843 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002844 x509.ReasonFlags.key_compromise,
2845 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002846 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002847 [x509.UniformResourceIdentifier(u"uri://thing")],
2848 ),
2849 ])
2850 cdp2 = x509.CRLDistributionPoints([
2851 x509.DistributionPoint(
2852 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002853 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002854 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002855 x509.ReasonFlags.key_compromise,
2856 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002857 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002858 [x509.UniformResourceIdentifier(u"uri://thing")],
2859 ),
2860 ])
2861 assert cdp == cdp2
2862
2863 def test_ne(self):
2864 cdp = x509.CRLDistributionPoints([
2865 x509.DistributionPoint(
2866 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002867 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002868 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002869 x509.ReasonFlags.key_compromise,
2870 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002871 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002872 [x509.UniformResourceIdentifier(u"uri://thing")],
2873 ),
2874 ])
2875 cdp2 = x509.CRLDistributionPoints([
2876 x509.DistributionPoint(
2877 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002878 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002879 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002880 x509.ReasonFlags.key_compromise,
2881 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002882 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002883 [x509.UniformResourceIdentifier(u"uri://thing")],
2884 ),
2885 ])
2886 cdp3 = x509.CRLDistributionPoints([
2887 x509.DistributionPoint(
2888 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002889 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002890 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002891 [x509.UniformResourceIdentifier(u"uri://thing")],
2892 ),
2893 ])
2894 cdp4 = x509.CRLDistributionPoints([
2895 x509.DistributionPoint(
2896 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002897 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002898 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002899 x509.ReasonFlags.key_compromise,
2900 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002901 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002902 [x509.UniformResourceIdentifier(u"uri://thing2")],
2903 ),
2904 ])
2905 assert cdp != cdp2
2906 assert cdp != cdp3
2907 assert cdp != cdp4
2908 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002909
2910
2911@pytest.mark.requires_backend_interface(interface=RSABackend)
2912@pytest.mark.requires_backend_interface(interface=X509Backend)
2913class TestCRLDistributionPointsExtension(object):
2914 def test_fullname_and_crl_issuer(self, backend):
2915 cert = _load_cert(
2916 os.path.join(
2917 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2918 ),
2919 x509.load_der_x509_certificate,
2920 backend
2921 )
2922
2923 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002924 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002925 ).value
2926
2927 assert cdps == x509.CRLDistributionPoints([
2928 x509.DistributionPoint(
2929 full_name=[x509.DirectoryName(
2930 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002931 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002932 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002933 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002934 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002935 ),
2936 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002937 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002938 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002939 ),
2940 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002941 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002942 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002943 ),
2944 ])
2945 )],
2946 relative_name=None,
2947 reasons=None,
2948 crl_issuer=[x509.DirectoryName(
2949 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002950 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002951 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002952 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002953 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002954 ),
2955 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002956 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002957 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002958 ),
2959 ])
2960 )],
2961 )
2962 ])
2963
2964 def test_relativename_and_crl_issuer(self, backend):
2965 cert = _load_cert(
2966 os.path.join(
2967 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2968 ),
2969 x509.load_der_x509_certificate,
2970 backend
2971 )
2972
2973 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002974 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002975 ).value
2976
2977 assert cdps == x509.CRLDistributionPoints([
2978 x509.DistributionPoint(
2979 full_name=None,
2980 relative_name=x509.Name([
2981 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002982 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002983 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002984 ),
2985 ]),
2986 reasons=None,
2987 crl_issuer=[x509.DirectoryName(
2988 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002989 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002990 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002991 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002992 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002993 ),
2994 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002995 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002996 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002997 ),
2998 ])
2999 )],
3000 )
3001 ])
3002
3003 def test_fullname_crl_issuer_reasons(self, backend):
3004 cert = _load_cert(
3005 os.path.join(
3006 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3007 ),
3008 x509.load_pem_x509_certificate,
3009 backend
3010 )
3011
3012 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003013 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003014 ).value
3015
3016 assert cdps == x509.CRLDistributionPoints([
3017 x509.DistributionPoint(
3018 full_name=[x509.UniformResourceIdentifier(
3019 u"http://myhost.com/myca.crl"
3020 )],
3021 relative_name=None,
3022 reasons=frozenset([
3023 x509.ReasonFlags.key_compromise,
3024 x509.ReasonFlags.ca_compromise
3025 ]),
3026 crl_issuer=[x509.DirectoryName(
3027 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003028 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003029 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003030 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003031 ),
3032 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003033 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003034 ),
3035 ])
3036 )],
3037 )
3038 ])
3039
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003040 def test_all_reasons(self, backend):
3041 cert = _load_cert(
3042 os.path.join(
3043 "x509", "custom", "cdp_all_reasons.pem"
3044 ),
3045 x509.load_pem_x509_certificate,
3046 backend
3047 )
3048
3049 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003050 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003051 ).value
3052
3053 assert cdps == x509.CRLDistributionPoints([
3054 x509.DistributionPoint(
3055 full_name=[x509.UniformResourceIdentifier(
3056 u"http://domain.com/some.crl"
3057 )],
3058 relative_name=None,
3059 reasons=frozenset([
3060 x509.ReasonFlags.key_compromise,
3061 x509.ReasonFlags.ca_compromise,
3062 x509.ReasonFlags.affiliation_changed,
3063 x509.ReasonFlags.superseded,
3064 x509.ReasonFlags.privilege_withdrawn,
3065 x509.ReasonFlags.cessation_of_operation,
3066 x509.ReasonFlags.aa_compromise,
3067 x509.ReasonFlags.certificate_hold,
3068 ]),
3069 crl_issuer=None
3070 )
3071 ])
3072
3073 def test_single_reason(self, backend):
3074 cert = _load_cert(
3075 os.path.join(
3076 "x509", "custom", "cdp_reason_aa_compromise.pem"
3077 ),
3078 x509.load_pem_x509_certificate,
3079 backend
3080 )
3081
3082 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003083 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003084 ).value
3085
3086 assert cdps == x509.CRLDistributionPoints([
3087 x509.DistributionPoint(
3088 full_name=[x509.UniformResourceIdentifier(
3089 u"http://domain.com/some.crl"
3090 )],
3091 relative_name=None,
3092 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3093 crl_issuer=None
3094 )
3095 ])
3096
Paul Kehrer9a10d592015-05-10 14:55:51 -05003097 def test_crl_issuer_only(self, backend):
3098 cert = _load_cert(
3099 os.path.join(
3100 "x509", "custom", "cdp_crl_issuer.pem"
3101 ),
3102 x509.load_pem_x509_certificate,
3103 backend
3104 )
3105
3106 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003107 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003108 ).value
3109
3110 assert cdps == x509.CRLDistributionPoints([
3111 x509.DistributionPoint(
3112 full_name=None,
3113 relative_name=None,
3114 reasons=None,
3115 crl_issuer=[x509.DirectoryName(
3116 x509.Name([
3117 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003118 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003119 ),
3120 ])
3121 )],
3122 )
3123 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003124
Dominic Chen87bb9572015-10-09 00:23:07 -04003125 def test_crl_empty_hostname(self, backend):
3126 cert = _load_cert(
3127 os.path.join(
3128 "x509", "custom", "cdp_empty_hostname.pem"
3129 ),
3130 x509.load_pem_x509_certificate,
3131 backend
3132 )
3133
3134 cdps = cert.extensions.get_extension_for_oid(
3135 ExtensionOID.CRL_DISTRIBUTION_POINTS
3136 ).value
3137
3138 assert cdps == x509.CRLDistributionPoints([
3139 x509.DistributionPoint(
3140 full_name=[x509.UniformResourceIdentifier(
3141 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3142 )],
3143 relative_name=None,
3144 reasons=None,
3145 crl_issuer=None
3146 )
3147 ])
3148
Paul Kehrer16fae762015-05-01 23:14:20 -05003149
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003150@pytest.mark.requires_backend_interface(interface=RSABackend)
3151@pytest.mark.requires_backend_interface(interface=X509Backend)
3152class TestOCSPNoCheckExtension(object):
3153 def test_nocheck(self, backend):
3154 cert = _load_cert(
3155 os.path.join(
3156 "x509", "custom", "ocsp_nocheck.pem"
3157 ),
3158 x509.load_pem_x509_certificate,
3159 backend
3160 )
3161 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003162 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003163 )
3164 assert isinstance(ext.value, x509.OCSPNoCheck)
3165
3166
Paul Kehrer16fae762015-05-01 23:14:20 -05003167class TestInhibitAnyPolicy(object):
3168 def test_not_int(self):
3169 with pytest.raises(TypeError):
3170 x509.InhibitAnyPolicy("notint")
3171
3172 def test_negative_int(self):
3173 with pytest.raises(ValueError):
3174 x509.InhibitAnyPolicy(-1)
3175
3176 def test_repr(self):
3177 iap = x509.InhibitAnyPolicy(0)
3178 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3179
3180 def test_eq(self):
3181 iap = x509.InhibitAnyPolicy(1)
3182 iap2 = x509.InhibitAnyPolicy(1)
3183 assert iap == iap2
3184
3185 def test_ne(self):
3186 iap = x509.InhibitAnyPolicy(1)
3187 iap2 = x509.InhibitAnyPolicy(4)
3188 assert iap != iap2
3189 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003190
3191
3192@pytest.mark.requires_backend_interface(interface=RSABackend)
3193@pytest.mark.requires_backend_interface(interface=X509Backend)
3194class TestInhibitAnyPolicyExtension(object):
3195 def test_nocheck(self, backend):
3196 cert = _load_cert(
3197 os.path.join(
3198 "x509", "custom", "inhibit_any_policy_5.pem"
3199 ),
3200 x509.load_pem_x509_certificate,
3201 backend
3202 )
3203 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003204 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003205 ).value
3206 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003207
3208
3209@pytest.mark.requires_backend_interface(interface=RSABackend)
3210@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003211class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003212 def test_invalid_certificate_policies_data(self, backend):
3213 cert = _load_cert(
3214 os.path.join(
3215 "x509", "custom", "cp_invalid.pem"
3216 ),
3217 x509.load_pem_x509_certificate,
3218 backend
3219 )
3220 with pytest.raises(ValueError):
3221 cert.extensions