blob: b89abddab12294c8becab5b3e69fcebf7894c6f5 [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)
Marti4739cfc2016-08-02 04:03:25 +030020from cryptography.hazmat.primitives import hashes
Paul Kehrerf22f6122015-08-05 12:57:13 +010021from cryptography.hazmat.primitives.asymmetric import ec
Marti4739cfc2016-08-02 04:03:25 +030022from cryptography.x509 import DNSName, NameConstraints, SubjectAlternativeName
Paul Kehrer9e102db2015-08-10 21:53:09 -050023from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080024 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
25 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050026)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050027
Marti4739cfc2016-08-02 04:03:25 +030028from .hazmat.primitives.fixtures_rsa import RSA_KEY_2048
Paul Kehrerf22f6122015-08-05 12:57:13 +010029from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050030from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050031
32
Marti4739cfc2016-08-02 04:03:25 +030033def _make_certbuilder(private_key):
34 name = x509.Name(
35 [x509.NameAttribute(NameOID.COMMON_NAME, u'example.org')])
36 return (
37 x509.CertificateBuilder()
38 .subject_name(name)
39 .issuer_name(name)
40 .public_key(private_key.public_key())
41 .serial_number(777)
42 .not_valid_before(datetime.datetime(1999, 1, 1))
43 .not_valid_after(datetime.datetime(2020, 1, 1))
44 )
45
46
Paul Kehrer85894662015-03-22 13:19:31 -050047class TestExtension(object):
48 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050049 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050050 with pytest.raises(TypeError):
51 x509.Extension("notanoid", True, bc)
52
53 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050054 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050055 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050056 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050057
58 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050059 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050060 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050061 assert repr(ext) == (
62 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
63 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
64 "_length=None)>)>"
65 )
66
Paul Kehrer58e870c2015-05-17 09:15:30 -070067 def test_eq(self):
68 ext1 = x509.Extension(
69 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
70 )
71 ext2 = x509.Extension(
72 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
73 )
74 assert ext1 == ext2
75
76 def test_ne(self):
77 ext1 = x509.Extension(
78 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
79 )
80 ext2 = x509.Extension(
81 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
82 )
83 ext3 = x509.Extension(
84 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
85 )
86 ext4 = x509.Extension(
87 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
88 )
89 assert ext1 != ext2
90 assert ext1 != ext3
91 assert ext1 != ext4
92 assert ext1 != object()
93
Paul Kehrer85894662015-03-22 13:19:31 -050094
Paul Kehrer14fd6972015-12-30 10:58:25 -060095class TestUnrecognizedExtension(object):
96 def test_invalid_oid(self):
97 with pytest.raises(TypeError):
98 x509.UnrecognizedExtension("notanoid", b"somedata")
99
100 def test_eq(self):
101 ext1 = x509.UnrecognizedExtension(
102 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
103 )
104 ext2 = x509.UnrecognizedExtension(
105 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
106 )
107 assert ext1 == ext2
108
109 def test_ne(self):
110 ext1 = x509.UnrecognizedExtension(
111 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
112 )
113 ext2 = x509.UnrecognizedExtension(
114 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x02"
115 )
116 ext3 = x509.UnrecognizedExtension(
117 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
118 )
119 assert ext1 != ext2
120 assert ext1 != ext3
121 assert ext1 != object()
122
123 def test_repr(self):
124 ext1 = x509.UnrecognizedExtension(
125 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
126 )
Paul Kehrer50e9dd82015-12-30 12:20:55 -0600127 if six.PY3:
128 assert repr(ext1) == (
129 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
130 "name=Unknown OID)>, value=b'\\x03\\x02\\x01')>"
131 )
132 else:
133 assert repr(ext1) == (
134 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
135 "name=Unknown OID)>, value='\\x03\\x02\\x01')>"
136 )
Paul Kehrer14fd6972015-12-30 10:58:25 -0600137
138 def test_hash(self):
139 ext1 = x509.UnrecognizedExtension(
140 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
141 )
142 ext2 = x509.UnrecognizedExtension(
143 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
144 )
145 ext3 = x509.UnrecognizedExtension(
146 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
147 )
148 assert hash(ext1) == hash(ext2)
149 assert hash(ext1) != hash(ext3)
150
151
Paul Kehrer49bb7562015-12-25 16:17:40 -0600152class TestCertificateIssuer(object):
153 def test_iter_names(self):
154 ci = x509.CertificateIssuer([
155 x509.DNSName(u"cryptography.io"),
156 x509.DNSName(u"crypto.local"),
157 ])
158 assert len(ci) == 2
159 assert list(ci) == [
160 x509.DNSName(u"cryptography.io"),
161 x509.DNSName(u"crypto.local"),
162 ]
163
Paul Kehrer5c999d32015-12-26 17:45:20 -0600164 def test_indexing(self):
165 ci = x509.CertificateIssuer([
166 x509.DNSName(u"cryptography.io"),
167 x509.DNSName(u"crypto.local"),
168 x509.DNSName(u"another.local"),
169 x509.RFC822Name(u"email@another.local"),
170 x509.UniformResourceIdentifier(u"http://another.local"),
171 ])
172 assert ci[-1] == ci[4]
173 assert ci[2:6:2] == [ci[2], ci[4]]
174
Paul Kehrer49bb7562015-12-25 16:17:40 -0600175 def test_eq(self):
176 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
177 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
178 assert ci1 == ci2
179
180 def test_ne(self):
181 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
182 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
183 assert ci1 != ci2
184 assert ci1 != object()
185
186 def test_repr(self):
187 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
188 assert repr(ci) == (
189 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
190 ")>])>)>"
191 )
192
193 def test_get_values_for_type(self):
194 ci = x509.CertificateIssuer(
195 [x509.DNSName(u"cryptography.io")]
196 )
197 names = ci.get_values_for_type(x509.DNSName)
198 assert names == [u"cryptography.io"]
199
200
Paul Kehrer7058ece2015-12-25 22:28:29 -0600201class TestCRLReason(object):
202 def test_invalid_reason_flags(self):
203 with pytest.raises(TypeError):
204 x509.CRLReason("notareason")
205
206 def test_eq(self):
207 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
208 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
209 assert reason1 == reason2
210
211 def test_ne(self):
212 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
213 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
214 assert reason1 != reason2
215 assert reason1 != object()
216
Alex Gaynor07d5cae2015-12-27 15:30:39 -0500217 def test_hash(self):
218 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
219 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
220 reason3 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
221
222 assert hash(reason1) == hash(reason2)
223 assert hash(reason1) != hash(reason3)
224
Paul Kehrer7058ece2015-12-25 22:28:29 -0600225 def test_repr(self):
226 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
227 assert repr(reason1) == (
228 "<CRLReason(reason=ReasonFlags.unspecified)>"
229 )
230
231
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600232class TestInvalidityDate(object):
233 def test_invalid_invalidity_date(self):
234 with pytest.raises(TypeError):
235 x509.InvalidityDate("notadate")
236
237 def test_eq(self):
238 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
239 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
240 assert invalid1 == invalid2
241
242 def test_ne(self):
243 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
244 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
245 assert invalid1 != invalid2
246 assert invalid1 != object()
247
248 def test_repr(self):
249 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
250 assert repr(invalid1) == (
251 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
252 )
253
Paul Kehrer67cde762015-12-26 11:37:14 -0600254 def test_hash(self):
255 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
256 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
257 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
258 assert hash(invalid1) == hash(invalid2)
259 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600260
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600261
Paul Kehrer2b622582015-04-15 11:04:29 -0400262class TestNoticeReference(object):
263 def test_notice_numbers_not_all_int(self):
264 with pytest.raises(TypeError):
265 x509.NoticeReference("org", [1, 2, "three"])
266
267 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500268 with pytest.raises(TypeError):
269 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400270
Marti40f19992016-08-26 04:26:31 +0300271 def test_iter_input(self):
272 numbers = [1, 3, 4]
273 nr = x509.NoticeReference(u"org", iter(numbers))
274 assert list(nr.notice_numbers) == numbers
275
Paul Kehrer2b622582015-04-15 11:04:29 -0400276 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500277 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400278
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500279 if six.PY3:
280 assert repr(nr) == (
281 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
282 "])>"
283 )
284 else:
285 assert repr(nr) == (
286 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
287 "4])>"
288 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400289
Paul Kehrerc56ab622015-05-03 09:56:31 -0500290 def test_eq(self):
291 nr = x509.NoticeReference("org", [1, 2])
292 nr2 = x509.NoticeReference("org", [1, 2])
293 assert nr == nr2
294
295 def test_ne(self):
296 nr = x509.NoticeReference("org", [1, 2])
297 nr2 = x509.NoticeReference("org", [1])
298 nr3 = x509.NoticeReference(None, [1, 2])
299 assert nr != nr2
300 assert nr != nr3
301 assert nr != object()
302
Paul Kehrer2b622582015-04-15 11:04:29 -0400303
304class TestUserNotice(object):
305 def test_notice_reference_invalid(self):
306 with pytest.raises(TypeError):
307 x509.UserNotice("invalid", None)
308
309 def test_notice_reference_none(self):
310 un = x509.UserNotice(None, "text")
311 assert un.notice_reference is None
312 assert un.explicit_text == "text"
313
314 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500315 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500316 if six.PY3:
317 assert repr(un) == (
318 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500319 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500320 )
321 else:
322 assert repr(un) == (
323 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500324 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500325 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400326
Paul Kehrerc56ab622015-05-03 09:56:31 -0500327 def test_eq(self):
328 nr = x509.NoticeReference("org", [1, 2])
329 nr2 = x509.NoticeReference("org", [1, 2])
330 un = x509.UserNotice(nr, "text")
331 un2 = x509.UserNotice(nr2, "text")
332 assert un == un2
333
334 def test_ne(self):
335 nr = x509.NoticeReference("org", [1, 2])
336 nr2 = x509.NoticeReference("org", [1])
337 un = x509.UserNotice(nr, "text")
338 un2 = x509.UserNotice(nr2, "text")
339 un3 = x509.UserNotice(nr, "text3")
340 assert un != un2
341 assert un != un3
342 assert un != object()
343
Paul Kehrer2b622582015-04-15 11:04:29 -0400344
Paul Kehrer2b622582015-04-15 11:04:29 -0400345class TestPolicyInformation(object):
346 def test_invalid_policy_identifier(self):
347 with pytest.raises(TypeError):
348 x509.PolicyInformation("notanoid", None)
349
350 def test_none_policy_qualifiers(self):
351 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
352 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
353 assert pi.policy_qualifiers is None
354
355 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500356 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400357 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
358 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
359 assert pi.policy_qualifiers == pq
360
361 def test_invalid_policy_identifiers(self):
362 with pytest.raises(TypeError):
363 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
364
Marti40f19992016-08-26 04:26:31 +0300365 def test_iter_input(self):
366 qual = [u"foo", u"bar"]
367 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), iter(qual))
368 assert list(pi.policy_qualifiers) == qual
369
Paul Kehrer2b622582015-04-15 11:04:29 -0400370 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500371 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400372 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500373 if six.PY3:
374 assert repr(pi) == (
375 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
376 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500377 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500378 )
379 else:
380 assert repr(pi) == (
381 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
382 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500383 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500384 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400385
Paul Kehrerc56ab622015-05-03 09:56:31 -0500386 def test_eq(self):
387 pi = x509.PolicyInformation(
388 x509.ObjectIdentifier("1.2.3"),
389 [u"string", x509.UserNotice(None, u"hi")]
390 )
391 pi2 = x509.PolicyInformation(
392 x509.ObjectIdentifier("1.2.3"),
393 [u"string", x509.UserNotice(None, u"hi")]
394 )
395 assert pi == pi2
396
397 def test_ne(self):
398 pi = x509.PolicyInformation(
399 x509.ObjectIdentifier("1.2.3"), [u"string"]
400 )
401 pi2 = x509.PolicyInformation(
402 x509.ObjectIdentifier("1.2.3"), [u"string2"]
403 )
404 pi3 = x509.PolicyInformation(
405 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
406 )
407 assert pi != pi2
408 assert pi != pi3
409 assert pi != object()
410
Paul Kehrer2b622582015-04-15 11:04:29 -0400411
Fraser Tweedaled607dd72017-05-29 16:33:20 -0500412@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer2b622582015-04-15 11:04:29 -0400413class TestCertificatePolicies(object):
414 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500415 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400416 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
417 with pytest.raises(TypeError):
418 x509.CertificatePolicies([1, pi])
419
420 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500421 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400422 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
423 cp = x509.CertificatePolicies([pi])
424 assert len(cp) == 1
425 for policyinfo in cp:
426 assert policyinfo == pi
427
Marti40f19992016-08-26 04:26:31 +0300428 def test_iter_input(self):
429 policies = [
430 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"string"])
431 ]
432 cp = x509.CertificatePolicies(iter(policies))
433 assert list(cp) == policies
434
Paul Kehrer2b622582015-04-15 11:04:29 -0400435 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500436 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400437 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
438 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500439 if six.PY3:
440 assert repr(cp) == (
441 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
442 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
443 "ers=['string'])>])>"
444 )
445 else:
446 assert repr(cp) == (
447 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
448 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
449 "ers=[u'string'])>])>"
450 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400451
Paul Kehrerc56ab622015-05-03 09:56:31 -0500452 def test_eq(self):
453 pi = x509.PolicyInformation(
454 x509.ObjectIdentifier("1.2.3"), [u"string"]
455 )
456 cp = x509.CertificatePolicies([pi])
457 pi2 = x509.PolicyInformation(
458 x509.ObjectIdentifier("1.2.3"), [u"string"]
459 )
460 cp2 = x509.CertificatePolicies([pi2])
461 assert cp == cp2
462
463 def test_ne(self):
464 pi = x509.PolicyInformation(
465 x509.ObjectIdentifier("1.2.3"), [u"string"]
466 )
467 cp = x509.CertificatePolicies([pi])
468 pi2 = x509.PolicyInformation(
469 x509.ObjectIdentifier("1.2.3"), [u"string2"]
470 )
471 cp2 = x509.CertificatePolicies([pi2])
472 assert cp != cp2
473 assert cp != object()
474
Paul Kehrere8db7bd2015-12-27 17:32:57 -0600475 def test_indexing(self):
476 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"test"])
477 pi2 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.4"), [u"test"])
478 pi3 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.5"), [u"test"])
479 pi4 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.6"), [u"test"])
480 pi5 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.7"), [u"test"])
481 cp = x509.CertificatePolicies([pi, pi2, pi3, pi4, pi5])
482 assert cp[-1] == cp[4]
483 assert cp[2:6:2] == [cp[2], cp[4]]
484
Fraser Tweedaled607dd72017-05-29 16:33:20 -0500485 def test_long_oid(self, backend):
486 """
487 Test that parsing a CertificatePolicies ext with
488 a very long OID succeeds.
489 """
490 cert = _load_cert(
491 os.path.join("x509", "bigoid.pem"),
492 x509.load_pem_x509_certificate,
493 backend
494 )
495 ext = cert.extensions.get_extension_for_class(
496 x509.CertificatePolicies)
497
498 oid = x509.ObjectIdentifier(
499 "1.3.6.1.4.1.311.21.8.8950086.10656446.2706058"
500 ".12775672.480128.147.13466065.13029902"
501 )
502
503 assert ext.value[0].policy_identifier == oid
504
Paul Kehrer2b622582015-04-15 11:04:29 -0400505
Paul Kehrer11026fe2015-05-12 11:23:56 -0500506@pytest.mark.requires_backend_interface(interface=RSABackend)
507@pytest.mark.requires_backend_interface(interface=X509Backend)
508class TestCertificatePoliciesExtension(object):
509 def test_cps_uri_policy_qualifier(self, backend):
510 cert = _load_cert(
511 os.path.join("x509", "custom", "cp_cps_uri.pem"),
512 x509.load_pem_x509_certificate,
513 backend
514 )
515
516 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500517 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500518 ).value
519
520 assert cp == x509.CertificatePolicies([
521 x509.PolicyInformation(
522 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
523 [u"http://other.com/cps"]
524 )
525 ])
526
527 def test_user_notice_with_notice_reference(self, backend):
528 cert = _load_cert(
529 os.path.join(
530 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
531 ),
532 x509.load_pem_x509_certificate,
533 backend
534 )
535
536 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500537 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500538 ).value
539
540 assert cp == x509.CertificatePolicies([
541 x509.PolicyInformation(
542 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
543 [
544 u"http://example.com/cps",
545 u"http://other.com/cps",
546 x509.UserNotice(
547 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
548 u"thing"
549 )
550 ]
551 )
552 ])
553
554 def test_user_notice_with_explicit_text(self, backend):
555 cert = _load_cert(
556 os.path.join(
557 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
558 ),
559 x509.load_pem_x509_certificate,
560 backend
561 )
562
563 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500564 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500565 ).value
566
567 assert cp == x509.CertificatePolicies([
568 x509.PolicyInformation(
569 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
570 [x509.UserNotice(None, u"thing")]
571 )
572 ])
573
574 def test_user_notice_no_explicit_text(self, backend):
575 cert = _load_cert(
576 os.path.join(
577 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
578 ),
579 x509.load_pem_x509_certificate,
580 backend
581 )
582
583 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500584 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500585 ).value
586
587 assert cp == x509.CertificatePolicies([
588 x509.PolicyInformation(
589 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
590 [
591 x509.UserNotice(
592 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
593 None
594 )
595 ]
596 )
597 ])
598
599
Paul Kehrercecbbba2015-03-30 14:58:38 -0500600class TestKeyUsage(object):
601 def test_key_agreement_false_encipher_decipher_true(self):
602 with pytest.raises(ValueError):
603 x509.KeyUsage(
604 digital_signature=False,
605 content_commitment=False,
606 key_encipherment=False,
607 data_encipherment=False,
608 key_agreement=False,
609 key_cert_sign=False,
610 crl_sign=False,
611 encipher_only=True,
612 decipher_only=False
613 )
614
615 with pytest.raises(ValueError):
616 x509.KeyUsage(
617 digital_signature=False,
618 content_commitment=False,
619 key_encipherment=False,
620 data_encipherment=False,
621 key_agreement=False,
622 key_cert_sign=False,
623 crl_sign=False,
624 encipher_only=True,
625 decipher_only=True
626 )
627
628 with pytest.raises(ValueError):
629 x509.KeyUsage(
630 digital_signature=False,
631 content_commitment=False,
632 key_encipherment=False,
633 data_encipherment=False,
634 key_agreement=False,
635 key_cert_sign=False,
636 crl_sign=False,
637 encipher_only=False,
638 decipher_only=True
639 )
640
641 def test_properties_key_agreement_true(self):
642 ku = x509.KeyUsage(
643 digital_signature=True,
644 content_commitment=True,
645 key_encipherment=False,
646 data_encipherment=False,
647 key_agreement=False,
648 key_cert_sign=True,
649 crl_sign=False,
650 encipher_only=False,
651 decipher_only=False
652 )
653 assert ku.digital_signature is True
654 assert ku.content_commitment is True
655 assert ku.key_encipherment is False
656 assert ku.data_encipherment is False
657 assert ku.key_agreement is False
658 assert ku.key_cert_sign is True
659 assert ku.crl_sign is False
660
661 def test_key_agreement_true_properties(self):
662 ku = x509.KeyUsage(
663 digital_signature=False,
664 content_commitment=False,
665 key_encipherment=False,
666 data_encipherment=False,
667 key_agreement=True,
668 key_cert_sign=False,
669 crl_sign=False,
670 encipher_only=False,
671 decipher_only=True
672 )
673 assert ku.key_agreement is True
674 assert ku.encipher_only is False
675 assert ku.decipher_only is True
676
677 def test_key_agreement_false_properties(self):
678 ku = x509.KeyUsage(
679 digital_signature=False,
680 content_commitment=False,
681 key_encipherment=False,
682 data_encipherment=False,
683 key_agreement=False,
684 key_cert_sign=False,
685 crl_sign=False,
686 encipher_only=False,
687 decipher_only=False
688 )
689 assert ku.key_agreement is False
690 with pytest.raises(ValueError):
691 ku.encipher_only
692
693 with pytest.raises(ValueError):
694 ku.decipher_only
695
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500696 def test_repr_key_agreement_false(self):
697 ku = x509.KeyUsage(
698 digital_signature=True,
699 content_commitment=True,
700 key_encipherment=False,
701 data_encipherment=False,
702 key_agreement=False,
703 key_cert_sign=True,
704 crl_sign=False,
705 encipher_only=False,
706 decipher_only=False
707 )
708 assert repr(ku) == (
709 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
710 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400711 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
712 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500713 )
714
715 def test_repr_key_agreement_true(self):
716 ku = x509.KeyUsage(
717 digital_signature=True,
718 content_commitment=True,
719 key_encipherment=False,
720 data_encipherment=False,
721 key_agreement=True,
722 key_cert_sign=True,
723 crl_sign=False,
724 encipher_only=False,
725 decipher_only=False
726 )
727 assert repr(ku) == (
728 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
729 "cipherment=False, data_encipherment=False, key_agreement=True, k"
730 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
731 "only=False)>"
732 )
733
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500734 def test_eq(self):
735 ku = x509.KeyUsage(
736 digital_signature=False,
737 content_commitment=False,
738 key_encipherment=False,
739 data_encipherment=False,
740 key_agreement=True,
741 key_cert_sign=False,
742 crl_sign=False,
743 encipher_only=False,
744 decipher_only=True
745 )
746 ku2 = x509.KeyUsage(
747 digital_signature=False,
748 content_commitment=False,
749 key_encipherment=False,
750 data_encipherment=False,
751 key_agreement=True,
752 key_cert_sign=False,
753 crl_sign=False,
754 encipher_only=False,
755 decipher_only=True
756 )
757 assert ku == ku2
758
759 def test_ne(self):
760 ku = x509.KeyUsage(
761 digital_signature=False,
762 content_commitment=False,
763 key_encipherment=False,
764 data_encipherment=False,
765 key_agreement=True,
766 key_cert_sign=False,
767 crl_sign=False,
768 encipher_only=False,
769 decipher_only=True
770 )
771 ku2 = x509.KeyUsage(
772 digital_signature=False,
773 content_commitment=False,
774 key_encipherment=False,
775 data_encipherment=False,
776 key_agreement=False,
777 key_cert_sign=False,
778 crl_sign=False,
779 encipher_only=False,
780 decipher_only=False
781 )
782 assert ku != ku2
783 assert ku != object()
784
Paul Kehrercecbbba2015-03-30 14:58:38 -0500785
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500786class TestSubjectKeyIdentifier(object):
787 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400788 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500789 ski = x509.SubjectKeyIdentifier(value)
790 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500791
792 def test_repr(self):
793 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500794 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500795 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500796 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400797 if six.PY3:
798 assert repr(ext) == (
799 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
800 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
801 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
802 "\\xf7\\xff:\\xc9\')>)>"
803 )
804 else:
805 assert repr(ext) == (
806 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
807 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
808 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
809 "\\xf7\\xff:\\xc9\')>)>"
810 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500811
812 def test_eq(self):
813 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500814 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500815 )
816 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500817 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500818 )
819 assert ski == ski2
820
821 def test_ne(self):
822 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500823 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500824 )
825 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500826 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500827 )
828 assert ski != ski2
829 assert ski != object()
830
Alex Gaynor410fe352015-12-26 15:01:25 -0500831 def test_hash(self):
832 ski1 = x509.SubjectKeyIdentifier(
833 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
834 )
835 ski2 = x509.SubjectKeyIdentifier(
836 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
837 )
838 ski3 = x509.SubjectKeyIdentifier(
839 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
840 )
841
842 assert hash(ski1) == hash(ski2)
843 assert hash(ski1) != hash(ski3)
844
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500845
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400846class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500847 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400848 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500849 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400850
851 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500852 dirname = x509.DirectoryName(
853 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800854 x509.NameAttribute(
855 x509.ObjectIdentifier('2.999.1'),
856 u'value1'
857 ),
858 x509.NameAttribute(
859 x509.ObjectIdentifier('2.999.2'),
860 u'value2'
861 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500862 ])
863 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400864 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500865 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400866
867 def test_authority_issuer_none_serial_not_none(self):
868 with pytest.raises(ValueError):
869 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
870
871 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500872 dirname = x509.DirectoryName(
873 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800874 x509.NameAttribute(
875 x509.ObjectIdentifier('2.999.1'),
876 u'value1'
877 ),
878 x509.NameAttribute(
879 x509.ObjectIdentifier('2.999.2'),
880 u'value2'
881 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500882 ])
883 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400884 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500885 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400886
887 def test_authority_cert_serial_and_issuer_none(self):
888 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
889 assert aki.key_identifier == b"id"
890 assert aki.authority_cert_issuer is None
891 assert aki.authority_cert_serial_number is None
892
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600893 def test_authority_cert_serial_zero(self):
894 dns = x509.DNSName(u"SomeIssuer")
895 aki = x509.AuthorityKeyIdentifier(b"id", [dns], 0)
896 assert aki.key_identifier == b"id"
897 assert aki.authority_cert_issuer == [dns]
898 assert aki.authority_cert_serial_number == 0
899
Marti40f19992016-08-26 04:26:31 +0300900 def test_iter_input(self):
901 dirnames = [
902 x509.DirectoryName(
903 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
904 )
905 ]
906 aki = x509.AuthorityKeyIdentifier(b"digest", iter(dirnames), 1234)
907 assert list(aki.authority_cert_issuer) == dirnames
908
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400909 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500910 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500911 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500912 )
913 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400914
915 if six.PY3:
916 assert repr(aki) == (
917 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500918 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500919 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500920 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400921 )
922 else:
923 assert repr(aki) == (
924 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500925 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500926 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
927 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400928 )
929
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500930 def test_eq(self):
931 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500932 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500933 )
934 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
935 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500936 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500937 )
938 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
939 assert aki == aki2
940
941 def test_ne(self):
942 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500943 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500944 )
945 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500946 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500947 )
948 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
949 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
950 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
951 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
952 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
953 assert aki != aki2
954 assert aki != aki3
955 assert aki != aki4
956 assert aki != aki5
957 assert aki != object()
958
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400959
Paul Kehrer8cf26422015-03-21 09:50:24 -0500960class TestBasicConstraints(object):
961 def test_ca_not_boolean(self):
962 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500963 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500964
965 def test_path_length_not_ca(self):
966 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500967 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500968
969 def test_path_length_not_int(self):
970 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500971 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500972
973 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500974 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500975
976 def test_path_length_negative(self):
977 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500978 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500979
980 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500981 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500982 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500983 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500984 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500985
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600986 def test_hash(self):
987 na = x509.BasicConstraints(ca=True, path_length=None)
988 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600989 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600990 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600991 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600992
Paul Kehrer3a69b132015-05-13 10:03:46 -0500993 def test_eq(self):
994 na = x509.BasicConstraints(ca=True, path_length=None)
995 na2 = x509.BasicConstraints(ca=True, path_length=None)
996 assert na == na2
997
998 def test_ne(self):
999 na = x509.BasicConstraints(ca=True, path_length=None)
1000 na2 = x509.BasicConstraints(ca=True, path_length=1)
1001 na3 = x509.BasicConstraints(ca=False, path_length=None)
1002 assert na != na2
1003 assert na != na3
1004 assert na != object()
1005
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001006
Paul Kehrerffa2a152015-03-31 08:18:25 -05001007class TestExtendedKeyUsage(object):
1008 def test_not_all_oids(self):
1009 with pytest.raises(TypeError):
1010 x509.ExtendedKeyUsage(["notoid"])
1011
1012 def test_iter_len(self):
1013 eku = x509.ExtendedKeyUsage([
1014 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1015 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1016 ])
1017 assert len(eku) == 2
1018 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -05001019 ExtendedKeyUsageOID.SERVER_AUTH,
1020 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -05001021 ]
1022
Marti40f19992016-08-26 04:26:31 +03001023 def test_iter_input(self):
1024 usages = [
1025 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1026 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1027 ]
1028 aia = x509.ExtendedKeyUsage(iter(usages))
1029 assert list(aia) == usages
1030
Paul Kehrer23d10c32015-04-02 23:12:32 -05001031 def test_repr(self):
1032 eku = x509.ExtendedKeyUsage([
1033 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1034 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1035 ])
1036 assert repr(eku) == (
1037 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
1038 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
1039 "tAuth)>])>"
1040 )
1041
Paul Kehrerb0476172015-05-02 19:34:51 -05001042 def test_eq(self):
1043 eku = x509.ExtendedKeyUsage([
1044 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1045 ])
1046 eku2 = x509.ExtendedKeyUsage([
1047 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1048 ])
1049 assert eku == eku2
1050
1051 def test_ne(self):
1052 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
1053 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
1054 assert eku != eku2
1055 assert eku != object()
1056
Paul Kehrerffa2a152015-03-31 08:18:25 -05001057
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001058@pytest.mark.requires_backend_interface(interface=RSABackend)
1059@pytest.mark.requires_backend_interface(interface=X509Backend)
1060class TestExtensions(object):
1061 def test_no_extensions(self, backend):
1062 cert = _load_cert(
1063 os.path.join("x509", "verisign_md2_root.pem"),
1064 x509.load_pem_x509_certificate,
1065 backend
1066 )
1067 ext = cert.extensions
1068 assert len(ext) == 0
1069 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -05001070 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001071 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001072
Paul Kehrerd44e4132015-08-10 19:13:13 -05001073 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001074
1075 def test_one_extension(self, backend):
1076 cert = _load_cert(
1077 os.path.join(
1078 "x509", "custom", "basic_constraints_not_critical.pem"
1079 ),
1080 x509.load_pem_x509_certificate,
1081 backend
1082 )
1083 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001084 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001085 assert ext is not None
1086 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001087
1088 def test_duplicate_extension(self, backend):
1089 cert = _load_cert(
1090 os.path.join(
1091 "x509", "custom", "two_basic_constraints.pem"
1092 ),
1093 x509.load_pem_x509_certificate,
1094 backend
1095 )
1096 with pytest.raises(x509.DuplicateExtension) as exc:
1097 cert.extensions
1098
Paul Kehrerd44e4132015-08-10 19:13:13 -05001099 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001100
1101 def test_unsupported_critical_extension(self, backend):
1102 cert = _load_cert(
1103 os.path.join(
1104 "x509", "custom", "unsupported_extension_critical.pem"
1105 ),
1106 x509.load_pem_x509_certificate,
1107 backend
1108 )
Alex Gaynord08ddd52017-05-20 09:01:54 -07001109 ext = cert.extensions.get_extension_for_oid(
1110 x509.ObjectIdentifier("1.2.3.4")
1111 )
1112 assert ext.value.value == b"value"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001113
Paul Kehrer58ddc112015-12-30 20:19:00 -06001114 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001115 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001116 cert = _load_cert(
1117 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001118 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001119 ),
1120 x509.load_pem_x509_certificate,
1121 backend
1122 )
1123 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001124 assert len(extensions) == 2
1125 assert extensions[0].critical is False
1126 assert extensions[0].oid == x509.ObjectIdentifier(
1127 "1.3.6.1.4.1.41482.2"
1128 )
1129 assert extensions[0].value == x509.UnrecognizedExtension(
1130 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1131 b"1.3.6.1.4.1.41482.1.2"
1132 )
1133 assert extensions[1].critical is False
1134 assert extensions[1].oid == x509.ObjectIdentifier(
1135 "1.3.6.1.4.1.45724.2.1.1"
1136 )
1137 assert extensions[1].value == x509.UnrecognizedExtension(
1138 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1139 b"\x03\x02\x040"
1140 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001141
Phoebe Queenecae9812015-08-12 05:00:32 +01001142 def test_no_extensions_get_for_class(self, backend):
1143 cert = _load_cert(
1144 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001145 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001146 ),
1147 x509.load_pem_x509_certificate,
1148 backend
1149 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001150 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001151 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001152 exts.get_extension_for_class(x509.IssuerAlternativeName)
1153 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001154
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001155 def test_unrecognized_extension_for_class(self):
1156 exts = x509.Extensions([])
1157 with pytest.raises(TypeError):
1158 exts.get_extension_for_class(x509.UnrecognizedExtension)
1159
Paul Kehrer5b90c972015-12-26 00:52:58 -06001160 def test_indexing(self, backend):
1161 cert = _load_cert(
1162 os.path.join("x509", "cryptography.io.pem"),
1163 x509.load_pem_x509_certificate,
1164 backend
1165 )
1166 exts = cert.extensions
1167 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001168 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001169
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001170 def test_one_extension_get_for_class(self, backend):
1171 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001172 os.path.join(
1173 "x509", "custom", "basic_constraints_not_critical.pem"
1174 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001175 x509.load_pem_x509_certificate,
1176 backend
1177 )
1178 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1179 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001180 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001181
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001182 def test_repr(self, backend):
1183 cert = _load_cert(
1184 os.path.join(
1185 "x509", "custom", "basic_constraints_not_critical.pem"
1186 ),
1187 x509.load_pem_x509_certificate,
1188 backend
1189 )
1190 assert repr(cert.extensions) == (
1191 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1192 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1193 "alse, path_length=None)>)>])>"
1194 )
1195
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001196
Paul Kehrerfa56a232015-03-17 13:14:03 -05001197@pytest.mark.requires_backend_interface(interface=RSABackend)
1198@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001199class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001200 def test_ca_true_pathlen_6(self, backend):
1201 cert = _load_cert(
1202 os.path.join(
1203 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1204 ),
1205 x509.load_der_x509_certificate,
1206 backend
1207 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001208 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001209 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001210 )
1211 assert ext is not None
1212 assert ext.critical is True
1213 assert ext.value.ca is True
1214 assert ext.value.path_length == 6
1215
1216 def test_path_length_zero(self, backend):
1217 cert = _load_cert(
1218 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1219 x509.load_pem_x509_certificate,
1220 backend
1221 )
1222 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001223 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001224 )
1225 assert ext is not None
1226 assert ext.critical is True
1227 assert ext.value.ca is True
1228 assert ext.value.path_length == 0
1229
1230 def test_ca_true_no_pathlen(self, backend):
1231 cert = _load_cert(
1232 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1233 x509.load_der_x509_certificate,
1234 backend
1235 )
1236 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001237 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001238 )
1239 assert ext is not None
1240 assert ext.critical is True
1241 assert ext.value.ca is True
1242 assert ext.value.path_length is None
1243
1244 def test_ca_false(self, backend):
1245 cert = _load_cert(
1246 os.path.join("x509", "cryptography.io.pem"),
1247 x509.load_pem_x509_certificate,
1248 backend
1249 )
1250 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001251 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001252 )
1253 assert ext is not None
1254 assert ext.critical is True
1255 assert ext.value.ca is False
1256 assert ext.value.path_length is None
1257
1258 def test_no_basic_constraints(self, backend):
1259 cert = _load_cert(
1260 os.path.join(
1261 "x509",
1262 "PKITS_data",
1263 "certs",
1264 "ValidCertificatePathTest1EE.crt"
1265 ),
1266 x509.load_der_x509_certificate,
1267 backend
1268 )
1269 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001270 cert.extensions.get_extension_for_oid(
1271 ExtensionOID.BASIC_CONSTRAINTS
1272 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001273
1274 def test_basic_constraint_not_critical(self, backend):
1275 cert = _load_cert(
1276 os.path.join(
1277 "x509", "custom", "basic_constraints_not_critical.pem"
1278 ),
1279 x509.load_pem_x509_certificate,
1280 backend
1281 )
1282 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001283 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001284 )
1285 assert ext is not None
1286 assert ext.critical is False
1287 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001288
1289
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001290class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001291 @pytest.mark.requires_backend_interface(interface=RSABackend)
1292 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001293 def test_subject_key_identifier(self, backend):
1294 cert = _load_cert(
1295 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1296 x509.load_der_x509_certificate,
1297 backend
1298 )
1299 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001300 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001301 )
1302 ski = ext.value
1303 assert ext is not None
1304 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001305 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001306 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001307 )
1308
Paul Kehrerf22f6122015-08-05 12:57:13 +01001309 @pytest.mark.requires_backend_interface(interface=RSABackend)
1310 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001311 def test_no_subject_key_identifier(self, backend):
1312 cert = _load_cert(
1313 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1314 x509.load_pem_x509_certificate,
1315 backend
1316 )
1317 with pytest.raises(x509.ExtensionNotFound):
1318 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001319 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001320 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001321
Paul Kehrerf22f6122015-08-05 12:57:13 +01001322 @pytest.mark.requires_backend_interface(interface=RSABackend)
1323 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001324 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001325 cert = _load_cert(
1326 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1327 x509.load_der_x509_certificate,
1328 backend
1329 )
1330 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001331 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001332 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001333 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001334 cert.public_key()
1335 )
1336 assert ext.value == ski
1337
1338 @pytest.mark.requires_backend_interface(interface=DSABackend)
1339 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001340 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001341 cert = _load_cert(
1342 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1343 x509.load_pem_x509_certificate,
1344 backend
1345 )
1346
1347 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001348 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001349 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001350 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001351 cert.public_key()
1352 )
1353 assert ext.value == ski
1354
1355 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1356 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001357 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001358 _skip_curve_unsupported(backend, ec.SECP384R1())
1359 cert = _load_cert(
1360 os.path.join("x509", "ecdsa_root.pem"),
1361 x509.load_pem_x509_certificate,
1362 backend
1363 )
1364
1365 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001366 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001367 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001368 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001369 cert.public_key()
1370 )
1371 assert ext.value == ski
1372
Paul Kehrer5508ee22015-04-02 19:31:03 -05001373
1374@pytest.mark.requires_backend_interface(interface=RSABackend)
1375@pytest.mark.requires_backend_interface(interface=X509Backend)
1376class TestKeyUsageExtension(object):
1377 def test_no_key_usage(self, backend):
1378 cert = _load_cert(
1379 os.path.join("x509", "verisign_md2_root.pem"),
1380 x509.load_pem_x509_certificate,
1381 backend
1382 )
1383 ext = cert.extensions
1384 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001385 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001386
Paul Kehrerd44e4132015-08-10 19:13:13 -05001387 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001388
1389 def test_all_purposes(self, backend):
1390 cert = _load_cert(
1391 os.path.join(
1392 "x509", "custom", "all_key_usages.pem"
1393 ),
1394 x509.load_pem_x509_certificate,
1395 backend
1396 )
1397 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001398 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001399 assert ext is not None
1400
1401 ku = ext.value
1402 assert ku.digital_signature is True
1403 assert ku.content_commitment is True
1404 assert ku.key_encipherment is True
1405 assert ku.data_encipherment is True
1406 assert ku.key_agreement is True
1407 assert ku.key_cert_sign is True
1408 assert ku.crl_sign is True
1409 assert ku.encipher_only is True
1410 assert ku.decipher_only is True
1411
1412 def test_key_cert_sign_crl_sign(self, backend):
1413 cert = _load_cert(
1414 os.path.join(
1415 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1416 ),
1417 x509.load_der_x509_certificate,
1418 backend
1419 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001420 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001421 assert ext is not None
1422 assert ext.critical is True
1423
1424 ku = ext.value
1425 assert ku.digital_signature is False
1426 assert ku.content_commitment is False
1427 assert ku.key_encipherment is False
1428 assert ku.data_encipherment is False
1429 assert ku.key_agreement is False
1430 assert ku.key_cert_sign is True
1431 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001432
1433
1434@pytest.mark.parametrize(
1435 "name", [
1436 x509.RFC822Name,
1437 x509.DNSName,
1438 x509.UniformResourceIdentifier
1439 ]
1440)
1441class TestTextGeneralNames(object):
1442 def test_not_text(self, name):
1443 with pytest.raises(TypeError):
1444 name(b"notaunicodestring")
1445
1446 with pytest.raises(TypeError):
1447 name(1.3)
1448
1449 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301450 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001451 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1452
1453 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301454 gn = name(u"string")
1455 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001456 assert gn == gn2
1457
1458 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301459 gn = name(u"string")
1460 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001461 assert gn != gn2
1462 assert gn != object()
1463
1464
1465class TestDirectoryName(object):
1466 def test_not_name(self):
1467 with pytest.raises(TypeError):
1468 x509.DirectoryName(b"notaname")
1469
1470 with pytest.raises(TypeError):
1471 x509.DirectoryName(1.3)
1472
1473 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001474 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Marti40f19992016-08-26 04:26:31 +03001475 gn = x509.DirectoryName(name)
Ian Cordascoa908d692015-06-16 21:35:24 -05001476 if six.PY3:
1477 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001478 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1479 "ier(oid=2.5.4.3, name=commonName)>, value='value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001480 )
1481 else:
1482 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001483 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1484 "ier(oid=2.5.4.3, name=commonName)>, value=u'value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001485 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001486
1487 def test_eq(self):
1488 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001489 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001490 ])
1491 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001492 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001493 ])
Marti40f19992016-08-26 04:26:31 +03001494 gn = x509.DirectoryName(name)
1495 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001496 assert gn == gn2
1497
1498 def test_ne(self):
1499 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001500 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001501 ])
1502 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001503 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001504 ])
Marti40f19992016-08-26 04:26:31 +03001505 gn = x509.DirectoryName(name)
1506 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001507 assert gn != gn2
1508 assert gn != object()
1509
1510
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001511class TestRFC822Name(object):
1512 def test_invalid_email(self):
1513 with pytest.raises(ValueError):
1514 x509.RFC822Name(u"Name <email>")
1515
1516 with pytest.raises(ValueError):
1517 x509.RFC822Name(u"")
1518
1519 def test_single_label(self):
1520 gn = x509.RFC822Name(u"administrator")
1521 assert gn.value == u"administrator"
1522
1523 def test_idna(self):
1524 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1525 assert gn.value == u"email@em\xe5\xefl.com"
1526 assert gn._encoded == b"email@xn--eml-vla4c.com"
1527
Alex Gaynorb642dee2016-01-03 15:12:23 -05001528 def test_hash(self):
1529 g1 = x509.RFC822Name(u"email@host.com")
1530 g2 = x509.RFC822Name(u"email@host.com")
1531 g3 = x509.RFC822Name(u"admin@host.com")
1532
1533 assert hash(g1) == hash(g2)
1534 assert hash(g1) != hash(g3)
1535
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001536
Paul Kehrere28d6c42015-07-12 14:59:37 -05001537class TestUniformResourceIdentifier(object):
1538 def test_no_parsed_hostname(self):
1539 gn = x509.UniformResourceIdentifier(u"singlelabel")
1540 assert gn.value == u"singlelabel"
1541
1542 def test_with_port(self):
1543 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1544 assert gn.value == u"singlelabel:443/test"
1545
1546 def test_idna_no_port(self):
1547 gn = x509.UniformResourceIdentifier(
1548 u"http://\u043f\u044b\u043a\u0430.cryptography"
1549 )
1550 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1551 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1552
1553 def test_idna_with_port(self):
1554 gn = x509.UniformResourceIdentifier(
1555 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1556 )
1557 assert gn.value == (
1558 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1559 )
1560 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1561
1562 def test_query_and_fragment(self):
1563 gn = x509.UniformResourceIdentifier(
1564 u"ldap://cryptography:90/path?query=true#somedata"
1565 )
1566 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1567
Alex Gaynord1b56812016-01-03 15:14:34 -05001568 def test_hash(self):
1569 g1 = x509.UniformResourceIdentifier(u"http://host.com")
1570 g2 = x509.UniformResourceIdentifier(u"http://host.com")
1571 g3 = x509.UniformResourceIdentifier(u"http://other.com")
1572
1573 assert hash(g1) == hash(g2)
1574 assert hash(g1) != hash(g3)
1575
Paul Kehrere28d6c42015-07-12 14:59:37 -05001576
Paul Kehrer31bdf792015-03-25 14:11:00 -05001577class TestRegisteredID(object):
1578 def test_not_oid(self):
1579 with pytest.raises(TypeError):
1580 x509.RegisteredID(b"notanoid")
1581
1582 with pytest.raises(TypeError):
1583 x509.RegisteredID(1.3)
1584
1585 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001586 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001587 assert repr(gn) == (
1588 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1589 "e)>)>"
1590 )
1591
1592 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001593 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1594 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001595 assert gn == gn2
1596
1597 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001598 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001599 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001600 assert gn != gn2
1601 assert gn != object()
1602
1603
1604class TestIPAddress(object):
1605 def test_not_ipaddress(self):
1606 with pytest.raises(TypeError):
1607 x509.IPAddress(b"notanipaddress")
1608
1609 with pytest.raises(TypeError):
1610 x509.IPAddress(1.3)
1611
1612 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301613 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001614 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1615
Eeshan Gargf1234152015-04-29 18:41:00 +05301616 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001617 assert repr(gn2) == "<IPAddress(value=ff::)>"
1618
Paul Kehrereb177932015-05-17 18:33:33 -07001619 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1620 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1621
1622 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1623 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1624
Paul Kehrer31bdf792015-03-25 14:11:00 -05001625 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301626 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1627 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001628 assert gn == gn2
1629
1630 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301631 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1632 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001633 assert gn != gn2
1634 assert gn != object()
1635
1636
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001637class TestOtherName(object):
1638 def test_invalid_args(self):
1639 with pytest.raises(TypeError):
1640 x509.OtherName(b"notanobjectidentifier", b"derdata")
1641
1642 with pytest.raises(TypeError):
1643 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1644
1645 def test_repr(self):
1646 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1647 if six.PY3:
1648 assert repr(gn) == (
1649 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1650 "name=Unknown OID)>, value=b'derdata')>"
1651 )
1652 else:
1653 assert repr(gn) == (
1654 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1655 "name=Unknown OID)>, value='derdata')>"
1656 )
1657
1658 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1659 if six.PY3:
1660 assert repr(gn) == (
1661 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1662 "name=pseudonym)>, value=b'derdata')>"
1663 )
1664 else:
1665 assert repr(gn) == (
1666 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1667 "name=pseudonym)>, value='derdata')>"
1668 )
1669
1670 def test_eq(self):
1671 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1672 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1673 assert gn == gn2
1674
1675 def test_ne(self):
1676 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1677 assert gn != object()
1678
1679 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1680 assert gn != gn2
1681
1682 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1683 assert gn != gn2
1684
1685
Erik Trauschke2dcce902015-05-14 16:12:24 -07001686class TestGeneralNames(object):
1687 def test_get_values_for_type(self):
1688 gns = x509.GeneralNames(
1689 [x509.DNSName(u"cryptography.io")]
1690 )
1691 names = gns.get_values_for_type(x509.DNSName)
1692 assert names == [u"cryptography.io"]
1693
1694 def test_iter_names(self):
1695 gns = x509.GeneralNames([
1696 x509.DNSName(u"cryptography.io"),
1697 x509.DNSName(u"crypto.local"),
1698 ])
1699 assert len(gns) == 2
1700 assert list(gns) == [
1701 x509.DNSName(u"cryptography.io"),
1702 x509.DNSName(u"crypto.local"),
1703 ]
1704
Marti40f19992016-08-26 04:26:31 +03001705 def test_iter_input(self):
1706 names = [
1707 x509.DNSName(u"cryptography.io"),
1708 x509.DNSName(u"crypto.local"),
1709 ]
1710 gns = x509.GeneralNames(iter(names))
1711 assert list(gns) == names
1712
Paul Kehrer8adb5962015-12-26 14:46:58 -06001713 def test_indexing(self):
1714 gn = x509.GeneralNames([
1715 x509.DNSName(u"cryptography.io"),
1716 x509.DNSName(u"crypto.local"),
1717 x509.DNSName(u"another.local"),
1718 x509.RFC822Name(u"email@another.local"),
1719 x509.UniformResourceIdentifier(u"http://another.local"),
1720 ])
1721 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001722 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001723
Erik Trauschke2dcce902015-05-14 16:12:24 -07001724 def test_invalid_general_names(self):
1725 with pytest.raises(TypeError):
1726 x509.GeneralNames(
1727 [x509.DNSName(u"cryptography.io"), "invalid"]
1728 )
1729
1730 def test_repr(self):
1731 gns = x509.GeneralNames(
1732 [
1733 x509.DNSName(u"cryptography.io")
1734 ]
1735 )
1736 assert repr(gns) == (
1737 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1738 )
1739
1740 def test_eq(self):
1741 gns = x509.GeneralNames(
1742 [x509.DNSName(u"cryptography.io")]
1743 )
1744 gns2 = x509.GeneralNames(
1745 [x509.DNSName(u"cryptography.io")]
1746 )
1747 assert gns == gns2
1748
1749 def test_ne(self):
1750 gns = x509.GeneralNames(
1751 [x509.DNSName(u"cryptography.io")]
1752 )
1753 gns2 = x509.GeneralNames(
1754 [x509.RFC822Name(u"admin@cryptography.io")]
1755 )
1756 assert gns != gns2
1757 assert gns != object()
1758
1759
Paul Kehrer99125c92015-06-07 18:37:10 -05001760class TestIssuerAlternativeName(object):
1761 def test_get_values_for_type(self):
1762 san = x509.IssuerAlternativeName(
1763 [x509.DNSName(u"cryptography.io")]
1764 )
1765 names = san.get_values_for_type(x509.DNSName)
1766 assert names == [u"cryptography.io"]
1767
1768 def test_iter_names(self):
1769 san = x509.IssuerAlternativeName([
1770 x509.DNSName(u"cryptography.io"),
1771 x509.DNSName(u"crypto.local"),
1772 ])
1773 assert len(san) == 2
1774 assert list(san) == [
1775 x509.DNSName(u"cryptography.io"),
1776 x509.DNSName(u"crypto.local"),
1777 ]
1778
Paul Kehrer5c999d32015-12-26 17:45:20 -06001779 def test_indexing(self):
1780 ian = x509.IssuerAlternativeName([
1781 x509.DNSName(u"cryptography.io"),
1782 x509.DNSName(u"crypto.local"),
1783 x509.DNSName(u"another.local"),
1784 x509.RFC822Name(u"email@another.local"),
1785 x509.UniformResourceIdentifier(u"http://another.local"),
1786 ])
1787 assert ian[-1] == ian[4]
1788 assert ian[2:6:2] == [ian[2], ian[4]]
1789
Paul Kehrer99125c92015-06-07 18:37:10 -05001790 def test_invalid_general_names(self):
1791 with pytest.raises(TypeError):
1792 x509.IssuerAlternativeName(
1793 [x509.DNSName(u"cryptography.io"), "invalid"]
1794 )
1795
1796 def test_repr(self):
1797 san = x509.IssuerAlternativeName(
1798 [
1799 x509.DNSName(u"cryptography.io")
1800 ]
1801 )
1802 assert repr(san) == (
1803 "<IssuerAlternativeName("
1804 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1805 )
1806
1807 def test_eq(self):
1808 san = x509.IssuerAlternativeName(
1809 [x509.DNSName(u"cryptography.io")]
1810 )
1811 san2 = x509.IssuerAlternativeName(
1812 [x509.DNSName(u"cryptography.io")]
1813 )
1814 assert san == san2
1815
1816 def test_ne(self):
1817 san = x509.IssuerAlternativeName(
1818 [x509.DNSName(u"cryptography.io")]
1819 )
1820 san2 = x509.IssuerAlternativeName(
1821 [x509.RFC822Name(u"admin@cryptography.io")]
1822 )
1823 assert san != san2
1824 assert san != object()
1825
1826
Alex Gaynorf1c17672015-06-20 14:20:20 -04001827@pytest.mark.requires_backend_interface(interface=RSABackend)
1828@pytest.mark.requires_backend_interface(interface=X509Backend)
1829class TestRSAIssuerAlternativeNameExtension(object):
1830 def test_uri(self, backend):
1831 cert = _load_cert(
1832 os.path.join("x509", "custom", "ian_uri.pem"),
1833 x509.load_pem_x509_certificate,
1834 backend,
1835 )
1836 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001837 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001838 )
1839 assert list(ext.value) == [
1840 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1841 ]
1842
1843
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001844class TestCRLNumber(object):
1845 def test_eq(self):
1846 crl_number = x509.CRLNumber(15)
1847 assert crl_number == x509.CRLNumber(15)
1848
1849 def test_ne(self):
1850 crl_number = x509.CRLNumber(15)
1851 assert crl_number != x509.CRLNumber(14)
1852 assert crl_number != object()
1853
1854 def test_repr(self):
1855 crl_number = x509.CRLNumber(15)
1856 assert repr(crl_number) == "<CRLNumber(15)>"
1857
Paul Kehrera9718fc2015-12-22 22:55:35 -06001858 def test_invalid_number(self):
1859 with pytest.raises(TypeError):
1860 x509.CRLNumber("notanumber")
1861
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001862 def test_hash(self):
1863 c1 = x509.CRLNumber(1)
1864 c2 = x509.CRLNumber(1)
1865 c3 = x509.CRLNumber(2)
1866 assert hash(c1) == hash(c2)
1867 assert hash(c1) != hash(c3)
1868
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001869
Paul Kehrer31bdf792015-03-25 14:11:00 -05001870class TestSubjectAlternativeName(object):
1871 def test_get_values_for_type(self):
1872 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301873 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001874 )
1875 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301876 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001877
1878 def test_iter_names(self):
1879 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301880 x509.DNSName(u"cryptography.io"),
1881 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001882 ])
1883 assert len(san) == 2
1884 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301885 x509.DNSName(u"cryptography.io"),
1886 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001887 ]
1888
Paul Kehrer8adb5962015-12-26 14:46:58 -06001889 def test_indexing(self):
1890 san = x509.SubjectAlternativeName([
1891 x509.DNSName(u"cryptography.io"),
1892 x509.DNSName(u"crypto.local"),
1893 x509.DNSName(u"another.local"),
1894 x509.RFC822Name(u"email@another.local"),
1895 x509.UniformResourceIdentifier(u"http://another.local"),
1896 ])
1897 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001898 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001899
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001900 def test_invalid_general_names(self):
1901 with pytest.raises(TypeError):
1902 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301903 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001904 )
1905
Paul Kehrer31bdf792015-03-25 14:11:00 -05001906 def test_repr(self):
1907 san = x509.SubjectAlternativeName(
1908 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301909 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001910 ]
1911 )
1912 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001913 "<SubjectAlternativeName("
1914 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001915 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001916
Paul Kehrer58cc3972015-05-13 10:00:41 -05001917 def test_eq(self):
1918 san = x509.SubjectAlternativeName(
1919 [x509.DNSName(u"cryptography.io")]
1920 )
1921 san2 = x509.SubjectAlternativeName(
1922 [x509.DNSName(u"cryptography.io")]
1923 )
1924 assert san == san2
1925
1926 def test_ne(self):
1927 san = x509.SubjectAlternativeName(
1928 [x509.DNSName(u"cryptography.io")]
1929 )
1930 san2 = x509.SubjectAlternativeName(
1931 [x509.RFC822Name(u"admin@cryptography.io")]
1932 )
1933 assert san != san2
1934 assert san != object()
1935
Paul Kehrer40f83382015-04-20 15:00:16 -05001936
1937@pytest.mark.requires_backend_interface(interface=RSABackend)
1938@pytest.mark.requires_backend_interface(interface=X509Backend)
1939class TestRSASubjectAlternativeNameExtension(object):
1940 def test_dns_name(self, backend):
1941 cert = _load_cert(
1942 os.path.join("x509", "cryptography.io.pem"),
1943 x509.load_pem_x509_certificate,
1944 backend
1945 )
1946 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001947 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001948 )
1949 assert ext is not None
1950 assert ext.critical is False
1951
1952 san = ext.value
1953
1954 dns = san.get_values_for_type(x509.DNSName)
1955 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001956
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001957 def test_wildcard_dns_name(self, backend):
1958 cert = _load_cert(
1959 os.path.join("x509", "wildcard_san.pem"),
1960 x509.load_pem_x509_certificate,
1961 backend
1962 )
1963 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001964 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001965 )
1966
1967 dns = ext.value.get_values_for_type(x509.DNSName)
1968 assert dns == [
1969 u'*.langui.sh',
1970 u'langui.sh',
1971 u'*.saseliminator.com',
1972 u'saseliminator.com'
1973 ]
1974
Dominic Chen87bb9572015-10-09 00:23:07 -04001975 def test_san_empty_hostname(self, backend):
1976 cert = _load_cert(
1977 os.path.join(
1978 "x509", "custom", "san_empty_hostname.pem"
1979 ),
1980 x509.load_pem_x509_certificate,
1981 backend
1982 )
1983 san = cert.extensions.get_extension_for_oid(
1984 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1985 )
1986
1987 dns = san.value.get_values_for_type(x509.DNSName)
1988 assert dns == [u'']
1989
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001990 def test_san_wildcard_idna_dns_name(self, backend):
1991 cert = _load_cert(
1992 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1993 x509.load_pem_x509_certificate,
1994 backend
1995 )
1996 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001997 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001998 )
1999
2000 dns = ext.value.get_values_for_type(x509.DNSName)
2001 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
2002
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002003 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05002004 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002005 os.path.join("x509", "san_x400address.der"),
2006 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05002007 backend
2008 )
Paul Kehrerbed07352015-04-21 08:31:10 -05002009 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05002010 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05002011
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002012 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05002013
2014 def test_registered_id(self, backend):
2015 cert = _load_cert(
2016 os.path.join(
2017 "x509", "custom", "san_registered_id.pem"
2018 ),
2019 x509.load_pem_x509_certificate,
2020 backend
2021 )
2022 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002023 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05002024 )
2025 assert ext is not None
2026 assert ext.critical is False
2027
2028 san = ext.value
2029 rid = san.get_values_for_type(x509.RegisteredID)
2030 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002031
2032 def test_uri(self, backend):
2033 cert = _load_cert(
2034 os.path.join(
2035 "x509", "custom", "san_uri_with_port.pem"
2036 ),
2037 x509.load_pem_x509_certificate,
2038 backend
2039 )
2040 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002041 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002042 )
2043 assert ext is not None
2044 uri = ext.value.get_values_for_type(
2045 x509.UniformResourceIdentifier
2046 )
2047 assert uri == [
2048 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
2049 u"lo",
2050 u"http://someregulardomain.com",
2051 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05002052
2053 def test_ipaddress(self, backend):
2054 cert = _load_cert(
2055 os.path.join(
2056 "x509", "custom", "san_ipaddr.pem"
2057 ),
2058 x509.load_pem_x509_certificate,
2059 backend
2060 )
2061 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002062 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05002063 )
2064 assert ext is not None
2065 assert ext.critical is False
2066
2067 san = ext.value
2068
2069 ip = san.get_values_for_type(x509.IPAddress)
2070 assert [
2071 ipaddress.ip_address(u"127.0.0.1"),
2072 ipaddress.ip_address(u"ff::")
2073 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05002074
2075 def test_dirname(self, backend):
2076 cert = _load_cert(
2077 os.path.join(
2078 "x509", "custom", "san_dirname.pem"
2079 ),
2080 x509.load_pem_x509_certificate,
2081 backend
2082 )
2083 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002084 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002085 )
2086 assert ext is not None
2087 assert ext.critical is False
2088
2089 san = ext.value
2090
2091 dirname = san.get_values_for_type(x509.DirectoryName)
2092 assert [
2093 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002094 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2095 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2096 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002097 ])
2098 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002099
2100 def test_rfc822name(self, backend):
2101 cert = _load_cert(
2102 os.path.join(
2103 "x509", "custom", "san_rfc822_idna.pem"
2104 ),
2105 x509.load_pem_x509_certificate,
2106 backend
2107 )
2108 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002109 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002110 )
2111 assert ext is not None
2112 assert ext.critical is False
2113
2114 san = ext.value
2115
2116 rfc822name = san.get_values_for_type(x509.RFC822Name)
2117 assert [u"email@em\xe5\xefl.com"] == rfc822name
2118
Paul Kehrerb8968812015-05-15 09:01:34 -07002119 def test_idna2003_invalid(self, backend):
2120 cert = _load_cert(
2121 os.path.join(
2122 "x509", "custom", "san_idna2003_dnsname.pem"
2123 ),
2124 x509.load_pem_x509_certificate,
2125 backend
2126 )
2127 with pytest.raises(UnicodeError):
2128 cert.extensions
2129
Paul Kehrere06cab42015-04-30 10:23:33 -05002130 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2131 cert = _load_cert(
2132 os.path.join(
2133 "x509", "custom", "san_idna_names.pem"
2134 ),
2135 x509.load_pem_x509_certificate,
2136 backend
2137 )
2138 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002139 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002140 )
2141 assert ext is not None
2142 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2143 dns_name = ext.value.get_values_for_type(x509.DNSName)
2144 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2145 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2146 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2147 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2148
2149 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2150 cert = _load_cert(
2151 os.path.join(
2152 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2153 ),
2154 x509.load_pem_x509_certificate,
2155 backend
2156 )
2157 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002158 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002159 )
2160 assert ext is not None
2161 assert ext.critical is False
2162
2163 san = ext.value
2164
2165 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2166 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2167 dns = san.get_values_for_type(x509.DNSName)
2168 ip = san.get_values_for_type(x509.IPAddress)
2169 dirname = san.get_values_for_type(x509.DirectoryName)
2170 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002171 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002172 assert [u"cryptography.io"] == dns
2173 assert [
2174 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002175 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002176 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002177 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002178 ),
2179 ])
2180 ] == dirname
2181 assert [
2182 ipaddress.ip_address(u"127.0.0.1"),
2183 ipaddress.ip_address(u"ff::")
2184 ] == ip
2185
2186 def test_invalid_rfc822name(self, backend):
2187 cert = _load_cert(
2188 os.path.join(
2189 "x509", "custom", "san_rfc822_names.pem"
2190 ),
2191 x509.load_pem_x509_certificate,
2192 backend
2193 )
2194 with pytest.raises(ValueError) as exc:
2195 cert.extensions
2196
2197 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002198
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002199 def test_other_name(self, backend):
2200 cert = _load_cert(
2201 os.path.join(
2202 "x509", "custom", "san_other_name.pem"
2203 ),
2204 x509.load_pem_x509_certificate,
2205 backend
2206 )
2207
2208 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002209 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002210 )
2211 assert ext is not None
2212 assert ext.critical is False
2213
Joshua Taubererd2afad32015-07-06 22:37:53 +00002214 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2215 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002216 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002217 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002218
2219 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002220 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002221
Marti4739cfc2016-08-02 04:03:25 +03002222 def test_certbuilder(self, backend):
2223 sans = [u'*.example.org', u'*.\xf5\xe4\xf6\xfc.example.com',
2224 u'foobar.example.net']
2225 private_key = RSA_KEY_2048.private_key(backend)
2226 builder = _make_certbuilder(private_key)
2227 builder = builder.add_extension(
2228 SubjectAlternativeName(list(map(DNSName, sans))), True)
2229
2230 cert = builder.sign(private_key, hashes.SHA1(), backend)
2231 result = [x.value for x in cert.extensions.get_extension_for_class(
2232 SubjectAlternativeName).value]
2233 assert result == sans
2234
Paul Kehrer94c69602015-05-02 19:29:40 -05002235
2236@pytest.mark.requires_backend_interface(interface=RSABackend)
2237@pytest.mark.requires_backend_interface(interface=X509Backend)
2238class TestExtendedKeyUsageExtension(object):
2239 def test_eku(self, backend):
2240 cert = _load_cert(
2241 os.path.join(
2242 "x509", "custom", "extended_key_usage.pem"
2243 ),
2244 x509.load_pem_x509_certificate,
2245 backend
2246 )
2247 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002248 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002249 )
2250 assert ext is not None
2251 assert ext.critical is False
2252
2253 assert [
2254 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2255 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2256 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2257 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2258 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2259 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2260 x509.ObjectIdentifier("2.5.29.37.0"),
2261 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2262 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002263
2264
2265class TestAccessDescription(object):
2266 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002267 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002268 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2269
2270 def test_invalid_access_location(self):
2271 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002272 x509.AccessDescription(
2273 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2274 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002275
Nick Bastind2ecf862015-12-13 05:44:46 -08002276 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002277 ad = x509.AccessDescription(
2278 ObjectIdentifier("2.999.1"),
2279 x509.UniformResourceIdentifier(u"http://example.com")
2280 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002281 assert ad is not None
2282
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002283 def test_repr(self):
2284 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002285 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002286 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2287 )
2288 assert repr(ad) == (
2289 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2290 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2291 "(value=http://ocsp.domain.com)>)>"
2292 )
2293
2294 def test_eq(self):
2295 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002296 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002297 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2298 )
2299 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002300 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002301 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2302 )
2303 assert ad == ad2
2304
2305 def test_ne(self):
2306 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002307 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002308 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2309 )
2310 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002311 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002312 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2313 )
2314 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002315 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002316 x509.UniformResourceIdentifier(u"http://notthesame")
2317 )
2318 assert ad != ad2
2319 assert ad != ad3
2320 assert ad != object()
2321
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302322 def test_hash(self):
2323 ad = x509.AccessDescription(
2324 AuthorityInformationAccessOID.OCSP,
2325 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2326 )
2327 ad2 = x509.AccessDescription(
2328 AuthorityInformationAccessOID.OCSP,
2329 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2330 )
2331 ad3 = x509.AccessDescription(
2332 AuthorityInformationAccessOID.CA_ISSUERS,
2333 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2334 )
2335 assert hash(ad) == hash(ad2)
2336 assert hash(ad) != hash(ad3)
2337
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002338
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002339class TestPolicyConstraints(object):
2340 def test_invalid_explicit_policy(self):
2341 with pytest.raises(TypeError):
2342 x509.PolicyConstraints("invalid", None)
2343
2344 def test_invalid_inhibit_policy(self):
2345 with pytest.raises(TypeError):
2346 x509.PolicyConstraints(None, "invalid")
2347
2348 def test_both_none(self):
2349 with pytest.raises(ValueError):
2350 x509.PolicyConstraints(None, None)
2351
2352 def test_repr(self):
2353 pc = x509.PolicyConstraints(0, None)
2354
2355 assert repr(pc) == (
2356 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2357 u"pping=None)>"
2358 )
2359
2360 def test_eq(self):
2361 pc = x509.PolicyConstraints(2, 1)
2362 pc2 = x509.PolicyConstraints(2, 1)
2363 assert pc == pc2
2364
2365 def test_ne(self):
2366 pc = x509.PolicyConstraints(2, 1)
2367 pc2 = x509.PolicyConstraints(2, 2)
2368 pc3 = x509.PolicyConstraints(3, 1)
2369 assert pc != pc2
2370 assert pc != pc3
2371 assert pc != object()
2372
2373
Alex Gaynora9885602016-02-27 09:53:46 -05002374@pytest.mark.requires_backend_interface(interface=RSABackend)
2375@pytest.mark.requires_backend_interface(interface=X509Backend)
2376class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002377 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002378 cert = _load_cert(
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002379 os.path.join("x509", "department-of-state-root.pem"),
Alex Gaynora9885602016-02-27 09:53:46 -05002380 x509.load_pem_x509_certificate,
2381 backend
2382 )
2383 ext = cert.extensions.get_extension_for_oid(
2384 ExtensionOID.POLICY_CONSTRAINTS,
2385 )
2386 assert ext.critical is True
2387
2388 assert ext.value == x509.PolicyConstraints(
2389 require_explicit_policy=None, inhibit_policy_mapping=0,
2390 )
2391
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002392 def test_require_explicit_policy(self, backend):
2393 cert = _load_cert(
2394 os.path.join("x509", "custom", "policy_constraints_explicit.pem"),
2395 x509.load_pem_x509_certificate,
2396 backend
2397 )
2398 ext = cert.extensions.get_extension_for_oid(
2399 ExtensionOID.POLICY_CONSTRAINTS
2400 )
2401 assert ext.critical is True
2402 assert ext.value == x509.PolicyConstraints(
2403 require_explicit_policy=1, inhibit_policy_mapping=None,
2404 )
2405
Alex Gaynora9885602016-02-27 09:53:46 -05002406
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002407class TestAuthorityInformationAccess(object):
2408 def test_invalid_descriptions(self):
2409 with pytest.raises(TypeError):
2410 x509.AuthorityInformationAccess(["notanAccessDescription"])
2411
2412 def test_iter_len(self):
2413 aia = x509.AuthorityInformationAccess([
2414 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002415 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002416 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2417 ),
2418 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002419 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002420 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2421 )
2422 ])
2423 assert len(aia) == 2
2424 assert list(aia) == [
2425 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002426 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002427 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2428 ),
2429 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002430 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002431 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2432 )
2433 ]
2434
Marti40f19992016-08-26 04:26:31 +03002435 def test_iter_input(self):
2436 desc = [
2437 x509.AccessDescription(
2438 AuthorityInformationAccessOID.OCSP,
2439 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2440 )
2441 ]
2442 aia = x509.AuthorityInformationAccess(iter(desc))
2443 assert list(aia) == desc
2444
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002445 def test_repr(self):
2446 aia = x509.AuthorityInformationAccess([
2447 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002448 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002449 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2450 ),
2451 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002452 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002453 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2454 )
2455 ])
2456 assert repr(aia) == (
2457 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2458 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2459 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2460 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2461 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2462 "fier(value=http://domain.com/ca.crt)>)>])>"
2463 )
2464
2465 def test_eq(self):
2466 aia = x509.AuthorityInformationAccess([
2467 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002468 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002469 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2470 ),
2471 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002472 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002473 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2474 )
2475 ])
2476 aia2 = x509.AuthorityInformationAccess([
2477 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002478 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002479 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2480 ),
2481 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002482 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002483 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2484 )
2485 ])
2486 assert aia == aia2
2487
2488 def test_ne(self):
2489 aia = x509.AuthorityInformationAccess([
2490 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002491 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002492 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2493 ),
2494 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002495 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002496 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2497 )
2498 ])
2499 aia2 = x509.AuthorityInformationAccess([
2500 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002501 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002502 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2503 ),
2504 ])
2505
2506 assert aia != aia2
2507 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002508
Paul Kehrerad4b3592015-12-27 17:27:40 -06002509 def test_indexing(self):
2510 aia = x509.AuthorityInformationAccess([
2511 x509.AccessDescription(
2512 AuthorityInformationAccessOID.OCSP,
2513 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2514 ),
2515 x509.AccessDescription(
2516 AuthorityInformationAccessOID.CA_ISSUERS,
2517 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2518 ),
2519 x509.AccessDescription(
2520 AuthorityInformationAccessOID.OCSP,
2521 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2522 ),
2523 x509.AccessDescription(
2524 AuthorityInformationAccessOID.OCSP,
2525 x509.UniformResourceIdentifier(u"http://ocsp3.domain.com")
2526 ),
2527 x509.AccessDescription(
2528 AuthorityInformationAccessOID.OCSP,
2529 x509.UniformResourceIdentifier(u"http://ocsp4.domain.com")
2530 ),
2531 ])
2532 assert aia[-1] == aia[4]
2533 assert aia[2:6:2] == [aia[2], aia[4]]
2534
Paul Kehrerd774de92015-05-03 10:52:25 -05002535
2536@pytest.mark.requires_backend_interface(interface=RSABackend)
2537@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002538class TestAuthorityInformationAccessExtension(object):
2539 def test_aia_ocsp_ca_issuers(self, backend):
2540 cert = _load_cert(
2541 os.path.join("x509", "cryptography.io.pem"),
2542 x509.load_pem_x509_certificate,
2543 backend
2544 )
2545 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002546 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002547 )
2548 assert ext is not None
2549 assert ext.critical is False
2550
2551 assert ext.value == x509.AuthorityInformationAccess([
2552 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002553 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002554 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2555 ),
2556 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002557 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002558 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2559 ),
2560 ])
2561
2562 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2563 cert = _load_cert(
2564 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2565 x509.load_pem_x509_certificate,
2566 backend
2567 )
2568 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002569 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002570 )
2571 assert ext is not None
2572 assert ext.critical is False
2573
2574 assert ext.value == x509.AuthorityInformationAccess([
2575 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002576 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002577 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2578 ),
2579 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002580 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002581 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2582 ),
2583 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002584 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002585 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002586 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2587 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002588 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002589 ]))
2590 ),
2591 ])
2592
2593 def test_aia_ocsp_only(self, backend):
2594 cert = _load_cert(
2595 os.path.join("x509", "custom", "aia_ocsp.pem"),
2596 x509.load_pem_x509_certificate,
2597 backend
2598 )
2599 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002600 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002601 )
2602 assert ext is not None
2603 assert ext.critical is False
2604
2605 assert ext.value == x509.AuthorityInformationAccess([
2606 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002607 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002608 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2609 ),
2610 ])
2611
2612 def test_aia_ca_issuers_only(self, backend):
2613 cert = _load_cert(
2614 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2615 x509.load_pem_x509_certificate,
2616 backend
2617 )
2618 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002619 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002620 )
2621 assert ext is not None
2622 assert ext.critical is False
2623
2624 assert ext.value == x509.AuthorityInformationAccess([
2625 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002626 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002627 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002628 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2629 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002630 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002631 ]))
2632 ),
2633 ])
2634
2635
2636@pytest.mark.requires_backend_interface(interface=RSABackend)
2637@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002638class TestAuthorityKeyIdentifierExtension(object):
2639 def test_aki_keyid(self, backend):
2640 cert = _load_cert(
2641 os.path.join(
2642 "x509", "cryptography.io.pem"
2643 ),
2644 x509.load_pem_x509_certificate,
2645 backend
2646 )
2647 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002648 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002649 )
2650 assert ext is not None
2651 assert ext.critical is False
2652
2653 assert ext.value.key_identifier == (
2654 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2655 )
2656 assert ext.value.authority_cert_issuer is None
2657 assert ext.value.authority_cert_serial_number is None
2658
2659 def test_aki_all_fields(self, backend):
2660 cert = _load_cert(
2661 os.path.join(
2662 "x509", "custom", "authority_key_identifier.pem"
2663 ),
2664 x509.load_pem_x509_certificate,
2665 backend
2666 )
2667 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002668 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002669 )
2670 assert ext is not None
2671 assert ext.critical is False
2672
2673 assert ext.value.key_identifier == (
2674 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2675 )
2676 assert ext.value.authority_cert_issuer == [
2677 x509.DirectoryName(
2678 x509.Name([
2679 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002680 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002681 ),
2682 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002683 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002684 )
2685 ])
2686 )
2687 ]
2688 assert ext.value.authority_cert_serial_number == 3
2689
2690 def test_aki_no_keyid(self, backend):
2691 cert = _load_cert(
2692 os.path.join(
2693 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2694 ),
2695 x509.load_pem_x509_certificate,
2696 backend
2697 )
2698 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002699 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002700 )
2701 assert ext is not None
2702 assert ext.critical is False
2703
2704 assert ext.value.key_identifier is None
2705 assert ext.value.authority_cert_issuer == [
2706 x509.DirectoryName(
2707 x509.Name([
2708 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002709 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002710 ),
2711 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002712 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002713 )
2714 ])
2715 )
2716 ]
2717 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002718
Paul Kehrer253929a2015-08-05 17:30:39 +01002719 def test_from_certificate(self, backend):
2720 issuer_cert = _load_cert(
2721 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2722 x509.load_pem_x509_certificate,
2723 backend
2724 )
2725 cert = _load_cert(
2726 os.path.join("x509", "cryptography.io.pem"),
2727 x509.load_pem_x509_certificate,
2728 backend
2729 )
2730 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002731 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002732 )
2733 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2734 issuer_cert.public_key()
2735 )
2736 assert ext.value == aki
2737
Paul Kehrer61ff3562016-03-11 22:51:27 -04002738 def test_from_issuer_subject_key_identifier(self, backend):
2739 issuer_cert = _load_cert(
2740 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2741 x509.load_pem_x509_certificate,
2742 backend
2743 )
2744 cert = _load_cert(
2745 os.path.join("x509", "cryptography.io.pem"),
2746 x509.load_pem_x509_certificate,
2747 backend
2748 )
2749 ext = cert.extensions.get_extension_for_oid(
2750 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
2751 )
2752 ski = issuer_cert.extensions.get_extension_for_class(
2753 x509.SubjectKeyIdentifier
2754 )
2755 aki = x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier(
2756 ski
2757 )
2758 assert ext.value == aki
2759
Paul Kehrer5a485522015-05-06 00:29:12 -05002760
Paul Kehrere0017be2015-05-17 20:39:40 -06002761class TestNameConstraints(object):
2762 def test_ipaddress_wrong_type(self):
2763 with pytest.raises(TypeError):
2764 x509.NameConstraints(
2765 permitted_subtrees=[
2766 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2767 ],
2768 excluded_subtrees=None
2769 )
2770
2771 with pytest.raises(TypeError):
2772 x509.NameConstraints(
2773 permitted_subtrees=None,
2774 excluded_subtrees=[
2775 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2776 ]
2777 )
2778
2779 def test_ipaddress_allowed_type(self):
2780 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2781 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2782 nc = x509.NameConstraints(
2783 permitted_subtrees=permitted,
2784 excluded_subtrees=excluded
2785 )
2786 assert nc.permitted_subtrees == permitted
2787 assert nc.excluded_subtrees == excluded
2788
2789 def test_invalid_permitted_subtrees(self):
2790 with pytest.raises(TypeError):
2791 x509.NameConstraints("badpermitted", None)
2792
2793 def test_invalid_excluded_subtrees(self):
2794 with pytest.raises(TypeError):
2795 x509.NameConstraints(None, "badexcluded")
2796
2797 def test_no_subtrees(self):
2798 with pytest.raises(ValueError):
2799 x509.NameConstraints(None, None)
2800
2801 def test_permitted_none(self):
2802 excluded = [x509.DNSName(u"name.local")]
2803 nc = x509.NameConstraints(
2804 permitted_subtrees=None, excluded_subtrees=excluded
2805 )
2806 assert nc.permitted_subtrees is None
2807 assert nc.excluded_subtrees is not None
2808
2809 def test_excluded_none(self):
2810 permitted = [x509.DNSName(u"name.local")]
2811 nc = x509.NameConstraints(
2812 permitted_subtrees=permitted, excluded_subtrees=None
2813 )
2814 assert nc.permitted_subtrees is not None
2815 assert nc.excluded_subtrees is None
2816
Marti40f19992016-08-26 04:26:31 +03002817 def test_iter_input(self):
2818 subtrees = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))]
2819 nc = x509.NameConstraints(iter(subtrees), iter(subtrees))
2820 assert list(nc.permitted_subtrees) == subtrees
2821 assert list(nc.excluded_subtrees) == subtrees
2822
Paul Kehrere0017be2015-05-17 20:39:40 -06002823 def test_repr(self):
2824 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2825 nc = x509.NameConstraints(
2826 permitted_subtrees=permitted,
2827 excluded_subtrees=None
2828 )
2829 assert repr(nc) == (
2830 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2831 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2832 )
2833
Paul Kehrer31894282015-06-21 21:46:41 -05002834 def test_eq(self):
2835 nc = x509.NameConstraints(
2836 permitted_subtrees=[x509.DNSName(u"name.local")],
2837 excluded_subtrees=[x509.DNSName(u"name2.local")]
2838 )
2839 nc2 = x509.NameConstraints(
2840 permitted_subtrees=[x509.DNSName(u"name.local")],
2841 excluded_subtrees=[x509.DNSName(u"name2.local")]
2842 )
2843 assert nc == nc2
2844
2845 def test_ne(self):
2846 nc = x509.NameConstraints(
2847 permitted_subtrees=[x509.DNSName(u"name.local")],
2848 excluded_subtrees=[x509.DNSName(u"name2.local")]
2849 )
2850 nc2 = x509.NameConstraints(
2851 permitted_subtrees=[x509.DNSName(u"name.local")],
2852 excluded_subtrees=None
2853 )
2854 nc3 = x509.NameConstraints(
2855 permitted_subtrees=None,
2856 excluded_subtrees=[x509.DNSName(u"name2.local")]
2857 )
2858
2859 assert nc != nc2
2860 assert nc != nc3
2861 assert nc != object()
2862
Paul Kehrere0017be2015-05-17 20:39:40 -06002863
Paul Kehrer870d7e82015-06-21 22:20:44 -05002864@pytest.mark.requires_backend_interface(interface=RSABackend)
2865@pytest.mark.requires_backend_interface(interface=X509Backend)
2866class TestNameConstraintsExtension(object):
2867 def test_permitted_excluded(self, backend):
2868 cert = _load_cert(
2869 os.path.join(
2870 "x509", "custom", "nc_permitted_excluded_2.pem"
2871 ),
2872 x509.load_pem_x509_certificate,
2873 backend
2874 )
2875 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002876 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002877 ).value
2878 assert nc == x509.NameConstraints(
2879 permitted_subtrees=[
2880 x509.DNSName(u"zombo.local"),
2881 ],
2882 excluded_subtrees=[
2883 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002884 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002885 ]))
2886 ]
2887 )
2888
2889 def test_permitted(self, backend):
2890 cert = _load_cert(
2891 os.path.join(
2892 "x509", "custom", "nc_permitted_2.pem"
2893 ),
2894 x509.load_pem_x509_certificate,
2895 backend
2896 )
2897 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002898 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002899 ).value
2900 assert nc == x509.NameConstraints(
2901 permitted_subtrees=[
2902 x509.DNSName(u"zombo.local"),
2903 ],
2904 excluded_subtrees=None
2905 )
2906
Paul Kehrer42376832015-07-01 18:10:32 -05002907 def test_permitted_with_leading_period(self, backend):
2908 cert = _load_cert(
2909 os.path.join(
2910 "x509", "custom", "nc_permitted.pem"
2911 ),
2912 x509.load_pem_x509_certificate,
2913 backend
2914 )
2915 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002916 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002917 ).value
2918 assert nc == x509.NameConstraints(
2919 permitted_subtrees=[
2920 x509.DNSName(u".cryptography.io"),
2921 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2922 ],
2923 excluded_subtrees=None
2924 )
2925
2926 def test_excluded_with_leading_period(self, backend):
2927 cert = _load_cert(
2928 os.path.join(
2929 "x509", "custom", "nc_excluded.pem"
2930 ),
2931 x509.load_pem_x509_certificate,
2932 backend
2933 )
2934 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002935 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002936 ).value
2937 assert nc == x509.NameConstraints(
2938 permitted_subtrees=None,
2939 excluded_subtrees=[
2940 x509.DNSName(u".cryptography.io"),
2941 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2942 ]
2943 )
2944
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002945 def test_permitted_excluded_with_ips(self, backend):
2946 cert = _load_cert(
2947 os.path.join(
2948 "x509", "custom", "nc_permitted_excluded.pem"
2949 ),
2950 x509.load_pem_x509_certificate,
2951 backend
2952 )
2953 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002954 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002955 ).value
2956 assert nc == x509.NameConstraints(
2957 permitted_subtrees=[
2958 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2959 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2960 ],
2961 excluded_subtrees=[
2962 x509.DNSName(u".domain.com"),
2963 x509.UniformResourceIdentifier(u"http://test.local"),
2964 ]
2965 )
2966
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002967 def test_single_ip_netmask(self, backend):
2968 cert = _load_cert(
2969 os.path.join(
2970 "x509", "custom", "nc_single_ip_netmask.pem"
2971 ),
2972 x509.load_pem_x509_certificate,
2973 backend
2974 )
2975 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002976 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002977 ).value
2978 assert nc == x509.NameConstraints(
2979 permitted_subtrees=[
2980 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2981 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2982 ],
2983 excluded_subtrees=None
2984 )
2985
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002986 def test_invalid_netmask(self, backend):
2987 cert = _load_cert(
2988 os.path.join(
2989 "x509", "custom", "nc_invalid_ip_netmask.pem"
2990 ),
2991 x509.load_pem_x509_certificate,
2992 backend
2993 )
2994 with pytest.raises(ValueError):
2995 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002996 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002997 )
2998
Marti4739cfc2016-08-02 04:03:25 +03002999 def test_certbuilder(self, backend):
3000 permitted = [u'.example.org', u'.\xf5\xe4\xf6\xfc.example.com',
3001 u'foobar.example.net']
3002 private_key = RSA_KEY_2048.private_key(backend)
3003 builder = _make_certbuilder(private_key)
3004 builder = builder.add_extension(
3005 NameConstraints(permitted_subtrees=list(map(DNSName, permitted)),
3006 excluded_subtrees=[]), True)
3007
3008 cert = builder.sign(private_key, hashes.SHA1(), backend)
3009 result = [x.value for x in cert.extensions.get_extension_for_class(
3010 NameConstraints).value.permitted_subtrees]
3011 assert result == permitted
3012
Paul Kehrer870d7e82015-06-21 22:20:44 -05003013
Paul Kehrer5a485522015-05-06 00:29:12 -05003014class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003015 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003016 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003017 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003018
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003019 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003020 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003021 x509.DistributionPoint(None, "notname", None, None)
3022
3023 def test_distribution_point_full_and_relative_not_none(self):
3024 with pytest.raises(ValueError):
3025 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003026
3027 def test_crl_issuer_not_general_names(self):
3028 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003029 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05003030
3031 def test_reason_not_reasonflags(self):
3032 with pytest.raises(TypeError):
3033 x509.DistributionPoint(
3034 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003035 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003036 frozenset(["notreasonflags"]),
3037 None
3038 )
3039
3040 def test_reason_not_frozenset(self):
3041 with pytest.raises(TypeError):
3042 x509.DistributionPoint(
3043 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3044 None,
3045 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003046 None
3047 )
3048
3049 def test_disallowed_reasons(self):
3050 with pytest.raises(ValueError):
3051 x509.DistributionPoint(
3052 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3053 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003054 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003055 None
3056 )
3057
3058 with pytest.raises(ValueError):
3059 x509.DistributionPoint(
3060 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3061 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003062 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003063 None
3064 )
3065
3066 def test_reason_only(self):
3067 with pytest.raises(ValueError):
3068 x509.DistributionPoint(
3069 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003070 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003071 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003072 None
3073 )
3074
3075 def test_eq(self):
3076 dp = x509.DistributionPoint(
3077 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003078 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003079 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003080 [
3081 x509.DirectoryName(
3082 x509.Name([
3083 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003084 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003085 )
3086 ])
3087 )
3088 ],
3089 )
3090 dp2 = x509.DistributionPoint(
3091 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003092 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003093 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003094 [
3095 x509.DirectoryName(
3096 x509.Name([
3097 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003098 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003099 )
3100 ])
3101 )
3102 ],
3103 )
3104 assert dp == dp2
3105
3106 def test_ne(self):
3107 dp = x509.DistributionPoint(
3108 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003109 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003110 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003111 [
3112 x509.DirectoryName(
3113 x509.Name([
3114 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003115 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003116 )
3117 ])
3118 )
3119 ],
3120 )
3121 dp2 = x509.DistributionPoint(
3122 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3123 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003124 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003125 None
3126 )
3127 assert dp != dp2
3128 assert dp != object()
3129
Marti40f19992016-08-26 04:26:31 +03003130 def test_iter_input(self):
3131 name = [x509.UniformResourceIdentifier(u"http://crypt.og/crl")]
3132 issuer = [
3133 x509.DirectoryName(
3134 x509.Name([
3135 x509.NameAttribute(NameOID.COMMON_NAME, u"Important CA")
3136 ])
3137 )
3138 ]
3139 dp = x509.DistributionPoint(
3140 iter(name),
3141 None,
3142 frozenset([x509.ReasonFlags.ca_compromise]),
3143 iter(issuer),
3144 )
3145 assert list(dp.full_name) == name
3146 assert list(dp.crl_issuer) == issuer
3147
Paul Kehrer5a485522015-05-06 00:29:12 -05003148 def test_repr(self):
3149 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003150 None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003151 x509.RelativeDistinguishedName([
Paul Kehrereba19e62015-08-10 18:44:24 -05003152 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05003153 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003154 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003155 [
3156 x509.DirectoryName(
3157 x509.Name([
3158 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003159 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003160 )
3161 ])
3162 )
3163 ],
3164 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05003165 if six.PY3:
3166 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003167 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3168 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3169 "4.3, name=commonName)>, value='myCN')>])>, reasons=frozenset("
3170 "{<ReasonFlags.ca_compromise: 'cACompromise'>}), crl_issuer=[<"
3171 "DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentifi"
3172 "er(oid=2.5.4.3, name=commonName)>, value='Important CA')>])>)"
3173 ">])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003174 )
3175 else:
3176 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003177 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3178 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3179 "4.3, name=commonName)>, value=u'myCN')>])>, reasons=frozenset"
3180 "([<ReasonFlags.ca_compromise: 'cACompromise'>]), crl_issuer=["
3181 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
3182 "ier(oid=2.5.4.3, name=commonName)>, value=u'Important CA')>])"
3183 ">)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003184 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003185
3186
3187class TestCRLDistributionPoints(object):
3188 def test_invalid_distribution_points(self):
3189 with pytest.raises(TypeError):
3190 x509.CRLDistributionPoints(["notadistributionpoint"])
3191
3192 def test_iter_len(self):
3193 cdp = x509.CRLDistributionPoints([
3194 x509.DistributionPoint(
3195 [x509.UniformResourceIdentifier(u"http://domain")],
3196 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003197 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003198 None
3199 ),
3200 x509.DistributionPoint(
3201 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003202 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003203 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003204 x509.ReasonFlags.key_compromise,
3205 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003206 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003207 None
3208 ),
3209 ])
3210 assert len(cdp) == 2
3211 assert list(cdp) == [
3212 x509.DistributionPoint(
3213 [x509.UniformResourceIdentifier(u"http://domain")],
3214 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003215 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003216 None
3217 ),
3218 x509.DistributionPoint(
3219 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003220 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003221 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003222 x509.ReasonFlags.key_compromise,
3223 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003224 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003225 None
3226 ),
3227 ]
3228
Marti40f19992016-08-26 04:26:31 +03003229 def test_iter_input(self):
3230 points = [
3231 x509.DistributionPoint(
3232 [x509.UniformResourceIdentifier(u"http://domain")],
3233 None,
3234 None,
3235 None
3236 ),
3237 ]
3238 cdp = x509.CRLDistributionPoints(iter(points))
3239 assert list(cdp) == points
3240
Paul Kehrer5a485522015-05-06 00:29:12 -05003241 def test_repr(self):
3242 cdp = x509.CRLDistributionPoints([
3243 x509.DistributionPoint(
3244 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003245 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003246 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003247 None
3248 ),
3249 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003250 if six.PY3:
3251 assert repr(cdp) == (
3252 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3253 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3254 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
3255 "romise'>}), crl_issuer=None)>])>"
3256 )
3257 else:
3258 assert repr(cdp) == (
3259 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3260 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3261 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
3262 "romise'>]), crl_issuer=None)>])>"
3263 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003264
3265 def test_eq(self):
3266 cdp = x509.CRLDistributionPoints([
3267 x509.DistributionPoint(
3268 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003269 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003270 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003271 x509.ReasonFlags.key_compromise,
3272 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003273 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003274 [x509.UniformResourceIdentifier(u"uri://thing")],
3275 ),
3276 ])
3277 cdp2 = x509.CRLDistributionPoints([
3278 x509.DistributionPoint(
3279 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003280 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003281 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003282 x509.ReasonFlags.key_compromise,
3283 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003284 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003285 [x509.UniformResourceIdentifier(u"uri://thing")],
3286 ),
3287 ])
3288 assert cdp == cdp2
3289
3290 def test_ne(self):
3291 cdp = x509.CRLDistributionPoints([
3292 x509.DistributionPoint(
3293 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003294 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003295 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003296 x509.ReasonFlags.key_compromise,
3297 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003298 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003299 [x509.UniformResourceIdentifier(u"uri://thing")],
3300 ),
3301 ])
3302 cdp2 = x509.CRLDistributionPoints([
3303 x509.DistributionPoint(
3304 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003305 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003306 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003307 x509.ReasonFlags.key_compromise,
3308 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003309 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003310 [x509.UniformResourceIdentifier(u"uri://thing")],
3311 ),
3312 ])
3313 cdp3 = x509.CRLDistributionPoints([
3314 x509.DistributionPoint(
3315 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003316 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003317 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003318 [x509.UniformResourceIdentifier(u"uri://thing")],
3319 ),
3320 ])
3321 cdp4 = x509.CRLDistributionPoints([
3322 x509.DistributionPoint(
3323 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003324 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003325 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003326 x509.ReasonFlags.key_compromise,
3327 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003328 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003329 [x509.UniformResourceIdentifier(u"uri://thing2")],
3330 ),
3331 ])
3332 assert cdp != cdp2
3333 assert cdp != cdp3
3334 assert cdp != cdp4
3335 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003336
Paul Kehreree2e92d2015-12-27 17:29:37 -06003337 def test_indexing(self):
3338 ci = x509.CRLDistributionPoints([
3339 x509.DistributionPoint(
3340 None, None, None,
3341 [x509.UniformResourceIdentifier(u"uri://thing")],
3342 ),
3343 x509.DistributionPoint(
3344 None, None, None,
3345 [x509.UniformResourceIdentifier(u"uri://thing2")],
3346 ),
3347 x509.DistributionPoint(
3348 None, None, None,
3349 [x509.UniformResourceIdentifier(u"uri://thing3")],
3350 ),
3351 x509.DistributionPoint(
3352 None, None, None,
3353 [x509.UniformResourceIdentifier(u"uri://thing4")],
3354 ),
3355 x509.DistributionPoint(
3356 None, None, None,
3357 [x509.UniformResourceIdentifier(u"uri://thing5")],
3358 ),
3359 ])
3360 assert ci[-1] == ci[4]
3361 assert ci[2:6:2] == [ci[2], ci[4]]
3362
Paul Kehrer9a10d592015-05-10 14:55:51 -05003363
3364@pytest.mark.requires_backend_interface(interface=RSABackend)
3365@pytest.mark.requires_backend_interface(interface=X509Backend)
3366class TestCRLDistributionPointsExtension(object):
3367 def test_fullname_and_crl_issuer(self, backend):
3368 cert = _load_cert(
3369 os.path.join(
3370 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3371 ),
3372 x509.load_der_x509_certificate,
3373 backend
3374 )
3375
3376 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003377 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003378 ).value
3379
3380 assert cdps == x509.CRLDistributionPoints([
3381 x509.DistributionPoint(
3382 full_name=[x509.DirectoryName(
3383 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003384 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003385 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003386 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003387 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003388 ),
3389 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003390 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003391 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003392 ),
3393 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003394 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003395 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003396 ),
3397 ])
3398 )],
3399 relative_name=None,
3400 reasons=None,
3401 crl_issuer=[x509.DirectoryName(
3402 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003403 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003404 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003405 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003406 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003407 ),
3408 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003409 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003410 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003411 ),
3412 ])
3413 )],
3414 )
3415 ])
3416
3417 def test_relativename_and_crl_issuer(self, backend):
3418 cert = _load_cert(
3419 os.path.join(
3420 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3421 ),
3422 x509.load_der_x509_certificate,
3423 backend
3424 )
3425
3426 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003427 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003428 ).value
3429
3430 assert cdps == x509.CRLDistributionPoints([
3431 x509.DistributionPoint(
3432 full_name=None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003433 relative_name=x509.RelativeDistinguishedName([
Paul Kehrer9a10d592015-05-10 14:55:51 -05003434 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003435 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003436 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003437 ),
3438 ]),
3439 reasons=None,
3440 crl_issuer=[x509.DirectoryName(
3441 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003442 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003443 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003444 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003445 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003446 ),
3447 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003448 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003449 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003450 ),
3451 ])
3452 )],
3453 )
3454 ])
3455
3456 def test_fullname_crl_issuer_reasons(self, backend):
3457 cert = _load_cert(
3458 os.path.join(
3459 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3460 ),
3461 x509.load_pem_x509_certificate,
3462 backend
3463 )
3464
3465 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003466 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003467 ).value
3468
3469 assert cdps == x509.CRLDistributionPoints([
3470 x509.DistributionPoint(
3471 full_name=[x509.UniformResourceIdentifier(
3472 u"http://myhost.com/myca.crl"
3473 )],
3474 relative_name=None,
3475 reasons=frozenset([
3476 x509.ReasonFlags.key_compromise,
3477 x509.ReasonFlags.ca_compromise
3478 ]),
3479 crl_issuer=[x509.DirectoryName(
3480 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003481 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003482 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003483 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003484 ),
3485 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003486 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003487 ),
3488 ])
3489 )],
3490 )
3491 ])
3492
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003493 def test_all_reasons(self, backend):
3494 cert = _load_cert(
3495 os.path.join(
3496 "x509", "custom", "cdp_all_reasons.pem"
3497 ),
3498 x509.load_pem_x509_certificate,
3499 backend
3500 )
3501
3502 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003503 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003504 ).value
3505
3506 assert cdps == x509.CRLDistributionPoints([
3507 x509.DistributionPoint(
3508 full_name=[x509.UniformResourceIdentifier(
3509 u"http://domain.com/some.crl"
3510 )],
3511 relative_name=None,
3512 reasons=frozenset([
3513 x509.ReasonFlags.key_compromise,
3514 x509.ReasonFlags.ca_compromise,
3515 x509.ReasonFlags.affiliation_changed,
3516 x509.ReasonFlags.superseded,
3517 x509.ReasonFlags.privilege_withdrawn,
3518 x509.ReasonFlags.cessation_of_operation,
3519 x509.ReasonFlags.aa_compromise,
3520 x509.ReasonFlags.certificate_hold,
3521 ]),
3522 crl_issuer=None
3523 )
3524 ])
3525
3526 def test_single_reason(self, backend):
3527 cert = _load_cert(
3528 os.path.join(
3529 "x509", "custom", "cdp_reason_aa_compromise.pem"
3530 ),
3531 x509.load_pem_x509_certificate,
3532 backend
3533 )
3534
3535 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003536 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003537 ).value
3538
3539 assert cdps == x509.CRLDistributionPoints([
3540 x509.DistributionPoint(
3541 full_name=[x509.UniformResourceIdentifier(
3542 u"http://domain.com/some.crl"
3543 )],
3544 relative_name=None,
3545 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3546 crl_issuer=None
3547 )
3548 ])
3549
Paul Kehrer9a10d592015-05-10 14:55:51 -05003550 def test_crl_issuer_only(self, backend):
3551 cert = _load_cert(
3552 os.path.join(
3553 "x509", "custom", "cdp_crl_issuer.pem"
3554 ),
3555 x509.load_pem_x509_certificate,
3556 backend
3557 )
3558
3559 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003560 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003561 ).value
3562
3563 assert cdps == x509.CRLDistributionPoints([
3564 x509.DistributionPoint(
3565 full_name=None,
3566 relative_name=None,
3567 reasons=None,
3568 crl_issuer=[x509.DirectoryName(
3569 x509.Name([
3570 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003571 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003572 ),
3573 ])
3574 )],
3575 )
3576 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003577
Dominic Chen87bb9572015-10-09 00:23:07 -04003578 def test_crl_empty_hostname(self, backend):
3579 cert = _load_cert(
3580 os.path.join(
3581 "x509", "custom", "cdp_empty_hostname.pem"
3582 ),
3583 x509.load_pem_x509_certificate,
3584 backend
3585 )
3586
3587 cdps = cert.extensions.get_extension_for_oid(
3588 ExtensionOID.CRL_DISTRIBUTION_POINTS
3589 ).value
3590
3591 assert cdps == x509.CRLDistributionPoints([
3592 x509.DistributionPoint(
3593 full_name=[x509.UniformResourceIdentifier(
3594 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3595 )],
3596 relative_name=None,
3597 reasons=None,
3598 crl_issuer=None
3599 )
3600 ])
3601
Paul Kehrer16fae762015-05-01 23:14:20 -05003602
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003603@pytest.mark.requires_backend_interface(interface=RSABackend)
3604@pytest.mark.requires_backend_interface(interface=X509Backend)
3605class TestOCSPNoCheckExtension(object):
3606 def test_nocheck(self, backend):
3607 cert = _load_cert(
3608 os.path.join(
3609 "x509", "custom", "ocsp_nocheck.pem"
3610 ),
3611 x509.load_pem_x509_certificate,
3612 backend
3613 )
3614 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003615 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003616 )
3617 assert isinstance(ext.value, x509.OCSPNoCheck)
3618
3619
Paul Kehrer16fae762015-05-01 23:14:20 -05003620class TestInhibitAnyPolicy(object):
3621 def test_not_int(self):
3622 with pytest.raises(TypeError):
3623 x509.InhibitAnyPolicy("notint")
3624
3625 def test_negative_int(self):
3626 with pytest.raises(ValueError):
3627 x509.InhibitAnyPolicy(-1)
3628
3629 def test_repr(self):
3630 iap = x509.InhibitAnyPolicy(0)
3631 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3632
3633 def test_eq(self):
3634 iap = x509.InhibitAnyPolicy(1)
3635 iap2 = x509.InhibitAnyPolicy(1)
3636 assert iap == iap2
3637
3638 def test_ne(self):
3639 iap = x509.InhibitAnyPolicy(1)
3640 iap2 = x509.InhibitAnyPolicy(4)
3641 assert iap != iap2
3642 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003643
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303644 def test_hash(self):
3645 iap = x509.InhibitAnyPolicy(1)
3646 iap2 = x509.InhibitAnyPolicy(1)
3647 iap3 = x509.InhibitAnyPolicy(4)
3648 assert hash(iap) == hash(iap2)
3649 assert hash(iap) != hash(iap3)
3650
Paul Kehrerca6ce992015-06-17 22:13:15 -06003651
3652@pytest.mark.requires_backend_interface(interface=RSABackend)
3653@pytest.mark.requires_backend_interface(interface=X509Backend)
3654class TestInhibitAnyPolicyExtension(object):
3655 def test_nocheck(self, backend):
3656 cert = _load_cert(
3657 os.path.join(
3658 "x509", "custom", "inhibit_any_policy_5.pem"
3659 ),
3660 x509.load_pem_x509_certificate,
3661 backend
3662 )
3663 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003664 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003665 ).value
3666 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003667
3668
3669@pytest.mark.requires_backend_interface(interface=RSABackend)
3670@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003671class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003672 def test_invalid_certificate_policies_data(self, backend):
3673 cert = _load_cert(
3674 os.path.join(
3675 "x509", "custom", "cp_invalid.pem"
3676 ),
3677 x509.load_pem_x509_certificate,
3678 backend
3679 )
3680 with pytest.raises(ValueError):
3681 cert.extensions