blob: ee94faafabc05137481666555697a8cd0b1f610e [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 Kehrer3e15ca52017-08-01 21:21:19 -0500169 x509.RFC822Name(b"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):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001514 gn = x509.RFC822Name(b"string")
1515 if six.PY3:
1516 assert repr(gn) == "<RFC822Name(bytes_value=b'string')>"
1517 else:
1518 assert repr(gn) == "<RFC822Name(bytes_value='string')>"
Paul Kehrer6c29d742017-08-01 19:27:06 -05001519
1520 def test_equality(self):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001521 gn = x509.RFC822Name(b"string")
1522 gn2 = x509.RFC822Name(b"string2")
1523 gn3 = x509.RFC822Name(b"string")
Paul Kehrer6c29d742017-08-01 19:27:06 -05001524 assert gn != gn2
1525 assert gn != object()
1526 assert gn == gn3
1527
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001528 def test_not_text_or_bytes(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001529 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>")
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001535 with pytest.raises(ValueError):
1536 x509.RFC822Name(b"Name <email>")
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001537
1538 with pytest.raises(ValueError):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001539 x509.RFC822Name(b"")
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001540
1541 def test_single_label(self):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001542 gn = x509.RFC822Name(b"administrator")
1543 with pytest.warns(utils.DeprecatedIn21):
1544 assert gn.value == u"administrator"
1545
1546 assert gn.bytes_value == b"administrator"
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001547
1548 def test_idna(self):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001549 with pytest.warns(utils.DeprecatedIn21):
1550 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1551
1552 with pytest.warns(utils.DeprecatedIn21):
1553 assert gn.value == u"email@em\xe5\xefl.com"
1554
1555 assert gn.bytes_value == b"email@xn--eml-vla4c.com"
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001556
Alex Gaynorb642dee2016-01-03 15:12:23 -05001557 def test_hash(self):
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001558 g1 = x509.RFC822Name(b"email@host.com")
1559 g2 = x509.RFC822Name(b"email@host.com")
1560 g3 = x509.RFC822Name(b"admin@host.com")
Alex Gaynorb642dee2016-01-03 15:12:23 -05001561
1562 assert hash(g1) == hash(g2)
1563 assert hash(g1) != hash(g3)
1564
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001565
Paul Kehrere28d6c42015-07-12 14:59:37 -05001566class TestUniformResourceIdentifier(object):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001567 def test_equality(self):
1568 gn = x509.UniformResourceIdentifier(b"string")
1569 gn2 = x509.UniformResourceIdentifier(b"string2")
1570 gn3 = x509.UniformResourceIdentifier(b"string")
1571 assert gn != gn2
1572 assert gn != object()
1573 assert gn == gn3
1574
1575 def test_not_text_or_bytes(self):
1576 with pytest.raises(TypeError):
1577 x509.UniformResourceIdentifier(1.3)
1578
Paul Kehrere28d6c42015-07-12 14:59:37 -05001579 def test_no_parsed_hostname(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001580 gn = x509.UniformResourceIdentifier(b"singlelabel")
1581 assert gn.bytes_value == b"singlelabel"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001582
1583 def test_with_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001584 gn = x509.UniformResourceIdentifier(b"singlelabel:443/test")
1585 assert gn.bytes_value == b"singlelabel:443/test"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001586
1587 def test_idna_no_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001588 with pytest.warns(utils.DeprecatedIn21):
1589 gn = x509.UniformResourceIdentifier(
1590 u"http://\u043f\u044b\u043a\u0430.cryptography"
1591 )
1592 with pytest.warns(utils.DeprecatedIn21):
1593 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1594 assert gn.bytes_value == b"http://xn--80ato2c.cryptography"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001595
1596 def test_idna_with_port(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001597 with pytest.warns(utils.DeprecatedIn21):
1598 gn = x509.UniformResourceIdentifier(
1599 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1600 )
1601 with pytest.warns(utils.DeprecatedIn21):
1602 assert gn.value == (
1603 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1604 )
1605 assert gn.bytes_value == (
1606 b"gopher://xn--80ato2c.cryptography:70/some/path"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001607 )
Paul Kehrere28d6c42015-07-12 14:59:37 -05001608
1609 def test_query_and_fragment(self):
1610 gn = x509.UniformResourceIdentifier(
Paul Kehrer6c29d742017-08-01 19:27:06 -05001611 b"ldap://cryptography:90/path?query=true#somedata"
Paul Kehrere28d6c42015-07-12 14:59:37 -05001612 )
Paul Kehrer6c29d742017-08-01 19:27:06 -05001613 assert gn.bytes_value == (
1614 b"ldap://cryptography:90/path?query=true#somedata"
1615 )
Paul Kehrere28d6c42015-07-12 14:59:37 -05001616
Alex Gaynord1b56812016-01-03 15:14:34 -05001617 def test_hash(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05001618 g1 = x509.UniformResourceIdentifier(b"http://host.com")
1619 g2 = x509.UniformResourceIdentifier(b"http://host.com")
1620 g3 = x509.UniformResourceIdentifier(b"http://other.com")
Alex Gaynord1b56812016-01-03 15:14:34 -05001621
1622 assert hash(g1) == hash(g2)
1623 assert hash(g1) != hash(g3)
1624
Paul Kehrer6c29d742017-08-01 19:27:06 -05001625 def test_repr(self):
1626 gn = x509.UniformResourceIdentifier(b"string")
1627 if six.PY3:
1628 assert repr(gn) == (
1629 "<UniformResourceIdentifier(bytes_value=b'string')>"
1630 )
1631 else:
1632 assert repr(gn) == (
1633 "<UniformResourceIdentifier(bytes_value='string')>"
1634 )
1635
Paul Kehrere28d6c42015-07-12 14:59:37 -05001636
Paul Kehrer31bdf792015-03-25 14:11:00 -05001637class TestRegisteredID(object):
1638 def test_not_oid(self):
1639 with pytest.raises(TypeError):
1640 x509.RegisteredID(b"notanoid")
1641
1642 with pytest.raises(TypeError):
1643 x509.RegisteredID(1.3)
1644
1645 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001646 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001647 assert repr(gn) == (
1648 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1649 "e)>)>"
1650 )
1651
1652 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001653 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1654 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001655 assert gn == gn2
1656
1657 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001658 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001659 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001660 assert gn != gn2
1661 assert gn != object()
1662
1663
1664class TestIPAddress(object):
1665 def test_not_ipaddress(self):
1666 with pytest.raises(TypeError):
1667 x509.IPAddress(b"notanipaddress")
1668
1669 with pytest.raises(TypeError):
1670 x509.IPAddress(1.3)
1671
1672 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301673 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001674 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1675
Eeshan Gargf1234152015-04-29 18:41:00 +05301676 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001677 assert repr(gn2) == "<IPAddress(value=ff::)>"
1678
Paul Kehrereb177932015-05-17 18:33:33 -07001679 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1680 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1681
1682 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1683 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1684
Paul Kehrer31bdf792015-03-25 14:11:00 -05001685 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301686 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1687 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001688 assert gn == gn2
1689
1690 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301691 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1692 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001693 assert gn != gn2
1694 assert gn != object()
1695
1696
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001697class TestOtherName(object):
1698 def test_invalid_args(self):
1699 with pytest.raises(TypeError):
1700 x509.OtherName(b"notanobjectidentifier", b"derdata")
1701
1702 with pytest.raises(TypeError):
1703 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1704
1705 def test_repr(self):
1706 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1707 if six.PY3:
1708 assert repr(gn) == (
1709 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1710 "name=Unknown OID)>, value=b'derdata')>"
1711 )
1712 else:
1713 assert repr(gn) == (
1714 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1715 "name=Unknown OID)>, value='derdata')>"
1716 )
1717
1718 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1719 if six.PY3:
1720 assert repr(gn) == (
1721 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1722 "name=pseudonym)>, value=b'derdata')>"
1723 )
1724 else:
1725 assert repr(gn) == (
1726 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1727 "name=pseudonym)>, value='derdata')>"
1728 )
1729
1730 def test_eq(self):
1731 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1732 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1733 assert gn == gn2
1734
1735 def test_ne(self):
1736 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1737 assert gn != object()
1738
1739 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1740 assert gn != gn2
1741
1742 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1743 assert gn != gn2
1744
1745
Erik Trauschke2dcce902015-05-14 16:12:24 -07001746class TestGeneralNames(object):
1747 def test_get_values_for_type(self):
1748 gns = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001749 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001750 )
1751 names = gns.get_values_for_type(x509.DNSName)
1752 assert names == [u"cryptography.io"]
1753
1754 def test_iter_names(self):
1755 gns = x509.GeneralNames([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001756 x509.DNSName(b"cryptography.io"),
1757 x509.DNSName(b"crypto.local"),
Erik Trauschke2dcce902015-05-14 16:12:24 -07001758 ])
1759 assert len(gns) == 2
1760 assert list(gns) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001761 x509.DNSName(b"cryptography.io"),
1762 x509.DNSName(b"crypto.local"),
Erik Trauschke2dcce902015-05-14 16:12:24 -07001763 ]
1764
Marti40f19992016-08-26 04:26:31 +03001765 def test_iter_input(self):
1766 names = [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001767 x509.DNSName(b"cryptography.io"),
1768 x509.DNSName(b"crypto.local"),
Marti40f19992016-08-26 04:26:31 +03001769 ]
1770 gns = x509.GeneralNames(iter(names))
1771 assert list(gns) == names
1772
Paul Kehrer8adb5962015-12-26 14:46:58 -06001773 def test_indexing(self):
1774 gn = x509.GeneralNames([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001775 x509.DNSName(b"cryptography.io"),
1776 x509.DNSName(b"crypto.local"),
1777 x509.DNSName(b"another.local"),
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001778 x509.RFC822Name(b"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001779 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001780 ])
1781 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001782 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001783
Erik Trauschke2dcce902015-05-14 16:12:24 -07001784 def test_invalid_general_names(self):
1785 with pytest.raises(TypeError):
1786 x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001787 [x509.DNSName(b"cryptography.io"), "invalid"]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001788 )
1789
1790 def test_repr(self):
1791 gns = x509.GeneralNames(
1792 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001793 x509.DNSName(b"cryptography.io")
Erik Trauschke2dcce902015-05-14 16:12:24 -07001794 ]
1795 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001796 if six.PY3:
1797 assert repr(gns) == (
1798 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>"
1799 )
1800 else:
1801 assert repr(gns) == (
1802 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>"
1803 )
Erik Trauschke2dcce902015-05-14 16:12:24 -07001804
1805 def test_eq(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(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001810 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001811 )
1812 assert gns == gns2
1813
1814 def test_ne(self):
1815 gns = x509.GeneralNames(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001816 [x509.DNSName(b"cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001817 )
1818 gns2 = x509.GeneralNames(
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001819 [x509.RFC822Name(b"admin@cryptography.io")]
Erik Trauschke2dcce902015-05-14 16:12:24 -07001820 )
1821 assert gns != gns2
1822 assert gns != object()
1823
1824
Paul Kehrer99125c92015-06-07 18:37:10 -05001825class TestIssuerAlternativeName(object):
1826 def test_get_values_for_type(self):
1827 san = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001828 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001829 )
1830 names = san.get_values_for_type(x509.DNSName)
1831 assert names == [u"cryptography.io"]
1832
1833 def test_iter_names(self):
1834 san = x509.IssuerAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001835 x509.DNSName(b"cryptography.io"),
1836 x509.DNSName(b"crypto.local"),
Paul Kehrer99125c92015-06-07 18:37:10 -05001837 ])
1838 assert len(san) == 2
1839 assert list(san) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001840 x509.DNSName(b"cryptography.io"),
1841 x509.DNSName(b"crypto.local"),
Paul Kehrer99125c92015-06-07 18:37:10 -05001842 ]
1843
Paul Kehrer5c999d32015-12-26 17:45:20 -06001844 def test_indexing(self):
1845 ian = x509.IssuerAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001846 x509.DNSName(b"cryptography.io"),
1847 x509.DNSName(b"crypto.local"),
1848 x509.DNSName(b"another.local"),
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001849 x509.RFC822Name(b"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001850 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer5c999d32015-12-26 17:45:20 -06001851 ])
1852 assert ian[-1] == ian[4]
1853 assert ian[2:6:2] == [ian[2], ian[4]]
1854
Paul Kehrer99125c92015-06-07 18:37:10 -05001855 def test_invalid_general_names(self):
1856 with pytest.raises(TypeError):
1857 x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001858 [x509.DNSName(b"cryptography.io"), "invalid"]
Paul Kehrer99125c92015-06-07 18:37:10 -05001859 )
1860
1861 def test_repr(self):
1862 san = x509.IssuerAlternativeName(
1863 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001864 x509.DNSName(b"cryptography.io")
Paul Kehrer99125c92015-06-07 18:37:10 -05001865 ]
1866 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001867 if six.PY3:
1868 assert repr(san) == (
1869 "<IssuerAlternativeName("
1870 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>)>"
1871 )
1872 else:
1873 assert repr(san) == (
1874 "<IssuerAlternativeName("
1875 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>)>"
1876 )
Paul Kehrer99125c92015-06-07 18:37:10 -05001877
1878 def test_eq(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(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001883 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001884 )
1885 assert san == san2
1886
1887 def test_ne(self):
1888 san = x509.IssuerAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001889 [x509.DNSName(b"cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001890 )
1891 san2 = x509.IssuerAlternativeName(
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001892 [x509.RFC822Name(b"admin@cryptography.io")]
Paul Kehrer99125c92015-06-07 18:37:10 -05001893 )
1894 assert san != san2
1895 assert san != object()
1896
1897
Alex Gaynorf1c17672015-06-20 14:20:20 -04001898@pytest.mark.requires_backend_interface(interface=RSABackend)
1899@pytest.mark.requires_backend_interface(interface=X509Backend)
1900class TestRSAIssuerAlternativeNameExtension(object):
1901 def test_uri(self, backend):
1902 cert = _load_cert(
1903 os.path.join("x509", "custom", "ian_uri.pem"),
1904 x509.load_pem_x509_certificate,
1905 backend,
1906 )
1907 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001908 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001909 )
1910 assert list(ext.value) == [
Paul Kehrer6c29d742017-08-01 19:27:06 -05001911 x509.UniformResourceIdentifier(b"http://path.to.root/root.crt"),
Alex Gaynorf1c17672015-06-20 14:20:20 -04001912 ]
1913
1914
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001915class TestCRLNumber(object):
1916 def test_eq(self):
1917 crl_number = x509.CRLNumber(15)
1918 assert crl_number == x509.CRLNumber(15)
1919
1920 def test_ne(self):
1921 crl_number = x509.CRLNumber(15)
1922 assert crl_number != x509.CRLNumber(14)
1923 assert crl_number != object()
1924
1925 def test_repr(self):
1926 crl_number = x509.CRLNumber(15)
1927 assert repr(crl_number) == "<CRLNumber(15)>"
1928
Paul Kehrera9718fc2015-12-22 22:55:35 -06001929 def test_invalid_number(self):
1930 with pytest.raises(TypeError):
1931 x509.CRLNumber("notanumber")
1932
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001933 def test_hash(self):
1934 c1 = x509.CRLNumber(1)
1935 c2 = x509.CRLNumber(1)
1936 c3 = x509.CRLNumber(2)
1937 assert hash(c1) == hash(c2)
1938 assert hash(c1) != hash(c3)
1939
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001940
Paul Kehrer31bdf792015-03-25 14:11:00 -05001941class TestSubjectAlternativeName(object):
1942 def test_get_values_for_type(self):
1943 san = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001944 [x509.DNSName(b"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001945 )
1946 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301947 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001948
1949 def test_iter_names(self):
1950 san = x509.SubjectAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001951 x509.DNSName(b"cryptography.io"),
1952 x509.DNSName(b"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001953 ])
1954 assert len(san) == 2
1955 assert list(san) == [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001956 x509.DNSName(b"cryptography.io"),
1957 x509.DNSName(b"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001958 ]
1959
Paul Kehrer8adb5962015-12-26 14:46:58 -06001960 def test_indexing(self):
1961 san = x509.SubjectAlternativeName([
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001962 x509.DNSName(b"cryptography.io"),
1963 x509.DNSName(b"crypto.local"),
1964 x509.DNSName(b"another.local"),
Paul Kehrer3e15ca52017-08-01 21:21:19 -05001965 x509.RFC822Name(b"email@another.local"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05001966 x509.UniformResourceIdentifier(b"http://another.local"),
Paul Kehrer8adb5962015-12-26 14:46:58 -06001967 ])
1968 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001969 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001970
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001971 def test_invalid_general_names(self):
1972 with pytest.raises(TypeError):
1973 x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001974 [x509.DNSName(b"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001975 )
1976
Paul Kehrer31bdf792015-03-25 14:11:00 -05001977 def test_repr(self):
1978 san = x509.SubjectAlternativeName(
1979 [
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001980 x509.DNSName(b"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001981 ]
1982 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001983 if six.PY3:
1984 assert repr(san) == (
1985 "<SubjectAlternativeName("
1986 "<GeneralNames([<DNSName(bytes_value=b'cryptography.io')>])>)>"
1987 )
1988 else:
1989 assert repr(san) == (
1990 "<SubjectAlternativeName("
1991 "<GeneralNames([<DNSName(bytes_value='cryptography.io')>])>)>"
1992 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001993
Paul Kehrer58cc3972015-05-13 10:00:41 -05001994 def test_eq(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(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04001999 [x509.DNSName(b"cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05002000 )
2001 assert san == san2
2002
2003 def test_ne(self):
2004 san = x509.SubjectAlternativeName(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002005 [x509.DNSName(b"cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05002006 )
2007 san2 = x509.SubjectAlternativeName(
Paul Kehrer3e15ca52017-08-01 21:21:19 -05002008 [x509.RFC822Name(b"admin@cryptography.io")]
Paul Kehrer58cc3972015-05-13 10:00:41 -05002009 )
2010 assert san != san2
2011 assert san != object()
2012
Paul Kehrer40f83382015-04-20 15:00:16 -05002013
2014@pytest.mark.requires_backend_interface(interface=RSABackend)
2015@pytest.mark.requires_backend_interface(interface=X509Backend)
2016class TestRSASubjectAlternativeNameExtension(object):
2017 def test_dns_name(self, backend):
2018 cert = _load_cert(
2019 os.path.join("x509", "cryptography.io.pem"),
2020 x509.load_pem_x509_certificate,
2021 backend
2022 )
2023 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002024 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05002025 )
2026 assert ext is not None
2027 assert ext.critical is False
2028
2029 san = ext.value
2030
2031 dns = san.get_values_for_type(x509.DNSName)
2032 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05002033
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002034 def test_wildcard_dns_name(self, backend):
2035 cert = _load_cert(
2036 os.path.join("x509", "wildcard_san.pem"),
2037 x509.load_pem_x509_certificate,
2038 backend
2039 )
2040 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002041 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002042 )
2043
2044 dns = ext.value.get_values_for_type(x509.DNSName)
2045 assert dns == [
2046 u'*.langui.sh',
2047 u'langui.sh',
2048 u'*.saseliminator.com',
2049 u'saseliminator.com'
2050 ]
2051
Dominic Chen87bb9572015-10-09 00:23:07 -04002052 def test_san_empty_hostname(self, backend):
2053 cert = _load_cert(
2054 os.path.join(
2055 "x509", "custom", "san_empty_hostname.pem"
2056 ),
2057 x509.load_pem_x509_certificate,
2058 backend
2059 )
2060 san = cert.extensions.get_extension_for_oid(
2061 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
2062 )
2063
2064 dns = san.value.get_values_for_type(x509.DNSName)
2065 assert dns == [u'']
2066
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002067 def test_san_wildcard_idna_dns_name(self, backend):
2068 cert = _load_cert(
2069 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
2070 x509.load_pem_x509_certificate,
2071 backend
2072 )
2073 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002074 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05002075 )
2076
2077 dns = ext.value.get_values_for_type(x509.DNSName)
2078 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
2079
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002080 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05002081 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002082 os.path.join("x509", "san_x400address.der"),
2083 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05002084 backend
2085 )
Paul Kehrerbed07352015-04-21 08:31:10 -05002086 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05002087 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05002088
Paul Kehrer7bdf6572015-07-05 08:55:44 -05002089 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05002090
2091 def test_registered_id(self, backend):
2092 cert = _load_cert(
2093 os.path.join(
2094 "x509", "custom", "san_registered_id.pem"
2095 ),
2096 x509.load_pem_x509_certificate,
2097 backend
2098 )
2099 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002100 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05002101 )
2102 assert ext is not None
2103 assert ext.critical is False
2104
2105 san = ext.value
2106 rid = san.get_values_for_type(x509.RegisteredID)
2107 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002108
2109 def test_uri(self, backend):
2110 cert = _load_cert(
2111 os.path.join(
2112 "x509", "custom", "san_uri_with_port.pem"
2113 ),
2114 x509.load_pem_x509_certificate,
2115 backend
2116 )
2117 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002118 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002119 )
2120 assert ext is not None
2121 uri = ext.value.get_values_for_type(
2122 x509.UniformResourceIdentifier
2123 )
2124 assert uri == [
2125 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
2126 u"lo",
2127 u"http://someregulardomain.com",
2128 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05002129
2130 def test_ipaddress(self, backend):
2131 cert = _load_cert(
2132 os.path.join(
2133 "x509", "custom", "san_ipaddr.pem"
2134 ),
2135 x509.load_pem_x509_certificate,
2136 backend
2137 )
2138 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002139 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05002140 )
2141 assert ext is not None
2142 assert ext.critical is False
2143
2144 san = ext.value
2145
2146 ip = san.get_values_for_type(x509.IPAddress)
2147 assert [
2148 ipaddress.ip_address(u"127.0.0.1"),
2149 ipaddress.ip_address(u"ff::")
2150 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05002151
2152 def test_dirname(self, backend):
2153 cert = _load_cert(
2154 os.path.join(
2155 "x509", "custom", "san_dirname.pem"
2156 ),
2157 x509.load_pem_x509_certificate,
2158 backend
2159 )
2160 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002161 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002162 )
2163 assert ext is not None
2164 assert ext.critical is False
2165
2166 san = ext.value
2167
2168 dirname = san.get_values_for_type(x509.DirectoryName)
2169 assert [
2170 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002171 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2172 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2173 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002174 ])
2175 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002176
2177 def test_rfc822name(self, backend):
2178 cert = _load_cert(
2179 os.path.join(
2180 "x509", "custom", "san_rfc822_idna.pem"
2181 ),
2182 x509.load_pem_x509_certificate,
2183 backend
2184 )
2185 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002186 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002187 )
2188 assert ext is not None
2189 assert ext.critical is False
2190
2191 san = ext.value
2192
2193 rfc822name = san.get_values_for_type(x509.RFC822Name)
2194 assert [u"email@em\xe5\xefl.com"] == rfc822name
2195
Paul Kehrerb8968812015-05-15 09:01:34 -07002196 def test_idna2003_invalid(self, backend):
2197 cert = _load_cert(
2198 os.path.join(
2199 "x509", "custom", "san_idna2003_dnsname.pem"
2200 ),
2201 x509.load_pem_x509_certificate,
2202 backend
2203 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002204 san = cert.extensions.get_extension_for_class(
2205 x509.SubjectAlternativeName
2206 ).value
2207
2208 assert len(san) == 1
2209 [name] = san
2210 assert name.bytes_value == b"xn--k4h.ws"
Paul Kehrerb8968812015-05-15 09:01:34 -07002211 with pytest.raises(UnicodeError):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002212 name.value
Paul Kehrerb8968812015-05-15 09:01:34 -07002213
Paul Kehrere06cab42015-04-30 10:23:33 -05002214 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2215 cert = _load_cert(
2216 os.path.join(
2217 "x509", "custom", "san_idna_names.pem"
2218 ),
2219 x509.load_pem_x509_certificate,
2220 backend
2221 )
2222 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002223 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002224 )
2225 assert ext is not None
2226 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2227 dns_name = ext.value.get_values_for_type(x509.DNSName)
2228 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2229 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2230 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2231 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2232
2233 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2234 cert = _load_cert(
2235 os.path.join(
2236 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2237 ),
2238 x509.load_pem_x509_certificate,
2239 backend
2240 )
2241 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002242 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002243 )
2244 assert ext is not None
2245 assert ext.critical is False
2246
2247 san = ext.value
2248
2249 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2250 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2251 dns = san.get_values_for_type(x509.DNSName)
2252 ip = san.get_values_for_type(x509.IPAddress)
2253 dirname = san.get_values_for_type(x509.DirectoryName)
2254 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002255 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002256 assert [u"cryptography.io"] == dns
2257 assert [
2258 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002259 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002260 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002261 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002262 ),
2263 ])
2264 ] == dirname
2265 assert [
2266 ipaddress.ip_address(u"127.0.0.1"),
2267 ipaddress.ip_address(u"ff::")
2268 ] == ip
2269
2270 def test_invalid_rfc822name(self, backend):
2271 cert = _load_cert(
2272 os.path.join(
2273 "x509", "custom", "san_rfc822_names.pem"
2274 ),
2275 x509.load_pem_x509_certificate,
2276 backend
2277 )
2278 with pytest.raises(ValueError) as exc:
2279 cert.extensions
2280
2281 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002282
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002283 def test_other_name(self, backend):
2284 cert = _load_cert(
2285 os.path.join(
2286 "x509", "custom", "san_other_name.pem"
2287 ),
2288 x509.load_pem_x509_certificate,
2289 backend
2290 )
2291
2292 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002293 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002294 )
2295 assert ext is not None
2296 assert ext.critical is False
2297
Joshua Taubererd2afad32015-07-06 22:37:53 +00002298 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2299 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002300 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002301 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002302
2303 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002304 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002305
Marti4739cfc2016-08-02 04:03:25 +03002306 def test_certbuilder(self, backend):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002307 sans = [b'*.example.org', b'*.xn--4ca7aey.example.com',
2308 b'foobar.example.net']
Marti4739cfc2016-08-02 04:03:25 +03002309 private_key = RSA_KEY_2048.private_key(backend)
2310 builder = _make_certbuilder(private_key)
2311 builder = builder.add_extension(
2312 SubjectAlternativeName(list(map(DNSName, sans))), True)
2313
2314 cert = builder.sign(private_key, hashes.SHA1(), backend)
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002315 result = [
2316 x.bytes_value
2317 for x in cert.extensions.get_extension_for_class(
2318 SubjectAlternativeName
2319 ).value
2320 ]
Marti4739cfc2016-08-02 04:03:25 +03002321 assert result == sans
2322
Paul Kehrer94c69602015-05-02 19:29:40 -05002323
2324@pytest.mark.requires_backend_interface(interface=RSABackend)
2325@pytest.mark.requires_backend_interface(interface=X509Backend)
2326class TestExtendedKeyUsageExtension(object):
2327 def test_eku(self, backend):
2328 cert = _load_cert(
2329 os.path.join(
2330 "x509", "custom", "extended_key_usage.pem"
2331 ),
2332 x509.load_pem_x509_certificate,
2333 backend
2334 )
2335 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002336 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002337 )
2338 assert ext is not None
2339 assert ext.critical is False
2340
2341 assert [
2342 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2343 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2344 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2345 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2346 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2347 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2348 x509.ObjectIdentifier("2.5.29.37.0"),
2349 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2350 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002351
2352
2353class TestAccessDescription(object):
2354 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002355 with pytest.raises(TypeError):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002356 x509.AccessDescription("notanoid", x509.DNSName(b"test"))
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002357
2358 def test_invalid_access_location(self):
2359 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002360 x509.AccessDescription(
2361 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2362 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002363
Nick Bastind2ecf862015-12-13 05:44:46 -08002364 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002365 ad = x509.AccessDescription(
2366 ObjectIdentifier("2.999.1"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05002367 x509.UniformResourceIdentifier(b"http://example.com")
Nick Bastin326fc8e2015-12-12 19:08:12 -08002368 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002369 assert ad is not None
2370
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002371 def test_repr(self):
2372 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002373 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002374 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002375 )
Paul Kehrer6c29d742017-08-01 19:27:06 -05002376 if six.PY3:
2377 assert repr(ad) == (
2378 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6"
2379 ".1.5.5.7.48.1, name=OCSP)>, access_location=<UniformResource"
2380 "Identifier(bytes_value=b'http://ocsp.domain.com')>)>"
2381 )
2382 else:
2383 assert repr(ad) == (
2384 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6"
2385 ".1.5.5.7.48.1, name=OCSP)>, access_location=<UniformResource"
2386 "Identifier(bytes_value='http://ocsp.domain.com')>)>"
2387 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002388
2389 def test_eq(self):
2390 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002391 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002392 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002393 )
2394 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002395 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002396 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002397 )
2398 assert ad == ad2
2399
2400 def test_ne(self):
2401 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002402 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002403 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002404 )
2405 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002406 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002407 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002408 )
2409 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002410 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002411 x509.UniformResourceIdentifier(b"http://notthesame")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002412 )
2413 assert ad != ad2
2414 assert ad != ad3
2415 assert ad != object()
2416
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302417 def test_hash(self):
2418 ad = x509.AccessDescription(
2419 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002420 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302421 )
2422 ad2 = x509.AccessDescription(
2423 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002424 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302425 )
2426 ad3 = x509.AccessDescription(
2427 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002428 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302429 )
2430 assert hash(ad) == hash(ad2)
2431 assert hash(ad) != hash(ad3)
2432
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002433
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002434class TestPolicyConstraints(object):
2435 def test_invalid_explicit_policy(self):
2436 with pytest.raises(TypeError):
2437 x509.PolicyConstraints("invalid", None)
2438
2439 def test_invalid_inhibit_policy(self):
2440 with pytest.raises(TypeError):
2441 x509.PolicyConstraints(None, "invalid")
2442
2443 def test_both_none(self):
2444 with pytest.raises(ValueError):
2445 x509.PolicyConstraints(None, None)
2446
2447 def test_repr(self):
2448 pc = x509.PolicyConstraints(0, None)
2449
2450 assert repr(pc) == (
2451 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2452 u"pping=None)>"
2453 )
2454
2455 def test_eq(self):
2456 pc = x509.PolicyConstraints(2, 1)
2457 pc2 = x509.PolicyConstraints(2, 1)
2458 assert pc == pc2
2459
2460 def test_ne(self):
2461 pc = x509.PolicyConstraints(2, 1)
2462 pc2 = x509.PolicyConstraints(2, 2)
2463 pc3 = x509.PolicyConstraints(3, 1)
2464 assert pc != pc2
2465 assert pc != pc3
2466 assert pc != object()
2467
2468
Alex Gaynora9885602016-02-27 09:53:46 -05002469@pytest.mark.requires_backend_interface(interface=RSABackend)
2470@pytest.mark.requires_backend_interface(interface=X509Backend)
2471class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002472 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002473 cert = _load_cert(
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002474 os.path.join("x509", "department-of-state-root.pem"),
Alex Gaynora9885602016-02-27 09:53:46 -05002475 x509.load_pem_x509_certificate,
2476 backend
2477 )
2478 ext = cert.extensions.get_extension_for_oid(
2479 ExtensionOID.POLICY_CONSTRAINTS,
2480 )
2481 assert ext.critical is True
2482
2483 assert ext.value == x509.PolicyConstraints(
2484 require_explicit_policy=None, inhibit_policy_mapping=0,
2485 )
2486
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002487 def test_require_explicit_policy(self, backend):
2488 cert = _load_cert(
2489 os.path.join("x509", "custom", "policy_constraints_explicit.pem"),
2490 x509.load_pem_x509_certificate,
2491 backend
2492 )
2493 ext = cert.extensions.get_extension_for_oid(
2494 ExtensionOID.POLICY_CONSTRAINTS
2495 )
2496 assert ext.critical is True
2497 assert ext.value == x509.PolicyConstraints(
2498 require_explicit_policy=1, inhibit_policy_mapping=None,
2499 )
2500
Alex Gaynora9885602016-02-27 09:53:46 -05002501
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002502class TestAuthorityInformationAccess(object):
2503 def test_invalid_descriptions(self):
2504 with pytest.raises(TypeError):
2505 x509.AuthorityInformationAccess(["notanAccessDescription"])
2506
2507 def test_iter_len(self):
2508 aia = x509.AuthorityInformationAccess([
2509 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002510 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002511 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002512 ),
2513 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002514 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002515 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002516 )
2517 ])
2518 assert len(aia) == 2
2519 assert list(aia) == [
2520 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002521 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002522 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002523 ),
2524 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002525 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002526 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002527 )
2528 ]
2529
Marti40f19992016-08-26 04:26:31 +03002530 def test_iter_input(self):
2531 desc = [
2532 x509.AccessDescription(
2533 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002534 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Marti40f19992016-08-26 04:26:31 +03002535 )
2536 ]
2537 aia = x509.AuthorityInformationAccess(iter(desc))
2538 assert list(aia) == desc
2539
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002540 def test_repr(self):
2541 aia = x509.AuthorityInformationAccess([
2542 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002543 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002544 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002545 ),
2546 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002547 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002548 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002549 )
2550 ])
Paul Kehrer6c29d742017-08-01 19:27:06 -05002551 if six.PY3:
2552 assert repr(aia) == (
2553 "<AuthorityInformationAccess([<AccessDescription(access_method"
2554 "=<ObjectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, acces"
2555 "s_location=<UniformResourceIdentifier(bytes_value=b'http://oc"
2556 "sp.domain.com')>)>, <AccessDescription(access_method=<ObjectI"
2557 "dentifier(oid=1.3.6.1.5.5.7.48.2, name=caIssuers)>, access_lo"
2558 "cation=<UniformResourceIdentifier(bytes_value=b'http://domain"
2559 ".com/ca.crt')>)>])>"
2560 )
2561 else:
2562 assert repr(aia) == (
2563 "<AuthorityInformationAccess([<AccessDescription(access_method"
2564 "=<ObjectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, acces"
2565 "s_location=<UniformResourceIdentifier(bytes_value='http://oc"
2566 "sp.domain.com')>)>, <AccessDescription(access_method=<ObjectI"
2567 "dentifier(oid=1.3.6.1.5.5.7.48.2, name=caIssuers)>, access_lo"
2568 "cation=<UniformResourceIdentifier(bytes_value='http://domain"
2569 ".com/ca.crt')>)>])>"
2570 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002571
2572 def test_eq(self):
2573 aia = x509.AuthorityInformationAccess([
2574 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002575 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002576 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002577 ),
2578 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002579 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002580 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002581 )
2582 ])
2583 aia2 = x509.AuthorityInformationAccess([
2584 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002585 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002586 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002587 ),
2588 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002589 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002590 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002591 )
2592 ])
2593 assert aia == aia2
2594
2595 def test_ne(self):
2596 aia = x509.AuthorityInformationAccess([
2597 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002598 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002599 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002600 ),
2601 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002602 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002603 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002604 )
2605 ])
2606 aia2 = x509.AuthorityInformationAccess([
2607 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002608 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002609 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002610 ),
2611 ])
2612
2613 assert aia != aia2
2614 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002615
Paul Kehrerad4b3592015-12-27 17:27:40 -06002616 def test_indexing(self):
2617 aia = x509.AuthorityInformationAccess([
2618 x509.AccessDescription(
2619 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002620 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002621 ),
2622 x509.AccessDescription(
2623 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002624 x509.UniformResourceIdentifier(b"http://domain.com/ca.crt")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002625 ),
2626 x509.AccessDescription(
2627 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002628 x509.UniformResourceIdentifier(b"http://ocsp2.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002629 ),
2630 x509.AccessDescription(
2631 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002632 x509.UniformResourceIdentifier(b"http://ocsp3.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002633 ),
2634 x509.AccessDescription(
2635 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002636 x509.UniformResourceIdentifier(b"http://ocsp4.domain.com")
Paul Kehrerad4b3592015-12-27 17:27:40 -06002637 ),
2638 ])
2639 assert aia[-1] == aia[4]
2640 assert aia[2:6:2] == [aia[2], aia[4]]
2641
Paul Kehrerd774de92015-05-03 10:52:25 -05002642
2643@pytest.mark.requires_backend_interface(interface=RSABackend)
2644@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002645class TestAuthorityInformationAccessExtension(object):
2646 def test_aia_ocsp_ca_issuers(self, backend):
2647 cert = _load_cert(
2648 os.path.join("x509", "cryptography.io.pem"),
2649 x509.load_pem_x509_certificate,
2650 backend
2651 )
2652 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002653 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002654 )
2655 assert ext is not None
2656 assert ext.critical is False
2657
2658 assert ext.value == x509.AuthorityInformationAccess([
2659 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002660 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002661 x509.UniformResourceIdentifier(b"http://gv.symcd.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002662 ),
2663 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002664 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002665 x509.UniformResourceIdentifier(b"http://gv.symcb.com/gv.crt")
Paul Kehrera1476992015-05-04 17:35:47 -05002666 ),
2667 ])
2668
2669 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2670 cert = _load_cert(
2671 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2672 x509.load_pem_x509_certificate,
2673 backend
2674 )
2675 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002676 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002677 )
2678 assert ext is not None
2679 assert ext.critical is False
2680
2681 assert ext.value == x509.AuthorityInformationAccess([
2682 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002683 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002684 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002685 ),
2686 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002687 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002688 x509.UniformResourceIdentifier(b"http://ocsp2.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002689 ),
2690 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002691 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002692 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002693 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2694 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002695 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002696 ]))
2697 ),
2698 ])
2699
2700 def test_aia_ocsp_only(self, backend):
2701 cert = _load_cert(
2702 os.path.join("x509", "custom", "aia_ocsp.pem"),
2703 x509.load_pem_x509_certificate,
2704 backend
2705 )
2706 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002707 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002708 )
2709 assert ext is not None
2710 assert ext.critical is False
2711
2712 assert ext.value == x509.AuthorityInformationAccess([
2713 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002714 AuthorityInformationAccessOID.OCSP,
Paul Kehrer6c29d742017-08-01 19:27:06 -05002715 x509.UniformResourceIdentifier(b"http://ocsp.domain.com")
Paul Kehrera1476992015-05-04 17:35:47 -05002716 ),
2717 ])
2718
2719 def test_aia_ca_issuers_only(self, backend):
2720 cert = _load_cert(
2721 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2722 x509.load_pem_x509_certificate,
2723 backend
2724 )
2725 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002726 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002727 )
2728 assert ext is not None
2729 assert ext.critical is False
2730
2731 assert ext.value == x509.AuthorityInformationAccess([
2732 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002733 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002734 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002735 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2736 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002737 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002738 ]))
2739 ),
2740 ])
2741
2742
2743@pytest.mark.requires_backend_interface(interface=RSABackend)
2744@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002745class TestAuthorityKeyIdentifierExtension(object):
2746 def test_aki_keyid(self, backend):
2747 cert = _load_cert(
2748 os.path.join(
2749 "x509", "cryptography.io.pem"
2750 ),
2751 x509.load_pem_x509_certificate,
2752 backend
2753 )
2754 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002755 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002756 )
2757 assert ext is not None
2758 assert ext.critical is False
2759
2760 assert ext.value.key_identifier == (
2761 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2762 )
2763 assert ext.value.authority_cert_issuer is None
2764 assert ext.value.authority_cert_serial_number is None
2765
2766 def test_aki_all_fields(self, backend):
2767 cert = _load_cert(
2768 os.path.join(
2769 "x509", "custom", "authority_key_identifier.pem"
2770 ),
2771 x509.load_pem_x509_certificate,
2772 backend
2773 )
2774 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002775 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002776 )
2777 assert ext is not None
2778 assert ext.critical is False
2779
2780 assert ext.value.key_identifier == (
2781 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2782 )
2783 assert ext.value.authority_cert_issuer == [
2784 x509.DirectoryName(
2785 x509.Name([
2786 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002787 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002788 ),
2789 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002790 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002791 )
2792 ])
2793 )
2794 ]
2795 assert ext.value.authority_cert_serial_number == 3
2796
2797 def test_aki_no_keyid(self, backend):
2798 cert = _load_cert(
2799 os.path.join(
2800 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2801 ),
2802 x509.load_pem_x509_certificate,
2803 backend
2804 )
2805 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002806 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002807 )
2808 assert ext is not None
2809 assert ext.critical is False
2810
2811 assert ext.value.key_identifier is None
2812 assert ext.value.authority_cert_issuer == [
2813 x509.DirectoryName(
2814 x509.Name([
2815 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002816 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002817 ),
2818 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002819 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002820 )
2821 ])
2822 )
2823 ]
2824 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002825
Paul Kehrer253929a2015-08-05 17:30:39 +01002826 def test_from_certificate(self, backend):
2827 issuer_cert = _load_cert(
2828 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2829 x509.load_pem_x509_certificate,
2830 backend
2831 )
2832 cert = _load_cert(
2833 os.path.join("x509", "cryptography.io.pem"),
2834 x509.load_pem_x509_certificate,
2835 backend
2836 )
2837 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002838 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002839 )
2840 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2841 issuer_cert.public_key()
2842 )
2843 assert ext.value == aki
2844
Paul Kehrer61ff3562016-03-11 22:51:27 -04002845 def test_from_issuer_subject_key_identifier(self, backend):
2846 issuer_cert = _load_cert(
2847 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2848 x509.load_pem_x509_certificate,
2849 backend
2850 )
2851 cert = _load_cert(
2852 os.path.join("x509", "cryptography.io.pem"),
2853 x509.load_pem_x509_certificate,
2854 backend
2855 )
2856 ext = cert.extensions.get_extension_for_oid(
2857 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
2858 )
2859 ski = issuer_cert.extensions.get_extension_for_class(
2860 x509.SubjectKeyIdentifier
2861 )
2862 aki = x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier(
2863 ski
2864 )
2865 assert ext.value == aki
2866
Paul Kehrer5a485522015-05-06 00:29:12 -05002867
Paul Kehrere0017be2015-05-17 20:39:40 -06002868class TestNameConstraints(object):
2869 def test_ipaddress_wrong_type(self):
2870 with pytest.raises(TypeError):
2871 x509.NameConstraints(
2872 permitted_subtrees=[
2873 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2874 ],
2875 excluded_subtrees=None
2876 )
2877
2878 with pytest.raises(TypeError):
2879 x509.NameConstraints(
2880 permitted_subtrees=None,
2881 excluded_subtrees=[
2882 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2883 ]
2884 )
2885
2886 def test_ipaddress_allowed_type(self):
2887 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2888 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2889 nc = x509.NameConstraints(
2890 permitted_subtrees=permitted,
2891 excluded_subtrees=excluded
2892 )
2893 assert nc.permitted_subtrees == permitted
2894 assert nc.excluded_subtrees == excluded
2895
2896 def test_invalid_permitted_subtrees(self):
2897 with pytest.raises(TypeError):
2898 x509.NameConstraints("badpermitted", None)
2899
2900 def test_invalid_excluded_subtrees(self):
2901 with pytest.raises(TypeError):
2902 x509.NameConstraints(None, "badexcluded")
2903
2904 def test_no_subtrees(self):
2905 with pytest.raises(ValueError):
2906 x509.NameConstraints(None, None)
2907
2908 def test_permitted_none(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002909 excluded = [x509.DNSName(b"name.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002910 nc = x509.NameConstraints(
2911 permitted_subtrees=None, excluded_subtrees=excluded
2912 )
2913 assert nc.permitted_subtrees is None
2914 assert nc.excluded_subtrees is not None
2915
2916 def test_excluded_none(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002917 permitted = [x509.DNSName(b"name.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002918 nc = x509.NameConstraints(
2919 permitted_subtrees=permitted, excluded_subtrees=None
2920 )
2921 assert nc.permitted_subtrees is not None
2922 assert nc.excluded_subtrees is None
2923
Marti40f19992016-08-26 04:26:31 +03002924 def test_iter_input(self):
2925 subtrees = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))]
2926 nc = x509.NameConstraints(iter(subtrees), iter(subtrees))
2927 assert list(nc.permitted_subtrees) == subtrees
2928 assert list(nc.excluded_subtrees) == subtrees
2929
Paul Kehrere0017be2015-05-17 20:39:40 -06002930 def test_repr(self):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002931 permitted = [x509.DNSName(b"name.local"), x509.DNSName(b"name2.local")]
Paul Kehrere0017be2015-05-17 20:39:40 -06002932 nc = x509.NameConstraints(
2933 permitted_subtrees=permitted,
2934 excluded_subtrees=None
2935 )
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002936 if six.PY3:
2937 assert repr(nc) == (
2938 "<NameConstraints(permitted_subtrees=[<DNSName("
2939 "bytes_value=b'name.local')>, <DNSName(bytes_value="
2940 "b'name2.local')>], excluded_subtrees=None)>"
2941 )
2942 else:
2943 assert repr(nc) == (
2944 "<NameConstraints(permitted_subtrees=[<DNSName("
2945 "bytes_value='name.local')>, <DNSName(bytes_value="
2946 "'name2.local')>], excluded_subtrees=None)>"
2947 )
Paul Kehrere0017be2015-05-17 20:39:40 -06002948
Paul Kehrer31894282015-06-21 21:46:41 -05002949 def test_eq(self):
2950 nc = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002951 permitted_subtrees=[x509.DNSName(b"name.local")],
2952 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002953 )
2954 nc2 = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002955 permitted_subtrees=[x509.DNSName(b"name.local")],
2956 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002957 )
2958 assert nc == nc2
2959
2960 def test_ne(self):
2961 nc = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002962 permitted_subtrees=[x509.DNSName(b"name.local")],
2963 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002964 )
2965 nc2 = x509.NameConstraints(
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002966 permitted_subtrees=[x509.DNSName(b"name.local")],
Paul Kehrer31894282015-06-21 21:46:41 -05002967 excluded_subtrees=None
2968 )
2969 nc3 = x509.NameConstraints(
2970 permitted_subtrees=None,
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002971 excluded_subtrees=[x509.DNSName(b"name2.local")]
Paul Kehrer31894282015-06-21 21:46:41 -05002972 )
2973
2974 assert nc != nc2
2975 assert nc != nc3
2976 assert nc != object()
2977
Paul Kehrere0017be2015-05-17 20:39:40 -06002978
Paul Kehrer870d7e82015-06-21 22:20:44 -05002979@pytest.mark.requires_backend_interface(interface=RSABackend)
2980@pytest.mark.requires_backend_interface(interface=X509Backend)
2981class TestNameConstraintsExtension(object):
2982 def test_permitted_excluded(self, backend):
2983 cert = _load_cert(
2984 os.path.join(
2985 "x509", "custom", "nc_permitted_excluded_2.pem"
2986 ),
2987 x509.load_pem_x509_certificate,
2988 backend
2989 )
2990 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002991 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002992 ).value
2993 assert nc == x509.NameConstraints(
2994 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04002995 x509.DNSName(b"zombo.local"),
Paul Kehrer870d7e82015-06-21 22:20:44 -05002996 ],
2997 excluded_subtrees=[
2998 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002999 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05003000 ]))
3001 ]
3002 )
3003
3004 def test_permitted(self, backend):
3005 cert = _load_cert(
3006 os.path.join(
3007 "x509", "custom", "nc_permitted_2.pem"
3008 ),
3009 x509.load_pem_x509_certificate,
3010 backend
3011 )
3012 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003013 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05003014 ).value
3015 assert nc == x509.NameConstraints(
3016 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003017 x509.DNSName(b"zombo.local"),
Paul Kehrer870d7e82015-06-21 22:20:44 -05003018 ],
3019 excluded_subtrees=None
3020 )
3021
Paul Kehrer42376832015-07-01 18:10:32 -05003022 def test_permitted_with_leading_period(self, backend):
3023 cert = _load_cert(
3024 os.path.join(
3025 "x509", "custom", "nc_permitted.pem"
3026 ),
3027 x509.load_pem_x509_certificate,
3028 backend
3029 )
3030 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003031 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05003032 ).value
3033 assert nc == x509.NameConstraints(
3034 permitted_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003035 x509.DNSName(b".cryptography.io"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003036 x509.UniformResourceIdentifier(b"ftp://cryptography.test")
Paul Kehrer42376832015-07-01 18:10:32 -05003037 ],
3038 excluded_subtrees=None
3039 )
3040
3041 def test_excluded_with_leading_period(self, backend):
3042 cert = _load_cert(
3043 os.path.join(
3044 "x509", "custom", "nc_excluded.pem"
3045 ),
3046 x509.load_pem_x509_certificate,
3047 backend
3048 )
3049 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003050 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05003051 ).value
3052 assert nc == x509.NameConstraints(
3053 permitted_subtrees=None,
3054 excluded_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003055 x509.DNSName(b".cryptography.io"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003056 x509.UniformResourceIdentifier(b"gopher://cryptography.test")
Paul Kehrer42376832015-07-01 18:10:32 -05003057 ]
3058 )
3059
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003060 def test_permitted_excluded_with_ips(self, backend):
3061 cert = _load_cert(
3062 os.path.join(
3063 "x509", "custom", "nc_permitted_excluded.pem"
3064 ),
3065 x509.load_pem_x509_certificate,
3066 backend
3067 )
3068 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003069 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003070 ).value
3071 assert nc == x509.NameConstraints(
3072 permitted_subtrees=[
3073 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
3074 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
3075 ],
3076 excluded_subtrees=[
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003077 x509.DNSName(b".domain.com"),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003078 x509.UniformResourceIdentifier(b"http://test.local"),
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003079 ]
3080 )
3081
Paul Kehrera72ebaf2015-07-01 21:07:37 -05003082 def test_single_ip_netmask(self, backend):
3083 cert = _load_cert(
3084 os.path.join(
3085 "x509", "custom", "nc_single_ip_netmask.pem"
3086 ),
3087 x509.load_pem_x509_certificate,
3088 backend
3089 )
3090 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003091 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05003092 ).value
3093 assert nc == x509.NameConstraints(
3094 permitted_subtrees=[
3095 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
3096 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
3097 ],
3098 excluded_subtrees=None
3099 )
3100
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003101 def test_invalid_netmask(self, backend):
3102 cert = _load_cert(
3103 os.path.join(
3104 "x509", "custom", "nc_invalid_ip_netmask.pem"
3105 ),
3106 x509.load_pem_x509_certificate,
3107 backend
3108 )
3109 with pytest.raises(ValueError):
3110 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003111 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05003112 )
3113
Marti4739cfc2016-08-02 04:03:25 +03003114 def test_certbuilder(self, backend):
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003115 permitted = [b'.example.org', b'.xn--4ca7aey.example.com',
3116 b'foobar.example.net']
Marti4739cfc2016-08-02 04:03:25 +03003117 private_key = RSA_KEY_2048.private_key(backend)
3118 builder = _make_certbuilder(private_key)
3119 builder = builder.add_extension(
3120 NameConstraints(permitted_subtrees=list(map(DNSName, permitted)),
3121 excluded_subtrees=[]), True)
3122
3123 cert = builder.sign(private_key, hashes.SHA1(), backend)
Alex Gaynorcdaf3ff2017-07-30 13:08:51 -04003124 result = [
3125 x.bytes_value
3126 for x in cert.extensions.get_extension_for_class(
3127 NameConstraints
3128 ).value.permitted_subtrees
3129 ]
Marti4739cfc2016-08-02 04:03:25 +03003130 assert result == permitted
3131
Paul Kehrer870d7e82015-06-21 22:20:44 -05003132
Paul Kehrer5a485522015-05-06 00:29:12 -05003133class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003134 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003135 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003136 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003137
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003138 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05003139 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003140 x509.DistributionPoint(None, "notname", None, None)
3141
3142 def test_distribution_point_full_and_relative_not_none(self):
3143 with pytest.raises(ValueError):
3144 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003145
3146 def test_crl_issuer_not_general_names(self):
3147 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003148 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05003149
3150 def test_reason_not_reasonflags(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 Kehrer4e8dacd2015-05-09 10:38:23 -05003154 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003155 frozenset(["notreasonflags"]),
3156 None
3157 )
3158
3159 def test_reason_not_frozenset(self):
3160 with pytest.raises(TypeError):
3161 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003162 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer3fd02602015-05-09 19:46:13 -05003163 None,
3164 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003165 None
3166 )
3167
3168 def test_disallowed_reasons(self):
3169 with pytest.raises(ValueError):
3170 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003171 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003172 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003173 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003174 None
3175 )
3176
3177 with pytest.raises(ValueError):
3178 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003179 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003180 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003181 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003182 None
3183 )
3184
3185 def test_reason_only(self):
3186 with pytest.raises(ValueError):
3187 x509.DistributionPoint(
3188 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003189 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003190 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003191 None
3192 )
3193
3194 def test_eq(self):
3195 dp = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003196 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003197 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003198 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003199 [
3200 x509.DirectoryName(
3201 x509.Name([
3202 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003203 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003204 )
3205 ])
3206 )
3207 ],
3208 )
3209 dp2 = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003210 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003211 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003212 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003213 [
3214 x509.DirectoryName(
3215 x509.Name([
3216 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003217 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003218 )
3219 ])
3220 )
3221 ],
3222 )
3223 assert dp == dp2
3224
3225 def test_ne(self):
3226 dp = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003227 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003228 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003229 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003230 [
3231 x509.DirectoryName(
3232 x509.Name([
3233 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003234 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003235 )
3236 ])
3237 )
3238 ],
3239 )
3240 dp2 = x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003241 [x509.UniformResourceIdentifier(b"http://crypt.og/crl")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003242 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003243 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003244 None
3245 )
3246 assert dp != dp2
3247 assert dp != object()
3248
Marti40f19992016-08-26 04:26:31 +03003249 def test_iter_input(self):
Paul Kehrer6c29d742017-08-01 19:27:06 -05003250 name = [x509.UniformResourceIdentifier(b"http://crypt.og/crl")]
Marti40f19992016-08-26 04:26:31 +03003251 issuer = [
3252 x509.DirectoryName(
3253 x509.Name([
3254 x509.NameAttribute(NameOID.COMMON_NAME, u"Important CA")
3255 ])
3256 )
3257 ]
3258 dp = x509.DistributionPoint(
3259 iter(name),
3260 None,
3261 frozenset([x509.ReasonFlags.ca_compromise]),
3262 iter(issuer),
3263 )
3264 assert list(dp.full_name) == name
3265 assert list(dp.crl_issuer) == issuer
3266
Paul Kehrer5a485522015-05-06 00:29:12 -05003267 def test_repr(self):
3268 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003269 None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003270 x509.RelativeDistinguishedName([
Paul Kehrereba19e62015-08-10 18:44:24 -05003271 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05003272 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003273 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003274 [
3275 x509.DirectoryName(
3276 x509.Name([
3277 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003278 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003279 )
3280 ])
3281 )
3282 ],
3283 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05003284 if six.PY3:
3285 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003286 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3287 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3288 "4.3, name=commonName)>, value='myCN')>])>, reasons=frozenset("
3289 "{<ReasonFlags.ca_compromise: 'cACompromise'>}), crl_issuer=[<"
3290 "DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentifi"
3291 "er(oid=2.5.4.3, name=commonName)>, value='Important CA')>])>)"
3292 ">])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003293 )
3294 else:
3295 assert repr(dp) == (
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003296 "<DistributionPoint(full_name=None, relative_name=<RelativeDis"
3297 "tinguishedName([<NameAttribute(oid=<ObjectIdentifier(oid=2.5."
3298 "4.3, name=commonName)>, value=u'myCN')>])>, reasons=frozenset"
3299 "([<ReasonFlags.ca_compromise: 'cACompromise'>]), crl_issuer=["
3300 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
3301 "ier(oid=2.5.4.3, name=commonName)>, value=u'Important CA')>])"
3302 ">)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003303 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003304
3305
3306class TestCRLDistributionPoints(object):
3307 def test_invalid_distribution_points(self):
3308 with pytest.raises(TypeError):
3309 x509.CRLDistributionPoints(["notadistributionpoint"])
3310
3311 def test_iter_len(self):
3312 cdp = x509.CRLDistributionPoints([
3313 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003314 [x509.UniformResourceIdentifier(b"http://domain")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003315 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003316 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003317 None
3318 ),
3319 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003320 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003321 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003322 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003323 x509.ReasonFlags.key_compromise,
3324 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003325 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003326 None
3327 ),
3328 ])
3329 assert len(cdp) == 2
3330 assert list(cdp) == [
3331 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003332 [x509.UniformResourceIdentifier(b"http://domain")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003333 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003334 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003335 None
3336 ),
3337 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003338 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003339 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003340 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003341 x509.ReasonFlags.key_compromise,
3342 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003343 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003344 None
3345 ),
3346 ]
3347
Marti40f19992016-08-26 04:26:31 +03003348 def test_iter_input(self):
3349 points = [
3350 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003351 [x509.UniformResourceIdentifier(b"http://domain")],
Marti40f19992016-08-26 04:26:31 +03003352 None,
3353 None,
3354 None
3355 ),
3356 ]
3357 cdp = x509.CRLDistributionPoints(iter(points))
3358 assert list(cdp) == points
3359
Paul Kehrer5a485522015-05-06 00:29:12 -05003360 def test_repr(self):
3361 cdp = x509.CRLDistributionPoints([
3362 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003363 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003364 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003365 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003366 None
3367 ),
3368 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003369 if six.PY3:
3370 assert repr(cdp) == (
3371 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
Paul Kehrer6c29d742017-08-01 19:27:06 -05003372 "rmResourceIdentifier(bytes_value=b'ftp://domain')>], relative"
3373 "_name=None, reasons=frozenset({<ReasonFlags.key_compromise: "
3374 "'keyCompromise'>}), crl_issuer=None)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003375 )
3376 else:
3377 assert repr(cdp) == (
3378 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
Paul Kehrer6c29d742017-08-01 19:27:06 -05003379 "rmResourceIdentifier(bytes_value='ftp://domain')>], relative"
3380 "_name=None, reasons=frozenset([<ReasonFlags.key_compromise: "
3381 "'keyCompromise'>]), crl_issuer=None)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003382 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003383
3384 def test_eq(self):
3385 cdp = x509.CRLDistributionPoints([
3386 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003387 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003388 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003389 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003390 x509.ReasonFlags.key_compromise,
3391 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003392 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003393 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003394 ),
3395 ])
3396 cdp2 = x509.CRLDistributionPoints([
3397 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003398 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003399 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003400 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003401 x509.ReasonFlags.key_compromise,
3402 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003403 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003404 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003405 ),
3406 ])
3407 assert cdp == cdp2
3408
3409 def test_ne(self):
3410 cdp = x509.CRLDistributionPoints([
3411 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003412 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003413 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003414 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003415 x509.ReasonFlags.key_compromise,
3416 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003417 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003418 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003419 ),
3420 ])
3421 cdp2 = x509.CRLDistributionPoints([
3422 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003423 [x509.UniformResourceIdentifier(b"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003424 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003425 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003426 x509.ReasonFlags.key_compromise,
3427 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003428 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003429 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003430 ),
3431 ])
3432 cdp3 = x509.CRLDistributionPoints([
3433 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003434 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003435 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003436 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003437 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003438 ),
3439 ])
3440 cdp4 = x509.CRLDistributionPoints([
3441 x509.DistributionPoint(
Paul Kehrer6c29d742017-08-01 19:27:06 -05003442 [x509.UniformResourceIdentifier(b"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003443 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003444 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003445 x509.ReasonFlags.key_compromise,
3446 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003447 ]),
Paul Kehrer6c29d742017-08-01 19:27:06 -05003448 [x509.UniformResourceIdentifier(b"uri://thing2")],
Paul Kehrer5a485522015-05-06 00:29:12 -05003449 ),
3450 ])
3451 assert cdp != cdp2
3452 assert cdp != cdp3
3453 assert cdp != cdp4
3454 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003455
Paul Kehreree2e92d2015-12-27 17:29:37 -06003456 def test_indexing(self):
3457 ci = x509.CRLDistributionPoints([
3458 x509.DistributionPoint(
3459 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003460 [x509.UniformResourceIdentifier(b"uri://thing")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003461 ),
3462 x509.DistributionPoint(
3463 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003464 [x509.UniformResourceIdentifier(b"uri://thing2")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003465 ),
3466 x509.DistributionPoint(
3467 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003468 [x509.UniformResourceIdentifier(b"uri://thing3")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003469 ),
3470 x509.DistributionPoint(
3471 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003472 [x509.UniformResourceIdentifier(b"uri://thing4")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003473 ),
3474 x509.DistributionPoint(
3475 None, None, None,
Paul Kehrer6c29d742017-08-01 19:27:06 -05003476 [x509.UniformResourceIdentifier(b"uri://thing5")],
Paul Kehreree2e92d2015-12-27 17:29:37 -06003477 ),
3478 ])
3479 assert ci[-1] == ci[4]
3480 assert ci[2:6:2] == [ci[2], ci[4]]
3481
Paul Kehrer9a10d592015-05-10 14:55:51 -05003482
3483@pytest.mark.requires_backend_interface(interface=RSABackend)
3484@pytest.mark.requires_backend_interface(interface=X509Backend)
3485class TestCRLDistributionPointsExtension(object):
3486 def test_fullname_and_crl_issuer(self, backend):
3487 cert = _load_cert(
3488 os.path.join(
3489 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3490 ),
3491 x509.load_der_x509_certificate,
3492 backend
3493 )
3494
3495 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003496 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003497 ).value
3498
3499 assert cdps == x509.CRLDistributionPoints([
3500 x509.DistributionPoint(
3501 full_name=[x509.DirectoryName(
3502 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003503 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003504 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003505 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003506 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003507 ),
3508 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003509 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003510 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003511 ),
3512 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003513 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003514 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003515 ),
3516 ])
3517 )],
3518 relative_name=None,
3519 reasons=None,
3520 crl_issuer=[x509.DirectoryName(
3521 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003522 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003523 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003524 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003525 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003526 ),
3527 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003528 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003529 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003530 ),
3531 ])
3532 )],
3533 )
3534 ])
3535
3536 def test_relativename_and_crl_issuer(self, backend):
3537 cert = _load_cert(
3538 os.path.join(
3539 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3540 ),
3541 x509.load_der_x509_certificate,
3542 backend
3543 )
3544
3545 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003546 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003547 ).value
3548
3549 assert cdps == x509.CRLDistributionPoints([
3550 x509.DistributionPoint(
3551 full_name=None,
Fraser Tweedale02467dd2016-11-07 15:54:04 +10003552 relative_name=x509.RelativeDistinguishedName([
Paul Kehrer9a10d592015-05-10 14:55:51 -05003553 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003554 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003555 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003556 ),
3557 ]),
3558 reasons=None,
3559 crl_issuer=[x509.DirectoryName(
3560 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003561 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003562 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003563 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003564 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003565 ),
3566 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003567 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003568 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003569 ),
3570 ])
3571 )],
3572 )
3573 ])
3574
3575 def test_fullname_crl_issuer_reasons(self, backend):
3576 cert = _load_cert(
3577 os.path.join(
3578 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3579 ),
3580 x509.load_pem_x509_certificate,
3581 backend
3582 )
3583
3584 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003585 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003586 ).value
3587
3588 assert cdps == x509.CRLDistributionPoints([
3589 x509.DistributionPoint(
3590 full_name=[x509.UniformResourceIdentifier(
3591 u"http://myhost.com/myca.crl"
3592 )],
3593 relative_name=None,
3594 reasons=frozenset([
3595 x509.ReasonFlags.key_compromise,
3596 x509.ReasonFlags.ca_compromise
3597 ]),
3598 crl_issuer=[x509.DirectoryName(
3599 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003600 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003601 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003602 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003603 ),
3604 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003605 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003606 ),
3607 ])
3608 )],
3609 )
3610 ])
3611
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003612 def test_all_reasons(self, backend):
3613 cert = _load_cert(
3614 os.path.join(
3615 "x509", "custom", "cdp_all_reasons.pem"
3616 ),
3617 x509.load_pem_x509_certificate,
3618 backend
3619 )
3620
3621 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003622 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003623 ).value
3624
3625 assert cdps == x509.CRLDistributionPoints([
3626 x509.DistributionPoint(
3627 full_name=[x509.UniformResourceIdentifier(
3628 u"http://domain.com/some.crl"
3629 )],
3630 relative_name=None,
3631 reasons=frozenset([
3632 x509.ReasonFlags.key_compromise,
3633 x509.ReasonFlags.ca_compromise,
3634 x509.ReasonFlags.affiliation_changed,
3635 x509.ReasonFlags.superseded,
3636 x509.ReasonFlags.privilege_withdrawn,
3637 x509.ReasonFlags.cessation_of_operation,
3638 x509.ReasonFlags.aa_compromise,
3639 x509.ReasonFlags.certificate_hold,
3640 ]),
3641 crl_issuer=None
3642 )
3643 ])
3644
3645 def test_single_reason(self, backend):
3646 cert = _load_cert(
3647 os.path.join(
3648 "x509", "custom", "cdp_reason_aa_compromise.pem"
3649 ),
3650 x509.load_pem_x509_certificate,
3651 backend
3652 )
3653
3654 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003655 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003656 ).value
3657
3658 assert cdps == x509.CRLDistributionPoints([
3659 x509.DistributionPoint(
3660 full_name=[x509.UniformResourceIdentifier(
3661 u"http://domain.com/some.crl"
3662 )],
3663 relative_name=None,
3664 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3665 crl_issuer=None
3666 )
3667 ])
3668
Paul Kehrer9a10d592015-05-10 14:55:51 -05003669 def test_crl_issuer_only(self, backend):
3670 cert = _load_cert(
3671 os.path.join(
3672 "x509", "custom", "cdp_crl_issuer.pem"
3673 ),
3674 x509.load_pem_x509_certificate,
3675 backend
3676 )
3677
3678 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003679 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003680 ).value
3681
3682 assert cdps == x509.CRLDistributionPoints([
3683 x509.DistributionPoint(
3684 full_name=None,
3685 relative_name=None,
3686 reasons=None,
3687 crl_issuer=[x509.DirectoryName(
3688 x509.Name([
3689 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003690 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003691 ),
3692 ])
3693 )],
3694 )
3695 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003696
Dominic Chen87bb9572015-10-09 00:23:07 -04003697 def test_crl_empty_hostname(self, backend):
3698 cert = _load_cert(
3699 os.path.join(
3700 "x509", "custom", "cdp_empty_hostname.pem"
3701 ),
3702 x509.load_pem_x509_certificate,
3703 backend
3704 )
3705
3706 cdps = cert.extensions.get_extension_for_oid(
3707 ExtensionOID.CRL_DISTRIBUTION_POINTS
3708 ).value
3709
3710 assert cdps == x509.CRLDistributionPoints([
3711 x509.DistributionPoint(
3712 full_name=[x509.UniformResourceIdentifier(
3713 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3714 )],
3715 relative_name=None,
3716 reasons=None,
3717 crl_issuer=None
3718 )
3719 ])
3720
Paul Kehrer16fae762015-05-01 23:14:20 -05003721
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003722@pytest.mark.requires_backend_interface(interface=RSABackend)
3723@pytest.mark.requires_backend_interface(interface=X509Backend)
3724class TestOCSPNoCheckExtension(object):
3725 def test_nocheck(self, backend):
3726 cert = _load_cert(
3727 os.path.join(
3728 "x509", "custom", "ocsp_nocheck.pem"
3729 ),
3730 x509.load_pem_x509_certificate,
3731 backend
3732 )
3733 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003734 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003735 )
3736 assert isinstance(ext.value, x509.OCSPNoCheck)
3737
3738
Paul Kehrer16fae762015-05-01 23:14:20 -05003739class TestInhibitAnyPolicy(object):
3740 def test_not_int(self):
3741 with pytest.raises(TypeError):
3742 x509.InhibitAnyPolicy("notint")
3743
3744 def test_negative_int(self):
3745 with pytest.raises(ValueError):
3746 x509.InhibitAnyPolicy(-1)
3747
3748 def test_repr(self):
3749 iap = x509.InhibitAnyPolicy(0)
3750 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3751
3752 def test_eq(self):
3753 iap = x509.InhibitAnyPolicy(1)
3754 iap2 = x509.InhibitAnyPolicy(1)
3755 assert iap == iap2
3756
3757 def test_ne(self):
3758 iap = x509.InhibitAnyPolicy(1)
3759 iap2 = x509.InhibitAnyPolicy(4)
3760 assert iap != iap2
3761 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003762
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303763 def test_hash(self):
3764 iap = x509.InhibitAnyPolicy(1)
3765 iap2 = x509.InhibitAnyPolicy(1)
3766 iap3 = x509.InhibitAnyPolicy(4)
3767 assert hash(iap) == hash(iap2)
3768 assert hash(iap) != hash(iap3)
3769
Paul Kehrerca6ce992015-06-17 22:13:15 -06003770
3771@pytest.mark.requires_backend_interface(interface=RSABackend)
3772@pytest.mark.requires_backend_interface(interface=X509Backend)
3773class TestInhibitAnyPolicyExtension(object):
3774 def test_nocheck(self, backend):
3775 cert = _load_cert(
3776 os.path.join(
3777 "x509", "custom", "inhibit_any_policy_5.pem"
3778 ),
3779 x509.load_pem_x509_certificate,
3780 backend
3781 )
3782 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003783 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003784 ).value
3785 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003786
3787
3788@pytest.mark.requires_backend_interface(interface=RSABackend)
3789@pytest.mark.requires_backend_interface(interface=X509Backend)
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003790class TestPrecertificateSignedCertificateTimestampsExtension(object):
3791 def test_init(self):
3792 with pytest.raises(TypeError):
3793 x509.PrecertificateSignedCertificateTimestamps([object()])
3794
3795 def test_repr(self):
3796 assert repr(x509.PrecertificateSignedCertificateTimestamps([])) == (
3797 "<PrecertificateSignedCertificateTimestamps([])>"
3798 )
3799
Paul Kehrerce69b822017-07-04 15:59:38 -05003800 @pytest.mark.supported(
3801 only_if=lambda backend: (
3802 backend._lib.CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER),
3803 skip_message="Requires OpenSSL 1.1.0f+",
3804 )
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003805 def test_simple(self, backend):
3806 cert = _load_cert(
3807 os.path.join("x509", "badssl-sct.pem"),
3808 x509.load_pem_x509_certificate,
3809 backend
3810 )
3811 scts = cert.extensions.get_extension_for_class(
3812 x509.PrecertificateSignedCertificateTimestamps
3813 ).value
3814 assert len(scts) == 1
3815 [sct] = scts
3816 assert scts[0] == sct
3817 assert sct.version == x509.certificate_transparency.Version.v1
3818 assert sct.log_id == (
3819 b"\xa7\xceJNb\x07\xe0\xad\xde\xe5\xfd\xaaK\x1f\x86v\x87g\xb5\xd0"
3820 b"\x02\xa5]G1\x0e~g\n\x95\xea\xb2"
3821 )
3822 assert sct.timestamp == datetime.datetime(
3823 2016, 11, 17, 1, 56, 25, 396000
3824 )
3825 assert (
3826 sct.entry_type ==
3827 x509.certificate_transparency.LogEntryType.PRE_CERTIFICATE
3828 )
3829
Paul Kehrerce69b822017-07-04 15:59:38 -05003830 @pytest.mark.supported(
3831 only_if=lambda backend: (
3832 not backend._lib.CRYPTOGRAPHY_OPENSSL_110_OR_GREATER),
3833 skip_message="Requires OpenSSL < 1.1.0",
3834 )
3835 def test_skips_scts_if_unsupported(self, backend):
3836 cert = _load_cert(
3837 os.path.join("x509", "badssl-sct.pem"),
3838 x509.load_pem_x509_certificate,
3839 backend
3840 )
3841 assert len(cert.extensions) == 10
3842 with pytest.raises(x509.ExtensionNotFound):
3843 cert.extensions.get_extension_for_class(
3844 x509.PrecertificateSignedCertificateTimestamps
3845 )
3846
3847 ext = cert.extensions.get_extension_for_oid(
3848 x509.ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS
3849 )
3850 assert isinstance(ext.value, x509.UnrecognizedExtension)
3851
Alex Gaynor6a0718f2017-06-04 13:36:58 -04003852
3853@pytest.mark.requires_backend_interface(interface=RSABackend)
3854@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003855class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003856 def test_invalid_certificate_policies_data(self, backend):
3857 cert = _load_cert(
3858 os.path.join(
3859 "x509", "custom", "cp_invalid.pem"
3860 ),
3861 x509.load_pem_x509_certificate,
3862 backend
3863 )
3864 with pytest.raises(ValueError):
3865 cert.extensions