blob: 749e52f126f3a6c54daf14952af53693eb5c2935 [file] [log] [blame]
Paul Kehrer8cf26422015-03-21 09:50:24 -05001# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import absolute_import, division, print_function
6
Paul Kehrer1eb82a62015-03-31 20:00:33 -05007import binascii
Paul Kehrer23c0bbc2015-12-25 22:35:19 -06008import datetime
Paul Kehrer31bdf792015-03-25 14:11:00 -05009import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050010import os
11
Paul Kehrer8cf26422015-03-21 09:50:24 -050012import pytest
13
Paul Kehrercbfb1012015-04-10 20:57:20 -040014import six
15
Paul Kehrer8cf26422015-03-21 09:50:24 -050016from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010017from cryptography.hazmat.backends.interfaces import (
18 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
19)
Marti4739cfc2016-08-02 04:03:25 +030020from cryptography.hazmat.primitives import hashes
Paul Kehrerf22f6122015-08-05 12:57:13 +010021from cryptography.hazmat.primitives.asymmetric import ec
Marti4739cfc2016-08-02 04:03:25 +030022from cryptography.x509 import DNSName, NameConstraints, SubjectAlternativeName
Paul Kehrer9e102db2015-08-10 21:53:09 -050023from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080024 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
25 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050026)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050027
Marti4739cfc2016-08-02 04:03:25 +030028from .hazmat.primitives.fixtures_rsa import RSA_KEY_2048
Paul Kehrerf22f6122015-08-05 12:57:13 +010029from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050030from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050031
32
Marti4739cfc2016-08-02 04:03:25 +030033def _make_certbuilder(private_key):
34 name = x509.Name(
35 [x509.NameAttribute(NameOID.COMMON_NAME, u'example.org')])
36 return (
37 x509.CertificateBuilder()
38 .subject_name(name)
39 .issuer_name(name)
40 .public_key(private_key.public_key())
41 .serial_number(777)
42 .not_valid_before(datetime.datetime(1999, 1, 1))
43 .not_valid_after(datetime.datetime(2020, 1, 1))
44 )
45
46
Paul Kehrer85894662015-03-22 13:19:31 -050047class TestExtension(object):
48 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050049 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050050 with pytest.raises(TypeError):
51 x509.Extension("notanoid", True, bc)
52
53 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050054 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050055 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050056 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050057
58 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050059 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050060 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050061 assert repr(ext) == (
62 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
63 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
64 "_length=None)>)>"
65 )
66
Paul Kehrer58e870c2015-05-17 09:15:30 -070067 def test_eq(self):
68 ext1 = x509.Extension(
69 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
70 )
71 ext2 = x509.Extension(
72 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
73 )
74 assert ext1 == ext2
75
76 def test_ne(self):
77 ext1 = x509.Extension(
78 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
79 )
80 ext2 = x509.Extension(
81 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
82 )
83 ext3 = x509.Extension(
84 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
85 )
86 ext4 = x509.Extension(
87 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
88 )
89 assert ext1 != ext2
90 assert ext1 != ext3
91 assert ext1 != ext4
92 assert ext1 != object()
93
Paul Kehrer85894662015-03-22 13:19:31 -050094
Paul Kehrer14fd6972015-12-30 10:58:25 -060095class TestUnrecognizedExtension(object):
96 def test_invalid_oid(self):
97 with pytest.raises(TypeError):
98 x509.UnrecognizedExtension("notanoid", b"somedata")
99
100 def test_eq(self):
101 ext1 = x509.UnrecognizedExtension(
102 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
103 )
104 ext2 = x509.UnrecognizedExtension(
105 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
106 )
107 assert ext1 == ext2
108
109 def test_ne(self):
110 ext1 = x509.UnrecognizedExtension(
111 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
112 )
113 ext2 = x509.UnrecognizedExtension(
114 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x02"
115 )
116 ext3 = x509.UnrecognizedExtension(
117 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
118 )
119 assert ext1 != ext2
120 assert ext1 != ext3
121 assert ext1 != object()
122
123 def test_repr(self):
124 ext1 = x509.UnrecognizedExtension(
125 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
126 )
Paul Kehrer50e9dd82015-12-30 12:20:55 -0600127 if six.PY3:
128 assert repr(ext1) == (
129 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
130 "name=Unknown OID)>, value=b'\\x03\\x02\\x01')>"
131 )
132 else:
133 assert repr(ext1) == (
134 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
135 "name=Unknown OID)>, value='\\x03\\x02\\x01')>"
136 )
Paul Kehrer14fd6972015-12-30 10:58:25 -0600137
138 def test_hash(self):
139 ext1 = x509.UnrecognizedExtension(
140 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
141 )
142 ext2 = x509.UnrecognizedExtension(
143 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
144 )
145 ext3 = x509.UnrecognizedExtension(
146 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
147 )
148 assert hash(ext1) == hash(ext2)
149 assert hash(ext1) != hash(ext3)
150
151
Paul Kehrer49bb7562015-12-25 16:17:40 -0600152class TestCertificateIssuer(object):
153 def test_iter_names(self):
154 ci = x509.CertificateIssuer([
155 x509.DNSName(u"cryptography.io"),
156 x509.DNSName(u"crypto.local"),
157 ])
158 assert len(ci) == 2
159 assert list(ci) == [
160 x509.DNSName(u"cryptography.io"),
161 x509.DNSName(u"crypto.local"),
162 ]
163
Paul Kehrer5c999d32015-12-26 17:45:20 -0600164 def test_indexing(self):
165 ci = x509.CertificateIssuer([
166 x509.DNSName(u"cryptography.io"),
167 x509.DNSName(u"crypto.local"),
168 x509.DNSName(u"another.local"),
169 x509.RFC822Name(u"email@another.local"),
170 x509.UniformResourceIdentifier(u"http://another.local"),
171 ])
172 assert ci[-1] == ci[4]
173 assert ci[2:6:2] == [ci[2], ci[4]]
174
Paul Kehrer49bb7562015-12-25 16:17:40 -0600175 def test_eq(self):
176 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
177 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
178 assert ci1 == ci2
179
180 def test_ne(self):
181 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
182 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
183 assert ci1 != ci2
184 assert ci1 != object()
185
186 def test_repr(self):
187 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
188 assert repr(ci) == (
189 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
190 ")>])>)>"
191 )
192
193 def test_get_values_for_type(self):
194 ci = x509.CertificateIssuer(
195 [x509.DNSName(u"cryptography.io")]
196 )
197 names = ci.get_values_for_type(x509.DNSName)
198 assert names == [u"cryptography.io"]
199
200
Paul Kehrer7058ece2015-12-25 22:28:29 -0600201class TestCRLReason(object):
202 def test_invalid_reason_flags(self):
203 with pytest.raises(TypeError):
204 x509.CRLReason("notareason")
205
206 def test_eq(self):
207 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
208 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
209 assert reason1 == reason2
210
211 def test_ne(self):
212 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
213 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
214 assert reason1 != reason2
215 assert reason1 != object()
216
Alex Gaynor07d5cae2015-12-27 15:30:39 -0500217 def test_hash(self):
218 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
219 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
220 reason3 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
221
222 assert hash(reason1) == hash(reason2)
223 assert hash(reason1) != hash(reason3)
224
Paul Kehrer7058ece2015-12-25 22:28:29 -0600225 def test_repr(self):
226 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
227 assert repr(reason1) == (
228 "<CRLReason(reason=ReasonFlags.unspecified)>"
229 )
230
231
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600232class TestInvalidityDate(object):
233 def test_invalid_invalidity_date(self):
234 with pytest.raises(TypeError):
235 x509.InvalidityDate("notadate")
236
237 def test_eq(self):
238 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
239 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
240 assert invalid1 == invalid2
241
242 def test_ne(self):
243 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
244 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
245 assert invalid1 != invalid2
246 assert invalid1 != object()
247
248 def test_repr(self):
249 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
250 assert repr(invalid1) == (
251 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
252 )
253
Paul Kehrer67cde762015-12-26 11:37:14 -0600254 def test_hash(self):
255 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
256 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
257 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
258 assert hash(invalid1) == hash(invalid2)
259 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600260
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600261
Paul Kehrer2b622582015-04-15 11:04:29 -0400262class TestNoticeReference(object):
263 def test_notice_numbers_not_all_int(self):
264 with pytest.raises(TypeError):
265 x509.NoticeReference("org", [1, 2, "three"])
266
267 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500268 with pytest.raises(TypeError):
269 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400270
Marti40f19992016-08-26 04:26:31 +0300271 def test_iter_input(self):
272 numbers = [1, 3, 4]
273 nr = x509.NoticeReference(u"org", iter(numbers))
274 assert list(nr.notice_numbers) == numbers
275
Paul Kehrer2b622582015-04-15 11:04:29 -0400276 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500277 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400278
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500279 if six.PY3:
280 assert repr(nr) == (
281 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
282 "])>"
283 )
284 else:
285 assert repr(nr) == (
286 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
287 "4])>"
288 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400289
Paul Kehrerc56ab622015-05-03 09:56:31 -0500290 def test_eq(self):
291 nr = x509.NoticeReference("org", [1, 2])
292 nr2 = x509.NoticeReference("org", [1, 2])
293 assert nr == nr2
294
295 def test_ne(self):
296 nr = x509.NoticeReference("org", [1, 2])
297 nr2 = x509.NoticeReference("org", [1])
298 nr3 = x509.NoticeReference(None, [1, 2])
299 assert nr != nr2
300 assert nr != nr3
301 assert nr != object()
302
Paul Kehrer2b622582015-04-15 11:04:29 -0400303
304class TestUserNotice(object):
305 def test_notice_reference_invalid(self):
306 with pytest.raises(TypeError):
307 x509.UserNotice("invalid", None)
308
309 def test_notice_reference_none(self):
310 un = x509.UserNotice(None, "text")
311 assert un.notice_reference is None
312 assert un.explicit_text == "text"
313
314 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500315 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500316 if six.PY3:
317 assert repr(un) == (
318 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500319 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500320 )
321 else:
322 assert repr(un) == (
323 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500324 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500325 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400326
Paul Kehrerc56ab622015-05-03 09:56:31 -0500327 def test_eq(self):
328 nr = x509.NoticeReference("org", [1, 2])
329 nr2 = x509.NoticeReference("org", [1, 2])
330 un = x509.UserNotice(nr, "text")
331 un2 = x509.UserNotice(nr2, "text")
332 assert un == un2
333
334 def test_ne(self):
335 nr = x509.NoticeReference("org", [1, 2])
336 nr2 = x509.NoticeReference("org", [1])
337 un = x509.UserNotice(nr, "text")
338 un2 = x509.UserNotice(nr2, "text")
339 un3 = x509.UserNotice(nr, "text3")
340 assert un != un2
341 assert un != un3
342 assert un != object()
343
Paul Kehrer2b622582015-04-15 11:04:29 -0400344
Paul Kehrer2b622582015-04-15 11:04:29 -0400345class TestPolicyInformation(object):
346 def test_invalid_policy_identifier(self):
347 with pytest.raises(TypeError):
348 x509.PolicyInformation("notanoid", None)
349
350 def test_none_policy_qualifiers(self):
351 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
352 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
353 assert pi.policy_qualifiers is None
354
355 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500356 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400357 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
358 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
359 assert pi.policy_qualifiers == pq
360
361 def test_invalid_policy_identifiers(self):
362 with pytest.raises(TypeError):
363 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
364
Marti40f19992016-08-26 04:26:31 +0300365 def test_iter_input(self):
366 qual = [u"foo", u"bar"]
367 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), iter(qual))
368 assert list(pi.policy_qualifiers) == qual
369
Paul Kehrer2b622582015-04-15 11:04:29 -0400370 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500371 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400372 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500373 if six.PY3:
374 assert repr(pi) == (
375 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
376 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500377 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500378 )
379 else:
380 assert repr(pi) == (
381 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
382 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500383 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500384 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400385
Paul Kehrerc56ab622015-05-03 09:56:31 -0500386 def test_eq(self):
387 pi = x509.PolicyInformation(
388 x509.ObjectIdentifier("1.2.3"),
389 [u"string", x509.UserNotice(None, u"hi")]
390 )
391 pi2 = x509.PolicyInformation(
392 x509.ObjectIdentifier("1.2.3"),
393 [u"string", x509.UserNotice(None, u"hi")]
394 )
395 assert pi == pi2
396
397 def test_ne(self):
398 pi = x509.PolicyInformation(
399 x509.ObjectIdentifier("1.2.3"), [u"string"]
400 )
401 pi2 = x509.PolicyInformation(
402 x509.ObjectIdentifier("1.2.3"), [u"string2"]
403 )
404 pi3 = x509.PolicyInformation(
405 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
406 )
407 assert pi != pi2
408 assert pi != pi3
409 assert pi != object()
410
Paul Kehrer2b622582015-04-15 11:04:29 -0400411
412class TestCertificatePolicies(object):
413 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500414 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400415 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
416 with pytest.raises(TypeError):
417 x509.CertificatePolicies([1, pi])
418
419 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500420 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400421 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
422 cp = x509.CertificatePolicies([pi])
423 assert len(cp) == 1
424 for policyinfo in cp:
425 assert policyinfo == pi
426
Marti40f19992016-08-26 04:26:31 +0300427 def test_iter_input(self):
428 policies = [
429 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"string"])
430 ]
431 cp = x509.CertificatePolicies(iter(policies))
432 assert list(cp) == policies
433
Paul Kehrer2b622582015-04-15 11:04:29 -0400434 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500435 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400436 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
437 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500438 if six.PY3:
439 assert repr(cp) == (
440 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
441 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
442 "ers=['string'])>])>"
443 )
444 else:
445 assert repr(cp) == (
446 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
447 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
448 "ers=[u'string'])>])>"
449 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400450
Paul Kehrerc56ab622015-05-03 09:56:31 -0500451 def test_eq(self):
452 pi = x509.PolicyInformation(
453 x509.ObjectIdentifier("1.2.3"), [u"string"]
454 )
455 cp = x509.CertificatePolicies([pi])
456 pi2 = x509.PolicyInformation(
457 x509.ObjectIdentifier("1.2.3"), [u"string"]
458 )
459 cp2 = x509.CertificatePolicies([pi2])
460 assert cp == cp2
461
462 def test_ne(self):
463 pi = x509.PolicyInformation(
464 x509.ObjectIdentifier("1.2.3"), [u"string"]
465 )
466 cp = x509.CertificatePolicies([pi])
467 pi2 = x509.PolicyInformation(
468 x509.ObjectIdentifier("1.2.3"), [u"string2"]
469 )
470 cp2 = x509.CertificatePolicies([pi2])
471 assert cp != cp2
472 assert cp != object()
473
Paul Kehrere8db7bd2015-12-27 17:32:57 -0600474 def test_indexing(self):
475 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"test"])
476 pi2 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.4"), [u"test"])
477 pi3 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.5"), [u"test"])
478 pi4 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.6"), [u"test"])
479 pi5 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.7"), [u"test"])
480 cp = x509.CertificatePolicies([pi, pi2, pi3, pi4, pi5])
481 assert cp[-1] == cp[4]
482 assert cp[2:6:2] == [cp[2], cp[4]]
483
Paul Kehrer2b622582015-04-15 11:04:29 -0400484
Paul Kehrer11026fe2015-05-12 11:23:56 -0500485@pytest.mark.requires_backend_interface(interface=RSABackend)
486@pytest.mark.requires_backend_interface(interface=X509Backend)
487class TestCertificatePoliciesExtension(object):
488 def test_cps_uri_policy_qualifier(self, backend):
489 cert = _load_cert(
490 os.path.join("x509", "custom", "cp_cps_uri.pem"),
491 x509.load_pem_x509_certificate,
492 backend
493 )
494
495 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500496 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500497 ).value
498
499 assert cp == x509.CertificatePolicies([
500 x509.PolicyInformation(
501 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
502 [u"http://other.com/cps"]
503 )
504 ])
505
506 def test_user_notice_with_notice_reference(self, backend):
507 cert = _load_cert(
508 os.path.join(
509 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
510 ),
511 x509.load_pem_x509_certificate,
512 backend
513 )
514
515 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500516 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500517 ).value
518
519 assert cp == x509.CertificatePolicies([
520 x509.PolicyInformation(
521 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
522 [
523 u"http://example.com/cps",
524 u"http://other.com/cps",
525 x509.UserNotice(
526 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
527 u"thing"
528 )
529 ]
530 )
531 ])
532
533 def test_user_notice_with_explicit_text(self, backend):
534 cert = _load_cert(
535 os.path.join(
536 "x509", "custom", "cp_user_notice_with_explicit_text.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 [x509.UserNotice(None, u"thing")]
550 )
551 ])
552
553 def test_user_notice_no_explicit_text(self, backend):
554 cert = _load_cert(
555 os.path.join(
556 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
557 ),
558 x509.load_pem_x509_certificate,
559 backend
560 )
561
562 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500563 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500564 ).value
565
566 assert cp == x509.CertificatePolicies([
567 x509.PolicyInformation(
568 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
569 [
570 x509.UserNotice(
571 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
572 None
573 )
574 ]
575 )
576 ])
577
578
Paul Kehrercecbbba2015-03-30 14:58:38 -0500579class TestKeyUsage(object):
580 def test_key_agreement_false_encipher_decipher_true(self):
581 with pytest.raises(ValueError):
582 x509.KeyUsage(
583 digital_signature=False,
584 content_commitment=False,
585 key_encipherment=False,
586 data_encipherment=False,
587 key_agreement=False,
588 key_cert_sign=False,
589 crl_sign=False,
590 encipher_only=True,
591 decipher_only=False
592 )
593
594 with pytest.raises(ValueError):
595 x509.KeyUsage(
596 digital_signature=False,
597 content_commitment=False,
598 key_encipherment=False,
599 data_encipherment=False,
600 key_agreement=False,
601 key_cert_sign=False,
602 crl_sign=False,
603 encipher_only=True,
604 decipher_only=True
605 )
606
607 with pytest.raises(ValueError):
608 x509.KeyUsage(
609 digital_signature=False,
610 content_commitment=False,
611 key_encipherment=False,
612 data_encipherment=False,
613 key_agreement=False,
614 key_cert_sign=False,
615 crl_sign=False,
616 encipher_only=False,
617 decipher_only=True
618 )
619
620 def test_properties_key_agreement_true(self):
621 ku = x509.KeyUsage(
622 digital_signature=True,
623 content_commitment=True,
624 key_encipherment=False,
625 data_encipherment=False,
626 key_agreement=False,
627 key_cert_sign=True,
628 crl_sign=False,
629 encipher_only=False,
630 decipher_only=False
631 )
632 assert ku.digital_signature is True
633 assert ku.content_commitment is True
634 assert ku.key_encipherment is False
635 assert ku.data_encipherment is False
636 assert ku.key_agreement is False
637 assert ku.key_cert_sign is True
638 assert ku.crl_sign is False
639
640 def test_key_agreement_true_properties(self):
641 ku = x509.KeyUsage(
642 digital_signature=False,
643 content_commitment=False,
644 key_encipherment=False,
645 data_encipherment=False,
646 key_agreement=True,
647 key_cert_sign=False,
648 crl_sign=False,
649 encipher_only=False,
650 decipher_only=True
651 )
652 assert ku.key_agreement is True
653 assert ku.encipher_only is False
654 assert ku.decipher_only is True
655
656 def test_key_agreement_false_properties(self):
657 ku = x509.KeyUsage(
658 digital_signature=False,
659 content_commitment=False,
660 key_encipherment=False,
661 data_encipherment=False,
662 key_agreement=False,
663 key_cert_sign=False,
664 crl_sign=False,
665 encipher_only=False,
666 decipher_only=False
667 )
668 assert ku.key_agreement is False
669 with pytest.raises(ValueError):
670 ku.encipher_only
671
672 with pytest.raises(ValueError):
673 ku.decipher_only
674
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500675 def test_repr_key_agreement_false(self):
676 ku = x509.KeyUsage(
677 digital_signature=True,
678 content_commitment=True,
679 key_encipherment=False,
680 data_encipherment=False,
681 key_agreement=False,
682 key_cert_sign=True,
683 crl_sign=False,
684 encipher_only=False,
685 decipher_only=False
686 )
687 assert repr(ku) == (
688 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
689 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400690 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
691 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500692 )
693
694 def test_repr_key_agreement_true(self):
695 ku = x509.KeyUsage(
696 digital_signature=True,
697 content_commitment=True,
698 key_encipherment=False,
699 data_encipherment=False,
700 key_agreement=True,
701 key_cert_sign=True,
702 crl_sign=False,
703 encipher_only=False,
704 decipher_only=False
705 )
706 assert repr(ku) == (
707 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
708 "cipherment=False, data_encipherment=False, key_agreement=True, k"
709 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
710 "only=False)>"
711 )
712
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500713 def test_eq(self):
714 ku = x509.KeyUsage(
715 digital_signature=False,
716 content_commitment=False,
717 key_encipherment=False,
718 data_encipherment=False,
719 key_agreement=True,
720 key_cert_sign=False,
721 crl_sign=False,
722 encipher_only=False,
723 decipher_only=True
724 )
725 ku2 = x509.KeyUsage(
726 digital_signature=False,
727 content_commitment=False,
728 key_encipherment=False,
729 data_encipherment=False,
730 key_agreement=True,
731 key_cert_sign=False,
732 crl_sign=False,
733 encipher_only=False,
734 decipher_only=True
735 )
736 assert ku == ku2
737
738 def test_ne(self):
739 ku = x509.KeyUsage(
740 digital_signature=False,
741 content_commitment=False,
742 key_encipherment=False,
743 data_encipherment=False,
744 key_agreement=True,
745 key_cert_sign=False,
746 crl_sign=False,
747 encipher_only=False,
748 decipher_only=True
749 )
750 ku2 = x509.KeyUsage(
751 digital_signature=False,
752 content_commitment=False,
753 key_encipherment=False,
754 data_encipherment=False,
755 key_agreement=False,
756 key_cert_sign=False,
757 crl_sign=False,
758 encipher_only=False,
759 decipher_only=False
760 )
761 assert ku != ku2
762 assert ku != object()
763
Paul Kehrercecbbba2015-03-30 14:58:38 -0500764
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500765class TestSubjectKeyIdentifier(object):
766 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400767 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500768 ski = x509.SubjectKeyIdentifier(value)
769 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500770
771 def test_repr(self):
772 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500773 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500774 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500775 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400776 if six.PY3:
777 assert repr(ext) == (
778 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
779 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
780 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
781 "\\xf7\\xff:\\xc9\')>)>"
782 )
783 else:
784 assert repr(ext) == (
785 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
786 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
787 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
788 "\\xf7\\xff:\\xc9\')>)>"
789 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500790
791 def test_eq(self):
792 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500793 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500794 )
795 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500796 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500797 )
798 assert ski == ski2
799
800 def test_ne(self):
801 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500802 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500803 )
804 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500805 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500806 )
807 assert ski != ski2
808 assert ski != object()
809
Alex Gaynor410fe352015-12-26 15:01:25 -0500810 def test_hash(self):
811 ski1 = x509.SubjectKeyIdentifier(
812 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
813 )
814 ski2 = x509.SubjectKeyIdentifier(
815 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
816 )
817 ski3 = x509.SubjectKeyIdentifier(
818 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
819 )
820
821 assert hash(ski1) == hash(ski2)
822 assert hash(ski1) != hash(ski3)
823
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500824
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400825class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500826 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400827 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500828 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400829
830 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500831 dirname = x509.DirectoryName(
832 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800833 x509.NameAttribute(
834 x509.ObjectIdentifier('2.999.1'),
835 u'value1'
836 ),
837 x509.NameAttribute(
838 x509.ObjectIdentifier('2.999.2'),
839 u'value2'
840 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500841 ])
842 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400843 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500844 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400845
846 def test_authority_issuer_none_serial_not_none(self):
847 with pytest.raises(ValueError):
848 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
849
850 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500851 dirname = x509.DirectoryName(
852 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800853 x509.NameAttribute(
854 x509.ObjectIdentifier('2.999.1'),
855 u'value1'
856 ),
857 x509.NameAttribute(
858 x509.ObjectIdentifier('2.999.2'),
859 u'value2'
860 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500861 ])
862 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400863 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500864 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400865
866 def test_authority_cert_serial_and_issuer_none(self):
867 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
868 assert aki.key_identifier == b"id"
869 assert aki.authority_cert_issuer is None
870 assert aki.authority_cert_serial_number is None
871
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600872 def test_authority_cert_serial_zero(self):
873 dns = x509.DNSName(u"SomeIssuer")
874 aki = x509.AuthorityKeyIdentifier(b"id", [dns], 0)
875 assert aki.key_identifier == b"id"
876 assert aki.authority_cert_issuer == [dns]
877 assert aki.authority_cert_serial_number == 0
878
Marti40f19992016-08-26 04:26:31 +0300879 def test_iter_input(self):
880 dirnames = [
881 x509.DirectoryName(
882 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
883 )
884 ]
885 aki = x509.AuthorityKeyIdentifier(b"digest", iter(dirnames), 1234)
886 assert list(aki.authority_cert_issuer) == dirnames
887
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400888 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500889 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500890 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500891 )
892 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400893
894 if six.PY3:
895 assert repr(aki) == (
896 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500897 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500898 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500899 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400900 )
901 else:
902 assert repr(aki) == (
903 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500904 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500905 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
906 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400907 )
908
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500909 def test_eq(self):
910 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500911 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500912 )
913 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
914 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500915 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500916 )
917 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
918 assert aki == aki2
919
920 def test_ne(self):
921 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500922 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500923 )
924 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500925 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500926 )
927 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
928 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
929 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
930 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
931 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
932 assert aki != aki2
933 assert aki != aki3
934 assert aki != aki4
935 assert aki != aki5
936 assert aki != object()
937
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400938
Paul Kehrer8cf26422015-03-21 09:50:24 -0500939class TestBasicConstraints(object):
940 def test_ca_not_boolean(self):
941 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500942 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500943
944 def test_path_length_not_ca(self):
945 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500946 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500947
948 def test_path_length_not_int(self):
949 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500950 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500951
952 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500953 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500954
955 def test_path_length_negative(self):
956 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500957 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500958
959 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500960 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500961 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500962 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500963 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500964
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600965 def test_hash(self):
966 na = x509.BasicConstraints(ca=True, path_length=None)
967 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600968 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600969 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600970 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600971
Paul Kehrer3a69b132015-05-13 10:03:46 -0500972 def test_eq(self):
973 na = x509.BasicConstraints(ca=True, path_length=None)
974 na2 = x509.BasicConstraints(ca=True, path_length=None)
975 assert na == na2
976
977 def test_ne(self):
978 na = x509.BasicConstraints(ca=True, path_length=None)
979 na2 = x509.BasicConstraints(ca=True, path_length=1)
980 na3 = x509.BasicConstraints(ca=False, path_length=None)
981 assert na != na2
982 assert na != na3
983 assert na != object()
984
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500985
Paul Kehrerffa2a152015-03-31 08:18:25 -0500986class TestExtendedKeyUsage(object):
987 def test_not_all_oids(self):
988 with pytest.raises(TypeError):
989 x509.ExtendedKeyUsage(["notoid"])
990
991 def test_iter_len(self):
992 eku = x509.ExtendedKeyUsage([
993 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
994 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
995 ])
996 assert len(eku) == 2
997 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500998 ExtendedKeyUsageOID.SERVER_AUTH,
999 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -05001000 ]
1001
Marti40f19992016-08-26 04:26:31 +03001002 def test_iter_input(self):
1003 usages = [
1004 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1005 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1006 ]
1007 aia = x509.ExtendedKeyUsage(iter(usages))
1008 assert list(aia) == usages
1009
Paul Kehrer23d10c32015-04-02 23:12:32 -05001010 def test_repr(self):
1011 eku = x509.ExtendedKeyUsage([
1012 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1013 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1014 ])
1015 assert repr(eku) == (
1016 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
1017 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
1018 "tAuth)>])>"
1019 )
1020
Paul Kehrerb0476172015-05-02 19:34:51 -05001021 def test_eq(self):
1022 eku = x509.ExtendedKeyUsage([
1023 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1024 ])
1025 eku2 = x509.ExtendedKeyUsage([
1026 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
1027 ])
1028 assert eku == eku2
1029
1030 def test_ne(self):
1031 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
1032 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
1033 assert eku != eku2
1034 assert eku != object()
1035
Paul Kehrerffa2a152015-03-31 08:18:25 -05001036
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001037@pytest.mark.requires_backend_interface(interface=RSABackend)
1038@pytest.mark.requires_backend_interface(interface=X509Backend)
1039class TestExtensions(object):
1040 def test_no_extensions(self, backend):
1041 cert = _load_cert(
1042 os.path.join("x509", "verisign_md2_root.pem"),
1043 x509.load_pem_x509_certificate,
1044 backend
1045 )
1046 ext = cert.extensions
1047 assert len(ext) == 0
1048 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -05001049 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001050 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001051
Paul Kehrerd44e4132015-08-10 19:13:13 -05001052 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001053
1054 def test_one_extension(self, backend):
1055 cert = _load_cert(
1056 os.path.join(
1057 "x509", "custom", "basic_constraints_not_critical.pem"
1058 ),
1059 x509.load_pem_x509_certificate,
1060 backend
1061 )
1062 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001063 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001064 assert ext is not None
1065 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001066
1067 def test_duplicate_extension(self, backend):
1068 cert = _load_cert(
1069 os.path.join(
1070 "x509", "custom", "two_basic_constraints.pem"
1071 ),
1072 x509.load_pem_x509_certificate,
1073 backend
1074 )
1075 with pytest.raises(x509.DuplicateExtension) as exc:
1076 cert.extensions
1077
Paul Kehrerd44e4132015-08-10 19:13:13 -05001078 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001079
1080 def test_unsupported_critical_extension(self, backend):
1081 cert = _load_cert(
1082 os.path.join(
1083 "x509", "custom", "unsupported_extension_critical.pem"
1084 ),
1085 x509.load_pem_x509_certificate,
1086 backend
1087 )
1088 with pytest.raises(x509.UnsupportedExtension) as exc:
1089 cert.extensions
1090
1091 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
1092
Paul Kehrer58ddc112015-12-30 20:19:00 -06001093 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001094 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001095 cert = _load_cert(
1096 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001097 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001098 ),
1099 x509.load_pem_x509_certificate,
1100 backend
1101 )
1102 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001103 assert len(extensions) == 2
1104 assert extensions[0].critical is False
1105 assert extensions[0].oid == x509.ObjectIdentifier(
1106 "1.3.6.1.4.1.41482.2"
1107 )
1108 assert extensions[0].value == x509.UnrecognizedExtension(
1109 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1110 b"1.3.6.1.4.1.41482.1.2"
1111 )
1112 assert extensions[1].critical is False
1113 assert extensions[1].oid == x509.ObjectIdentifier(
1114 "1.3.6.1.4.1.45724.2.1.1"
1115 )
1116 assert extensions[1].value == x509.UnrecognizedExtension(
1117 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1118 b"\x03\x02\x040"
1119 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001120
Phoebe Queenecae9812015-08-12 05:00:32 +01001121 def test_no_extensions_get_for_class(self, backend):
1122 cert = _load_cert(
1123 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001124 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001125 ),
1126 x509.load_pem_x509_certificate,
1127 backend
1128 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001129 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001130 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001131 exts.get_extension_for_class(x509.IssuerAlternativeName)
1132 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001133
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001134 def test_unrecognized_extension_for_class(self):
1135 exts = x509.Extensions([])
1136 with pytest.raises(TypeError):
1137 exts.get_extension_for_class(x509.UnrecognizedExtension)
1138
Paul Kehrer5b90c972015-12-26 00:52:58 -06001139 def test_indexing(self, backend):
1140 cert = _load_cert(
1141 os.path.join("x509", "cryptography.io.pem"),
1142 x509.load_pem_x509_certificate,
1143 backend
1144 )
1145 exts = cert.extensions
1146 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001147 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001148
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001149 def test_one_extension_get_for_class(self, backend):
1150 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001151 os.path.join(
1152 "x509", "custom", "basic_constraints_not_critical.pem"
1153 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001154 x509.load_pem_x509_certificate,
1155 backend
1156 )
1157 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1158 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001159 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001160
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001161 def test_repr(self, backend):
1162 cert = _load_cert(
1163 os.path.join(
1164 "x509", "custom", "basic_constraints_not_critical.pem"
1165 ),
1166 x509.load_pem_x509_certificate,
1167 backend
1168 )
1169 assert repr(cert.extensions) == (
1170 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1171 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1172 "alse, path_length=None)>)>])>"
1173 )
1174
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001175
Paul Kehrerfa56a232015-03-17 13:14:03 -05001176@pytest.mark.requires_backend_interface(interface=RSABackend)
1177@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001178class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001179 def test_ca_true_pathlen_6(self, backend):
1180 cert = _load_cert(
1181 os.path.join(
1182 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1183 ),
1184 x509.load_der_x509_certificate,
1185 backend
1186 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001187 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001188 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001189 )
1190 assert ext is not None
1191 assert ext.critical is True
1192 assert ext.value.ca is True
1193 assert ext.value.path_length == 6
1194
1195 def test_path_length_zero(self, backend):
1196 cert = _load_cert(
1197 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1198 x509.load_pem_x509_certificate,
1199 backend
1200 )
1201 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001202 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001203 )
1204 assert ext is not None
1205 assert ext.critical is True
1206 assert ext.value.ca is True
1207 assert ext.value.path_length == 0
1208
1209 def test_ca_true_no_pathlen(self, backend):
1210 cert = _load_cert(
1211 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1212 x509.load_der_x509_certificate,
1213 backend
1214 )
1215 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001216 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001217 )
1218 assert ext is not None
1219 assert ext.critical is True
1220 assert ext.value.ca is True
1221 assert ext.value.path_length is None
1222
1223 def test_ca_false(self, backend):
1224 cert = _load_cert(
1225 os.path.join("x509", "cryptography.io.pem"),
1226 x509.load_pem_x509_certificate,
1227 backend
1228 )
1229 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001230 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001231 )
1232 assert ext is not None
1233 assert ext.critical is True
1234 assert ext.value.ca is False
1235 assert ext.value.path_length is None
1236
1237 def test_no_basic_constraints(self, backend):
1238 cert = _load_cert(
1239 os.path.join(
1240 "x509",
1241 "PKITS_data",
1242 "certs",
1243 "ValidCertificatePathTest1EE.crt"
1244 ),
1245 x509.load_der_x509_certificate,
1246 backend
1247 )
1248 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001249 cert.extensions.get_extension_for_oid(
1250 ExtensionOID.BASIC_CONSTRAINTS
1251 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001252
1253 def test_basic_constraint_not_critical(self, backend):
1254 cert = _load_cert(
1255 os.path.join(
1256 "x509", "custom", "basic_constraints_not_critical.pem"
1257 ),
1258 x509.load_pem_x509_certificate,
1259 backend
1260 )
1261 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001262 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001263 )
1264 assert ext is not None
1265 assert ext.critical is False
1266 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001267
1268
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001269class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001270 @pytest.mark.requires_backend_interface(interface=RSABackend)
1271 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001272 def test_subject_key_identifier(self, backend):
1273 cert = _load_cert(
1274 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1275 x509.load_der_x509_certificate,
1276 backend
1277 )
1278 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001279 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001280 )
1281 ski = ext.value
1282 assert ext is not None
1283 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001284 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001285 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001286 )
1287
Paul Kehrerf22f6122015-08-05 12:57:13 +01001288 @pytest.mark.requires_backend_interface(interface=RSABackend)
1289 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001290 def test_no_subject_key_identifier(self, backend):
1291 cert = _load_cert(
1292 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1293 x509.load_pem_x509_certificate,
1294 backend
1295 )
1296 with pytest.raises(x509.ExtensionNotFound):
1297 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001298 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001299 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001300
Paul Kehrerf22f6122015-08-05 12:57:13 +01001301 @pytest.mark.requires_backend_interface(interface=RSABackend)
1302 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001303 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001304 cert = _load_cert(
1305 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1306 x509.load_der_x509_certificate,
1307 backend
1308 )
1309 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001310 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001311 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001312 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001313 cert.public_key()
1314 )
1315 assert ext.value == ski
1316
1317 @pytest.mark.requires_backend_interface(interface=DSABackend)
1318 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001319 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001320 cert = _load_cert(
1321 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1322 x509.load_pem_x509_certificate,
1323 backend
1324 )
1325
1326 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001327 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001328 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001329 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001330 cert.public_key()
1331 )
1332 assert ext.value == ski
1333
1334 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1335 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001336 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001337 _skip_curve_unsupported(backend, ec.SECP384R1())
1338 cert = _load_cert(
1339 os.path.join("x509", "ecdsa_root.pem"),
1340 x509.load_pem_x509_certificate,
1341 backend
1342 )
1343
1344 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001345 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001346 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001347 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001348 cert.public_key()
1349 )
1350 assert ext.value == ski
1351
Paul Kehrer5508ee22015-04-02 19:31:03 -05001352
1353@pytest.mark.requires_backend_interface(interface=RSABackend)
1354@pytest.mark.requires_backend_interface(interface=X509Backend)
1355class TestKeyUsageExtension(object):
1356 def test_no_key_usage(self, backend):
1357 cert = _load_cert(
1358 os.path.join("x509", "verisign_md2_root.pem"),
1359 x509.load_pem_x509_certificate,
1360 backend
1361 )
1362 ext = cert.extensions
1363 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001364 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001365
Paul Kehrerd44e4132015-08-10 19:13:13 -05001366 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001367
1368 def test_all_purposes(self, backend):
1369 cert = _load_cert(
1370 os.path.join(
1371 "x509", "custom", "all_key_usages.pem"
1372 ),
1373 x509.load_pem_x509_certificate,
1374 backend
1375 )
1376 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001377 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001378 assert ext is not None
1379
1380 ku = ext.value
1381 assert ku.digital_signature is True
1382 assert ku.content_commitment is True
1383 assert ku.key_encipherment is True
1384 assert ku.data_encipherment is True
1385 assert ku.key_agreement is True
1386 assert ku.key_cert_sign is True
1387 assert ku.crl_sign is True
1388 assert ku.encipher_only is True
1389 assert ku.decipher_only is True
1390
1391 def test_key_cert_sign_crl_sign(self, backend):
1392 cert = _load_cert(
1393 os.path.join(
1394 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1395 ),
1396 x509.load_der_x509_certificate,
1397 backend
1398 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001399 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001400 assert ext is not None
1401 assert ext.critical is True
1402
1403 ku = ext.value
1404 assert ku.digital_signature is False
1405 assert ku.content_commitment is False
1406 assert ku.key_encipherment is False
1407 assert ku.data_encipherment is False
1408 assert ku.key_agreement is False
1409 assert ku.key_cert_sign is True
1410 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001411
1412
1413@pytest.mark.parametrize(
1414 "name", [
1415 x509.RFC822Name,
1416 x509.DNSName,
1417 x509.UniformResourceIdentifier
1418 ]
1419)
1420class TestTextGeneralNames(object):
1421 def test_not_text(self, name):
1422 with pytest.raises(TypeError):
1423 name(b"notaunicodestring")
1424
1425 with pytest.raises(TypeError):
1426 name(1.3)
1427
1428 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301429 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001430 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1431
1432 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301433 gn = name(u"string")
1434 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001435 assert gn == gn2
1436
1437 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301438 gn = name(u"string")
1439 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001440 assert gn != gn2
1441 assert gn != object()
1442
1443
1444class TestDirectoryName(object):
1445 def test_not_name(self):
1446 with pytest.raises(TypeError):
1447 x509.DirectoryName(b"notaname")
1448
1449 with pytest.raises(TypeError):
1450 x509.DirectoryName(1.3)
1451
1452 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001453 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Marti40f19992016-08-26 04:26:31 +03001454 gn = x509.DirectoryName(name)
Ian Cordascoa908d692015-06-16 21:35:24 -05001455 if six.PY3:
1456 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001457 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1458 "ier(oid=2.5.4.3, name=commonName)>, value='value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001459 )
1460 else:
1461 assert repr(gn) == (
Marti40f19992016-08-26 04:26:31 +03001462 "<DirectoryName(value=<Name([<NameAttribute(oid=<ObjectIdentif"
1463 "ier(oid=2.5.4.3, name=commonName)>, value=u'value1')>])>)>"
Ian Cordascoa908d692015-06-16 21:35:24 -05001464 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001465
1466 def test_eq(self):
1467 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001468 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001469 ])
1470 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001471 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001472 ])
Marti40f19992016-08-26 04:26:31 +03001473 gn = x509.DirectoryName(name)
1474 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001475 assert gn == gn2
1476
1477 def test_ne(self):
1478 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001479 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001480 ])
1481 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001482 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001483 ])
Marti40f19992016-08-26 04:26:31 +03001484 gn = x509.DirectoryName(name)
1485 gn2 = x509.DirectoryName(name2)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001486 assert gn != gn2
1487 assert gn != object()
1488
1489
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001490class TestRFC822Name(object):
1491 def test_invalid_email(self):
1492 with pytest.raises(ValueError):
1493 x509.RFC822Name(u"Name <email>")
1494
1495 with pytest.raises(ValueError):
1496 x509.RFC822Name(u"")
1497
1498 def test_single_label(self):
1499 gn = x509.RFC822Name(u"administrator")
1500 assert gn.value == u"administrator"
1501
1502 def test_idna(self):
1503 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1504 assert gn.value == u"email@em\xe5\xefl.com"
1505 assert gn._encoded == b"email@xn--eml-vla4c.com"
1506
Alex Gaynorb642dee2016-01-03 15:12:23 -05001507 def test_hash(self):
1508 g1 = x509.RFC822Name(u"email@host.com")
1509 g2 = x509.RFC822Name(u"email@host.com")
1510 g3 = x509.RFC822Name(u"admin@host.com")
1511
1512 assert hash(g1) == hash(g2)
1513 assert hash(g1) != hash(g3)
1514
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001515
Paul Kehrere28d6c42015-07-12 14:59:37 -05001516class TestUniformResourceIdentifier(object):
1517 def test_no_parsed_hostname(self):
1518 gn = x509.UniformResourceIdentifier(u"singlelabel")
1519 assert gn.value == u"singlelabel"
1520
1521 def test_with_port(self):
1522 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1523 assert gn.value == u"singlelabel:443/test"
1524
1525 def test_idna_no_port(self):
1526 gn = x509.UniformResourceIdentifier(
1527 u"http://\u043f\u044b\u043a\u0430.cryptography"
1528 )
1529 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1530 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1531
1532 def test_idna_with_port(self):
1533 gn = x509.UniformResourceIdentifier(
1534 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1535 )
1536 assert gn.value == (
1537 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1538 )
1539 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1540
1541 def test_query_and_fragment(self):
1542 gn = x509.UniformResourceIdentifier(
1543 u"ldap://cryptography:90/path?query=true#somedata"
1544 )
1545 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1546
Alex Gaynord1b56812016-01-03 15:14:34 -05001547 def test_hash(self):
1548 g1 = x509.UniformResourceIdentifier(u"http://host.com")
1549 g2 = x509.UniformResourceIdentifier(u"http://host.com")
1550 g3 = x509.UniformResourceIdentifier(u"http://other.com")
1551
1552 assert hash(g1) == hash(g2)
1553 assert hash(g1) != hash(g3)
1554
Paul Kehrere28d6c42015-07-12 14:59:37 -05001555
Paul Kehrer31bdf792015-03-25 14:11:00 -05001556class TestRegisteredID(object):
1557 def test_not_oid(self):
1558 with pytest.raises(TypeError):
1559 x509.RegisteredID(b"notanoid")
1560
1561 with pytest.raises(TypeError):
1562 x509.RegisteredID(1.3)
1563
1564 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001565 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001566 assert repr(gn) == (
1567 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1568 "e)>)>"
1569 )
1570
1571 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001572 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1573 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001574 assert gn == gn2
1575
1576 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001577 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001578 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001579 assert gn != gn2
1580 assert gn != object()
1581
1582
1583class TestIPAddress(object):
1584 def test_not_ipaddress(self):
1585 with pytest.raises(TypeError):
1586 x509.IPAddress(b"notanipaddress")
1587
1588 with pytest.raises(TypeError):
1589 x509.IPAddress(1.3)
1590
1591 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301592 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001593 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1594
Eeshan Gargf1234152015-04-29 18:41:00 +05301595 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001596 assert repr(gn2) == "<IPAddress(value=ff::)>"
1597
Paul Kehrereb177932015-05-17 18:33:33 -07001598 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1599 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1600
1601 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1602 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1603
Paul Kehrer31bdf792015-03-25 14:11:00 -05001604 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301605 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1606 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001607 assert gn == gn2
1608
1609 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301610 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1611 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001612 assert gn != gn2
1613 assert gn != object()
1614
1615
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001616class TestOtherName(object):
1617 def test_invalid_args(self):
1618 with pytest.raises(TypeError):
1619 x509.OtherName(b"notanobjectidentifier", b"derdata")
1620
1621 with pytest.raises(TypeError):
1622 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1623
1624 def test_repr(self):
1625 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1626 if six.PY3:
1627 assert repr(gn) == (
1628 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1629 "name=Unknown OID)>, value=b'derdata')>"
1630 )
1631 else:
1632 assert repr(gn) == (
1633 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1634 "name=Unknown OID)>, value='derdata')>"
1635 )
1636
1637 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1638 if six.PY3:
1639 assert repr(gn) == (
1640 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1641 "name=pseudonym)>, value=b'derdata')>"
1642 )
1643 else:
1644 assert repr(gn) == (
1645 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1646 "name=pseudonym)>, value='derdata')>"
1647 )
1648
1649 def test_eq(self):
1650 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1651 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1652 assert gn == gn2
1653
1654 def test_ne(self):
1655 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1656 assert gn != object()
1657
1658 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1659 assert gn != gn2
1660
1661 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1662 assert gn != gn2
1663
1664
Erik Trauschke2dcce902015-05-14 16:12:24 -07001665class TestGeneralNames(object):
1666 def test_get_values_for_type(self):
1667 gns = x509.GeneralNames(
1668 [x509.DNSName(u"cryptography.io")]
1669 )
1670 names = gns.get_values_for_type(x509.DNSName)
1671 assert names == [u"cryptography.io"]
1672
1673 def test_iter_names(self):
1674 gns = x509.GeneralNames([
1675 x509.DNSName(u"cryptography.io"),
1676 x509.DNSName(u"crypto.local"),
1677 ])
1678 assert len(gns) == 2
1679 assert list(gns) == [
1680 x509.DNSName(u"cryptography.io"),
1681 x509.DNSName(u"crypto.local"),
1682 ]
1683
Marti40f19992016-08-26 04:26:31 +03001684 def test_iter_input(self):
1685 names = [
1686 x509.DNSName(u"cryptography.io"),
1687 x509.DNSName(u"crypto.local"),
1688 ]
1689 gns = x509.GeneralNames(iter(names))
1690 assert list(gns) == names
1691
Paul Kehrer8adb5962015-12-26 14:46:58 -06001692 def test_indexing(self):
1693 gn = x509.GeneralNames([
1694 x509.DNSName(u"cryptography.io"),
1695 x509.DNSName(u"crypto.local"),
1696 x509.DNSName(u"another.local"),
1697 x509.RFC822Name(u"email@another.local"),
1698 x509.UniformResourceIdentifier(u"http://another.local"),
1699 ])
1700 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001701 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001702
Erik Trauschke2dcce902015-05-14 16:12:24 -07001703 def test_invalid_general_names(self):
1704 with pytest.raises(TypeError):
1705 x509.GeneralNames(
1706 [x509.DNSName(u"cryptography.io"), "invalid"]
1707 )
1708
1709 def test_repr(self):
1710 gns = x509.GeneralNames(
1711 [
1712 x509.DNSName(u"cryptography.io")
1713 ]
1714 )
1715 assert repr(gns) == (
1716 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1717 )
1718
1719 def test_eq(self):
1720 gns = x509.GeneralNames(
1721 [x509.DNSName(u"cryptography.io")]
1722 )
1723 gns2 = x509.GeneralNames(
1724 [x509.DNSName(u"cryptography.io")]
1725 )
1726 assert gns == gns2
1727
1728 def test_ne(self):
1729 gns = x509.GeneralNames(
1730 [x509.DNSName(u"cryptography.io")]
1731 )
1732 gns2 = x509.GeneralNames(
1733 [x509.RFC822Name(u"admin@cryptography.io")]
1734 )
1735 assert gns != gns2
1736 assert gns != object()
1737
1738
Paul Kehrer99125c92015-06-07 18:37:10 -05001739class TestIssuerAlternativeName(object):
1740 def test_get_values_for_type(self):
1741 san = x509.IssuerAlternativeName(
1742 [x509.DNSName(u"cryptography.io")]
1743 )
1744 names = san.get_values_for_type(x509.DNSName)
1745 assert names == [u"cryptography.io"]
1746
1747 def test_iter_names(self):
1748 san = x509.IssuerAlternativeName([
1749 x509.DNSName(u"cryptography.io"),
1750 x509.DNSName(u"crypto.local"),
1751 ])
1752 assert len(san) == 2
1753 assert list(san) == [
1754 x509.DNSName(u"cryptography.io"),
1755 x509.DNSName(u"crypto.local"),
1756 ]
1757
Paul Kehrer5c999d32015-12-26 17:45:20 -06001758 def test_indexing(self):
1759 ian = x509.IssuerAlternativeName([
1760 x509.DNSName(u"cryptography.io"),
1761 x509.DNSName(u"crypto.local"),
1762 x509.DNSName(u"another.local"),
1763 x509.RFC822Name(u"email@another.local"),
1764 x509.UniformResourceIdentifier(u"http://another.local"),
1765 ])
1766 assert ian[-1] == ian[4]
1767 assert ian[2:6:2] == [ian[2], ian[4]]
1768
Paul Kehrer99125c92015-06-07 18:37:10 -05001769 def test_invalid_general_names(self):
1770 with pytest.raises(TypeError):
1771 x509.IssuerAlternativeName(
1772 [x509.DNSName(u"cryptography.io"), "invalid"]
1773 )
1774
1775 def test_repr(self):
1776 san = x509.IssuerAlternativeName(
1777 [
1778 x509.DNSName(u"cryptography.io")
1779 ]
1780 )
1781 assert repr(san) == (
1782 "<IssuerAlternativeName("
1783 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1784 )
1785
1786 def test_eq(self):
1787 san = x509.IssuerAlternativeName(
1788 [x509.DNSName(u"cryptography.io")]
1789 )
1790 san2 = x509.IssuerAlternativeName(
1791 [x509.DNSName(u"cryptography.io")]
1792 )
1793 assert san == san2
1794
1795 def test_ne(self):
1796 san = x509.IssuerAlternativeName(
1797 [x509.DNSName(u"cryptography.io")]
1798 )
1799 san2 = x509.IssuerAlternativeName(
1800 [x509.RFC822Name(u"admin@cryptography.io")]
1801 )
1802 assert san != san2
1803 assert san != object()
1804
1805
Alex Gaynorf1c17672015-06-20 14:20:20 -04001806@pytest.mark.requires_backend_interface(interface=RSABackend)
1807@pytest.mark.requires_backend_interface(interface=X509Backend)
1808class TestRSAIssuerAlternativeNameExtension(object):
1809 def test_uri(self, backend):
1810 cert = _load_cert(
1811 os.path.join("x509", "custom", "ian_uri.pem"),
1812 x509.load_pem_x509_certificate,
1813 backend,
1814 )
1815 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001816 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001817 )
1818 assert list(ext.value) == [
1819 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1820 ]
1821
1822
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001823class TestCRLNumber(object):
1824 def test_eq(self):
1825 crl_number = x509.CRLNumber(15)
1826 assert crl_number == x509.CRLNumber(15)
1827
1828 def test_ne(self):
1829 crl_number = x509.CRLNumber(15)
1830 assert crl_number != x509.CRLNumber(14)
1831 assert crl_number != object()
1832
1833 def test_repr(self):
1834 crl_number = x509.CRLNumber(15)
1835 assert repr(crl_number) == "<CRLNumber(15)>"
1836
Paul Kehrera9718fc2015-12-22 22:55:35 -06001837 def test_invalid_number(self):
1838 with pytest.raises(TypeError):
1839 x509.CRLNumber("notanumber")
1840
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001841 def test_hash(self):
1842 c1 = x509.CRLNumber(1)
1843 c2 = x509.CRLNumber(1)
1844 c3 = x509.CRLNumber(2)
1845 assert hash(c1) == hash(c2)
1846 assert hash(c1) != hash(c3)
1847
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001848
Paul Kehrer31bdf792015-03-25 14:11:00 -05001849class TestSubjectAlternativeName(object):
1850 def test_get_values_for_type(self):
1851 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301852 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001853 )
1854 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301855 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001856
1857 def test_iter_names(self):
1858 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301859 x509.DNSName(u"cryptography.io"),
1860 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001861 ])
1862 assert len(san) == 2
1863 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301864 x509.DNSName(u"cryptography.io"),
1865 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001866 ]
1867
Paul Kehrer8adb5962015-12-26 14:46:58 -06001868 def test_indexing(self):
1869 san = x509.SubjectAlternativeName([
1870 x509.DNSName(u"cryptography.io"),
1871 x509.DNSName(u"crypto.local"),
1872 x509.DNSName(u"another.local"),
1873 x509.RFC822Name(u"email@another.local"),
1874 x509.UniformResourceIdentifier(u"http://another.local"),
1875 ])
1876 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001877 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001878
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001879 def test_invalid_general_names(self):
1880 with pytest.raises(TypeError):
1881 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301882 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001883 )
1884
Paul Kehrer31bdf792015-03-25 14:11:00 -05001885 def test_repr(self):
1886 san = x509.SubjectAlternativeName(
1887 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301888 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001889 ]
1890 )
1891 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001892 "<SubjectAlternativeName("
1893 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001894 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001895
Paul Kehrer58cc3972015-05-13 10:00:41 -05001896 def test_eq(self):
1897 san = x509.SubjectAlternativeName(
1898 [x509.DNSName(u"cryptography.io")]
1899 )
1900 san2 = x509.SubjectAlternativeName(
1901 [x509.DNSName(u"cryptography.io")]
1902 )
1903 assert san == san2
1904
1905 def test_ne(self):
1906 san = x509.SubjectAlternativeName(
1907 [x509.DNSName(u"cryptography.io")]
1908 )
1909 san2 = x509.SubjectAlternativeName(
1910 [x509.RFC822Name(u"admin@cryptography.io")]
1911 )
1912 assert san != san2
1913 assert san != object()
1914
Paul Kehrer40f83382015-04-20 15:00:16 -05001915
1916@pytest.mark.requires_backend_interface(interface=RSABackend)
1917@pytest.mark.requires_backend_interface(interface=X509Backend)
1918class TestRSASubjectAlternativeNameExtension(object):
1919 def test_dns_name(self, backend):
1920 cert = _load_cert(
1921 os.path.join("x509", "cryptography.io.pem"),
1922 x509.load_pem_x509_certificate,
1923 backend
1924 )
1925 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001926 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001927 )
1928 assert ext is not None
1929 assert ext.critical is False
1930
1931 san = ext.value
1932
1933 dns = san.get_values_for_type(x509.DNSName)
1934 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001935
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001936 def test_wildcard_dns_name(self, backend):
1937 cert = _load_cert(
1938 os.path.join("x509", "wildcard_san.pem"),
1939 x509.load_pem_x509_certificate,
1940 backend
1941 )
1942 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001943 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001944 )
1945
1946 dns = ext.value.get_values_for_type(x509.DNSName)
1947 assert dns == [
1948 u'*.langui.sh',
1949 u'langui.sh',
1950 u'*.saseliminator.com',
1951 u'saseliminator.com'
1952 ]
1953
Dominic Chen87bb9572015-10-09 00:23:07 -04001954 def test_san_empty_hostname(self, backend):
1955 cert = _load_cert(
1956 os.path.join(
1957 "x509", "custom", "san_empty_hostname.pem"
1958 ),
1959 x509.load_pem_x509_certificate,
1960 backend
1961 )
1962 san = cert.extensions.get_extension_for_oid(
1963 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1964 )
1965
1966 dns = san.value.get_values_for_type(x509.DNSName)
1967 assert dns == [u'']
1968
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001969 def test_san_wildcard_idna_dns_name(self, backend):
1970 cert = _load_cert(
1971 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1972 x509.load_pem_x509_certificate,
1973 backend
1974 )
1975 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001976 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001977 )
1978
1979 dns = ext.value.get_values_for_type(x509.DNSName)
1980 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1981
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001982 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001983 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001984 os.path.join("x509", "san_x400address.der"),
1985 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001986 backend
1987 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001988 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001989 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001990
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001991 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001992
1993 def test_registered_id(self, backend):
1994 cert = _load_cert(
1995 os.path.join(
1996 "x509", "custom", "san_registered_id.pem"
1997 ),
1998 x509.load_pem_x509_certificate,
1999 backend
2000 )
2001 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002002 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05002003 )
2004 assert ext is not None
2005 assert ext.critical is False
2006
2007 san = ext.value
2008 rid = san.get_values_for_type(x509.RegisteredID)
2009 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002010
2011 def test_uri(self, backend):
2012 cert = _load_cert(
2013 os.path.join(
2014 "x509", "custom", "san_uri_with_port.pem"
2015 ),
2016 x509.load_pem_x509_certificate,
2017 backend
2018 )
2019 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002020 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05002021 )
2022 assert ext is not None
2023 uri = ext.value.get_values_for_type(
2024 x509.UniformResourceIdentifier
2025 )
2026 assert uri == [
2027 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
2028 u"lo",
2029 u"http://someregulardomain.com",
2030 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05002031
2032 def test_ipaddress(self, backend):
2033 cert = _load_cert(
2034 os.path.join(
2035 "x509", "custom", "san_ipaddr.pem"
2036 ),
2037 x509.load_pem_x509_certificate,
2038 backend
2039 )
2040 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002041 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05002042 )
2043 assert ext is not None
2044 assert ext.critical is False
2045
2046 san = ext.value
2047
2048 ip = san.get_values_for_type(x509.IPAddress)
2049 assert [
2050 ipaddress.ip_address(u"127.0.0.1"),
2051 ipaddress.ip_address(u"ff::")
2052 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05002053
2054 def test_dirname(self, backend):
2055 cert = _load_cert(
2056 os.path.join(
2057 "x509", "custom", "san_dirname.pem"
2058 ),
2059 x509.load_pem_x509_certificate,
2060 backend
2061 )
2062 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002063 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002064 )
2065 assert ext is not None
2066 assert ext.critical is False
2067
2068 san = ext.value
2069
2070 dirname = san.get_values_for_type(x509.DirectoryName)
2071 assert [
2072 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002073 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2074 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2075 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002076 ])
2077 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002078
2079 def test_rfc822name(self, backend):
2080 cert = _load_cert(
2081 os.path.join(
2082 "x509", "custom", "san_rfc822_idna.pem"
2083 ),
2084 x509.load_pem_x509_certificate,
2085 backend
2086 )
2087 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002088 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002089 )
2090 assert ext is not None
2091 assert ext.critical is False
2092
2093 san = ext.value
2094
2095 rfc822name = san.get_values_for_type(x509.RFC822Name)
2096 assert [u"email@em\xe5\xefl.com"] == rfc822name
2097
Paul Kehrerb8968812015-05-15 09:01:34 -07002098 def test_idna2003_invalid(self, backend):
2099 cert = _load_cert(
2100 os.path.join(
2101 "x509", "custom", "san_idna2003_dnsname.pem"
2102 ),
2103 x509.load_pem_x509_certificate,
2104 backend
2105 )
2106 with pytest.raises(UnicodeError):
2107 cert.extensions
2108
Paul Kehrere06cab42015-04-30 10:23:33 -05002109 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2110 cert = _load_cert(
2111 os.path.join(
2112 "x509", "custom", "san_idna_names.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 Kehrere06cab42015-04-30 10:23:33 -05002119 )
2120 assert ext is not None
2121 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2122 dns_name = ext.value.get_values_for_type(x509.DNSName)
2123 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2124 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2125 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2126 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2127
2128 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2129 cert = _load_cert(
2130 os.path.join(
2131 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2132 ),
2133 x509.load_pem_x509_certificate,
2134 backend
2135 )
2136 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002137 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002138 )
2139 assert ext is not None
2140 assert ext.critical is False
2141
2142 san = ext.value
2143
2144 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2145 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2146 dns = san.get_values_for_type(x509.DNSName)
2147 ip = san.get_values_for_type(x509.IPAddress)
2148 dirname = san.get_values_for_type(x509.DirectoryName)
2149 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002150 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002151 assert [u"cryptography.io"] == dns
2152 assert [
2153 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002154 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002155 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002156 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002157 ),
2158 ])
2159 ] == dirname
2160 assert [
2161 ipaddress.ip_address(u"127.0.0.1"),
2162 ipaddress.ip_address(u"ff::")
2163 ] == ip
2164
2165 def test_invalid_rfc822name(self, backend):
2166 cert = _load_cert(
2167 os.path.join(
2168 "x509", "custom", "san_rfc822_names.pem"
2169 ),
2170 x509.load_pem_x509_certificate,
2171 backend
2172 )
2173 with pytest.raises(ValueError) as exc:
2174 cert.extensions
2175
2176 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002177
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002178 def test_other_name(self, backend):
2179 cert = _load_cert(
2180 os.path.join(
2181 "x509", "custom", "san_other_name.pem"
2182 ),
2183 x509.load_pem_x509_certificate,
2184 backend
2185 )
2186
2187 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002188 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002189 )
2190 assert ext is not None
2191 assert ext.critical is False
2192
Joshua Taubererd2afad32015-07-06 22:37:53 +00002193 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2194 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002195 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002196 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002197
2198 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002199 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002200
Marti4739cfc2016-08-02 04:03:25 +03002201 def test_certbuilder(self, backend):
2202 sans = [u'*.example.org', u'*.\xf5\xe4\xf6\xfc.example.com',
2203 u'foobar.example.net']
2204 private_key = RSA_KEY_2048.private_key(backend)
2205 builder = _make_certbuilder(private_key)
2206 builder = builder.add_extension(
2207 SubjectAlternativeName(list(map(DNSName, sans))), True)
2208
2209 cert = builder.sign(private_key, hashes.SHA1(), backend)
2210 result = [x.value for x in cert.extensions.get_extension_for_class(
2211 SubjectAlternativeName).value]
2212 assert result == sans
2213
Paul Kehrer94c69602015-05-02 19:29:40 -05002214
2215@pytest.mark.requires_backend_interface(interface=RSABackend)
2216@pytest.mark.requires_backend_interface(interface=X509Backend)
2217class TestExtendedKeyUsageExtension(object):
2218 def test_eku(self, backend):
2219 cert = _load_cert(
2220 os.path.join(
2221 "x509", "custom", "extended_key_usage.pem"
2222 ),
2223 x509.load_pem_x509_certificate,
2224 backend
2225 )
2226 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002227 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002228 )
2229 assert ext is not None
2230 assert ext.critical is False
2231
2232 assert [
2233 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2234 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2235 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2236 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2237 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2238 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2239 x509.ObjectIdentifier("2.5.29.37.0"),
2240 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2241 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002242
2243
2244class TestAccessDescription(object):
2245 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002246 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002247 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2248
2249 def test_invalid_access_location(self):
2250 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002251 x509.AccessDescription(
2252 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2253 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002254
Nick Bastind2ecf862015-12-13 05:44:46 -08002255 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002256 ad = x509.AccessDescription(
2257 ObjectIdentifier("2.999.1"),
2258 x509.UniformResourceIdentifier(u"http://example.com")
2259 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002260 assert ad is not None
2261
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002262 def test_repr(self):
2263 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002264 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002265 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2266 )
2267 assert repr(ad) == (
2268 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2269 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2270 "(value=http://ocsp.domain.com)>)>"
2271 )
2272
2273 def test_eq(self):
2274 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002275 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002276 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2277 )
2278 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002279 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002280 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2281 )
2282 assert ad == ad2
2283
2284 def test_ne(self):
2285 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002286 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002287 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2288 )
2289 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002290 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002291 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2292 )
2293 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002294 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002295 x509.UniformResourceIdentifier(u"http://notthesame")
2296 )
2297 assert ad != ad2
2298 assert ad != ad3
2299 assert ad != object()
2300
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302301 def test_hash(self):
2302 ad = x509.AccessDescription(
2303 AuthorityInformationAccessOID.OCSP,
2304 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2305 )
2306 ad2 = x509.AccessDescription(
2307 AuthorityInformationAccessOID.OCSP,
2308 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2309 )
2310 ad3 = x509.AccessDescription(
2311 AuthorityInformationAccessOID.CA_ISSUERS,
2312 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2313 )
2314 assert hash(ad) == hash(ad2)
2315 assert hash(ad) != hash(ad3)
2316
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002317
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002318class TestPolicyConstraints(object):
2319 def test_invalid_explicit_policy(self):
2320 with pytest.raises(TypeError):
2321 x509.PolicyConstraints("invalid", None)
2322
2323 def test_invalid_inhibit_policy(self):
2324 with pytest.raises(TypeError):
2325 x509.PolicyConstraints(None, "invalid")
2326
2327 def test_both_none(self):
2328 with pytest.raises(ValueError):
2329 x509.PolicyConstraints(None, None)
2330
2331 def test_repr(self):
2332 pc = x509.PolicyConstraints(0, None)
2333
2334 assert repr(pc) == (
2335 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2336 u"pping=None)>"
2337 )
2338
2339 def test_eq(self):
2340 pc = x509.PolicyConstraints(2, 1)
2341 pc2 = x509.PolicyConstraints(2, 1)
2342 assert pc == pc2
2343
2344 def test_ne(self):
2345 pc = x509.PolicyConstraints(2, 1)
2346 pc2 = x509.PolicyConstraints(2, 2)
2347 pc3 = x509.PolicyConstraints(3, 1)
2348 assert pc != pc2
2349 assert pc != pc3
2350 assert pc != object()
2351
2352
Alex Gaynora9885602016-02-27 09:53:46 -05002353@pytest.mark.requires_backend_interface(interface=RSABackend)
2354@pytest.mark.requires_backend_interface(interface=X509Backend)
2355class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002356 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002357 cert = _load_cert(
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002358 os.path.join("x509", "department-of-state-root.pem"),
Alex Gaynora9885602016-02-27 09:53:46 -05002359 x509.load_pem_x509_certificate,
2360 backend
2361 )
2362 ext = cert.extensions.get_extension_for_oid(
2363 ExtensionOID.POLICY_CONSTRAINTS,
2364 )
2365 assert ext.critical is True
2366
2367 assert ext.value == x509.PolicyConstraints(
2368 require_explicit_policy=None, inhibit_policy_mapping=0,
2369 )
2370
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002371 def test_require_explicit_policy(self, backend):
2372 cert = _load_cert(
2373 os.path.join("x509", "custom", "policy_constraints_explicit.pem"),
2374 x509.load_pem_x509_certificate,
2375 backend
2376 )
2377 ext = cert.extensions.get_extension_for_oid(
2378 ExtensionOID.POLICY_CONSTRAINTS
2379 )
2380 assert ext.critical is True
2381 assert ext.value == x509.PolicyConstraints(
2382 require_explicit_policy=1, inhibit_policy_mapping=None,
2383 )
2384
Alex Gaynora9885602016-02-27 09:53:46 -05002385
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002386class TestAuthorityInformationAccess(object):
2387 def test_invalid_descriptions(self):
2388 with pytest.raises(TypeError):
2389 x509.AuthorityInformationAccess(["notanAccessDescription"])
2390
2391 def test_iter_len(self):
2392 aia = x509.AuthorityInformationAccess([
2393 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002394 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002395 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2396 ),
2397 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002398 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002399 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2400 )
2401 ])
2402 assert len(aia) == 2
2403 assert list(aia) == [
2404 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002405 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002406 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2407 ),
2408 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002409 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002410 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2411 )
2412 ]
2413
Marti40f19992016-08-26 04:26:31 +03002414 def test_iter_input(self):
2415 desc = [
2416 x509.AccessDescription(
2417 AuthorityInformationAccessOID.OCSP,
2418 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2419 )
2420 ]
2421 aia = x509.AuthorityInformationAccess(iter(desc))
2422 assert list(aia) == desc
2423
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002424 def test_repr(self):
2425 aia = x509.AuthorityInformationAccess([
2426 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002427 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002428 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2429 ),
2430 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002431 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002432 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2433 )
2434 ])
2435 assert repr(aia) == (
2436 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2437 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2438 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2439 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2440 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2441 "fier(value=http://domain.com/ca.crt)>)>])>"
2442 )
2443
2444 def test_eq(self):
2445 aia = x509.AuthorityInformationAccess([
2446 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002447 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002448 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2449 ),
2450 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002451 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002452 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2453 )
2454 ])
2455 aia2 = x509.AuthorityInformationAccess([
2456 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002457 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002458 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2459 ),
2460 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002461 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002462 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2463 )
2464 ])
2465 assert aia == aia2
2466
2467 def test_ne(self):
2468 aia = x509.AuthorityInformationAccess([
2469 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002470 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002471 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2472 ),
2473 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002474 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002475 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2476 )
2477 ])
2478 aia2 = x509.AuthorityInformationAccess([
2479 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002480 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002481 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2482 ),
2483 ])
2484
2485 assert aia != aia2
2486 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002487
Paul Kehrerad4b3592015-12-27 17:27:40 -06002488 def test_indexing(self):
2489 aia = x509.AuthorityInformationAccess([
2490 x509.AccessDescription(
2491 AuthorityInformationAccessOID.OCSP,
2492 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2493 ),
2494 x509.AccessDescription(
2495 AuthorityInformationAccessOID.CA_ISSUERS,
2496 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2497 ),
2498 x509.AccessDescription(
2499 AuthorityInformationAccessOID.OCSP,
2500 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2501 ),
2502 x509.AccessDescription(
2503 AuthorityInformationAccessOID.OCSP,
2504 x509.UniformResourceIdentifier(u"http://ocsp3.domain.com")
2505 ),
2506 x509.AccessDescription(
2507 AuthorityInformationAccessOID.OCSP,
2508 x509.UniformResourceIdentifier(u"http://ocsp4.domain.com")
2509 ),
2510 ])
2511 assert aia[-1] == aia[4]
2512 assert aia[2:6:2] == [aia[2], aia[4]]
2513
Paul Kehrerd774de92015-05-03 10:52:25 -05002514
2515@pytest.mark.requires_backend_interface(interface=RSABackend)
2516@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002517class TestAuthorityInformationAccessExtension(object):
2518 def test_aia_ocsp_ca_issuers(self, backend):
2519 cert = _load_cert(
2520 os.path.join("x509", "cryptography.io.pem"),
2521 x509.load_pem_x509_certificate,
2522 backend
2523 )
2524 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002525 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002526 )
2527 assert ext is not None
2528 assert ext.critical is False
2529
2530 assert ext.value == x509.AuthorityInformationAccess([
2531 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002532 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002533 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2534 ),
2535 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002536 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002537 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2538 ),
2539 ])
2540
2541 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2542 cert = _load_cert(
2543 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2544 x509.load_pem_x509_certificate,
2545 backend
2546 )
2547 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002548 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002549 )
2550 assert ext is not None
2551 assert ext.critical is False
2552
2553 assert ext.value == x509.AuthorityInformationAccess([
2554 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002555 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002556 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2557 ),
2558 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002559 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002560 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2561 ),
2562 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002563 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002564 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002565 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2566 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002567 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002568 ]))
2569 ),
2570 ])
2571
2572 def test_aia_ocsp_only(self, backend):
2573 cert = _load_cert(
2574 os.path.join("x509", "custom", "aia_ocsp.pem"),
2575 x509.load_pem_x509_certificate,
2576 backend
2577 )
2578 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002579 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002580 )
2581 assert ext is not None
2582 assert ext.critical is False
2583
2584 assert ext.value == x509.AuthorityInformationAccess([
2585 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002586 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002587 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2588 ),
2589 ])
2590
2591 def test_aia_ca_issuers_only(self, backend):
2592 cert = _load_cert(
2593 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2594 x509.load_pem_x509_certificate,
2595 backend
2596 )
2597 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002598 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002599 )
2600 assert ext is not None
2601 assert ext.critical is False
2602
2603 assert ext.value == x509.AuthorityInformationAccess([
2604 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002605 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002606 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002607 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2608 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002609 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002610 ]))
2611 ),
2612 ])
2613
2614
2615@pytest.mark.requires_backend_interface(interface=RSABackend)
2616@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002617class TestAuthorityKeyIdentifierExtension(object):
2618 def test_aki_keyid(self, backend):
2619 cert = _load_cert(
2620 os.path.join(
2621 "x509", "cryptography.io.pem"
2622 ),
2623 x509.load_pem_x509_certificate,
2624 backend
2625 )
2626 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002627 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002628 )
2629 assert ext is not None
2630 assert ext.critical is False
2631
2632 assert ext.value.key_identifier == (
2633 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2634 )
2635 assert ext.value.authority_cert_issuer is None
2636 assert ext.value.authority_cert_serial_number is None
2637
2638 def test_aki_all_fields(self, backend):
2639 cert = _load_cert(
2640 os.path.join(
2641 "x509", "custom", "authority_key_identifier.pem"
2642 ),
2643 x509.load_pem_x509_certificate,
2644 backend
2645 )
2646 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002647 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002648 )
2649 assert ext is not None
2650 assert ext.critical is False
2651
2652 assert ext.value.key_identifier == (
2653 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2654 )
2655 assert ext.value.authority_cert_issuer == [
2656 x509.DirectoryName(
2657 x509.Name([
2658 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002659 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002660 ),
2661 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002662 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002663 )
2664 ])
2665 )
2666 ]
2667 assert ext.value.authority_cert_serial_number == 3
2668
2669 def test_aki_no_keyid(self, backend):
2670 cert = _load_cert(
2671 os.path.join(
2672 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2673 ),
2674 x509.load_pem_x509_certificate,
2675 backend
2676 )
2677 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002678 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002679 )
2680 assert ext is not None
2681 assert ext.critical is False
2682
2683 assert ext.value.key_identifier is None
2684 assert ext.value.authority_cert_issuer == [
2685 x509.DirectoryName(
2686 x509.Name([
2687 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002688 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002689 ),
2690 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002691 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002692 )
2693 ])
2694 )
2695 ]
2696 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002697
Paul Kehrer253929a2015-08-05 17:30:39 +01002698 def test_from_certificate(self, backend):
2699 issuer_cert = _load_cert(
2700 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2701 x509.load_pem_x509_certificate,
2702 backend
2703 )
2704 cert = _load_cert(
2705 os.path.join("x509", "cryptography.io.pem"),
2706 x509.load_pem_x509_certificate,
2707 backend
2708 )
2709 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002710 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002711 )
2712 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2713 issuer_cert.public_key()
2714 )
2715 assert ext.value == aki
2716
Paul Kehrer61ff3562016-03-11 22:51:27 -04002717 def test_from_issuer_subject_key_identifier(self, backend):
2718 issuer_cert = _load_cert(
2719 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2720 x509.load_pem_x509_certificate,
2721 backend
2722 )
2723 cert = _load_cert(
2724 os.path.join("x509", "cryptography.io.pem"),
2725 x509.load_pem_x509_certificate,
2726 backend
2727 )
2728 ext = cert.extensions.get_extension_for_oid(
2729 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
2730 )
2731 ski = issuer_cert.extensions.get_extension_for_class(
2732 x509.SubjectKeyIdentifier
2733 )
2734 aki = x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier(
2735 ski
2736 )
2737 assert ext.value == aki
2738
Paul Kehrer5a485522015-05-06 00:29:12 -05002739
Paul Kehrere0017be2015-05-17 20:39:40 -06002740class TestNameConstraints(object):
2741 def test_ipaddress_wrong_type(self):
2742 with pytest.raises(TypeError):
2743 x509.NameConstraints(
2744 permitted_subtrees=[
2745 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2746 ],
2747 excluded_subtrees=None
2748 )
2749
2750 with pytest.raises(TypeError):
2751 x509.NameConstraints(
2752 permitted_subtrees=None,
2753 excluded_subtrees=[
2754 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2755 ]
2756 )
2757
2758 def test_ipaddress_allowed_type(self):
2759 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2760 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2761 nc = x509.NameConstraints(
2762 permitted_subtrees=permitted,
2763 excluded_subtrees=excluded
2764 )
2765 assert nc.permitted_subtrees == permitted
2766 assert nc.excluded_subtrees == excluded
2767
2768 def test_invalid_permitted_subtrees(self):
2769 with pytest.raises(TypeError):
2770 x509.NameConstraints("badpermitted", None)
2771
2772 def test_invalid_excluded_subtrees(self):
2773 with pytest.raises(TypeError):
2774 x509.NameConstraints(None, "badexcluded")
2775
2776 def test_no_subtrees(self):
2777 with pytest.raises(ValueError):
2778 x509.NameConstraints(None, None)
2779
2780 def test_permitted_none(self):
2781 excluded = [x509.DNSName(u"name.local")]
2782 nc = x509.NameConstraints(
2783 permitted_subtrees=None, excluded_subtrees=excluded
2784 )
2785 assert nc.permitted_subtrees is None
2786 assert nc.excluded_subtrees is not None
2787
2788 def test_excluded_none(self):
2789 permitted = [x509.DNSName(u"name.local")]
2790 nc = x509.NameConstraints(
2791 permitted_subtrees=permitted, excluded_subtrees=None
2792 )
2793 assert nc.permitted_subtrees is not None
2794 assert nc.excluded_subtrees is None
2795
Marti40f19992016-08-26 04:26:31 +03002796 def test_iter_input(self):
2797 subtrees = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))]
2798 nc = x509.NameConstraints(iter(subtrees), iter(subtrees))
2799 assert list(nc.permitted_subtrees) == subtrees
2800 assert list(nc.excluded_subtrees) == subtrees
2801
Paul Kehrere0017be2015-05-17 20:39:40 -06002802 def test_repr(self):
2803 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2804 nc = x509.NameConstraints(
2805 permitted_subtrees=permitted,
2806 excluded_subtrees=None
2807 )
2808 assert repr(nc) == (
2809 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2810 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2811 )
2812
Paul Kehrer31894282015-06-21 21:46:41 -05002813 def test_eq(self):
2814 nc = x509.NameConstraints(
2815 permitted_subtrees=[x509.DNSName(u"name.local")],
2816 excluded_subtrees=[x509.DNSName(u"name2.local")]
2817 )
2818 nc2 = x509.NameConstraints(
2819 permitted_subtrees=[x509.DNSName(u"name.local")],
2820 excluded_subtrees=[x509.DNSName(u"name2.local")]
2821 )
2822 assert nc == nc2
2823
2824 def test_ne(self):
2825 nc = x509.NameConstraints(
2826 permitted_subtrees=[x509.DNSName(u"name.local")],
2827 excluded_subtrees=[x509.DNSName(u"name2.local")]
2828 )
2829 nc2 = x509.NameConstraints(
2830 permitted_subtrees=[x509.DNSName(u"name.local")],
2831 excluded_subtrees=None
2832 )
2833 nc3 = x509.NameConstraints(
2834 permitted_subtrees=None,
2835 excluded_subtrees=[x509.DNSName(u"name2.local")]
2836 )
2837
2838 assert nc != nc2
2839 assert nc != nc3
2840 assert nc != object()
2841
Paul Kehrere0017be2015-05-17 20:39:40 -06002842
Paul Kehrer870d7e82015-06-21 22:20:44 -05002843@pytest.mark.requires_backend_interface(interface=RSABackend)
2844@pytest.mark.requires_backend_interface(interface=X509Backend)
2845class TestNameConstraintsExtension(object):
2846 def test_permitted_excluded(self, backend):
2847 cert = _load_cert(
2848 os.path.join(
2849 "x509", "custom", "nc_permitted_excluded_2.pem"
2850 ),
2851 x509.load_pem_x509_certificate,
2852 backend
2853 )
2854 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002855 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002856 ).value
2857 assert nc == x509.NameConstraints(
2858 permitted_subtrees=[
2859 x509.DNSName(u"zombo.local"),
2860 ],
2861 excluded_subtrees=[
2862 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002863 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002864 ]))
2865 ]
2866 )
2867
2868 def test_permitted(self, backend):
2869 cert = _load_cert(
2870 os.path.join(
2871 "x509", "custom", "nc_permitted_2.pem"
2872 ),
2873 x509.load_pem_x509_certificate,
2874 backend
2875 )
2876 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002877 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002878 ).value
2879 assert nc == x509.NameConstraints(
2880 permitted_subtrees=[
2881 x509.DNSName(u"zombo.local"),
2882 ],
2883 excluded_subtrees=None
2884 )
2885
Paul Kehrer42376832015-07-01 18:10:32 -05002886 def test_permitted_with_leading_period(self, backend):
2887 cert = _load_cert(
2888 os.path.join(
2889 "x509", "custom", "nc_permitted.pem"
2890 ),
2891 x509.load_pem_x509_certificate,
2892 backend
2893 )
2894 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002895 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002896 ).value
2897 assert nc == x509.NameConstraints(
2898 permitted_subtrees=[
2899 x509.DNSName(u".cryptography.io"),
2900 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2901 ],
2902 excluded_subtrees=None
2903 )
2904
2905 def test_excluded_with_leading_period(self, backend):
2906 cert = _load_cert(
2907 os.path.join(
2908 "x509", "custom", "nc_excluded.pem"
2909 ),
2910 x509.load_pem_x509_certificate,
2911 backend
2912 )
2913 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002914 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002915 ).value
2916 assert nc == x509.NameConstraints(
2917 permitted_subtrees=None,
2918 excluded_subtrees=[
2919 x509.DNSName(u".cryptography.io"),
2920 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2921 ]
2922 )
2923
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002924 def test_permitted_excluded_with_ips(self, backend):
2925 cert = _load_cert(
2926 os.path.join(
2927 "x509", "custom", "nc_permitted_excluded.pem"
2928 ),
2929 x509.load_pem_x509_certificate,
2930 backend
2931 )
2932 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002933 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002934 ).value
2935 assert nc == x509.NameConstraints(
2936 permitted_subtrees=[
2937 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2938 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2939 ],
2940 excluded_subtrees=[
2941 x509.DNSName(u".domain.com"),
2942 x509.UniformResourceIdentifier(u"http://test.local"),
2943 ]
2944 )
2945
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002946 def test_single_ip_netmask(self, backend):
2947 cert = _load_cert(
2948 os.path.join(
2949 "x509", "custom", "nc_single_ip_netmask.pem"
2950 ),
2951 x509.load_pem_x509_certificate,
2952 backend
2953 )
2954 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002955 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002956 ).value
2957 assert nc == x509.NameConstraints(
2958 permitted_subtrees=[
2959 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2960 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2961 ],
2962 excluded_subtrees=None
2963 )
2964
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002965 def test_invalid_netmask(self, backend):
2966 cert = _load_cert(
2967 os.path.join(
2968 "x509", "custom", "nc_invalid_ip_netmask.pem"
2969 ),
2970 x509.load_pem_x509_certificate,
2971 backend
2972 )
2973 with pytest.raises(ValueError):
2974 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002975 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002976 )
2977
Marti4739cfc2016-08-02 04:03:25 +03002978 def test_certbuilder(self, backend):
2979 permitted = [u'.example.org', u'.\xf5\xe4\xf6\xfc.example.com',
2980 u'foobar.example.net']
2981 private_key = RSA_KEY_2048.private_key(backend)
2982 builder = _make_certbuilder(private_key)
2983 builder = builder.add_extension(
2984 NameConstraints(permitted_subtrees=list(map(DNSName, permitted)),
2985 excluded_subtrees=[]), True)
2986
2987 cert = builder.sign(private_key, hashes.SHA1(), backend)
2988 result = [x.value for x in cert.extensions.get_extension_for_class(
2989 NameConstraints).value.permitted_subtrees]
2990 assert result == permitted
2991
Paul Kehrer870d7e82015-06-21 22:20:44 -05002992
Paul Kehrer5a485522015-05-06 00:29:12 -05002993class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002994 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002995 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002996 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002997
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002998 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002999 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003000 x509.DistributionPoint(None, "notname", None, None)
3001
3002 def test_distribution_point_full_and_relative_not_none(self):
3003 with pytest.raises(ValueError):
3004 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05003005
3006 def test_crl_issuer_not_general_names(self):
3007 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003008 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05003009
3010 def test_reason_not_reasonflags(self):
3011 with pytest.raises(TypeError):
3012 x509.DistributionPoint(
3013 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003014 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003015 frozenset(["notreasonflags"]),
3016 None
3017 )
3018
3019 def test_reason_not_frozenset(self):
3020 with pytest.raises(TypeError):
3021 x509.DistributionPoint(
3022 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3023 None,
3024 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003025 None
3026 )
3027
3028 def test_disallowed_reasons(self):
3029 with pytest.raises(ValueError):
3030 x509.DistributionPoint(
3031 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3032 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003033 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003034 None
3035 )
3036
3037 with pytest.raises(ValueError):
3038 x509.DistributionPoint(
3039 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3040 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003041 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003042 None
3043 )
3044
3045 def test_reason_only(self):
3046 with pytest.raises(ValueError):
3047 x509.DistributionPoint(
3048 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003049 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003050 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003051 None
3052 )
3053
3054 def test_eq(self):
3055 dp = x509.DistributionPoint(
3056 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003057 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003058 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003059 [
3060 x509.DirectoryName(
3061 x509.Name([
3062 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003063 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003064 )
3065 ])
3066 )
3067 ],
3068 )
3069 dp2 = x509.DistributionPoint(
3070 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003071 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003072 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003073 [
3074 x509.DirectoryName(
3075 x509.Name([
3076 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003077 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003078 )
3079 ])
3080 )
3081 ],
3082 )
3083 assert dp == dp2
3084
3085 def test_ne(self):
3086 dp = x509.DistributionPoint(
3087 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003088 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003089 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003090 [
3091 x509.DirectoryName(
3092 x509.Name([
3093 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003094 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003095 )
3096 ])
3097 )
3098 ],
3099 )
3100 dp2 = x509.DistributionPoint(
3101 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3102 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003103 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003104 None
3105 )
3106 assert dp != dp2
3107 assert dp != object()
3108
Marti40f19992016-08-26 04:26:31 +03003109 def test_iter_input(self):
3110 name = [x509.UniformResourceIdentifier(u"http://crypt.og/crl")]
3111 issuer = [
3112 x509.DirectoryName(
3113 x509.Name([
3114 x509.NameAttribute(NameOID.COMMON_NAME, u"Important CA")
3115 ])
3116 )
3117 ]
3118 dp = x509.DistributionPoint(
3119 iter(name),
3120 None,
3121 frozenset([x509.ReasonFlags.ca_compromise]),
3122 iter(issuer),
3123 )
3124 assert list(dp.full_name) == name
3125 assert list(dp.crl_issuer) == issuer
3126
Paul Kehrer5a485522015-05-06 00:29:12 -05003127 def test_repr(self):
3128 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003129 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003130 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003131 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05003132 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003133 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003134 [
3135 x509.DirectoryName(
3136 x509.Name([
3137 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003138 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003139 )
3140 ])
3141 )
3142 ],
3143 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05003144 if six.PY3:
3145 assert repr(dp) == (
3146 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
3147 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05003148 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
3149 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
3150 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
3151 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003152 )
3153 else:
3154 assert repr(dp) == (
3155 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
3156 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05003157 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
3158 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
3159 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
3160 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003161 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003162
3163
3164class TestCRLDistributionPoints(object):
3165 def test_invalid_distribution_points(self):
3166 with pytest.raises(TypeError):
3167 x509.CRLDistributionPoints(["notadistributionpoint"])
3168
3169 def test_iter_len(self):
3170 cdp = x509.CRLDistributionPoints([
3171 x509.DistributionPoint(
3172 [x509.UniformResourceIdentifier(u"http://domain")],
3173 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003174 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003175 None
3176 ),
3177 x509.DistributionPoint(
3178 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003179 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003180 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003181 x509.ReasonFlags.key_compromise,
3182 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003183 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003184 None
3185 ),
3186 ])
3187 assert len(cdp) == 2
3188 assert list(cdp) == [
3189 x509.DistributionPoint(
3190 [x509.UniformResourceIdentifier(u"http://domain")],
3191 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003192 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003193 None
3194 ),
3195 x509.DistributionPoint(
3196 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003197 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003198 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003199 x509.ReasonFlags.key_compromise,
3200 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003201 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003202 None
3203 ),
3204 ]
3205
Marti40f19992016-08-26 04:26:31 +03003206 def test_iter_input(self):
3207 points = [
3208 x509.DistributionPoint(
3209 [x509.UniformResourceIdentifier(u"http://domain")],
3210 None,
3211 None,
3212 None
3213 ),
3214 ]
3215 cdp = x509.CRLDistributionPoints(iter(points))
3216 assert list(cdp) == points
3217
Paul Kehrer5a485522015-05-06 00:29:12 -05003218 def test_repr(self):
3219 cdp = x509.CRLDistributionPoints([
3220 x509.DistributionPoint(
3221 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003222 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003223 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003224 None
3225 ),
3226 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003227 if six.PY3:
3228 assert repr(cdp) == (
3229 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3230 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3231 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
3232 "romise'>}), crl_issuer=None)>])>"
3233 )
3234 else:
3235 assert repr(cdp) == (
3236 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3237 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3238 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
3239 "romise'>]), crl_issuer=None)>])>"
3240 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003241
3242 def test_eq(self):
3243 cdp = x509.CRLDistributionPoints([
3244 x509.DistributionPoint(
3245 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003246 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003247 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003248 x509.ReasonFlags.key_compromise,
3249 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003250 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003251 [x509.UniformResourceIdentifier(u"uri://thing")],
3252 ),
3253 ])
3254 cdp2 = x509.CRLDistributionPoints([
3255 x509.DistributionPoint(
3256 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003257 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003258 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003259 x509.ReasonFlags.key_compromise,
3260 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003261 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003262 [x509.UniformResourceIdentifier(u"uri://thing")],
3263 ),
3264 ])
3265 assert cdp == cdp2
3266
3267 def test_ne(self):
3268 cdp = x509.CRLDistributionPoints([
3269 x509.DistributionPoint(
3270 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003271 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003272 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003273 x509.ReasonFlags.key_compromise,
3274 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003275 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003276 [x509.UniformResourceIdentifier(u"uri://thing")],
3277 ),
3278 ])
3279 cdp2 = x509.CRLDistributionPoints([
3280 x509.DistributionPoint(
3281 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003282 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003283 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003284 x509.ReasonFlags.key_compromise,
3285 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003286 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003287 [x509.UniformResourceIdentifier(u"uri://thing")],
3288 ),
3289 ])
3290 cdp3 = x509.CRLDistributionPoints([
3291 x509.DistributionPoint(
3292 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003293 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003294 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003295 [x509.UniformResourceIdentifier(u"uri://thing")],
3296 ),
3297 ])
3298 cdp4 = x509.CRLDistributionPoints([
3299 x509.DistributionPoint(
3300 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003301 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003302 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003303 x509.ReasonFlags.key_compromise,
3304 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003305 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003306 [x509.UniformResourceIdentifier(u"uri://thing2")],
3307 ),
3308 ])
3309 assert cdp != cdp2
3310 assert cdp != cdp3
3311 assert cdp != cdp4
3312 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003313
Paul Kehreree2e92d2015-12-27 17:29:37 -06003314 def test_indexing(self):
3315 ci = x509.CRLDistributionPoints([
3316 x509.DistributionPoint(
3317 None, None, None,
3318 [x509.UniformResourceIdentifier(u"uri://thing")],
3319 ),
3320 x509.DistributionPoint(
3321 None, None, None,
3322 [x509.UniformResourceIdentifier(u"uri://thing2")],
3323 ),
3324 x509.DistributionPoint(
3325 None, None, None,
3326 [x509.UniformResourceIdentifier(u"uri://thing3")],
3327 ),
3328 x509.DistributionPoint(
3329 None, None, None,
3330 [x509.UniformResourceIdentifier(u"uri://thing4")],
3331 ),
3332 x509.DistributionPoint(
3333 None, None, None,
3334 [x509.UniformResourceIdentifier(u"uri://thing5")],
3335 ),
3336 ])
3337 assert ci[-1] == ci[4]
3338 assert ci[2:6:2] == [ci[2], ci[4]]
3339
Paul Kehrer9a10d592015-05-10 14:55:51 -05003340
3341@pytest.mark.requires_backend_interface(interface=RSABackend)
3342@pytest.mark.requires_backend_interface(interface=X509Backend)
3343class TestCRLDistributionPointsExtension(object):
3344 def test_fullname_and_crl_issuer(self, backend):
3345 cert = _load_cert(
3346 os.path.join(
3347 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3348 ),
3349 x509.load_der_x509_certificate,
3350 backend
3351 )
3352
3353 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003354 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003355 ).value
3356
3357 assert cdps == x509.CRLDistributionPoints([
3358 x509.DistributionPoint(
3359 full_name=[x509.DirectoryName(
3360 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003361 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003362 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003363 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003364 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003365 ),
3366 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003367 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003368 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003369 ),
3370 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003371 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003372 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003373 ),
3374 ])
3375 )],
3376 relative_name=None,
3377 reasons=None,
3378 crl_issuer=[x509.DirectoryName(
3379 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003380 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003381 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003382 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003383 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003384 ),
3385 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003386 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003387 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003388 ),
3389 ])
3390 )],
3391 )
3392 ])
3393
3394 def test_relativename_and_crl_issuer(self, backend):
3395 cert = _load_cert(
3396 os.path.join(
3397 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3398 ),
3399 x509.load_der_x509_certificate,
3400 backend
3401 )
3402
3403 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003404 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003405 ).value
3406
3407 assert cdps == x509.CRLDistributionPoints([
3408 x509.DistributionPoint(
3409 full_name=None,
3410 relative_name=x509.Name([
3411 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003412 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003413 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003414 ),
3415 ]),
3416 reasons=None,
3417 crl_issuer=[x509.DirectoryName(
3418 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003419 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003420 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003421 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003422 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003423 ),
3424 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003425 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003426 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003427 ),
3428 ])
3429 )],
3430 )
3431 ])
3432
3433 def test_fullname_crl_issuer_reasons(self, backend):
3434 cert = _load_cert(
3435 os.path.join(
3436 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3437 ),
3438 x509.load_pem_x509_certificate,
3439 backend
3440 )
3441
3442 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003443 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003444 ).value
3445
3446 assert cdps == x509.CRLDistributionPoints([
3447 x509.DistributionPoint(
3448 full_name=[x509.UniformResourceIdentifier(
3449 u"http://myhost.com/myca.crl"
3450 )],
3451 relative_name=None,
3452 reasons=frozenset([
3453 x509.ReasonFlags.key_compromise,
3454 x509.ReasonFlags.ca_compromise
3455 ]),
3456 crl_issuer=[x509.DirectoryName(
3457 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003458 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003459 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003460 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003461 ),
3462 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003463 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003464 ),
3465 ])
3466 )],
3467 )
3468 ])
3469
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003470 def test_all_reasons(self, backend):
3471 cert = _load_cert(
3472 os.path.join(
3473 "x509", "custom", "cdp_all_reasons.pem"
3474 ),
3475 x509.load_pem_x509_certificate,
3476 backend
3477 )
3478
3479 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003480 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003481 ).value
3482
3483 assert cdps == x509.CRLDistributionPoints([
3484 x509.DistributionPoint(
3485 full_name=[x509.UniformResourceIdentifier(
3486 u"http://domain.com/some.crl"
3487 )],
3488 relative_name=None,
3489 reasons=frozenset([
3490 x509.ReasonFlags.key_compromise,
3491 x509.ReasonFlags.ca_compromise,
3492 x509.ReasonFlags.affiliation_changed,
3493 x509.ReasonFlags.superseded,
3494 x509.ReasonFlags.privilege_withdrawn,
3495 x509.ReasonFlags.cessation_of_operation,
3496 x509.ReasonFlags.aa_compromise,
3497 x509.ReasonFlags.certificate_hold,
3498 ]),
3499 crl_issuer=None
3500 )
3501 ])
3502
3503 def test_single_reason(self, backend):
3504 cert = _load_cert(
3505 os.path.join(
3506 "x509", "custom", "cdp_reason_aa_compromise.pem"
3507 ),
3508 x509.load_pem_x509_certificate,
3509 backend
3510 )
3511
3512 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003513 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003514 ).value
3515
3516 assert cdps == x509.CRLDistributionPoints([
3517 x509.DistributionPoint(
3518 full_name=[x509.UniformResourceIdentifier(
3519 u"http://domain.com/some.crl"
3520 )],
3521 relative_name=None,
3522 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3523 crl_issuer=None
3524 )
3525 ])
3526
Paul Kehrer9a10d592015-05-10 14:55:51 -05003527 def test_crl_issuer_only(self, backend):
3528 cert = _load_cert(
3529 os.path.join(
3530 "x509", "custom", "cdp_crl_issuer.pem"
3531 ),
3532 x509.load_pem_x509_certificate,
3533 backend
3534 )
3535
3536 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003537 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003538 ).value
3539
3540 assert cdps == x509.CRLDistributionPoints([
3541 x509.DistributionPoint(
3542 full_name=None,
3543 relative_name=None,
3544 reasons=None,
3545 crl_issuer=[x509.DirectoryName(
3546 x509.Name([
3547 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003548 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003549 ),
3550 ])
3551 )],
3552 )
3553 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003554
Dominic Chen87bb9572015-10-09 00:23:07 -04003555 def test_crl_empty_hostname(self, backend):
3556 cert = _load_cert(
3557 os.path.join(
3558 "x509", "custom", "cdp_empty_hostname.pem"
3559 ),
3560 x509.load_pem_x509_certificate,
3561 backend
3562 )
3563
3564 cdps = cert.extensions.get_extension_for_oid(
3565 ExtensionOID.CRL_DISTRIBUTION_POINTS
3566 ).value
3567
3568 assert cdps == x509.CRLDistributionPoints([
3569 x509.DistributionPoint(
3570 full_name=[x509.UniformResourceIdentifier(
3571 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3572 )],
3573 relative_name=None,
3574 reasons=None,
3575 crl_issuer=None
3576 )
3577 ])
3578
Paul Kehrer16fae762015-05-01 23:14:20 -05003579
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003580@pytest.mark.requires_backend_interface(interface=RSABackend)
3581@pytest.mark.requires_backend_interface(interface=X509Backend)
3582class TestOCSPNoCheckExtension(object):
3583 def test_nocheck(self, backend):
3584 cert = _load_cert(
3585 os.path.join(
3586 "x509", "custom", "ocsp_nocheck.pem"
3587 ),
3588 x509.load_pem_x509_certificate,
3589 backend
3590 )
3591 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003592 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003593 )
3594 assert isinstance(ext.value, x509.OCSPNoCheck)
3595
3596
Paul Kehrer16fae762015-05-01 23:14:20 -05003597class TestInhibitAnyPolicy(object):
3598 def test_not_int(self):
3599 with pytest.raises(TypeError):
3600 x509.InhibitAnyPolicy("notint")
3601
3602 def test_negative_int(self):
3603 with pytest.raises(ValueError):
3604 x509.InhibitAnyPolicy(-1)
3605
3606 def test_repr(self):
3607 iap = x509.InhibitAnyPolicy(0)
3608 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3609
3610 def test_eq(self):
3611 iap = x509.InhibitAnyPolicy(1)
3612 iap2 = x509.InhibitAnyPolicy(1)
3613 assert iap == iap2
3614
3615 def test_ne(self):
3616 iap = x509.InhibitAnyPolicy(1)
3617 iap2 = x509.InhibitAnyPolicy(4)
3618 assert iap != iap2
3619 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003620
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303621 def test_hash(self):
3622 iap = x509.InhibitAnyPolicy(1)
3623 iap2 = x509.InhibitAnyPolicy(1)
3624 iap3 = x509.InhibitAnyPolicy(4)
3625 assert hash(iap) == hash(iap2)
3626 assert hash(iap) != hash(iap3)
3627
Paul Kehrerca6ce992015-06-17 22:13:15 -06003628
3629@pytest.mark.requires_backend_interface(interface=RSABackend)
3630@pytest.mark.requires_backend_interface(interface=X509Backend)
3631class TestInhibitAnyPolicyExtension(object):
3632 def test_nocheck(self, backend):
3633 cert = _load_cert(
3634 os.path.join(
3635 "x509", "custom", "inhibit_any_policy_5.pem"
3636 ),
3637 x509.load_pem_x509_certificate,
3638 backend
3639 )
3640 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003641 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003642 ).value
3643 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003644
3645
3646@pytest.mark.requires_backend_interface(interface=RSABackend)
3647@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003648class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003649 def test_invalid_certificate_policies_data(self, backend):
3650 cert = _load_cert(
3651 os.path.join(
3652 "x509", "custom", "cp_invalid.pem"
3653 ),
3654 x509.load_pem_x509_certificate,
3655 backend
3656 )
3657 with pytest.raises(ValueError):
3658 cert.extensions