blob: 93538bbcb176fd81bbcb26cf97a4b59dd615c293 [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
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -040016from cryptography import utils, 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([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400155 x509.DNSName(b"cryptography.io"),
156 x509.DNSName(b"crypto.local"),
Paul Kehrer49bb7562015-12-25 16:17:40 -0600157 ])
158 assert len(ci) == 2
159 assert list(ci) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400160 x509.DNSName(b"cryptography.io"),
161 x509.DNSName(b"crypto.local"),
Paul Kehrer49bb7562015-12-25 16:17:40 -0600162 ]
163
Paul Kehrer5c999d32015-12-26 17:45:20 -0600164 def test_indexing(self):
165 ci = x509.CertificateIssuer([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400166 x509.DNSName(b"cryptography.io"),
167 x509.DNSName(b"crypto.local"),
168 x509.DNSName(b"another.local"),
Paul Kehrer5c999d32015-12-26 17:45:20 -0600169 x509.RFC822Name(u"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -0500170 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer5c999d32015-12-26 17:45:20 -0600171 ])
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):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400176 ci1 = x509.CertificateIssuer([x509.DNSName(b"cryptography.io")])
177 ci2 = x509.CertificateIssuer([x509.DNSName(b"cryptography.io")])
Paul Kehrer49bb7562015-12-25 16:17:40 -0600178 assert ci1 == ci2
179
180 def test_ne(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400181 ci1 = x509.CertificateIssuer([x509.DNSName(b"cryptography.io")])
182 ci2 = x509.CertificateIssuer([x509.DNSName(b"somethingelse.tld")])
Paul Kehrer49bb7562015-12-25 16:17:40 -0600183 assert ci1 != ci2
184 assert ci1 != object()
185
186 def test_repr(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400187 ci = x509.CertificateIssuer([x509.DNSName(b"cryptography.io")])
188 if six.PY3:
189 assert repr(ci) == (
190 "<CertificateIssuer(<GeneralNames([<DNSName(bytes_value="
191 "b'cryptography.io')>])>)>"
192 )
193 else:
194 assert repr(ci) == (
195 "<CertificateIssuer(<GeneralNames([<DNSName(bytes_value="
196 "'cryptography.io')>])>)>"
197 )
Paul Kehrer49bb7562015-12-25 16:17:40 -0600198
199 def test_get_values_for_type(self):
200 ci = x509.CertificateIssuer(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400201 [x509.DNSName(b"cryptography.io")]
Paul Kehrer49bb7562015-12-25 16:17:40 -0600202 )
203 names = ci.get_values_for_type(x509.DNSName)
204 assert names == [u"cryptography.io"]
205
206
Paul Kehrer7058ece2015-12-25 22:28:29 -0600207class TestCRLReason(object):
208 def test_invalid_reason_flags(self):
209 with pytest.raises(TypeError):
210 x509.CRLReason("notareason")
211
212 def test_eq(self):
213 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
214 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
215 assert reason1 == reason2
216
217 def test_ne(self):
218 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
219 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
220 assert reason1 != reason2
221 assert reason1 != object()
222
Alex Gaynor07d5cae2015-12-27 15:30:39 -0500223 def test_hash(self):
224 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
225 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
226 reason3 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
227
228 assert hash(reason1) == hash(reason2)
229 assert hash(reason1) != hash(reason3)
230
Paul Kehrer7058ece2015-12-25 22:28:29 -0600231 def test_repr(self):
232 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
233 assert repr(reason1) == (
234 "<CRLReason(reason=ReasonFlags.unspecified)>"
235 )
236
237
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600238class TestInvalidityDate(object):
239 def test_invalid_invalidity_date(self):
240 with pytest.raises(TypeError):
241 x509.InvalidityDate("notadate")
242
243 def test_eq(self):
244 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
245 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
246 assert invalid1 == invalid2
247
248 def test_ne(self):
249 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
250 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
251 assert invalid1 != invalid2
252 assert invalid1 != object()
253
254 def test_repr(self):
255 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
256 assert repr(invalid1) == (
257 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
258 )
259
Paul Kehrer67cde762015-12-26 11:37:14 -0600260 def test_hash(self):
261 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
262 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
263 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
264 assert hash(invalid1) == hash(invalid2)
265 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600266
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600267
Paul Kehrer2b622582015-04-15 11:04:29 -0400268class TestNoticeReference(object):
269 def test_notice_numbers_not_all_int(self):
270 with pytest.raises(TypeError):
271 x509.NoticeReference("org", [1, 2, "three"])
272
273 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500274 with pytest.raises(TypeError):
275 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400276
Marti40f19992016-08-26 04:26:31 +0300277 def test_iter_input(self):
278 numbers = [1, 3, 4]
279 nr = x509.NoticeReference(u"org", iter(numbers))
280 assert list(nr.notice_numbers) == numbers
281
Paul Kehrer2b622582015-04-15 11:04:29 -0400282 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500283 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400284
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500285 if six.PY3:
286 assert repr(nr) == (
287 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
288 "])>"
289 )
290 else:
291 assert repr(nr) == (
292 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
293 "4])>"
294 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400295
Paul Kehrerc56ab622015-05-03 09:56:31 -0500296 def test_eq(self):
297 nr = x509.NoticeReference("org", [1, 2])
298 nr2 = x509.NoticeReference("org", [1, 2])
299 assert nr == nr2
300
301 def test_ne(self):
302 nr = x509.NoticeReference("org", [1, 2])
303 nr2 = x509.NoticeReference("org", [1])
304 nr3 = x509.NoticeReference(None, [1, 2])
305 assert nr != nr2
306 assert nr != nr3
307 assert nr != object()
308
Paul Kehrer2b622582015-04-15 11:04:29 -0400309
310class TestUserNotice(object):
311 def test_notice_reference_invalid(self):
312 with pytest.raises(TypeError):
313 x509.UserNotice("invalid", None)
314
315 def test_notice_reference_none(self):
316 un = x509.UserNotice(None, "text")
317 assert un.notice_reference is None
318 assert un.explicit_text == "text"
319
320 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500321 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500322 if six.PY3:
323 assert repr(un) == (
324 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500325 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500326 )
327 else:
328 assert repr(un) == (
329 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500330 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500331 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400332
Paul Kehrerc56ab622015-05-03 09:56:31 -0500333 def test_eq(self):
334 nr = x509.NoticeReference("org", [1, 2])
335 nr2 = x509.NoticeReference("org", [1, 2])
336 un = x509.UserNotice(nr, "text")
337 un2 = x509.UserNotice(nr2, "text")
338 assert un == un2
339
340 def test_ne(self):
341 nr = x509.NoticeReference("org", [1, 2])
342 nr2 = x509.NoticeReference("org", [1])
343 un = x509.UserNotice(nr, "text")
344 un2 = x509.UserNotice(nr2, "text")
345 un3 = x509.UserNotice(nr, "text3")
346 assert un != un2
347 assert un != un3
348 assert un != object()
349
Paul Kehrer2b622582015-04-15 11:04:29 -0400350
Paul Kehrer2b622582015-04-15 11:04:29 -0400351class TestPolicyInformation(object):
352 def test_invalid_policy_identifier(self):
353 with pytest.raises(TypeError):
354 x509.PolicyInformation("notanoid", None)
355
356 def test_none_policy_qualifiers(self):
357 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
358 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
359 assert pi.policy_qualifiers is None
360
361 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500362 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400363 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
364 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
365 assert pi.policy_qualifiers == pq
366
367 def test_invalid_policy_identifiers(self):
368 with pytest.raises(TypeError):
369 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
370
Marti40f19992016-08-26 04:26:31 +0300371 def test_iter_input(self):
372 qual = [u"foo", u"bar"]
373 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), iter(qual))
374 assert list(pi.policy_qualifiers) == qual
375
Paul Kehrer2b622582015-04-15 11:04:29 -0400376 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500377 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400378 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500379 if six.PY3:
380 assert repr(pi) == (
381 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
382 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500383 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500384 )
385 else:
386 assert repr(pi) == (
387 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
388 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500389 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500390 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400391
Paul Kehrerc56ab622015-05-03 09:56:31 -0500392 def test_eq(self):
393 pi = x509.PolicyInformation(
394 x509.ObjectIdentifier("1.2.3"),
395 [u"string", x509.UserNotice(None, u"hi")]
396 )
397 pi2 = x509.PolicyInformation(
398 x509.ObjectIdentifier("1.2.3"),
399 [u"string", x509.UserNotice(None, u"hi")]
400 )
401 assert pi == pi2
402
403 def test_ne(self):
404 pi = x509.PolicyInformation(
405 x509.ObjectIdentifier("1.2.3"), [u"string"]
406 )
407 pi2 = x509.PolicyInformation(
408 x509.ObjectIdentifier("1.2.3"), [u"string2"]
409 )
410 pi3 = x509.PolicyInformation(
411 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
412 )
413 assert pi != pi2
414 assert pi != pi3
415 assert pi != object()
416
Paul Kehrer2b622582015-04-15 11:04:29 -0400417
Fraser Tweedaled607dd72017-05-29 16:33:20 -0500418@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer2b622582015-04-15 11:04:29 -0400419class TestCertificatePolicies(object):
420 def test_invalid_policies(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 with pytest.raises(TypeError):
424 x509.CertificatePolicies([1, pi])
425
426 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500427 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400428 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
429 cp = x509.CertificatePolicies([pi])
430 assert len(cp) == 1
431 for policyinfo in cp:
432 assert policyinfo == pi
433
Marti40f19992016-08-26 04:26:31 +0300434 def test_iter_input(self):
435 policies = [
436 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"string"])
437 ]
438 cp = x509.CertificatePolicies(iter(policies))
439 assert list(cp) == policies
440
Paul Kehrer2b622582015-04-15 11:04:29 -0400441 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500442 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400443 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
444 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500445 if six.PY3:
446 assert repr(cp) == (
447 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
448 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
449 "ers=['string'])>])>"
450 )
451 else:
452 assert repr(cp) == (
453 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
454 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
455 "ers=[u'string'])>])>"
456 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400457
Paul Kehrerc56ab622015-05-03 09:56:31 -0500458 def test_eq(self):
459 pi = x509.PolicyInformation(
460 x509.ObjectIdentifier("1.2.3"), [u"string"]
461 )
462 cp = x509.CertificatePolicies([pi])
463 pi2 = x509.PolicyInformation(
464 x509.ObjectIdentifier("1.2.3"), [u"string"]
465 )
466 cp2 = x509.CertificatePolicies([pi2])
467 assert cp == cp2
468
469 def test_ne(self):
470 pi = x509.PolicyInformation(
471 x509.ObjectIdentifier("1.2.3"), [u"string"]
472 )
473 cp = x509.CertificatePolicies([pi])
474 pi2 = x509.PolicyInformation(
475 x509.ObjectIdentifier("1.2.3"), [u"string2"]
476 )
477 cp2 = x509.CertificatePolicies([pi2])
478 assert cp != cp2
479 assert cp != object()
480
Paul Kehrere8db7bd2015-12-27 17:32:57 -0600481 def test_indexing(self):
482 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"test"])
483 pi2 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.4"), [u"test"])
484 pi3 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.5"), [u"test"])
485 pi4 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.6"), [u"test"])
486 pi5 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.7"), [u"test"])
487 cp = x509.CertificatePolicies([pi, pi2, pi3, pi4, pi5])
488 assert cp[-1] == cp[4]
489 assert cp[2:6:2] == [cp[2], cp[4]]
490
Fraser Tweedaled607dd72017-05-29 16:33:20 -0500491 def test_long_oid(self, backend):
492 """
493 Test that parsing a CertificatePolicies ext with
494 a very long OID succeeds.
495 """
496 cert = _load_cert(
497 os.path.join("x509", "bigoid.pem"),
498 x509.load_pem_x509_certificate,
499 backend
500 )
501 ext = cert.extensions.get_extension_for_class(
502 x509.CertificatePolicies)
503
504 oid = x509.ObjectIdentifier(
505 "1.3.6.1.4.1.311.21.8.8950086.10656446.2706058"
506 ".12775672.480128.147.13466065.13029902"
507 )
508
509 assert ext.value[0].policy_identifier == oid
510
Paul Kehrer2b622582015-04-15 11:04:29 -0400511
Paul Kehrer11026fe2015-05-12 11:23:56 -0500512@pytest.mark.requires_backend_interface(interface=RSABackend)
513@pytest.mark.requires_backend_interface(interface=X509Backend)
514class TestCertificatePoliciesExtension(object):
515 def test_cps_uri_policy_qualifier(self, backend):
516 cert = _load_cert(
517 os.path.join("x509", "custom", "cp_cps_uri.pem"),
518 x509.load_pem_x509_certificate,
519 backend
520 )
521
522 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500523 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500524 ).value
525
526 assert cp == x509.CertificatePolicies([
527 x509.PolicyInformation(
528 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
529 [u"http://other.com/cps"]
530 )
531 ])
532
533 def test_user_notice_with_notice_reference(self, backend):
534 cert = _load_cert(
535 os.path.join(
536 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
537 ),
538 x509.load_pem_x509_certificate,
539 backend
540 )
541
542 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500543 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500544 ).value
545
546 assert cp == x509.CertificatePolicies([
547 x509.PolicyInformation(
548 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
549 [
550 u"http://example.com/cps",
551 u"http://other.com/cps",
552 x509.UserNotice(
553 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
554 u"thing"
555 )
556 ]
557 )
558 ])
559
560 def test_user_notice_with_explicit_text(self, backend):
561 cert = _load_cert(
562 os.path.join(
563 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
564 ),
565 x509.load_pem_x509_certificate,
566 backend
567 )
568
569 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500570 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500571 ).value
572
573 assert cp == x509.CertificatePolicies([
574 x509.PolicyInformation(
575 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
576 [x509.UserNotice(None, u"thing")]
577 )
578 ])
579
580 def test_user_notice_no_explicit_text(self, backend):
581 cert = _load_cert(
582 os.path.join(
583 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
584 ),
585 x509.load_pem_x509_certificate,
586 backend
587 )
588
589 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500590 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500591 ).value
592
593 assert cp == x509.CertificatePolicies([
594 x509.PolicyInformation(
595 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
596 [
597 x509.UserNotice(
598 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
599 None
600 )
601 ]
602 )
603 ])
604
605
Paul Kehrercecbbba2015-03-30 14:58:38 -0500606class TestKeyUsage(object):
607 def test_key_agreement_false_encipher_decipher_true(self):
608 with pytest.raises(ValueError):
609 x509.KeyUsage(
610 digital_signature=False,
611 content_commitment=False,
612 key_encipherment=False,
613 data_encipherment=False,
614 key_agreement=False,
615 key_cert_sign=False,
616 crl_sign=False,
617 encipher_only=True,
618 decipher_only=False
619 )
620
621 with pytest.raises(ValueError):
622 x509.KeyUsage(
623 digital_signature=False,
624 content_commitment=False,
625 key_encipherment=False,
626 data_encipherment=False,
627 key_agreement=False,
628 key_cert_sign=False,
629 crl_sign=False,
630 encipher_only=True,
631 decipher_only=True
632 )
633
634 with pytest.raises(ValueError):
635 x509.KeyUsage(
636 digital_signature=False,
637 content_commitment=False,
638 key_encipherment=False,
639 data_encipherment=False,
640 key_agreement=False,
641 key_cert_sign=False,
642 crl_sign=False,
643 encipher_only=False,
644 decipher_only=True
645 )
646
647 def test_properties_key_agreement_true(self):
648 ku = x509.KeyUsage(
649 digital_signature=True,
650 content_commitment=True,
651 key_encipherment=False,
652 data_encipherment=False,
653 key_agreement=False,
654 key_cert_sign=True,
655 crl_sign=False,
656 encipher_only=False,
657 decipher_only=False
658 )
659 assert ku.digital_signature is True
660 assert ku.content_commitment is True
661 assert ku.key_encipherment is False
662 assert ku.data_encipherment is False
663 assert ku.key_agreement is False
664 assert ku.key_cert_sign is True
665 assert ku.crl_sign is False
666
667 def test_key_agreement_true_properties(self):
668 ku = x509.KeyUsage(
669 digital_signature=False,
670 content_commitment=False,
671 key_encipherment=False,
672 data_encipherment=False,
673 key_agreement=True,
674 key_cert_sign=False,
675 crl_sign=False,
676 encipher_only=False,
677 decipher_only=True
678 )
679 assert ku.key_agreement is True
680 assert ku.encipher_only is False
681 assert ku.decipher_only is True
682
683 def test_key_agreement_false_properties(self):
684 ku = x509.KeyUsage(
685 digital_signature=False,
686 content_commitment=False,
687 key_encipherment=False,
688 data_encipherment=False,
689 key_agreement=False,
690 key_cert_sign=False,
691 crl_sign=False,
692 encipher_only=False,
693 decipher_only=False
694 )
695 assert ku.key_agreement is False
696 with pytest.raises(ValueError):
697 ku.encipher_only
698
699 with pytest.raises(ValueError):
700 ku.decipher_only
701
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500702 def test_repr_key_agreement_false(self):
703 ku = x509.KeyUsage(
704 digital_signature=True,
705 content_commitment=True,
706 key_encipherment=False,
707 data_encipherment=False,
708 key_agreement=False,
709 key_cert_sign=True,
710 crl_sign=False,
711 encipher_only=False,
712 decipher_only=False
713 )
714 assert repr(ku) == (
715 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
716 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400717 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
718 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500719 )
720
721 def test_repr_key_agreement_true(self):
722 ku = x509.KeyUsage(
723 digital_signature=True,
724 content_commitment=True,
725 key_encipherment=False,
726 data_encipherment=False,
727 key_agreement=True,
728 key_cert_sign=True,
729 crl_sign=False,
730 encipher_only=False,
731 decipher_only=False
732 )
733 assert repr(ku) == (
734 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
735 "cipherment=False, data_encipherment=False, key_agreement=True, k"
736 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
737 "only=False)>"
738 )
739
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500740 def test_eq(self):
741 ku = x509.KeyUsage(
742 digital_signature=False,
743 content_commitment=False,
744 key_encipherment=False,
745 data_encipherment=False,
746 key_agreement=True,
747 key_cert_sign=False,
748 crl_sign=False,
749 encipher_only=False,
750 decipher_only=True
751 )
752 ku2 = x509.KeyUsage(
753 digital_signature=False,
754 content_commitment=False,
755 key_encipherment=False,
756 data_encipherment=False,
757 key_agreement=True,
758 key_cert_sign=False,
759 crl_sign=False,
760 encipher_only=False,
761 decipher_only=True
762 )
763 assert ku == ku2
764
765 def test_ne(self):
766 ku = x509.KeyUsage(
767 digital_signature=False,
768 content_commitment=False,
769 key_encipherment=False,
770 data_encipherment=False,
771 key_agreement=True,
772 key_cert_sign=False,
773 crl_sign=False,
774 encipher_only=False,
775 decipher_only=True
776 )
777 ku2 = x509.KeyUsage(
778 digital_signature=False,
779 content_commitment=False,
780 key_encipherment=False,
781 data_encipherment=False,
782 key_agreement=False,
783 key_cert_sign=False,
784 crl_sign=False,
785 encipher_only=False,
786 decipher_only=False
787 )
788 assert ku != ku2
789 assert ku != object()
790
Paul Kehrercecbbba2015-03-30 14:58:38 -0500791
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500792class TestSubjectKeyIdentifier(object):
793 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400794 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500795 ski = x509.SubjectKeyIdentifier(value)
796 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500797
798 def test_repr(self):
799 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500800 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500801 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500802 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400803 if six.PY3:
804 assert repr(ext) == (
805 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
806 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
807 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
808 "\\xf7\\xff:\\xc9\')>)>"
809 )
810 else:
811 assert repr(ext) == (
812 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
813 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
814 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
815 "\\xf7\\xff:\\xc9\')>)>"
816 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500817
818 def test_eq(self):
819 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500820 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500821 )
822 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500823 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500824 )
825 assert ski == ski2
826
827 def test_ne(self):
828 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500829 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500830 )
831 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500832 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500833 )
834 assert ski != ski2
835 assert ski != object()
836
Alex Gaynor410fe352015-12-26 15:01:25 -0500837 def test_hash(self):
838 ski1 = x509.SubjectKeyIdentifier(
839 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
840 )
841 ski2 = x509.SubjectKeyIdentifier(
842 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
843 )
844 ski3 = x509.SubjectKeyIdentifier(
845 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
846 )
847
848 assert hash(ski1) == hash(ski2)
849 assert hash(ski1) != hash(ski3)
850
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500851
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400852class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500853 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400854 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500855 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400856
857 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500858 dirname = x509.DirectoryName(
859 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800860 x509.NameAttribute(
861 x509.ObjectIdentifier('2.999.1'),
862 u'value1'
863 ),
864 x509.NameAttribute(
865 x509.ObjectIdentifier('2.999.2'),
866 u'value2'
867 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500868 ])
869 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400870 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500871 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400872
873 def test_authority_issuer_none_serial_not_none(self):
874 with pytest.raises(ValueError):
875 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
876
877 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500878 dirname = x509.DirectoryName(
879 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800880 x509.NameAttribute(
881 x509.ObjectIdentifier('2.999.1'),
882 u'value1'
883 ),
884 x509.NameAttribute(
885 x509.ObjectIdentifier('2.999.2'),
886 u'value2'
887 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500888 ])
889 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400890 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500891 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400892
893 def test_authority_cert_serial_and_issuer_none(self):
894 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
895 assert aki.key_identifier == b"id"
896 assert aki.authority_cert_issuer is None
897 assert aki.authority_cert_serial_number is None
898
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600899 def test_authority_cert_serial_zero(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -0400900 dns = x509.DNSName(b"SomeIssuer")
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600901 aki = x509.AuthorityKeyIdentifier(b"id", [dns], 0)
902 assert aki.key_identifier == b"id"
903 assert aki.authority_cert_issuer == [dns]
904 assert aki.authority_cert_serial_number == 0
905
Marti40f19992016-08-26 04:26:31 +0300906 def test_iter_input(self):
907 dirnames = [
908 x509.DirectoryName(
909 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
910 )
911 ]
912 aki = x509.AuthorityKeyIdentifier(b"digest", iter(dirnames), 1234)
913 assert list(aki.authority_cert_issuer) == dirnames
914
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400915 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500916 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500917 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500918 )
919 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400920
921 if six.PY3:
922 assert repr(aki) == (
923 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500924 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500925 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500926 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400927 )
928 else:
929 assert repr(aki) == (
930 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500931 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500932 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
933 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400934 )
935
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500936 def test_eq(self):
937 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500938 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500939 )
940 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
941 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500942 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500943 )
944 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
945 assert aki == aki2
946
947 def test_ne(self):
948 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500949 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500950 )
951 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500952 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500953 )
954 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
955 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
956 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
957 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
958 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
959 assert aki != aki2
960 assert aki != aki3
961 assert aki != aki4
962 assert aki != aki5
963 assert aki != object()
964
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400965
Paul Kehrer8cf26422015-03-21 09:50:24 -0500966class TestBasicConstraints(object):
967 def test_ca_not_boolean(self):
968 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500969 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500970
971 def test_path_length_not_ca(self):
972 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500973 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500974
975 def test_path_length_not_int(self):
976 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500977 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500978
979 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500980 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500981
982 def test_path_length_negative(self):
983 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500984 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500985
986 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500987 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500988 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500989 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500990 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500991
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600992 def test_hash(self):
993 na = x509.BasicConstraints(ca=True, path_length=None)
994 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600995 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600996 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600997 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600998
Paul Kehrer3a69b132015-05-13 10:03:46 -0500999 def test_eq(self):
1000 na = x509.BasicConstraints(ca=True, path_length=None)
1001 na2 = x509.BasicConstraints(ca=True, path_length=None)
1002 assert na == na2
1003
1004 def test_ne(self):
1005 na = x509.BasicConstraints(ca=True, path_length=None)
1006 na2 = x509.BasicConstraints(ca=True, path_length=1)
1007 na3 = x509.BasicConstraints(ca=False, path_length=None)
1008 assert na != na2
1009 assert na != na3
1010 assert na != object()
1011
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001012
Paul Kehrerffa2a152015-03-31 08:18:25 -05001013class TestExtendedKeyUsage(object):
1014 def test_not_all_oids(self):
1015 with pytest.raises(TypeError):
1016 x509.ExtendedKeyUsage(["notoid"])
1017
1018 def test_iter_len(self):
1019 eku = x509.ExtendedKeyUsage([
1020 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1021 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1022 ])
1023 assert len(eku) == 2
1024 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -05001025 ExtendedKeyUsageOID.SERVER_AUTH,
1026 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -05001027 ]
1028
Marti40f19992016-08-26 04:26:31 +03001029 def test_iter_input(self):
1030 usages = [
1031 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1032 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1033 ]
1034 aia = x509.ExtendedKeyUsage(iter(usages))
1035 assert list(aia) == usages
1036
Paul Kehrer23d10c32015-04-02 23:12:32 -05001037 def test_repr(self):
1038 eku = x509.ExtendedKeyUsage([
1039 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1040 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1041 ])
1042 assert repr(eku) == (
1043 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
1044 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
1045 "tAuth)>])>"
1046 )
1047
Paul Kehrerb0476172015-05-02 19:34:51 -05001048 def test_eq(self):
1049 eku = x509.ExtendedKeyUsage([
1050 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1051 ])
1052 eku2 = x509.ExtendedKeyUsage([
1053 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1054 ])
1055 assert eku == eku2
1056
1057 def test_ne(self):
1058 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
1059 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
1060 assert eku != eku2
1061 assert eku != object()
1062
Paul Kehrerffa2a152015-03-31 08:18:25 -05001063
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001064@pytest.mark.requires_backend_interface(interface=RSABackend)
1065@pytest.mark.requires_backend_interface(interface=X509Backend)
1066class TestExtensions(object):
1067 def test_no_extensions(self, backend):
1068 cert = _load_cert(
1069 os.path.join("x509", "verisign_md2_root.pem"),
1070 x509.load_pem_x509_certificate,
1071 backend
1072 )
1073 ext = cert.extensions
1074 assert len(ext) == 0
1075 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -05001076 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001077 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001078
Paul Kehrerd44e4132015-08-10 19:13:13 -05001079 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001080
1081 def test_one_extension(self, backend):
1082 cert = _load_cert(
1083 os.path.join(
1084 "x509", "custom", "basic_constraints_not_critical.pem"
1085 ),
1086 x509.load_pem_x509_certificate,
1087 backend
1088 )
1089 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001090 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001091 assert ext is not None
1092 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001093
1094 def test_duplicate_extension(self, backend):
1095 cert = _load_cert(
1096 os.path.join(
1097 "x509", "custom", "two_basic_constraints.pem"
1098 ),
1099 x509.load_pem_x509_certificate,
1100 backend
1101 )
1102 with pytest.raises(x509.DuplicateExtension) as exc:
1103 cert.extensions
1104
Paul Kehrerd44e4132015-08-10 19:13:13 -05001105 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001106
1107 def test_unsupported_critical_extension(self, backend):
1108 cert = _load_cert(
1109 os.path.join(
1110 "x509", "custom", "unsupported_extension_critical.pem"
1111 ),
1112 x509.load_pem_x509_certificate,
1113 backend
1114 )
Alex Gaynord08ddd52017-05-20 09:01:54 -07001115 ext = cert.extensions.get_extension_for_oid(
1116 x509.ObjectIdentifier("1.2.3.4")
1117 )
1118 assert ext.value.value == b"value"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001119
Paul Kehrer58ddc112015-12-30 20:19:00 -06001120 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001121 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001122 cert = _load_cert(
1123 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001124 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001125 ),
1126 x509.load_pem_x509_certificate,
1127 backend
1128 )
1129 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001130 assert len(extensions) == 2
1131 assert extensions[0].critical is False
1132 assert extensions[0].oid == x509.ObjectIdentifier(
1133 "1.3.6.1.4.1.41482.2"
1134 )
1135 assert extensions[0].value == x509.UnrecognizedExtension(
1136 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1137 b"1.3.6.1.4.1.41482.1.2"
1138 )
1139 assert extensions[1].critical is False
1140 assert extensions[1].oid == x509.ObjectIdentifier(
1141 "1.3.6.1.4.1.45724.2.1.1"
1142 )
1143 assert extensions[1].value == x509.UnrecognizedExtension(
1144 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1145 b"\x03\x02\x040"
1146 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001147
Phoebe Queenecae9812015-08-12 05:00:32 +01001148 def test_no_extensions_get_for_class(self, backend):
1149 cert = _load_cert(
1150 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001151 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001152 ),
1153 x509.load_pem_x509_certificate,
1154 backend
1155 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001156 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001157 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001158 exts.get_extension_for_class(x509.IssuerAlternativeName)
1159 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001160
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001161 def test_unrecognized_extension_for_class(self):
1162 exts = x509.Extensions([])
1163 with pytest.raises(TypeError):
1164 exts.get_extension_for_class(x509.UnrecognizedExtension)
1165
Paul Kehrer5b90c972015-12-26 00:52:58 -06001166 def test_indexing(self, backend):
1167 cert = _load_cert(
1168 os.path.join("x509", "cryptography.io.pem"),
1169 x509.load_pem_x509_certificate,
1170 backend
1171 )
1172 exts = cert.extensions
1173 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001174 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001175
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001176 def test_one_extension_get_for_class(self, backend):
1177 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001178 os.path.join(
1179 "x509", "custom", "basic_constraints_not_critical.pem"
1180 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001181 x509.load_pem_x509_certificate,
1182 backend
1183 )
1184 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1185 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001186 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001187
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001188 def test_repr(self, backend):
1189 cert = _load_cert(
1190 os.path.join(
1191 "x509", "custom", "basic_constraints_not_critical.pem"
1192 ),
1193 x509.load_pem_x509_certificate,
1194 backend
1195 )
1196 assert repr(cert.extensions) == (
1197 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1198 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1199 "alse, path_length=None)>)>])>"
1200 )
1201
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001202
Paul Kehrerfa56a232015-03-17 13:14:03 -05001203@pytest.mark.requires_backend_interface(interface=RSABackend)
1204@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001205class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001206 def test_ca_true_pathlen_6(self, backend):
1207 cert = _load_cert(
1208 os.path.join(
1209 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1210 ),
1211 x509.load_der_x509_certificate,
1212 backend
1213 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001214 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001215 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001216 )
1217 assert ext is not None
1218 assert ext.critical is True
1219 assert ext.value.ca is True
1220 assert ext.value.path_length == 6
1221
1222 def test_path_length_zero(self, backend):
1223 cert = _load_cert(
1224 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1225 x509.load_pem_x509_certificate,
1226 backend
1227 )
1228 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001229 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001230 )
1231 assert ext is not None
1232 assert ext.critical is True
1233 assert ext.value.ca is True
1234 assert ext.value.path_length == 0
1235
1236 def test_ca_true_no_pathlen(self, backend):
1237 cert = _load_cert(
1238 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1239 x509.load_der_x509_certificate,
1240 backend
1241 )
1242 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001243 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001244 )
1245 assert ext is not None
1246 assert ext.critical is True
1247 assert ext.value.ca is True
1248 assert ext.value.path_length is None
1249
1250 def test_ca_false(self, backend):
1251 cert = _load_cert(
1252 os.path.join("x509", "cryptography.io.pem"),
1253 x509.load_pem_x509_certificate,
1254 backend
1255 )
1256 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001257 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001258 )
1259 assert ext is not None
1260 assert ext.critical is True
1261 assert ext.value.ca is False
1262 assert ext.value.path_length is None
1263
1264 def test_no_basic_constraints(self, backend):
1265 cert = _load_cert(
1266 os.path.join(
1267 "x509",
1268 "PKITS_data",
1269 "certs",
1270 "ValidCertificatePathTest1EE.crt"
1271 ),
1272 x509.load_der_x509_certificate,
1273 backend
1274 )
1275 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001276 cert.extensions.get_extension_for_oid(
1277 ExtensionOID.BASIC_CONSTRAINTS
1278 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001279
1280 def test_basic_constraint_not_critical(self, backend):
1281 cert = _load_cert(
1282 os.path.join(
1283 "x509", "custom", "basic_constraints_not_critical.pem"
1284 ),
1285 x509.load_pem_x509_certificate,
1286 backend
1287 )
1288 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001289 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001290 )
1291 assert ext is not None
1292 assert ext.critical is False
1293 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001294
1295
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001296class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001297 @pytest.mark.requires_backend_interface(interface=RSABackend)
1298 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001299 def test_subject_key_identifier(self, backend):
1300 cert = _load_cert(
1301 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1302 x509.load_der_x509_certificate,
1303 backend
1304 )
1305 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001306 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001307 )
1308 ski = ext.value
1309 assert ext is not None
1310 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001311 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001312 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001313 )
1314
Paul Kehrerf22f6122015-08-05 12:57:13 +01001315 @pytest.mark.requires_backend_interface(interface=RSABackend)
1316 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001317 def test_no_subject_key_identifier(self, backend):
1318 cert = _load_cert(
1319 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1320 x509.load_pem_x509_certificate,
1321 backend
1322 )
1323 with pytest.raises(x509.ExtensionNotFound):
1324 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001325 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001326 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001327
Paul Kehrerf22f6122015-08-05 12:57:13 +01001328 @pytest.mark.requires_backend_interface(interface=RSABackend)
1329 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001330 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001331 cert = _load_cert(
1332 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1333 x509.load_der_x509_certificate,
1334 backend
1335 )
1336 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001337 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001338 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001339 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001340 cert.public_key()
1341 )
1342 assert ext.value == ski
1343
1344 @pytest.mark.requires_backend_interface(interface=DSABackend)
1345 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001346 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001347 cert = _load_cert(
1348 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1349 x509.load_pem_x509_certificate,
1350 backend
1351 )
1352
1353 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001354 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001355 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001356 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001357 cert.public_key()
1358 )
1359 assert ext.value == ski
1360
1361 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1362 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001363 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001364 _skip_curve_unsupported(backend, ec.SECP384R1())
1365 cert = _load_cert(
1366 os.path.join("x509", "ecdsa_root.pem"),
1367 x509.load_pem_x509_certificate,
1368 backend
1369 )
1370
1371 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001372 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001373 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001374 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001375 cert.public_key()
1376 )
1377 assert ext.value == ski
1378
Paul Kehrer5508ee22015-04-02 19:31:03 -05001379
1380@pytest.mark.requires_backend_interface(interface=RSABackend)
1381@pytest.mark.requires_backend_interface(interface=X509Backend)
1382class TestKeyUsageExtension(object):
1383 def test_no_key_usage(self, backend):
1384 cert = _load_cert(
1385 os.path.join("x509", "verisign_md2_root.pem"),
1386 x509.load_pem_x509_certificate,
1387 backend
1388 )
1389 ext = cert.extensions
1390 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001391 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001392
Paul Kehrerd44e4132015-08-10 19:13:13 -05001393 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001394
1395 def test_all_purposes(self, backend):
1396 cert = _load_cert(
1397 os.path.join(
1398 "x509", "custom", "all_key_usages.pem"
1399 ),
1400 x509.load_pem_x509_certificate,
1401 backend
1402 )
1403 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001404 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001405 assert ext is not None
1406
1407 ku = ext.value
1408 assert ku.digital_signature is True
1409 assert ku.content_commitment is True
1410 assert ku.key_encipherment is True
1411 assert ku.data_encipherment is True
1412 assert ku.key_agreement is True
1413 assert ku.key_cert_sign is True
1414 assert ku.crl_sign is True
1415 assert ku.encipher_only is True
1416 assert ku.decipher_only is True
1417
1418 def test_key_cert_sign_crl_sign(self, backend):
1419 cert = _load_cert(
1420 os.path.join(
1421 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1422 ),
1423 x509.load_der_x509_certificate,
1424 backend
1425 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001426 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001427 assert ext is not None
1428 assert ext.critical is True
1429
1430 ku = ext.value
1431 assert ku.digital_signature is False
1432 assert ku.content_commitment is False
1433 assert ku.key_encipherment is False
1434 assert ku.data_encipherment is False
1435 assert ku.key_agreement is False
1436 assert ku.key_cert_sign is True
1437 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001438
1439
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001440class TestDNSName(object):
1441 def test_init(self):
1442 with pytest.warns(utils.DeprecatedIn21):
1443 name = x509.DNSName(u"*.\xf5\xe4\xf6\xfc.example.com")
1444 assert name.bytes_value == b"*.xn--4ca7aey.example.com"
1445
1446 with pytest.warns(utils.DeprecatedIn21):
1447 name = x509.DNSName(u".\xf5\xe4\xf6\xfc.example.com")
1448 assert name.bytes_value == b".xn--4ca7aey.example.com"
1449 assert name.value == u".\xf5\xe4\xf6\xfc.example.com"
1450
1451 with pytest.warns(utils.DeprecatedIn21):
1452 name = x509.DNSName(u"\xf5\xe4\xf6\xfc.example.com")
1453 assert name.bytes_value == b"xn--4ca7aey.example.com"
1454
1455 with pytest.raises(TypeError):
1456 x509.DNSName(1.3)
1457
1458 def test_ne(self):
1459 n1 = x509.DNSName(b"test1")
1460 n2 = x509.DNSName(b"test2")
1461 n3 = x509.DNSName(b"test2")
1462 assert n1 != n2
1463 assert not (n2 != n3)
1464
1465
Paul Kehrer31bdf792015-03-25 14:11:00 -05001466class TestDirectoryName(object):
1467 def test_not_name(self):
1468 with pytest.raises(TypeError):
1469 x509.DirectoryName(b"notaname")
1470
1471 with pytest.raises(TypeError):
1472 x509.DirectoryName(1.3)
1473
1474 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001475 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Marti40f19992016-08-26 04:26:31 +03001476 gn = x509.DirectoryName(name)
Ian Cordascoa908d692015-06-16 21:35:24 -05001477 if six.PY3:
1478 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001479 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1480 "ier(oid=2.5.4.3, name=commonName)>, value='value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001481 )
1482 else:
1483 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001484 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1485 "ier(oid=2.5.4.3, name=commonName)>, value=u'value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001486 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001487
1488 def test_eq(self):
1489 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001490 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001491 ])
1492 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001493 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001494 ])
Marti40f19992016-08-26 04:26:31 +03001495 gn = x509.DirectoryName(name)
1496 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001497 assert gn == gn2
1498
1499 def test_ne(self):
1500 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001501 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001502 ])
1503 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001504 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001505 ])
Marti40f19992016-08-26 04:26:31 +03001506 gn = x509.DirectoryName(name)
1507 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001508 assert gn != gn2
1509 assert gn != object()
1510
1511
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001512class TestRFC822Name(object):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001513 def test_repr(self):
1514 gn = x509.RFC822Name(u"string")
1515 assert repr(gn) == "<RFC822Name(value=string)>"
1516
1517 def test_equality(self):
1518 gn = x509.RFC822Name(u"string")
1519 gn2 = x509.RFC822Name(u"string2")
1520 gn3 = x509.RFC822Name(u"string")
1521 assert gn != gn2
1522 assert gn != object()
1523 assert gn == gn3
1524
1525 def test_not_text(self):
1526 with pytest.raises(TypeError):
1527 x509.RFC822Name(b"notaunicodestring")
1528
1529 with pytest.raises(TypeError):
1530 x509.RFC822Name(1.3)
1531
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001532 def test_invalid_email(self):
1533 with pytest.raises(ValueError):
1534 x509.RFC822Name(u"Name <email>")
1535
1536 with pytest.raises(ValueError):
1537 x509.RFC822Name(u"")
1538
1539 def test_single_label(self):
1540 gn = x509.RFC822Name(u"administrator")
1541 assert gn.value == u"administrator"
1542
1543 def test_idna(self):
1544 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1545 assert gn.value == u"email@em\xe5\xefl.com"
1546 assert gn._encoded == b"email@xn--eml-vla4c.com"
1547
Alex Gaynorb642dee2016-01-03 15:12:23 -05001548 def test_hash(self):
1549 g1 = x509.RFC822Name(u"email@host.com")
1550 g2 = x509.RFC822Name(u"email@host.com")
1551 g3 = x509.RFC822Name(u"admin@host.com")
1552
1553 assert hash(g1) == hash(g2)
1554 assert hash(g1) != hash(g3)
1555
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001556
Paul Kehrere28d6c42015-07-12 14:59:37 -05001557class TestUniformResourceIdentifier(object):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001558 def test_equality(self):
1559 gn = x509.UniformResourceIdentifier(b"string")
1560 gn2 = x509.UniformResourceIdentifier(b"string2")
1561 gn3 = x509.UniformResourceIdentifier(b"string")
1562 assert gn != gn2
1563 assert gn != object()
1564 assert gn == gn3
1565
1566 def test_not_text_or_bytes(self):
1567 with pytest.raises(TypeError):
1568 x509.UniformResourceIdentifier(1.3)
1569
Paul Kehrere28d6c42015-07-12 14:59:37 -05001570 def test_no_parsed_hostname(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001571 gn = x509.UniformResourceIdentifier(b"singlelabel")
1572 assert gn.bytes_value == b"singlelabel"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001573
1574 def test_with_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001575 gn = x509.UniformResourceIdentifier(b"singlelabel:443/test")
1576 assert gn.bytes_value == b"singlelabel:443/test"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001577
1578 def test_idna_no_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001579 with pytest.warns(utils.DeprecatedIn21):
1580 gn = x509.UniformResourceIdentifier(
1581 u"http://\u043f\u044b\u043a\u0430.cryptography"
1582 )
1583 with pytest.warns(utils.DeprecatedIn21):
1584 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1585 assert gn.bytes_value == b"http://xn--80ato2c.cryptography"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001586
1587 def test_idna_with_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001588 with pytest.warns(utils.DeprecatedIn21):
1589 gn = x509.UniformResourceIdentifier(
1590 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1591 )
1592 with pytest.warns(utils.DeprecatedIn21):
1593 assert gn.value == (
1594 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1595 )
1596 assert gn.bytes_value == (
1597 b"gopher://xn--80ato2c.cryptography:70/some/path"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001598 )
Paul Kehrere28d6c42015-07-12 14:59:37 -05001599
1600 def test_query_and_fragment(self):
1601 gn = x509.UniformResourceIdentifier(
Paul Kehrer6c29d742017-08-01 19:27:06 -05001602 b"ldap://cryptography:90/path?query=true#somedata"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001603 )
Paul Kehrer6c29d742017-08-01 19:27:06 -05001604 assert gn.bytes_value == (
1605 b"ldap://cryptography:90/path?query=true#somedata"
1606 )
Paul Kehrere28d6c42015-07-12 14:59:37 -05001607
Alex Gaynord1b56812016-01-03 15:14:34 -05001608 def test_hash(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001609 g1 = x509.UniformResourceIdentifier(b"http://host.com")
1610 g2 = x509.UniformResourceIdentifier(b"http://host.com")
1611 g3 = x509.UniformResourceIdentifier(b"http://other.com")
Alex Gaynord1b56812016-01-03 15:14:34 -05001612
1613 assert hash(g1) == hash(g2)
1614 assert hash(g1) != hash(g3)
1615
Paul Kehrer6c29d742017-08-01 19:27:06 -05001616 def test_repr(self):
1617 gn = x509.UniformResourceIdentifier(b"string")
1618 if six.PY3:
1619 assert repr(gn) == (
1620 "<UniformResourceIdentifier(bytes_value=b'string')>"
1621 )
1622 else:
1623 assert repr(gn) == (
1624 "<UniformResourceIdentifier(bytes_value='string')>"
1625 )
1626
Paul Kehrere28d6c42015-07-12 14:59:37 -05001627
Paul Kehrer31bdf792015-03-25 14:11:00 -05001628class TestRegisteredID(object):
1629 def test_not_oid(self):
1630 with pytest.raises(TypeError):
1631 x509.RegisteredID(b"notanoid")
1632
1633 with pytest.raises(TypeError):
1634 x509.RegisteredID(1.3)
1635
1636 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001637 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001638 assert repr(gn) == (
1639 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1640 "e)>)>"
1641 )
1642
1643 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001644 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1645 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001646 assert gn == gn2
1647
1648 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001649 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001650 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001651 assert gn != gn2
1652 assert gn != object()
1653
1654
1655class TestIPAddress(object):
1656 def test_not_ipaddress(self):
1657 with pytest.raises(TypeError):
1658 x509.IPAddress(b"notanipaddress")
1659
1660 with pytest.raises(TypeError):
1661 x509.IPAddress(1.3)
1662
1663 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301664 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001665 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1666
Eeshan Gargf1234152015-04-29 18:41:00 +05301667 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001668 assert repr(gn2) == "<IPAddress(value=ff::)>"
1669
Paul Kehrereb177932015-05-17 18:33:33 -07001670 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1671 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1672
1673 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1674 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1675
Paul Kehrer31bdf792015-03-25 14:11:00 -05001676 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301677 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1678 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001679 assert gn == gn2
1680
1681 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301682 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1683 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001684 assert gn != gn2
1685 assert gn != object()
1686
1687
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001688class TestOtherName(object):
1689 def test_invalid_args(self):
1690 with pytest.raises(TypeError):
1691 x509.OtherName(b"notanobjectidentifier", b"derdata")
1692
1693 with pytest.raises(TypeError):
1694 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1695
1696 def test_repr(self):
1697 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1698 if six.PY3:
1699 assert repr(gn) == (
1700 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1701 "name=Unknown OID)>, value=b'derdata')>"
1702 )
1703 else:
1704 assert repr(gn) == (
1705 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1706 "name=Unknown OID)>, value='derdata')>"
1707 )
1708
1709 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1710 if six.PY3:
1711 assert repr(gn) == (
1712 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1713 "name=pseudonym)>, value=b'derdata')>"
1714 )
1715 else:
1716 assert repr(gn) == (
1717 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1718 "name=pseudonym)>, value='derdata')>"
1719 )
1720
1721 def test_eq(self):
1722 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1723 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1724 assert gn == gn2
1725
1726 def test_ne(self):
1727 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1728 assert gn != object()
1729
1730 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1731 assert gn != gn2
1732
1733 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1734 assert gn != gn2
1735
1736
Erik Trauschke2dcce902015-05-14 16:12:24 -07001737class TestGeneralNames(object):
1738 def test_get_values_for_type(self):
1739 gns = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001740 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001741 )
1742 names = gns.get_values_for_type(x509.DNSName)
1743 assert names == [u"cryptography.io"]
1744
1745 def test_iter_names(self):
1746 gns = x509.GeneralNames([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001747 x509.DNSName(b"cryptography.io"),
1748 x509.DNSName(b"crypto.local"),
Erik Trauschke2dcce902015-05-14 16:12:24 -07001749 ])
1750 assert len(gns) == 2
1751 assert list(gns) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001752 x509.DNSName(b"cryptography.io"),
1753 x509.DNSName(b"crypto.local"),
Erik Trauschke2dcce902015-05-14 16:12:24 -07001754 ]
1755
Marti40f19992016-08-26 04:26:31 +03001756 def test_iter_input(self):
1757 names = [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001758 x509.DNSName(b"cryptography.io"),
1759 x509.DNSName(b"crypto.local"),
Marti40f19992016-08-26 04:26:31 +03001760 ]
1761 gns = x509.GeneralNames(iter(names))
1762 assert list(gns) == names
1763
Paul Kehrer8adb5962015-12-26 14:46:58 -06001764 def test_indexing(self):
1765 gn = x509.GeneralNames([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001766 x509.DNSName(b"cryptography.io"),
1767 x509.DNSName(b"crypto.local"),
1768 x509.DNSName(b"another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001769 x509.RFC822Name(u"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001770 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001771 ])
1772 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001773 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001774
Erik Trauschke2dcce902015-05-14 16:12:24 -07001775 def test_invalid_general_names(self):
1776 with pytest.raises(TypeError):
1777 x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001778 [x509.DNSName(b"cryptography.io"), "invalid"]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001779 )
1780
1781 def test_repr(self):
1782 gns = x509.GeneralNames(
1783 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001784 x509.DNSName(b"cryptography.io")
Erik Trauschke2dcce902015-05-14 16:12:24 -07001785 ]
1786 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001787 if six.PY3:
1788 assert repr(gns) == (
1789 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>"
1790 )
1791 else:
1792 assert repr(gns) == (
1793 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>"
1794 )
Erik Trauschke2dcce902015-05-14 16:12:24 -07001795
1796 def test_eq(self):
1797 gns = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001798 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001799 )
1800 gns2 = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001801 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001802 )
1803 assert gns == gns2
1804
1805 def test_ne(self):
1806 gns = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001807 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001808 )
1809 gns2 = x509.GeneralNames(
1810 [x509.RFC822Name(u"admin@cryptography.io")]
1811 )
1812 assert gns != gns2
1813 assert gns != object()
1814
1815
Paul Kehrer99125c92015-06-07 18:37:10 -05001816class TestIssuerAlternativeName(object):
1817 def test_get_values_for_type(self):
1818 san = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001819 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001820 )
1821 names = san.get_values_for_type(x509.DNSName)
1822 assert names == [u"cryptography.io"]
1823
1824 def test_iter_names(self):
1825 san = x509.IssuerAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001826 x509.DNSName(b"cryptography.io"),
1827 x509.DNSName(b"crypto.local"),
Paul Kehrer99125c92015-06-07 18:37:10 -05001828 ])
1829 assert len(san) == 2
1830 assert list(san) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001831 x509.DNSName(b"cryptography.io"),
1832 x509.DNSName(b"crypto.local"),
Paul Kehrer99125c92015-06-07 18:37:10 -05001833 ]
1834
Paul Kehrer5c999d32015-12-26 17:45:20 -06001835 def test_indexing(self):
1836 ian = x509.IssuerAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001837 x509.DNSName(b"cryptography.io"),
1838 x509.DNSName(b"crypto.local"),
1839 x509.DNSName(b"another.local"),
Paul Kehrer5c999d32015-12-26 17:45:20 -06001840 x509.RFC822Name(u"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001841 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer5c999d32015-12-26 17:45:20 -06001842 ])
1843 assert ian[-1] == ian[4]
1844 assert ian[2:6:2] == [ian[2], ian[4]]
1845
Paul Kehrer99125c92015-06-07 18:37:10 -05001846 def test_invalid_general_names(self):
1847 with pytest.raises(TypeError):
1848 x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001849 [x509.DNSName(b"cryptography.io"), "invalid"]
Paul Kehrer99125c92015-06-07 18:37:10 -05001850 )
1851
1852 def test_repr(self):
1853 san = x509.IssuerAlternativeName(
1854 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001855 x509.DNSName(b"cryptography.io")
Paul Kehrer99125c92015-06-07 18:37:10 -05001856 ]
1857 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001858 if six.PY3:
1859 assert repr(san) == (
1860 "<IssuerAlternativeName("
1861 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>)>"
1862 )
1863 else:
1864 assert repr(san) == (
1865 "<IssuerAlternativeName("
1866 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>)>"
1867 )
Paul Kehrer99125c92015-06-07 18:37:10 -05001868
1869 def test_eq(self):
1870 san = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001871 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001872 )
1873 san2 = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001874 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001875 )
1876 assert san == san2
1877
1878 def test_ne(self):
1879 san = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001880 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001881 )
1882 san2 = x509.IssuerAlternativeName(
1883 [x509.RFC822Name(u"admin@cryptography.io")]
1884 )
1885 assert san != san2
1886 assert san != object()
1887
1888
Alex Gaynorf1c17672015-06-20 14:20:20 -04001889@pytest.mark.requires_backend_interface(interface=RSABackend)
1890@pytest.mark.requires_backend_interface(interface=X509Backend)
1891class TestRSAIssuerAlternativeNameExtension(object):
1892 def test_uri(self, backend):
1893 cert = _load_cert(
1894 os.path.join("x509", "custom", "ian_uri.pem"),
1895 x509.load_pem_x509_certificate,
1896 backend,
1897 )
1898 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001899 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001900 )
1901 assert list(ext.value) == [
Paul Kehrer6c29d742017-08-01 19:27:06 -05001902 x509.UniformResourceIdentifier(b"http://path.to.root/root.crt"),
Alex Gaynorf1c17672015-06-20 14:20:20 -04001903 ]
1904
1905
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001906class TestCRLNumber(object):
1907 def test_eq(self):
1908 crl_number = x509.CRLNumber(15)
1909 assert crl_number == x509.CRLNumber(15)
1910
1911 def test_ne(self):
1912 crl_number = x509.CRLNumber(15)
1913 assert crl_number != x509.CRLNumber(14)
1914 assert crl_number != object()
1915
1916 def test_repr(self):
1917 crl_number = x509.CRLNumber(15)
1918 assert repr(crl_number) == "<CRLNumber(15)>"
1919
Paul Kehrera9718fc2015-12-22 22:55:35 -06001920 def test_invalid_number(self):
1921 with pytest.raises(TypeError):
1922 x509.CRLNumber("notanumber")
1923
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001924 def test_hash(self):
1925 c1 = x509.CRLNumber(1)
1926 c2 = x509.CRLNumber(1)
1927 c3 = x509.CRLNumber(2)
1928 assert hash(c1) == hash(c2)
1929 assert hash(c1) != hash(c3)
1930
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001931
Paul Kehrer31bdf792015-03-25 14:11:00 -05001932class TestSubjectAlternativeName(object):
1933 def test_get_values_for_type(self):
1934 san = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001935 [x509.DNSName(b"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001936 )
1937 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301938 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001939
1940 def test_iter_names(self):
1941 san = x509.SubjectAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001942 x509.DNSName(b"cryptography.io"),
1943 x509.DNSName(b"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001944 ])
1945 assert len(san) == 2
1946 assert list(san) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001947 x509.DNSName(b"cryptography.io"),
1948 x509.DNSName(b"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001949 ]
1950
Paul Kehrer8adb5962015-12-26 14:46:58 -06001951 def test_indexing(self):
1952 san = x509.SubjectAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001953 x509.DNSName(b"cryptography.io"),
1954 x509.DNSName(b"crypto.local"),
1955 x509.DNSName(b"another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001956 x509.RFC822Name(u"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001957 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001958 ])
1959 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001960 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001961
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001962 def test_invalid_general_names(self):
1963 with pytest.raises(TypeError):
1964 x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001965 [x509.DNSName(b"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001966 )
1967
Paul Kehrer31bdf792015-03-25 14:11:00 -05001968 def test_repr(self):
1969 san = x509.SubjectAlternativeName(
1970 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001971 x509.DNSName(b"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001972 ]
1973 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001974 if six.PY3:
1975 assert repr(san) == (
1976 "<SubjectAlternativeName("
1977 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>)>"
1978 )
1979 else:
1980 assert repr(san) == (
1981 "<SubjectAlternativeName("
1982 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>)>"
1983 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001984
Paul Kehrer58cc3972015-05-13 10:00:41 -05001985 def test_eq(self):
1986 san = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001987 [x509.DNSName(b"cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05001988 )
1989 san2 = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001990 [x509.DNSName(b"cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05001991 )
1992 assert san == san2
1993
1994 def test_ne(self):
1995 san = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001996 [x509.DNSName(b"cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05001997 )
1998 san2 = x509.SubjectAlternativeName(
1999 [x509.RFC822Name(u"admin@cryptography.io")]
2000 )
2001 assert san != san2
2002 assert san != object()
2003
Paul Kehrer40f83382015-04-20 15:00:16 -05002004
2005@pytest.mark.requires_backend_interface(interface=RSABackend)
2006@pytest.mark.requires_backend_interface(interface=X509Backend)
2007class TestRSASubjectAlternativeNameExtension(object):
2008 def test_dns_name(self, backend):
2009 cert = _load_cert(
2010 os.path.join("x509", "cryptography.io.pem"),
2011 x509.load_pem_x509_certificate,
2012 backend
2013 )
2014 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002015 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05002016 )
2017 assert ext is not None
2018 assert ext.critical is False
2019
2020 san = ext.value
2021
2022 dns = san.get_values_for_type(x509.DNSName)
2023 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05002024
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002025 def test_wildcard_dns_name(self, backend):
2026 cert = _load_cert(
2027 os.path.join("x509", "wildcard_san.pem"),
2028 x509.load_pem_x509_certificate,
2029 backend
2030 )
2031 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002032 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002033 )
2034
2035 dns = ext.value.get_values_for_type(x509.DNSName)
2036 assert dns == [
2037 u'*.langui.sh',
2038 u'langui.sh',
2039 u'*.saseliminator.com',
2040 u'saseliminator.com'
2041 ]
2042
Dominic Chen87bb9572015-10-09 00:23:07 -04002043 def test_san_empty_hostname(self, backend):
2044 cert = _load_cert(
2045 os.path.join(
2046 "x509", "custom", "san_empty_hostname.pem"
2047 ),
2048 x509.load_pem_x509_certificate,
2049 backend
2050 )
2051 san = cert.extensions.get_extension_for_oid(
2052 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
2053 )
2054
2055 dns = san.value.get_values_for_type(x509.DNSName)
2056 assert dns == [u'']
2057
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002058 def test_san_wildcard_idna_dns_name(self, backend):
2059 cert = _load_cert(
2060 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
2061 x509.load_pem_x509_certificate,
2062 backend
2063 )
2064 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002065 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002066 )
2067
2068 dns = ext.value.get_values_for_type(x509.DNSName)
2069 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
2070
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002071 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05002072 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002073 os.path.join("x509", "san_x400address.der"),
2074 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05002075 backend
2076 )
Paul Kehrerbed07352015-04-21 08:31:10 -05002077 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05002078 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05002079
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002080 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05002081
2082 def test_registered_id(self, backend):
2083 cert = _load_cert(
2084 os.path.join(
2085 "x509", "custom", "san_registered_id.pem"
2086 ),
2087 x509.load_pem_x509_certificate,
2088 backend
2089 )
2090 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002091 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05002092 )
2093 assert ext is not None
2094 assert ext.critical is False
2095
2096 san = ext.value
2097 rid = san.get_values_for_type(x509.RegisteredID)
2098 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002099
2100 def test_uri(self, backend):
2101 cert = _load_cert(
2102 os.path.join(
2103 "x509", "custom", "san_uri_with_port.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 Kehrerb8ef82e2015-04-22 16:04:24 -05002110 )
2111 assert ext is not None
2112 uri = ext.value.get_values_for_type(
2113 x509.UniformResourceIdentifier
2114 )
2115 assert uri == [
2116 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
2117 u"lo",
2118 u"http://someregulardomain.com",
2119 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05002120
2121 def test_ipaddress(self, backend):
2122 cert = _load_cert(
2123 os.path.join(
2124 "x509", "custom", "san_ipaddr.pem"
2125 ),
2126 x509.load_pem_x509_certificate,
2127 backend
2128 )
2129 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002130 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05002131 )
2132 assert ext is not None
2133 assert ext.critical is False
2134
2135 san = ext.value
2136
2137 ip = san.get_values_for_type(x509.IPAddress)
2138 assert [
2139 ipaddress.ip_address(u"127.0.0.1"),
2140 ipaddress.ip_address(u"ff::")
2141 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05002142
2143 def test_dirname(self, backend):
2144 cert = _load_cert(
2145 os.path.join(
2146 "x509", "custom", "san_dirname.pem"
2147 ),
2148 x509.load_pem_x509_certificate,
2149 backend
2150 )
2151 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002152 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002153 )
2154 assert ext is not None
2155 assert ext.critical is False
2156
2157 san = ext.value
2158
2159 dirname = san.get_values_for_type(x509.DirectoryName)
2160 assert [
2161 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002162 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2163 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2164 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002165 ])
2166 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002167
2168 def test_rfc822name(self, backend):
2169 cert = _load_cert(
2170 os.path.join(
2171 "x509", "custom", "san_rfc822_idna.pem"
2172 ),
2173 x509.load_pem_x509_certificate,
2174 backend
2175 )
2176 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002177 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002178 )
2179 assert ext is not None
2180 assert ext.critical is False
2181
2182 san = ext.value
2183
2184 rfc822name = san.get_values_for_type(x509.RFC822Name)
2185 assert [u"email@em\xe5\xefl.com"] == rfc822name
2186
Paul Kehrerb8968812015-05-15 09:01:34 -07002187 def test_idna2003_invalid(self, backend):
2188 cert = _load_cert(
2189 os.path.join(
2190 "x509", "custom", "san_idna2003_dnsname.pem"
2191 ),
2192 x509.load_pem_x509_certificate,
2193 backend
2194 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002195 san = cert.extensions.get_extension_for_class(
2196 x509.SubjectAlternativeName
2197 ).value
2198
2199 assert len(san) == 1
2200 [name] = san
2201 assert name.bytes_value == b"xn--k4h.ws"
Paul Kehrerb8968812015-05-15 09:01:34 -07002202 with pytest.raises(UnicodeError):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002203 name.value
Paul Kehrerb8968812015-05-15 09:01:34 -07002204
Paul Kehrere06cab42015-04-30 10:23:33 -05002205 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2206 cert = _load_cert(
2207 os.path.join(
2208 "x509", "custom", "san_idna_names.pem"
2209 ),
2210 x509.load_pem_x509_certificate,
2211 backend
2212 )
2213 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002214 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002215 )
2216 assert ext is not None
2217 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2218 dns_name = ext.value.get_values_for_type(x509.DNSName)
2219 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2220 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2221 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2222 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2223
2224 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2225 cert = _load_cert(
2226 os.path.join(
2227 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2228 ),
2229 x509.load_pem_x509_certificate,
2230 backend
2231 )
2232 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002233 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002234 )
2235 assert ext is not None
2236 assert ext.critical is False
2237
2238 san = ext.value
2239
2240 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2241 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2242 dns = san.get_values_for_type(x509.DNSName)
2243 ip = san.get_values_for_type(x509.IPAddress)
2244 dirname = san.get_values_for_type(x509.DirectoryName)
2245 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002246 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002247 assert [u"cryptography.io"] == dns
2248 assert [
2249 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002250 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002251 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002252 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002253 ),
2254 ])
2255 ] == dirname
2256 assert [
2257 ipaddress.ip_address(u"127.0.0.1"),
2258 ipaddress.ip_address(u"ff::")
2259 ] == ip
2260
2261 def test_invalid_rfc822name(self, backend):
2262 cert = _load_cert(
2263 os.path.join(
2264 "x509", "custom", "san_rfc822_names.pem"
2265 ),
2266 x509.load_pem_x509_certificate,
2267 backend
2268 )
2269 with pytest.raises(ValueError) as exc:
2270 cert.extensions
2271
2272 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002273
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002274 def test_other_name(self, backend):
2275 cert = _load_cert(
2276 os.path.join(
2277 "x509", "custom", "san_other_name.pem"
2278 ),
2279 x509.load_pem_x509_certificate,
2280 backend
2281 )
2282
2283 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002284 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002285 )
2286 assert ext is not None
2287 assert ext.critical is False
2288
Joshua Taubererd2afad32015-07-06 22:37:53 +00002289 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2290 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002291 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002292 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002293
2294 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002295 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002296
Marti4739cfc2016-08-02 04:03:25 +03002297 def test_certbuilder(self, backend):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002298 sans = [b'*.example.org', b'*.xn--4ca7aey.example.com',
2299 b'foobar.example.net']
Marti4739cfc2016-08-02 04:03:25 +03002300 private_key = RSA_KEY_2048.private_key(backend)
2301 builder = _make_certbuilder(private_key)
2302 builder = builder.add_extension(
2303 SubjectAlternativeName(list(map(DNSName, sans))), True)
2304
2305 cert = builder.sign(private_key, hashes.SHA1(), backend)
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002306 result = [
2307 x.bytes_value
2308 for x in cert.extensions.get_extension_for_class(
2309 SubjectAlternativeName
2310 ).value
2311 ]
Marti4739cfc2016-08-02 04:03:25 +03002312 assert result == sans
2313
Paul Kehrer94c69602015-05-02 19:29:40 -05002314
2315@pytest.mark.requires_backend_interface(interface=RSABackend)
2316@pytest.mark.requires_backend_interface(interface=X509Backend)
2317class TestExtendedKeyUsageExtension(object):
2318 def test_eku(self, backend):
2319 cert = _load_cert(
2320 os.path.join(
2321 "x509", "custom", "extended_key_usage.pem"
2322 ),
2323 x509.load_pem_x509_certificate,
2324 backend
2325 )
2326 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002327 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002328 )
2329 assert ext is not None
2330 assert ext.critical is False
2331
2332 assert [
2333 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2334 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2335 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2336 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2337 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2338 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2339 x509.ObjectIdentifier("2.5.29.37.0"),
2340 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2341 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002342
2343
2344class TestAccessDescription(object):
2345 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002346 with pytest.raises(TypeError):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002347 x509.AccessDescription("notanoid", x509.DNSName(b"test"))
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002348
2349 def test_invalid_access_location(self):
2350 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002351 x509.AccessDescription(
2352 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2353 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002354
Nick Bastind2ecf862015-12-13 05:44:46 -08002355 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002356 ad = x509.AccessDescription(
2357 ObjectIdentifier("2.999.1"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05002358 x509.UniformResourceIdentifier(b"http://example.com")
Nick Bastin326fc8e2015-12-12 19:08:12 -08002359 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002360 assert ad is not None
2361
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002362 def test_repr(self):
2363 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002364 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002365 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002366 )
Paul Kehrer6c29d742017-08-01 19:27:06 -05002367 if six.PY3:
2368 assert repr(ad) == (
2369 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6"
2370 ".1.5.5.7.48.1, name=OCSP)>, access_location=<UniformResource"
2371 "Identifier(bytes_value=b'http://ocsp.domain.com')>)>"
2372 )
2373 else:
2374 assert repr(ad) == (
2375 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6"
2376 ".1.5.5.7.48.1, name=OCSP)>, access_location=<UniformResource"
2377 "Identifier(bytes_value='http://ocsp.domain.com')>)>"
2378 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002379
2380 def test_eq(self):
2381 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002382 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002383 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002384 )
2385 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002386 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002387 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002388 )
2389 assert ad == ad2
2390
2391 def test_ne(self):
2392 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002393 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002394 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002395 )
2396 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002397 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002398 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002399 )
2400 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002401 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002402 x509.UniformResourceIdentifier(b"http://notthesame")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002403 )
2404 assert ad != ad2
2405 assert ad != ad3
2406 assert ad != object()
2407
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302408 def test_hash(self):
2409 ad = x509.AccessDescription(
2410 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002411 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302412 )
2413 ad2 = x509.AccessDescription(
2414 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002415 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302416 )
2417 ad3 = x509.AccessDescription(
2418 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002419 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302420 )
2421 assert hash(ad) == hash(ad2)
2422 assert hash(ad) != hash(ad3)
2423
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002424
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002425class TestPolicyConstraints(object):
2426 def test_invalid_explicit_policy(self):
2427 with pytest.raises(TypeError):
2428 x509.PolicyConstraints("invalid", None)
2429
2430 def test_invalid_inhibit_policy(self):
2431 with pytest.raises(TypeError):
2432 x509.PolicyConstraints(None, "invalid")
2433
2434 def test_both_none(self):
2435 with pytest.raises(ValueError):
2436 x509.PolicyConstraints(None, None)
2437
2438 def test_repr(self):
2439 pc = x509.PolicyConstraints(0, None)
2440
2441 assert repr(pc) == (
2442 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2443 u"pping=None)>"
2444 )
2445
2446 def test_eq(self):
2447 pc = x509.PolicyConstraints(2, 1)
2448 pc2 = x509.PolicyConstraints(2, 1)
2449 assert pc == pc2
2450
2451 def test_ne(self):
2452 pc = x509.PolicyConstraints(2, 1)
2453 pc2 = x509.PolicyConstraints(2, 2)
2454 pc3 = x509.PolicyConstraints(3, 1)
2455 assert pc != pc2
2456 assert pc != pc3
2457 assert pc != object()
2458
2459
Alex Gaynora9885602016-02-27 09:53:46 -05002460@pytest.mark.requires_backend_interface(interface=RSABackend)
2461@pytest.mark.requires_backend_interface(interface=X509Backend)
2462class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002463 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002464 cert = _load_cert(
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002465 os.path.join("x509", "department-of-state-root.pem"),
Alex Gaynora9885602016-02-27 09:53:46 -05002466 x509.load_pem_x509_certificate,
2467 backend
2468 )
2469 ext = cert.extensions.get_extension_for_oid(
2470 ExtensionOID.POLICY_CONSTRAINTS,
2471 )
2472 assert ext.critical is True
2473
2474 assert ext.value == x509.PolicyConstraints(
2475 require_explicit_policy=None, inhibit_policy_mapping=0,
2476 )
2477
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002478 def test_require_explicit_policy(self, backend):
2479 cert = _load_cert(
2480 os.path.join("x509", "custom", "policy_constraints_explicit.pem"),
2481 x509.load_pem_x509_certificate,
2482 backend
2483 )
2484 ext = cert.extensions.get_extension_for_oid(
2485 ExtensionOID.POLICY_CONSTRAINTS
2486 )
2487 assert ext.critical is True
2488 assert ext.value == x509.PolicyConstraints(
2489 require_explicit_policy=1, inhibit_policy_mapping=None,
2490 )
2491
Alex Gaynora9885602016-02-27 09:53:46 -05002492
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002493class TestAuthorityInformationAccess(object):
2494 def test_invalid_descriptions(self):
2495 with pytest.raises(TypeError):
2496 x509.AuthorityInformationAccess(["notanAccessDescription"])
2497
2498 def test_iter_len(self):
2499 aia = x509.AuthorityInformationAccess([
2500 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002501 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002502 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002503 ),
2504 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002505 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002506 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002507 )
2508 ])
2509 assert len(aia) == 2
2510 assert list(aia) == [
2511 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002512 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002513 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002514 ),
2515 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002516 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002517 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002518 )
2519 ]
2520
Marti40f19992016-08-26 04:26:31 +03002521 def test_iter_input(self):
2522 desc = [
2523 x509.AccessDescription(
2524 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002525 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Marti40f19992016-08-26 04:26:31 +03002526 )
2527 ]
2528 aia = x509.AuthorityInformationAccess(iter(desc))
2529 assert list(aia) == desc
2530
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002531 def test_repr(self):
2532 aia = x509.AuthorityInformationAccess([
2533 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002534 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002535 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002536 ),
2537 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002538 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002539 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002540 )
2541 ])
Paul Kehrer6c29d742017-08-01 19:27:06 -05002542 if six.PY3:
2543 assert repr(aia) == (
2544 "<AuthorityInformationAccess([<AccessDescription(access_method"
2545 "=<ObjectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, acces"
2546 "s_location=<UniformResourceIdentifier(bytes_value=b'http://oc"
2547 "sp.domain.com')>)>, <AccessDescription(access_method=<ObjectI"
2548 "dentifier(oid=1.3.6.1.5.5.7.48.2, name=caIssuers)>, access_lo"
2549 "cation=<UniformResourceIdentifier(bytes_value=b'http://domain"
2550 ".com/ca.crt')>)>])>"
2551 )
2552 else:
2553 assert repr(aia) == (
2554 "<AuthorityInformationAccess([<AccessDescription(access_method"
2555 "=<ObjectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, acces"
2556 "s_location=<UniformResourceIdentifier(bytes_value='http://oc"
2557 "sp.domain.com')>)>, <AccessDescription(access_method=<ObjectI"
2558 "dentifier(oid=1.3.6.1.5.5.7.48.2, name=caIssuers)>, access_lo"
2559 "cation=<UniformResourceIdentifier(bytes_value='http://domain"
2560 ".com/ca.crt')>)>])>"
2561 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002562
2563 def test_eq(self):
2564 aia = x509.AuthorityInformationAccess([
2565 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002566 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002567 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002568 ),
2569 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002570 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002571 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002572 )
2573 ])
2574 aia2 = x509.AuthorityInformationAccess([
2575 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002576 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002577 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002578 ),
2579 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002580 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002581 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002582 )
2583 ])
2584 assert aia == aia2
2585
2586 def test_ne(self):
2587 aia = x509.AuthorityInformationAccess([
2588 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002589 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002590 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002591 ),
2592 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002593 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002594 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002595 )
2596 ])
2597 aia2 = x509.AuthorityInformationAccess([
2598 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002599 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002600 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002601 ),
2602 ])
2603
2604 assert aia != aia2
2605 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002606
Paul Kehrerad4b3592015-12-27 17:27:40 -06002607 def test_indexing(self):
2608 aia = x509.AuthorityInformationAccess([
2609 x509.AccessDescription(
2610 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002611 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002612 ),
2613 x509.AccessDescription(
2614 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002615 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002616 ),
2617 x509.AccessDescription(
2618 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002619 x509.UniformResourceIdentifier(b"http://ocsp2.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002620 ),
2621 x509.AccessDescription(
2622 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002623 x509.UniformResourceIdentifier(b"http://ocsp3.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002624 ),
2625 x509.AccessDescription(
2626 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002627 x509.UniformResourceIdentifier(b"http://ocsp4.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002628 ),
2629 ])
2630 assert aia[-1] == aia[4]
2631 assert aia[2:6:2] == [aia[2], aia[4]]
2632
Paul Kehrerd774de92015-05-03 10:52:25 -05002633
2634@pytest.mark.requires_backend_interface(interface=RSABackend)
2635@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002636class TestAuthorityInformationAccessExtension(object):
2637 def test_aia_ocsp_ca_issuers(self, backend):
2638 cert = _load_cert(
2639 os.path.join("x509", "cryptography.io.pem"),
2640 x509.load_pem_x509_certificate,
2641 backend
2642 )
2643 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002644 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002645 )
2646 assert ext is not None
2647 assert ext.critical is False
2648
2649 assert ext.value == x509.AuthorityInformationAccess([
2650 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002651 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002652 x509.UniformResourceIdentifier(b"http://gv.symcd.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002653 ),
2654 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002655 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002656 x509.UniformResourceIdentifier(b"http://gv.symcb.com/gv.crt")
Paul Kehrera1476992015-05-04 17:35:47 -05002657 ),
2658 ])
2659
2660 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2661 cert = _load_cert(
2662 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2663 x509.load_pem_x509_certificate,
2664 backend
2665 )
2666 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002667 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002668 )
2669 assert ext is not None
2670 assert ext.critical is False
2671
2672 assert ext.value == x509.AuthorityInformationAccess([
2673 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002674 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002675 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002676 ),
2677 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002678 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002679 x509.UniformResourceIdentifier(b"http://ocsp2.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002680 ),
2681 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002682 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002683 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002684 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2685 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002686 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002687 ]))
2688 ),
2689 ])
2690
2691 def test_aia_ocsp_only(self, backend):
2692 cert = _load_cert(
2693 os.path.join("x509", "custom", "aia_ocsp.pem"),
2694 x509.load_pem_x509_certificate,
2695 backend
2696 )
2697 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002698 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002699 )
2700 assert ext is not None
2701 assert ext.critical is False
2702
2703 assert ext.value == x509.AuthorityInformationAccess([
2704 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002705 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002706 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002707 ),
2708 ])
2709
2710 def test_aia_ca_issuers_only(self, backend):
2711 cert = _load_cert(
2712 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2713 x509.load_pem_x509_certificate,
2714 backend
2715 )
2716 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002717 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002718 )
2719 assert ext is not None
2720 assert ext.critical is False
2721
2722 assert ext.value == x509.AuthorityInformationAccess([
2723 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002724 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002725 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002726 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2727 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002728 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002729 ]))
2730 ),
2731 ])
2732
2733
2734@pytest.mark.requires_backend_interface(interface=RSABackend)
2735@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002736class TestAuthorityKeyIdentifierExtension(object):
2737 def test_aki_keyid(self, backend):
2738 cert = _load_cert(
2739 os.path.join(
2740 "x509", "cryptography.io.pem"
2741 ),
2742 x509.load_pem_x509_certificate,
2743 backend
2744 )
2745 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002746 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002747 )
2748 assert ext is not None
2749 assert ext.critical is False
2750
2751 assert ext.value.key_identifier == (
2752 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2753 )
2754 assert ext.value.authority_cert_issuer is None
2755 assert ext.value.authority_cert_serial_number is None
2756
2757 def test_aki_all_fields(self, backend):
2758 cert = _load_cert(
2759 os.path.join(
2760 "x509", "custom", "authority_key_identifier.pem"
2761 ),
2762 x509.load_pem_x509_certificate,
2763 backend
2764 )
2765 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002766 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002767 )
2768 assert ext is not None
2769 assert ext.critical is False
2770
2771 assert ext.value.key_identifier == (
2772 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2773 )
2774 assert ext.value.authority_cert_issuer == [
2775 x509.DirectoryName(
2776 x509.Name([
2777 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002778 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002779 ),
2780 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002781 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002782 )
2783 ])
2784 )
2785 ]
2786 assert ext.value.authority_cert_serial_number == 3
2787
2788 def test_aki_no_keyid(self, backend):
2789 cert = _load_cert(
2790 os.path.join(
2791 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2792 ),
2793 x509.load_pem_x509_certificate,
2794 backend
2795 )
2796 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002797 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002798 )
2799 assert ext is not None
2800 assert ext.critical is False
2801
2802 assert ext.value.key_identifier is None
2803 assert ext.value.authority_cert_issuer == [
2804 x509.DirectoryName(
2805 x509.Name([
2806 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002807 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002808 ),
2809 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002810 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002811 )
2812 ])
2813 )
2814 ]
2815 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002816
Paul Kehrer253929a2015-08-05 17:30:39 +01002817 def test_from_certificate(self, backend):
2818 issuer_cert = _load_cert(
2819 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2820 x509.load_pem_x509_certificate,
2821 backend
2822 )
2823 cert = _load_cert(
2824 os.path.join("x509", "cryptography.io.pem"),
2825 x509.load_pem_x509_certificate,
2826 backend
2827 )
2828 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002829 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002830 )
2831 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2832 issuer_cert.public_key()
2833 )
2834 assert ext.value == aki
2835
Paul Kehrer61ff3562016-03-11 22:51:27 -04002836 def test_from_issuer_subject_key_identifier(self, backend):
2837 issuer_cert = _load_cert(
2838 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2839 x509.load_pem_x509_certificate,
2840 backend
2841 )
2842 cert = _load_cert(
2843 os.path.join("x509", "cryptography.io.pem"),
2844 x509.load_pem_x509_certificate,
2845 backend
2846 )
2847 ext = cert.extensions.get_extension_for_oid(
2848 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
2849 )
2850 ski = issuer_cert.extensions.get_extension_for_class(
2851 x509.SubjectKeyIdentifier
2852 )
2853 aki = x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier(
2854 ski
2855 )
2856 assert ext.value == aki
2857
Paul Kehrer5a485522015-05-06 00:29:12 -05002858
Paul Kehrere0017be2015-05-17 20:39:40 -06002859class TestNameConstraints(object):
2860 def test_ipaddress_wrong_type(self):
2861 with pytest.raises(TypeError):
2862 x509.NameConstraints(
2863 permitted_subtrees=[
2864 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2865 ],
2866 excluded_subtrees=None
2867 )
2868
2869 with pytest.raises(TypeError):
2870 x509.NameConstraints(
2871 permitted_subtrees=None,
2872 excluded_subtrees=[
2873 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2874 ]
2875 )
2876
2877 def test_ipaddress_allowed_type(self):
2878 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2879 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2880 nc = x509.NameConstraints(
2881 permitted_subtrees=permitted,
2882 excluded_subtrees=excluded
2883 )
2884 assert nc.permitted_subtrees == permitted
2885 assert nc.excluded_subtrees == excluded
2886
2887 def test_invalid_permitted_subtrees(self):
2888 with pytest.raises(TypeError):
2889 x509.NameConstraints("badpermitted", None)
2890
2891 def test_invalid_excluded_subtrees(self):
2892 with pytest.raises(TypeError):
2893 x509.NameConstraints(None, "badexcluded")
2894
2895 def test_no_subtrees(self):
2896 with pytest.raises(ValueError):
2897 x509.NameConstraints(None, None)
2898
2899 def test_permitted_none(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002900 excluded = [x509.DNSName(b"name.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002901 nc = x509.NameConstraints(
2902 permitted_subtrees=None, excluded_subtrees=excluded
2903 )
2904 assert nc.permitted_subtrees is None
2905 assert nc.excluded_subtrees is not None
2906
2907 def test_excluded_none(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002908 permitted = [x509.DNSName(b"name.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002909 nc = x509.NameConstraints(
2910 permitted_subtrees=permitted, excluded_subtrees=None
2911 )
2912 assert nc.permitted_subtrees is not None
2913 assert nc.excluded_subtrees is None
2914
Marti40f19992016-08-26 04:26:31 +03002915 def test_iter_input(self):
2916 subtrees = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))]
2917 nc = x509.NameConstraints(iter(subtrees), iter(subtrees))
2918 assert list(nc.permitted_subtrees) == subtrees
2919 assert list(nc.excluded_subtrees) == subtrees
2920
Paul Kehrere0017be2015-05-17 20:39:40 -06002921 def test_repr(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002922 permitted = [x509.DNSName(b"name.local"), x509.DNSName(b"name2.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002923 nc = x509.NameConstraints(
2924 permitted_subtrees=permitted,
2925 excluded_subtrees=None
2926 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002927 if six.PY3:
2928 assert repr(nc) == (
2929 "<NameConstraints(permitted_subtrees=[<DNSName("
2930 "bytes_value=b'name.local')>, <DNSName(bytes_value="
2931 "b'name2.local')>], excluded_subtrees=None)>"
2932 )
2933 else:
2934 assert repr(nc) == (
2935 "<NameConstraints(permitted_subtrees=[<DNSName("
2936 "bytes_value='name.local')>, <DNSName(bytes_value="
2937 "'name2.local')>], excluded_subtrees=None)>"
2938 )
Paul Kehrere0017be2015-05-17 20:39:40 -06002939
Paul Kehrer31894282015-06-21 21:46:41 -05002940 def test_eq(self):
2941 nc = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002942 permitted_subtrees=[x509.DNSName(b"name.local")],
2943 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002944 )
2945 nc2 = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002946 permitted_subtrees=[x509.DNSName(b"name.local")],
2947 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002948 )
2949 assert nc == nc2
2950
2951 def test_ne(self):
2952 nc = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002953 permitted_subtrees=[x509.DNSName(b"name.local")],
2954 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002955 )
2956 nc2 = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002957 permitted_subtrees=[x509.DNSName(b"name.local")],
Paul Kehrer31894282015-06-21 21:46:41 -05002958 excluded_subtrees=None
2959 )
2960 nc3 = x509.NameConstraints(
2961 permitted_subtrees=None,
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002962 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002963 )
2964
2965 assert nc != nc2
2966 assert nc != nc3
2967 assert nc != object()
2968
Paul Kehrere0017be2015-05-17 20:39:40 -06002969
Paul Kehrer870d7e82015-06-21 22:20:44 -05002970@pytest.mark.requires_backend_interface(interface=RSABackend)
2971@pytest.mark.requires_backend_interface(interface=X509Backend)
2972class TestNameConstraintsExtension(object):
2973 def test_permitted_excluded(self, backend):
2974 cert = _load_cert(
2975 os.path.join(
2976 "x509", "custom", "nc_permitted_excluded_2.pem"
2977 ),
2978 x509.load_pem_x509_certificate,
2979 backend
2980 )
2981 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002982 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002983 ).value
2984 assert nc == x509.NameConstraints(
2985 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002986 x509.DNSName(b"zombo.local"),
Paul Kehrer870d7e82015-06-21 22:20:44 -05002987 ],
2988 excluded_subtrees=[
2989 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002990 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002991 ]))
2992 ]
2993 )
2994
2995 def test_permitted(self, backend):
2996 cert = _load_cert(
2997 os.path.join(
2998 "x509", "custom", "nc_permitted_2.pem"
2999 ),
3000 x509.load_pem_x509_certificate,
3001 backend
3002 )
3003 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003004 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05003005 ).value
3006 assert nc == x509.NameConstraints(
3007 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003008 x509.DNSName(b"zombo.local"),
Paul Kehrer870d7e82015-06-21 22:20:44 -05003009 ],
3010 excluded_subtrees=None
3011 )
3012
Paul Kehrer42376832015-07-01 18:10:32 -05003013 def test_permitted_with_leading_period(self, backend):
3014 cert = _load_cert(
3015 os.path.join(
3016 "x509", "custom", "nc_permitted.pem"
3017 ),
3018 x509.load_pem_x509_certificate,
3019 backend
3020 )
3021 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003022 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05003023 ).value
3024 assert nc == x509.NameConstraints(
3025 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003026 x509.DNSName(b".cryptography.io"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003027 x509.UniformResourceIdentifier(b"ftp://cryptography.test")
Paul Kehrer42376832015-07-01 18:10:32 -05003028 ],
3029 excluded_subtrees=None
3030 )
3031
3032 def test_excluded_with_leading_period(self, backend):
3033 cert = _load_cert(
3034 os.path.join(
3035 "x509", "custom", "nc_excluded.pem"
3036 ),
3037 x509.load_pem_x509_certificate,
3038 backend
3039 )
3040 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003041 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05003042 ).value
3043 assert nc == x509.NameConstraints(
3044 permitted_subtrees=None,
3045 excluded_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003046 x509.DNSName(b".cryptography.io"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003047 x509.UniformResourceIdentifier(b"gopher://cryptography.test")
Paul Kehrer42376832015-07-01 18:10:32 -05003048 ]
3049 )
3050
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003051 def test_permitted_excluded_with_ips(self, backend):
3052 cert = _load_cert(
3053 os.path.join(
3054 "x509", "custom", "nc_permitted_excluded.pem"
3055 ),
3056 x509.load_pem_x509_certificate,
3057 backend
3058 )
3059 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003060 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003061 ).value
3062 assert nc == x509.NameConstraints(
3063 permitted_subtrees=[
3064 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
3065 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
3066 ],
3067 excluded_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003068 x509.DNSName(b".domain.com"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003069 x509.UniformResourceIdentifier(b"http://test.local"),
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003070 ]
3071 )
3072
Paul Kehrera72ebaf2015-07-01 21:07:37 -05003073 def test_single_ip_netmask(self, backend):
3074 cert = _load_cert(
3075 os.path.join(
3076 "x509", "custom", "nc_single_ip_netmask.pem"
3077 ),
3078 x509.load_pem_x509_certificate,
3079 backend
3080 )
3081 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003082 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05003083 ).value
3084 assert nc == x509.NameConstraints(
3085 permitted_subtrees=[
3086 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
3087 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
3088 ],
3089 excluded_subtrees=None
3090 )
3091
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003092 def test_invalid_netmask(self, backend):
3093 cert = _load_cert(
3094 os.path.join(
3095 "x509", "custom", "nc_invalid_ip_netmask.pem"
3096 ),
3097 x509.load_pem_x509_certificate,
3098 backend
3099 )
3100 with pytest.raises(ValueError):
3101 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003102 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003103 )
3104
Marti4739cfc2016-08-02 04:03:25 +03003105 def test_certbuilder(self, backend):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003106 permitted = [b'.example.org', b'.xn--4ca7aey.example.com',
3107 b'foobar.example.net']
Marti4739cfc2016-08-02 04:03:25 +03003108 private_key = RSA_KEY_2048.private_key(backend)
3109 builder = _make_certbuilder(private_key)
3110 builder = builder.add_extension(
3111 NameConstraints(permitted_subtrees=list(map(DNSName, permitted)),
3112 excluded_subtrees=[]), True)
3113
3114 cert = builder.sign(private_key, hashes.SHA1(), backend)
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003115 result = [
3116 x.bytes_value
3117 for x in cert.extensions.get_extension_for_class(
3118 NameConstraints
3119 ).value.permitted_subtrees
3120 ]
Marti4739cfc2016-08-02 04:03:25 +03003121 assert result == permitted
3122
Paul Kehrer870d7e82015-06-21 22:20:44 -05003123
Paul Kehrer5a485522015-05-06 00:29:12 -05003124class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003125 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003126 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003127 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003128
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003129 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003130 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003131 x509.DistributionPoint(None, "notname", None, None)
3132
3133 def test_distribution_point_full_and_relative_not_none(self):
3134 with pytest.raises(ValueError):
3135 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003136
3137 def test_crl_issuer_not_general_names(self):
3138 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003139 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05003140
3141 def test_reason_not_reasonflags(self):
3142 with pytest.raises(TypeError):
3143 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003144 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003145 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003146 frozenset(["notreasonflags"]),
3147 None
3148 )
3149
3150 def test_reason_not_frozenset(self):
3151 with pytest.raises(TypeError):
3152 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003153 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer3fd02602015-05-09 19:46:13 -05003154 None,
3155 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003156 None
3157 )
3158
3159 def test_disallowed_reasons(self):
3160 with pytest.raises(ValueError):
3161 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003162 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003163 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003164 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003165 None
3166 )
3167
3168 with pytest.raises(ValueError):
3169 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003170 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003171 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003172 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003173 None
3174 )
3175
3176 def test_reason_only(self):
3177 with pytest.raises(ValueError):
3178 x509.DistributionPoint(
3179 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003180 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003181 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003182 None
3183 )
3184
3185 def test_eq(self):
3186 dp = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003187 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003188 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003189 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003190 [
3191 x509.DirectoryName(
3192 x509.Name([
3193 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003194 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003195 )
3196 ])
3197 )
3198 ],
3199 )
3200 dp2 = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003201 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003202 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003203 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003204 [
3205 x509.DirectoryName(
3206 x509.Name([
3207 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003208 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003209 )
3210 ])
3211 )
3212 ],
3213 )
3214 assert dp == dp2
3215
3216 def test_ne(self):
3217 dp = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003218 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003219 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003220 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003221 [
3222 x509.DirectoryName(
3223 x509.Name([
3224 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003225 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003226 )
3227 ])
3228 )
3229 ],
3230 )
3231 dp2 = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003232 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003233 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003234 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003235 None
3236 )
3237 assert dp != dp2
3238 assert dp != object()
3239
Marti40f19992016-08-26 04:26:31 +03003240 def test_iter_input(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05003241 name = [x509.UniformResourceIdentifier(b"http://crypt.og/crl")]
Marti40f19992016-08-26 04:26:31 +03003242 issuer = [
3243 x509.DirectoryName(
3244 x509.Name([
3245 x509.NameAttribute(NameOID.COMMON_NAME, u"Important CA")
3246 ])
3247 )
3248 ]
3249 dp = x509.DistributionPoint(
3250 iter(name),
3251 None,
3252 frozenset([x509.ReasonFlags.ca_compromise]),
3253 iter(issuer),
3254 )
3255 assert list(dp.full_name) == name
3256 assert list(dp.crl_issuer) == issuer
3257
Paul Kehrer5a485522015-05-06 00:29:12 -05003258 def test_repr(self):
3259 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003260 None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003261 x509.RelativeDistinguishedName([
Paul Kehrereba19e62015-08-10 18:44:24 -05003262 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05003263 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003264 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003265 [
3266 x509.DirectoryName(
3267 x509.Name([
3268 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003269 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003270 )
3271 ])
3272 )
3273 ],
3274 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05003275 if six.PY3:
3276 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003277 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3278 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3279 "4.3, name=commonName)>, value='myCN')>])>, reasons=frozenset("
3280 "{<ReasonFlags.ca_compromise: 'cACompromise'>}), crl_issuer=[<"
3281 "DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentifi"
3282 "er(oid=2.5.4.3, name=commonName)>, value='Important CA')>])>)"
3283 ">])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003284 )
3285 else:
3286 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003287 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3288 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3289 "4.3, name=commonName)>, value=u'myCN')>])>, reasons=frozenset"
3290 "([<ReasonFlags.ca_compromise: 'cACompromise'>]), crl_issuer=["
3291 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
3292 "ier(oid=2.5.4.3, name=commonName)>, value=u'Important CA')>])"
3293 ">)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003294 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003295
3296
3297class TestCRLDistributionPoints(object):
3298 def test_invalid_distribution_points(self):
3299 with pytest.raises(TypeError):
3300 x509.CRLDistributionPoints(["notadistributionpoint"])
3301
3302 def test_iter_len(self):
3303 cdp = x509.CRLDistributionPoints([
3304 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003305 [x509.UniformResourceIdentifier(b"http://domain")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003306 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003307 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003308 None
3309 ),
3310 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003311 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003312 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003313 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003314 x509.ReasonFlags.key_compromise,
3315 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003316 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003317 None
3318 ),
3319 ])
3320 assert len(cdp) == 2
3321 assert list(cdp) == [
3322 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003323 [x509.UniformResourceIdentifier(b"http://domain")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003324 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003325 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003326 None
3327 ),
3328 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003329 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003330 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003331 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003332 x509.ReasonFlags.key_compromise,
3333 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003334 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003335 None
3336 ),
3337 ]
3338
Marti40f19992016-08-26 04:26:31 +03003339 def test_iter_input(self):
3340 points = [
3341 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003342 [x509.UniformResourceIdentifier(b"http://domain")],
Marti40f19992016-08-26 04:26:31 +03003343 None,
3344 None,
3345 None
3346 ),
3347 ]
3348 cdp = x509.CRLDistributionPoints(iter(points))
3349 assert list(cdp) == points
3350
Paul Kehrer5a485522015-05-06 00:29:12 -05003351 def test_repr(self):
3352 cdp = x509.CRLDistributionPoints([
3353 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003354 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003355 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003356 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003357 None
3358 ),
3359 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003360 if six.PY3:
3361 assert repr(cdp) == (
3362 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
Paul Kehrer6c29d742017-08-01 19:27:06 -05003363 "rmResourceIdentifier(bytes_value=b'ftp://domain')>], relative"
3364 "_name=None, reasons=frozenset({<ReasonFlags.key_compromise: "
3365 "'keyCompromise'>}), crl_issuer=None)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003366 )
3367 else:
3368 assert repr(cdp) == (
3369 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
Paul Kehrer6c29d742017-08-01 19:27:06 -05003370 "rmResourceIdentifier(bytes_value='ftp://domain')>], relative"
3371 "_name=None, reasons=frozenset([<ReasonFlags.key_compromise: "
3372 "'keyCompromise'>]), crl_issuer=None)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003373 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003374
3375 def test_eq(self):
3376 cdp = x509.CRLDistributionPoints([
3377 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003378 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003379 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003380 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003381 x509.ReasonFlags.key_compromise,
3382 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003383 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003384 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003385 ),
3386 ])
3387 cdp2 = x509.CRLDistributionPoints([
3388 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003389 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003390 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003391 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003392 x509.ReasonFlags.key_compromise,
3393 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003394 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003395 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003396 ),
3397 ])
3398 assert cdp == cdp2
3399
3400 def test_ne(self):
3401 cdp = x509.CRLDistributionPoints([
3402 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003403 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003404 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003405 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003406 x509.ReasonFlags.key_compromise,
3407 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003408 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003409 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003410 ),
3411 ])
3412 cdp2 = x509.CRLDistributionPoints([
3413 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003414 [x509.UniformResourceIdentifier(b"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003415 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003416 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003417 x509.ReasonFlags.key_compromise,
3418 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003419 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003420 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003421 ),
3422 ])
3423 cdp3 = x509.CRLDistributionPoints([
3424 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003425 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003426 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003427 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003428 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003429 ),
3430 ])
3431 cdp4 = x509.CRLDistributionPoints([
3432 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003433 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003434 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003435 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003436 x509.ReasonFlags.key_compromise,
3437 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003438 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003439 [x509.UniformResourceIdentifier(b"uri://thing2")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003440 ),
3441 ])
3442 assert cdp != cdp2
3443 assert cdp != cdp3
3444 assert cdp != cdp4
3445 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003446
Paul Kehreree2e92d2015-12-27 17:29:37 -06003447 def test_indexing(self):
3448 ci = x509.CRLDistributionPoints([
3449 x509.DistributionPoint(
3450 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003451 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003452 ),
3453 x509.DistributionPoint(
3454 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003455 [x509.UniformResourceIdentifier(b"uri://thing2")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003456 ),
3457 x509.DistributionPoint(
3458 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003459 [x509.UniformResourceIdentifier(b"uri://thing3")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003460 ),
3461 x509.DistributionPoint(
3462 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003463 [x509.UniformResourceIdentifier(b"uri://thing4")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003464 ),
3465 x509.DistributionPoint(
3466 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003467 [x509.UniformResourceIdentifier(b"uri://thing5")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003468 ),
3469 ])
3470 assert ci[-1] == ci[4]
3471 assert ci[2:6:2] == [ci[2], ci[4]]
3472
Paul Kehrer9a10d592015-05-10 14:55:51 -05003473
3474@pytest.mark.requires_backend_interface(interface=RSABackend)
3475@pytest.mark.requires_backend_interface(interface=X509Backend)
3476class TestCRLDistributionPointsExtension(object):
3477 def test_fullname_and_crl_issuer(self, backend):
3478 cert = _load_cert(
3479 os.path.join(
3480 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3481 ),
3482 x509.load_der_x509_certificate,
3483 backend
3484 )
3485
3486 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003487 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003488 ).value
3489
3490 assert cdps == x509.CRLDistributionPoints([
3491 x509.DistributionPoint(
3492 full_name=[x509.DirectoryName(
3493 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003494 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003495 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003496 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003497 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003498 ),
3499 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003500 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003501 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003502 ),
3503 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003504 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003505 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003506 ),
3507 ])
3508 )],
3509 relative_name=None,
3510 reasons=None,
3511 crl_issuer=[x509.DirectoryName(
3512 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003513 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003514 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003515 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003516 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003517 ),
3518 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003519 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003520 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003521 ),
3522 ])
3523 )],
3524 )
3525 ])
3526
3527 def test_relativename_and_crl_issuer(self, backend):
3528 cert = _load_cert(
3529 os.path.join(
3530 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3531 ),
3532 x509.load_der_x509_certificate,
3533 backend
3534 )
3535
3536 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003537 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003538 ).value
3539
3540 assert cdps == x509.CRLDistributionPoints([
3541 x509.DistributionPoint(
3542 full_name=None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003543 relative_name=x509.RelativeDistinguishedName([
Paul Kehrer9a10d592015-05-10 14:55:51 -05003544 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003545 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003546 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003547 ),
3548 ]),
3549 reasons=None,
3550 crl_issuer=[x509.DirectoryName(
3551 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003552 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003553 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003554 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003555 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003556 ),
3557 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003558 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003559 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003560 ),
3561 ])
3562 )],
3563 )
3564 ])
3565
3566 def test_fullname_crl_issuer_reasons(self, backend):
3567 cert = _load_cert(
3568 os.path.join(
3569 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3570 ),
3571 x509.load_pem_x509_certificate,
3572 backend
3573 )
3574
3575 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003576 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003577 ).value
3578
3579 assert cdps == x509.CRLDistributionPoints([
3580 x509.DistributionPoint(
3581 full_name=[x509.UniformResourceIdentifier(
3582 u"http://myhost.com/myca.crl"
3583 )],
3584 relative_name=None,
3585 reasons=frozenset([
3586 x509.ReasonFlags.key_compromise,
3587 x509.ReasonFlags.ca_compromise
3588 ]),
3589 crl_issuer=[x509.DirectoryName(
3590 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003591 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003592 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003593 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003594 ),
3595 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003596 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003597 ),
3598 ])
3599 )],
3600 )
3601 ])
3602
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003603 def test_all_reasons(self, backend):
3604 cert = _load_cert(
3605 os.path.join(
3606 "x509", "custom", "cdp_all_reasons.pem"
3607 ),
3608 x509.load_pem_x509_certificate,
3609 backend
3610 )
3611
3612 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003613 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003614 ).value
3615
3616 assert cdps == x509.CRLDistributionPoints([
3617 x509.DistributionPoint(
3618 full_name=[x509.UniformResourceIdentifier(
3619 u"http://domain.com/some.crl"
3620 )],
3621 relative_name=None,
3622 reasons=frozenset([
3623 x509.ReasonFlags.key_compromise,
3624 x509.ReasonFlags.ca_compromise,
3625 x509.ReasonFlags.affiliation_changed,
3626 x509.ReasonFlags.superseded,
3627 x509.ReasonFlags.privilege_withdrawn,
3628 x509.ReasonFlags.cessation_of_operation,
3629 x509.ReasonFlags.aa_compromise,
3630 x509.ReasonFlags.certificate_hold,
3631 ]),
3632 crl_issuer=None
3633 )
3634 ])
3635
3636 def test_single_reason(self, backend):
3637 cert = _load_cert(
3638 os.path.join(
3639 "x509", "custom", "cdp_reason_aa_compromise.pem"
3640 ),
3641 x509.load_pem_x509_certificate,
3642 backend
3643 )
3644
3645 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003646 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003647 ).value
3648
3649 assert cdps == x509.CRLDistributionPoints([
3650 x509.DistributionPoint(
3651 full_name=[x509.UniformResourceIdentifier(
3652 u"http://domain.com/some.crl"
3653 )],
3654 relative_name=None,
3655 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3656 crl_issuer=None
3657 )
3658 ])
3659
Paul Kehrer9a10d592015-05-10 14:55:51 -05003660 def test_crl_issuer_only(self, backend):
3661 cert = _load_cert(
3662 os.path.join(
3663 "x509", "custom", "cdp_crl_issuer.pem"
3664 ),
3665 x509.load_pem_x509_certificate,
3666 backend
3667 )
3668
3669 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003670 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003671 ).value
3672
3673 assert cdps == x509.CRLDistributionPoints([
3674 x509.DistributionPoint(
3675 full_name=None,
3676 relative_name=None,
3677 reasons=None,
3678 crl_issuer=[x509.DirectoryName(
3679 x509.Name([
3680 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003681 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003682 ),
3683 ])
3684 )],
3685 )
3686 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003687
Dominic Chen87bb9572015-10-09 00:23:07 -04003688 def test_crl_empty_hostname(self, backend):
3689 cert = _load_cert(
3690 os.path.join(
3691 "x509", "custom", "cdp_empty_hostname.pem"
3692 ),
3693 x509.load_pem_x509_certificate,
3694 backend
3695 )
3696
3697 cdps = cert.extensions.get_extension_for_oid(
3698 ExtensionOID.CRL_DISTRIBUTION_POINTS
3699 ).value
3700
3701 assert cdps == x509.CRLDistributionPoints([
3702 x509.DistributionPoint(
3703 full_name=[x509.UniformResourceIdentifier(
3704 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3705 )],
3706 relative_name=None,
3707 reasons=None,
3708 crl_issuer=None
3709 )
3710 ])
3711
Paul Kehrer16fae762015-05-01 23:14:20 -05003712
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003713@pytest.mark.requires_backend_interface(interface=RSABackend)
3714@pytest.mark.requires_backend_interface(interface=X509Backend)
3715class TestOCSPNoCheckExtension(object):
3716 def test_nocheck(self, backend):
3717 cert = _load_cert(
3718 os.path.join(
3719 "x509", "custom", "ocsp_nocheck.pem"
3720 ),
3721 x509.load_pem_x509_certificate,
3722 backend
3723 )
3724 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003725 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003726 )
3727 assert isinstance(ext.value, x509.OCSPNoCheck)
3728
3729
Paul Kehrer16fae762015-05-01 23:14:20 -05003730class TestInhibitAnyPolicy(object):
3731 def test_not_int(self):
3732 with pytest.raises(TypeError):
3733 x509.InhibitAnyPolicy("notint")
3734
3735 def test_negative_int(self):
3736 with pytest.raises(ValueError):
3737 x509.InhibitAnyPolicy(-1)
3738
3739 def test_repr(self):
3740 iap = x509.InhibitAnyPolicy(0)
3741 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3742
3743 def test_eq(self):
3744 iap = x509.InhibitAnyPolicy(1)
3745 iap2 = x509.InhibitAnyPolicy(1)
3746 assert iap == iap2
3747
3748 def test_ne(self):
3749 iap = x509.InhibitAnyPolicy(1)
3750 iap2 = x509.InhibitAnyPolicy(4)
3751 assert iap != iap2
3752 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003753
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303754 def test_hash(self):
3755 iap = x509.InhibitAnyPolicy(1)
3756 iap2 = x509.InhibitAnyPolicy(1)
3757 iap3 = x509.InhibitAnyPolicy(4)
3758 assert hash(iap) == hash(iap2)
3759 assert hash(iap) != hash(iap3)
3760
Paul Kehrerca6ce992015-06-17 22:13:15 -06003761
3762@pytest.mark.requires_backend_interface(interface=RSABackend)
3763@pytest.mark.requires_backend_interface(interface=X509Backend)
3764class TestInhibitAnyPolicyExtension(object):
3765 def test_nocheck(self, backend):
3766 cert = _load_cert(
3767 os.path.join(
3768 "x509", "custom", "inhibit_any_policy_5.pem"
3769 ),
3770 x509.load_pem_x509_certificate,
3771 backend
3772 )
3773 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003774 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003775 ).value
3776 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003777
3778
3779@pytest.mark.requires_backend_interface(interface=RSABackend)
3780@pytest.mark.requires_backend_interface(interface=X509Backend)
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003781class TestPrecertificateSignedCertificateTimestampsExtension(object):
3782 def test_init(self):
3783 with pytest.raises(TypeError):
3784 x509.PrecertificateSignedCertificateTimestamps([object()])
3785
3786 def test_repr(self):
3787 assert repr(x509.PrecertificateSignedCertificateTimestamps([])) == (
3788 "<PrecertificateSignedCertificateTimestamps([])>"
3789 )
3790
Paul Kehrerce69b822017-07-04 15:59:38 -05003791 @pytest.mark.supported(
3792 only_if=lambda backend: (
3793 backend._lib.CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER),
3794 skip_message="Requires OpenSSL 1.1.0f+",
3795 )
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003796 def test_simple(self, backend):
3797 cert = _load_cert(
3798 os.path.join("x509", "badssl-sct.pem"),
3799 x509.load_pem_x509_certificate,
3800 backend
3801 )
3802 scts = cert.extensions.get_extension_for_class(
3803 x509.PrecertificateSignedCertificateTimestamps
3804 ).value
3805 assert len(scts) == 1
3806 [sct] = scts
3807 assert scts[0] == sct
3808 assert sct.version == x509.certificate_transparency.Version.v1
3809 assert sct.log_id == (
3810 b"\xa7\xceJNb\x07\xe0\xad\xde\xe5\xfd\xaaK\x1f\x86v\x87g\xb5\xd0"
3811 b"\x02\xa5]G1\x0e~g\n\x95\xea\xb2"
3812 )
3813 assert sct.timestamp == datetime.datetime(
3814 2016, 11, 17, 1, 56, 25, 396000
3815 )
3816 assert (
3817 sct.entry_type ==
3818 x509.certificate_transparency.LogEntryType.PRE_CERTIFICATE
3819 )
3820
Paul Kehrerce69b822017-07-04 15:59:38 -05003821 @pytest.mark.supported(
3822 only_if=lambda backend: (
3823 not backend._lib.CRYPTOGRAPHY_OPENSSL_110_OR_GREATER),
3824 skip_message="Requires OpenSSL < 1.1.0",
3825 )
3826 def test_skips_scts_if_unsupported(self, backend):
3827 cert = _load_cert(
3828 os.path.join("x509", "badssl-sct.pem"),
3829 x509.load_pem_x509_certificate,
3830 backend
3831 )
3832 assert len(cert.extensions) == 10
3833 with pytest.raises(x509.ExtensionNotFound):
3834 cert.extensions.get_extension_for_class(
3835 x509.PrecertificateSignedCertificateTimestamps
3836 )
3837
3838 ext = cert.extensions.get_extension_for_oid(
3839 x509.ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS
3840 )
3841 assert isinstance(ext.value, x509.UnrecognizedExtension)
3842
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003843
3844@pytest.mark.requires_backend_interface(interface=RSABackend)
3845@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003846class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003847 def test_invalid_certificate_policies_data(self, backend):
3848 cert = _load_cert(
3849 os.path.join(
3850 "x509", "custom", "cp_invalid.pem"
3851 ),
3852 x509.load_pem_x509_certificate,
3853 backend
3854 )
3855 with pytest.raises(ValueError):
3856 cert.extensions