blob: f3677d11083b454f22b4d0363d7df246ce4f9dda [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
271 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500272 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400273
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500274 if six.PY3:
275 assert repr(nr) == (
276 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
277 "])>"
278 )
279 else:
280 assert repr(nr) == (
281 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
282 "4])>"
283 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400284
Paul Kehrerc56ab622015-05-03 09:56:31 -0500285 def test_eq(self):
286 nr = x509.NoticeReference("org", [1, 2])
287 nr2 = x509.NoticeReference("org", [1, 2])
288 assert nr == nr2
289
290 def test_ne(self):
291 nr = x509.NoticeReference("org", [1, 2])
292 nr2 = x509.NoticeReference("org", [1])
293 nr3 = x509.NoticeReference(None, [1, 2])
294 assert nr != nr2
295 assert nr != nr3
296 assert nr != object()
297
Paul Kehrer2b622582015-04-15 11:04:29 -0400298
299class TestUserNotice(object):
300 def test_notice_reference_invalid(self):
301 with pytest.raises(TypeError):
302 x509.UserNotice("invalid", None)
303
304 def test_notice_reference_none(self):
305 un = x509.UserNotice(None, "text")
306 assert un.notice_reference is None
307 assert un.explicit_text == "text"
308
309 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500310 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500311 if six.PY3:
312 assert repr(un) == (
313 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500314 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500315 )
316 else:
317 assert repr(un) == (
318 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500319 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500320 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400321
Paul Kehrerc56ab622015-05-03 09:56:31 -0500322 def test_eq(self):
323 nr = x509.NoticeReference("org", [1, 2])
324 nr2 = x509.NoticeReference("org", [1, 2])
325 un = x509.UserNotice(nr, "text")
326 un2 = x509.UserNotice(nr2, "text")
327 assert un == un2
328
329 def test_ne(self):
330 nr = x509.NoticeReference("org", [1, 2])
331 nr2 = x509.NoticeReference("org", [1])
332 un = x509.UserNotice(nr, "text")
333 un2 = x509.UserNotice(nr2, "text")
334 un3 = x509.UserNotice(nr, "text3")
335 assert un != un2
336 assert un != un3
337 assert un != object()
338
Paul Kehrer2b622582015-04-15 11:04:29 -0400339
Paul Kehrer2b622582015-04-15 11:04:29 -0400340class TestPolicyInformation(object):
341 def test_invalid_policy_identifier(self):
342 with pytest.raises(TypeError):
343 x509.PolicyInformation("notanoid", None)
344
345 def test_none_policy_qualifiers(self):
346 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
347 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
348 assert pi.policy_qualifiers is None
349
350 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500351 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400352 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
353 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
354 assert pi.policy_qualifiers == pq
355
356 def test_invalid_policy_identifiers(self):
357 with pytest.raises(TypeError):
358 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
359
360 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500361 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400362 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500363 if six.PY3:
364 assert repr(pi) == (
365 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
366 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500367 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500368 )
369 else:
370 assert repr(pi) == (
371 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
372 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500373 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500374 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400375
Paul Kehrerc56ab622015-05-03 09:56:31 -0500376 def test_eq(self):
377 pi = x509.PolicyInformation(
378 x509.ObjectIdentifier("1.2.3"),
379 [u"string", x509.UserNotice(None, u"hi")]
380 )
381 pi2 = x509.PolicyInformation(
382 x509.ObjectIdentifier("1.2.3"),
383 [u"string", x509.UserNotice(None, u"hi")]
384 )
385 assert pi == pi2
386
387 def test_ne(self):
388 pi = x509.PolicyInformation(
389 x509.ObjectIdentifier("1.2.3"), [u"string"]
390 )
391 pi2 = x509.PolicyInformation(
392 x509.ObjectIdentifier("1.2.3"), [u"string2"]
393 )
394 pi3 = x509.PolicyInformation(
395 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
396 )
397 assert pi != pi2
398 assert pi != pi3
399 assert pi != object()
400
Paul Kehrer2b622582015-04-15 11:04:29 -0400401
402class TestCertificatePolicies(object):
403 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500404 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400405 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
406 with pytest.raises(TypeError):
407 x509.CertificatePolicies([1, pi])
408
409 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500410 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400411 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
412 cp = x509.CertificatePolicies([pi])
413 assert len(cp) == 1
414 for policyinfo in cp:
415 assert policyinfo == pi
416
417 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500418 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400419 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
420 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500421 if six.PY3:
422 assert repr(cp) == (
423 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
424 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
425 "ers=['string'])>])>"
426 )
427 else:
428 assert repr(cp) == (
429 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
430 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
431 "ers=[u'string'])>])>"
432 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400433
Paul Kehrerc56ab622015-05-03 09:56:31 -0500434 def test_eq(self):
435 pi = x509.PolicyInformation(
436 x509.ObjectIdentifier("1.2.3"), [u"string"]
437 )
438 cp = x509.CertificatePolicies([pi])
439 pi2 = x509.PolicyInformation(
440 x509.ObjectIdentifier("1.2.3"), [u"string"]
441 )
442 cp2 = x509.CertificatePolicies([pi2])
443 assert cp == cp2
444
445 def test_ne(self):
446 pi = x509.PolicyInformation(
447 x509.ObjectIdentifier("1.2.3"), [u"string"]
448 )
449 cp = x509.CertificatePolicies([pi])
450 pi2 = x509.PolicyInformation(
451 x509.ObjectIdentifier("1.2.3"), [u"string2"]
452 )
453 cp2 = x509.CertificatePolicies([pi2])
454 assert cp != cp2
455 assert cp != object()
456
Paul Kehrere8db7bd2015-12-27 17:32:57 -0600457 def test_indexing(self):
458 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"test"])
459 pi2 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.4"), [u"test"])
460 pi3 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.5"), [u"test"])
461 pi4 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.6"), [u"test"])
462 pi5 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.7"), [u"test"])
463 cp = x509.CertificatePolicies([pi, pi2, pi3, pi4, pi5])
464 assert cp[-1] == cp[4]
465 assert cp[2:6:2] == [cp[2], cp[4]]
466
Paul Kehrer2b622582015-04-15 11:04:29 -0400467
Paul Kehrer11026fe2015-05-12 11:23:56 -0500468@pytest.mark.requires_backend_interface(interface=RSABackend)
469@pytest.mark.requires_backend_interface(interface=X509Backend)
470class TestCertificatePoliciesExtension(object):
471 def test_cps_uri_policy_qualifier(self, backend):
472 cert = _load_cert(
473 os.path.join("x509", "custom", "cp_cps_uri.pem"),
474 x509.load_pem_x509_certificate,
475 backend
476 )
477
478 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500479 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500480 ).value
481
482 assert cp == x509.CertificatePolicies([
483 x509.PolicyInformation(
484 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
485 [u"http://other.com/cps"]
486 )
487 ])
488
489 def test_user_notice_with_notice_reference(self, backend):
490 cert = _load_cert(
491 os.path.join(
492 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
493 ),
494 x509.load_pem_x509_certificate,
495 backend
496 )
497
498 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500499 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500500 ).value
501
502 assert cp == x509.CertificatePolicies([
503 x509.PolicyInformation(
504 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
505 [
506 u"http://example.com/cps",
507 u"http://other.com/cps",
508 x509.UserNotice(
509 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
510 u"thing"
511 )
512 ]
513 )
514 ])
515
516 def test_user_notice_with_explicit_text(self, backend):
517 cert = _load_cert(
518 os.path.join(
519 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
520 ),
521 x509.load_pem_x509_certificate,
522 backend
523 )
524
525 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500526 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500527 ).value
528
529 assert cp == x509.CertificatePolicies([
530 x509.PolicyInformation(
531 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
532 [x509.UserNotice(None, u"thing")]
533 )
534 ])
535
536 def test_user_notice_no_explicit_text(self, backend):
537 cert = _load_cert(
538 os.path.join(
539 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
540 ),
541 x509.load_pem_x509_certificate,
542 backend
543 )
544
545 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500546 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500547 ).value
548
549 assert cp == x509.CertificatePolicies([
550 x509.PolicyInformation(
551 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
552 [
553 x509.UserNotice(
554 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
555 None
556 )
557 ]
558 )
559 ])
560
561
Paul Kehrercecbbba2015-03-30 14:58:38 -0500562class TestKeyUsage(object):
563 def test_key_agreement_false_encipher_decipher_true(self):
564 with pytest.raises(ValueError):
565 x509.KeyUsage(
566 digital_signature=False,
567 content_commitment=False,
568 key_encipherment=False,
569 data_encipherment=False,
570 key_agreement=False,
571 key_cert_sign=False,
572 crl_sign=False,
573 encipher_only=True,
574 decipher_only=False
575 )
576
577 with pytest.raises(ValueError):
578 x509.KeyUsage(
579 digital_signature=False,
580 content_commitment=False,
581 key_encipherment=False,
582 data_encipherment=False,
583 key_agreement=False,
584 key_cert_sign=False,
585 crl_sign=False,
586 encipher_only=True,
587 decipher_only=True
588 )
589
590 with pytest.raises(ValueError):
591 x509.KeyUsage(
592 digital_signature=False,
593 content_commitment=False,
594 key_encipherment=False,
595 data_encipherment=False,
596 key_agreement=False,
597 key_cert_sign=False,
598 crl_sign=False,
599 encipher_only=False,
600 decipher_only=True
601 )
602
603 def test_properties_key_agreement_true(self):
604 ku = x509.KeyUsage(
605 digital_signature=True,
606 content_commitment=True,
607 key_encipherment=False,
608 data_encipherment=False,
609 key_agreement=False,
610 key_cert_sign=True,
611 crl_sign=False,
612 encipher_only=False,
613 decipher_only=False
614 )
615 assert ku.digital_signature is True
616 assert ku.content_commitment is True
617 assert ku.key_encipherment is False
618 assert ku.data_encipherment is False
619 assert ku.key_agreement is False
620 assert ku.key_cert_sign is True
621 assert ku.crl_sign is False
622
623 def test_key_agreement_true_properties(self):
624 ku = x509.KeyUsage(
625 digital_signature=False,
626 content_commitment=False,
627 key_encipherment=False,
628 data_encipherment=False,
629 key_agreement=True,
630 key_cert_sign=False,
631 crl_sign=False,
632 encipher_only=False,
633 decipher_only=True
634 )
635 assert ku.key_agreement is True
636 assert ku.encipher_only is False
637 assert ku.decipher_only is True
638
639 def test_key_agreement_false_properties(self):
640 ku = x509.KeyUsage(
641 digital_signature=False,
642 content_commitment=False,
643 key_encipherment=False,
644 data_encipherment=False,
645 key_agreement=False,
646 key_cert_sign=False,
647 crl_sign=False,
648 encipher_only=False,
649 decipher_only=False
650 )
651 assert ku.key_agreement is False
652 with pytest.raises(ValueError):
653 ku.encipher_only
654
655 with pytest.raises(ValueError):
656 ku.decipher_only
657
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500658 def test_repr_key_agreement_false(self):
659 ku = x509.KeyUsage(
660 digital_signature=True,
661 content_commitment=True,
662 key_encipherment=False,
663 data_encipherment=False,
664 key_agreement=False,
665 key_cert_sign=True,
666 crl_sign=False,
667 encipher_only=False,
668 decipher_only=False
669 )
670 assert repr(ku) == (
671 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
672 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400673 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
674 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500675 )
676
677 def test_repr_key_agreement_true(self):
678 ku = x509.KeyUsage(
679 digital_signature=True,
680 content_commitment=True,
681 key_encipherment=False,
682 data_encipherment=False,
683 key_agreement=True,
684 key_cert_sign=True,
685 crl_sign=False,
686 encipher_only=False,
687 decipher_only=False
688 )
689 assert repr(ku) == (
690 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
691 "cipherment=False, data_encipherment=False, key_agreement=True, k"
692 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
693 "only=False)>"
694 )
695
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500696 def test_eq(self):
697 ku = x509.KeyUsage(
698 digital_signature=False,
699 content_commitment=False,
700 key_encipherment=False,
701 data_encipherment=False,
702 key_agreement=True,
703 key_cert_sign=False,
704 crl_sign=False,
705 encipher_only=False,
706 decipher_only=True
707 )
708 ku2 = x509.KeyUsage(
709 digital_signature=False,
710 content_commitment=False,
711 key_encipherment=False,
712 data_encipherment=False,
713 key_agreement=True,
714 key_cert_sign=False,
715 crl_sign=False,
716 encipher_only=False,
717 decipher_only=True
718 )
719 assert ku == ku2
720
721 def test_ne(self):
722 ku = x509.KeyUsage(
723 digital_signature=False,
724 content_commitment=False,
725 key_encipherment=False,
726 data_encipherment=False,
727 key_agreement=True,
728 key_cert_sign=False,
729 crl_sign=False,
730 encipher_only=False,
731 decipher_only=True
732 )
733 ku2 = x509.KeyUsage(
734 digital_signature=False,
735 content_commitment=False,
736 key_encipherment=False,
737 data_encipherment=False,
738 key_agreement=False,
739 key_cert_sign=False,
740 crl_sign=False,
741 encipher_only=False,
742 decipher_only=False
743 )
744 assert ku != ku2
745 assert ku != object()
746
Paul Kehrercecbbba2015-03-30 14:58:38 -0500747
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500748class TestSubjectKeyIdentifier(object):
749 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400750 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500751 ski = x509.SubjectKeyIdentifier(value)
752 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500753
754 def test_repr(self):
755 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500756 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500757 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500758 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400759 if six.PY3:
760 assert repr(ext) == (
761 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
762 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
763 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
764 "\\xf7\\xff:\\xc9\')>)>"
765 )
766 else:
767 assert repr(ext) == (
768 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
769 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
770 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
771 "\\xf7\\xff:\\xc9\')>)>"
772 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500773
774 def test_eq(self):
775 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500776 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500777 )
778 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500779 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500780 )
781 assert ski == ski2
782
783 def test_ne(self):
784 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500785 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500786 )
787 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500788 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500789 )
790 assert ski != ski2
791 assert ski != object()
792
Alex Gaynor410fe352015-12-26 15:01:25 -0500793 def test_hash(self):
794 ski1 = x509.SubjectKeyIdentifier(
795 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
796 )
797 ski2 = x509.SubjectKeyIdentifier(
798 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
799 )
800 ski3 = x509.SubjectKeyIdentifier(
801 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
802 )
803
804 assert hash(ski1) == hash(ski2)
805 assert hash(ski1) != hash(ski3)
806
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500807
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400808class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500809 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400810 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500811 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400812
813 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500814 dirname = x509.DirectoryName(
815 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800816 x509.NameAttribute(
817 x509.ObjectIdentifier('2.999.1'),
818 u'value1'
819 ),
820 x509.NameAttribute(
821 x509.ObjectIdentifier('2.999.2'),
822 u'value2'
823 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500824 ])
825 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400826 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500827 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400828
829 def test_authority_issuer_none_serial_not_none(self):
830 with pytest.raises(ValueError):
831 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
832
833 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500834 dirname = x509.DirectoryName(
835 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800836 x509.NameAttribute(
837 x509.ObjectIdentifier('2.999.1'),
838 u'value1'
839 ),
840 x509.NameAttribute(
841 x509.ObjectIdentifier('2.999.2'),
842 u'value2'
843 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500844 ])
845 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400846 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500847 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400848
849 def test_authority_cert_serial_and_issuer_none(self):
850 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
851 assert aki.key_identifier == b"id"
852 assert aki.authority_cert_issuer is None
853 assert aki.authority_cert_serial_number is None
854
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600855 def test_authority_cert_serial_zero(self):
856 dns = x509.DNSName(u"SomeIssuer")
857 aki = x509.AuthorityKeyIdentifier(b"id", [dns], 0)
858 assert aki.key_identifier == b"id"
859 assert aki.authority_cert_issuer == [dns]
860 assert aki.authority_cert_serial_number == 0
861
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400862 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500863 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500864 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500865 )
866 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400867
868 if six.PY3:
869 assert repr(aki) == (
870 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500871 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500872 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500873 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400874 )
875 else:
876 assert repr(aki) == (
877 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500878 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500879 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
880 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400881 )
882
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500883 def test_eq(self):
884 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500885 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500886 )
887 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
888 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500889 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500890 )
891 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
892 assert aki == aki2
893
894 def test_ne(self):
895 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500896 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500897 )
898 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500899 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500900 )
901 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
902 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
903 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
904 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
905 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
906 assert aki != aki2
907 assert aki != aki3
908 assert aki != aki4
909 assert aki != aki5
910 assert aki != object()
911
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400912
Paul Kehrer8cf26422015-03-21 09:50:24 -0500913class TestBasicConstraints(object):
914 def test_ca_not_boolean(self):
915 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500916 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500917
918 def test_path_length_not_ca(self):
919 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500920 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500921
922 def test_path_length_not_int(self):
923 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500924 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500925
926 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500927 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500928
929 def test_path_length_negative(self):
930 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500931 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500932
933 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500934 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500935 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500936 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500937 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500938
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600939 def test_hash(self):
940 na = x509.BasicConstraints(ca=True, path_length=None)
941 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600942 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600943 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600944 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600945
Paul Kehrer3a69b132015-05-13 10:03:46 -0500946 def test_eq(self):
947 na = x509.BasicConstraints(ca=True, path_length=None)
948 na2 = x509.BasicConstraints(ca=True, path_length=None)
949 assert na == na2
950
951 def test_ne(self):
952 na = x509.BasicConstraints(ca=True, path_length=None)
953 na2 = x509.BasicConstraints(ca=True, path_length=1)
954 na3 = x509.BasicConstraints(ca=False, path_length=None)
955 assert na != na2
956 assert na != na3
957 assert na != object()
958
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500959
Paul Kehrerffa2a152015-03-31 08:18:25 -0500960class TestExtendedKeyUsage(object):
961 def test_not_all_oids(self):
962 with pytest.raises(TypeError):
963 x509.ExtendedKeyUsage(["notoid"])
964
965 def test_iter_len(self):
966 eku = x509.ExtendedKeyUsage([
967 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
968 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
969 ])
970 assert len(eku) == 2
971 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500972 ExtendedKeyUsageOID.SERVER_AUTH,
973 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500974 ]
975
Paul Kehrer23d10c32015-04-02 23:12:32 -0500976 def test_repr(self):
977 eku = x509.ExtendedKeyUsage([
978 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
979 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
980 ])
981 assert repr(eku) == (
982 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
983 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
984 "tAuth)>])>"
985 )
986
Paul Kehrerb0476172015-05-02 19:34:51 -0500987 def test_eq(self):
988 eku = x509.ExtendedKeyUsage([
989 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
990 ])
991 eku2 = x509.ExtendedKeyUsage([
992 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
993 ])
994 assert eku == eku2
995
996 def test_ne(self):
997 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
998 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
999 assert eku != eku2
1000 assert eku != object()
1001
Paul Kehrerffa2a152015-03-31 08:18:25 -05001002
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001003@pytest.mark.requires_backend_interface(interface=RSABackend)
1004@pytest.mark.requires_backend_interface(interface=X509Backend)
1005class TestExtensions(object):
1006 def test_no_extensions(self, backend):
1007 cert = _load_cert(
1008 os.path.join("x509", "verisign_md2_root.pem"),
1009 x509.load_pem_x509_certificate,
1010 backend
1011 )
1012 ext = cert.extensions
1013 assert len(ext) == 0
1014 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -05001015 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001016 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001017
Paul Kehrerd44e4132015-08-10 19:13:13 -05001018 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001019
1020 def test_one_extension(self, backend):
1021 cert = _load_cert(
1022 os.path.join(
1023 "x509", "custom", "basic_constraints_not_critical.pem"
1024 ),
1025 x509.load_pem_x509_certificate,
1026 backend
1027 )
1028 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001029 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001030 assert ext is not None
1031 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001032
1033 def test_duplicate_extension(self, backend):
1034 cert = _load_cert(
1035 os.path.join(
1036 "x509", "custom", "two_basic_constraints.pem"
1037 ),
1038 x509.load_pem_x509_certificate,
1039 backend
1040 )
1041 with pytest.raises(x509.DuplicateExtension) as exc:
1042 cert.extensions
1043
Paul Kehrerd44e4132015-08-10 19:13:13 -05001044 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001045
1046 def test_unsupported_critical_extension(self, backend):
1047 cert = _load_cert(
1048 os.path.join(
1049 "x509", "custom", "unsupported_extension_critical.pem"
1050 ),
1051 x509.load_pem_x509_certificate,
1052 backend
1053 )
1054 with pytest.raises(x509.UnsupportedExtension) as exc:
1055 cert.extensions
1056
1057 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
1058
Paul Kehrer58ddc112015-12-30 20:19:00 -06001059 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001060 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001061 cert = _load_cert(
1062 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001063 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001064 ),
1065 x509.load_pem_x509_certificate,
1066 backend
1067 )
1068 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001069 assert len(extensions) == 2
1070 assert extensions[0].critical is False
1071 assert extensions[0].oid == x509.ObjectIdentifier(
1072 "1.3.6.1.4.1.41482.2"
1073 )
1074 assert extensions[0].value == x509.UnrecognizedExtension(
1075 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1076 b"1.3.6.1.4.1.41482.1.2"
1077 )
1078 assert extensions[1].critical is False
1079 assert extensions[1].oid == x509.ObjectIdentifier(
1080 "1.3.6.1.4.1.45724.2.1.1"
1081 )
1082 assert extensions[1].value == x509.UnrecognizedExtension(
1083 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1084 b"\x03\x02\x040"
1085 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001086
Phoebe Queenecae9812015-08-12 05:00:32 +01001087 def test_no_extensions_get_for_class(self, backend):
1088 cert = _load_cert(
1089 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001090 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001091 ),
1092 x509.load_pem_x509_certificate,
1093 backend
1094 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001095 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001096 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001097 exts.get_extension_for_class(x509.IssuerAlternativeName)
1098 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001099
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001100 def test_unrecognized_extension_for_class(self):
1101 exts = x509.Extensions([])
1102 with pytest.raises(TypeError):
1103 exts.get_extension_for_class(x509.UnrecognizedExtension)
1104
Paul Kehrer5b90c972015-12-26 00:52:58 -06001105 def test_indexing(self, backend):
1106 cert = _load_cert(
1107 os.path.join("x509", "cryptography.io.pem"),
1108 x509.load_pem_x509_certificate,
1109 backend
1110 )
1111 exts = cert.extensions
1112 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001113 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001114
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001115 def test_one_extension_get_for_class(self, backend):
1116 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001117 os.path.join(
1118 "x509", "custom", "basic_constraints_not_critical.pem"
1119 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001120 x509.load_pem_x509_certificate,
1121 backend
1122 )
1123 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1124 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001125 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001126
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001127 def test_repr(self, backend):
1128 cert = _load_cert(
1129 os.path.join(
1130 "x509", "custom", "basic_constraints_not_critical.pem"
1131 ),
1132 x509.load_pem_x509_certificate,
1133 backend
1134 )
1135 assert repr(cert.extensions) == (
1136 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1137 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1138 "alse, path_length=None)>)>])>"
1139 )
1140
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001141
Paul Kehrerfa56a232015-03-17 13:14:03 -05001142@pytest.mark.requires_backend_interface(interface=RSABackend)
1143@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001144class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001145 def test_ca_true_pathlen_6(self, backend):
1146 cert = _load_cert(
1147 os.path.join(
1148 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1149 ),
1150 x509.load_der_x509_certificate,
1151 backend
1152 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001153 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001154 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001155 )
1156 assert ext is not None
1157 assert ext.critical is True
1158 assert ext.value.ca is True
1159 assert ext.value.path_length == 6
1160
1161 def test_path_length_zero(self, backend):
1162 cert = _load_cert(
1163 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1164 x509.load_pem_x509_certificate,
1165 backend
1166 )
1167 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001168 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001169 )
1170 assert ext is not None
1171 assert ext.critical is True
1172 assert ext.value.ca is True
1173 assert ext.value.path_length == 0
1174
1175 def test_ca_true_no_pathlen(self, backend):
1176 cert = _load_cert(
1177 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1178 x509.load_der_x509_certificate,
1179 backend
1180 )
1181 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001182 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001183 )
1184 assert ext is not None
1185 assert ext.critical is True
1186 assert ext.value.ca is True
1187 assert ext.value.path_length is None
1188
1189 def test_ca_false(self, backend):
1190 cert = _load_cert(
1191 os.path.join("x509", "cryptography.io.pem"),
1192 x509.load_pem_x509_certificate,
1193 backend
1194 )
1195 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001196 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001197 )
1198 assert ext is not None
1199 assert ext.critical is True
1200 assert ext.value.ca is False
1201 assert ext.value.path_length is None
1202
1203 def test_no_basic_constraints(self, backend):
1204 cert = _load_cert(
1205 os.path.join(
1206 "x509",
1207 "PKITS_data",
1208 "certs",
1209 "ValidCertificatePathTest1EE.crt"
1210 ),
1211 x509.load_der_x509_certificate,
1212 backend
1213 )
1214 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001215 cert.extensions.get_extension_for_oid(
1216 ExtensionOID.BASIC_CONSTRAINTS
1217 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001218
1219 def test_basic_constraint_not_critical(self, backend):
1220 cert = _load_cert(
1221 os.path.join(
1222 "x509", "custom", "basic_constraints_not_critical.pem"
1223 ),
1224 x509.load_pem_x509_certificate,
1225 backend
1226 )
1227 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001228 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001229 )
1230 assert ext is not None
1231 assert ext.critical is False
1232 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001233
1234
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001235class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001236 @pytest.mark.requires_backend_interface(interface=RSABackend)
1237 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001238 def test_subject_key_identifier(self, backend):
1239 cert = _load_cert(
1240 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1241 x509.load_der_x509_certificate,
1242 backend
1243 )
1244 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001245 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001246 )
1247 ski = ext.value
1248 assert ext is not None
1249 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001250 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001251 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001252 )
1253
Paul Kehrerf22f6122015-08-05 12:57:13 +01001254 @pytest.mark.requires_backend_interface(interface=RSABackend)
1255 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001256 def test_no_subject_key_identifier(self, backend):
1257 cert = _load_cert(
1258 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1259 x509.load_pem_x509_certificate,
1260 backend
1261 )
1262 with pytest.raises(x509.ExtensionNotFound):
1263 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001264 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001265 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001266
Paul Kehrerf22f6122015-08-05 12:57:13 +01001267 @pytest.mark.requires_backend_interface(interface=RSABackend)
1268 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001269 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001270 cert = _load_cert(
1271 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1272 x509.load_der_x509_certificate,
1273 backend
1274 )
1275 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001276 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001277 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001278 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001279 cert.public_key()
1280 )
1281 assert ext.value == ski
1282
1283 @pytest.mark.requires_backend_interface(interface=DSABackend)
1284 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001285 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001286 cert = _load_cert(
1287 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1288 x509.load_pem_x509_certificate,
1289 backend
1290 )
1291
1292 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001293 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001294 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001295 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001296 cert.public_key()
1297 )
1298 assert ext.value == ski
1299
1300 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1301 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001302 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001303 _skip_curve_unsupported(backend, ec.SECP384R1())
1304 cert = _load_cert(
1305 os.path.join("x509", "ecdsa_root.pem"),
1306 x509.load_pem_x509_certificate,
1307 backend
1308 )
1309
1310 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001311 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001312 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001313 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001314 cert.public_key()
1315 )
1316 assert ext.value == ski
1317
Paul Kehrer5508ee22015-04-02 19:31:03 -05001318
1319@pytest.mark.requires_backend_interface(interface=RSABackend)
1320@pytest.mark.requires_backend_interface(interface=X509Backend)
1321class TestKeyUsageExtension(object):
1322 def test_no_key_usage(self, backend):
1323 cert = _load_cert(
1324 os.path.join("x509", "verisign_md2_root.pem"),
1325 x509.load_pem_x509_certificate,
1326 backend
1327 )
1328 ext = cert.extensions
1329 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001330 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001331
Paul Kehrerd44e4132015-08-10 19:13:13 -05001332 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001333
1334 def test_all_purposes(self, backend):
1335 cert = _load_cert(
1336 os.path.join(
1337 "x509", "custom", "all_key_usages.pem"
1338 ),
1339 x509.load_pem_x509_certificate,
1340 backend
1341 )
1342 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001343 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001344 assert ext is not None
1345
1346 ku = ext.value
1347 assert ku.digital_signature is True
1348 assert ku.content_commitment is True
1349 assert ku.key_encipherment is True
1350 assert ku.data_encipherment is True
1351 assert ku.key_agreement is True
1352 assert ku.key_cert_sign is True
1353 assert ku.crl_sign is True
1354 assert ku.encipher_only is True
1355 assert ku.decipher_only is True
1356
1357 def test_key_cert_sign_crl_sign(self, backend):
1358 cert = _load_cert(
1359 os.path.join(
1360 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1361 ),
1362 x509.load_der_x509_certificate,
1363 backend
1364 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001365 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001366 assert ext is not None
1367 assert ext.critical is True
1368
1369 ku = ext.value
1370 assert ku.digital_signature is False
1371 assert ku.content_commitment is False
1372 assert ku.key_encipherment is False
1373 assert ku.data_encipherment is False
1374 assert ku.key_agreement is False
1375 assert ku.key_cert_sign is True
1376 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001377
1378
1379@pytest.mark.parametrize(
1380 "name", [
1381 x509.RFC822Name,
1382 x509.DNSName,
1383 x509.UniformResourceIdentifier
1384 ]
1385)
1386class TestTextGeneralNames(object):
1387 def test_not_text(self, name):
1388 with pytest.raises(TypeError):
1389 name(b"notaunicodestring")
1390
1391 with pytest.raises(TypeError):
1392 name(1.3)
1393
1394 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301395 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001396 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1397
1398 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301399 gn = name(u"string")
1400 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001401 assert gn == gn2
1402
1403 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301404 gn = name(u"string")
1405 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001406 assert gn != gn2
1407 assert gn != object()
1408
1409
1410class TestDirectoryName(object):
1411 def test_not_name(self):
1412 with pytest.raises(TypeError):
1413 x509.DirectoryName(b"notaname")
1414
1415 with pytest.raises(TypeError):
1416 x509.DirectoryName(1.3)
1417
1418 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001419 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001420 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001421 if six.PY3:
1422 assert repr(gn) == (
1423 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1424 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1425 ">])>)>"
1426 )
1427 else:
1428 assert repr(gn) == (
1429 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1430 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1431 ")>])>)>"
1432 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001433
1434 def test_eq(self):
1435 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001436 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001437 ])
1438 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001439 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001440 ])
1441 gn = x509.DirectoryName(x509.Name([name]))
1442 gn2 = x509.DirectoryName(x509.Name([name2]))
1443 assert gn == gn2
1444
1445 def test_ne(self):
1446 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001447 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001448 ])
1449 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001450 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001451 ])
1452 gn = x509.DirectoryName(x509.Name([name]))
1453 gn2 = x509.DirectoryName(x509.Name([name2]))
1454 assert gn != gn2
1455 assert gn != object()
1456
1457
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001458class TestRFC822Name(object):
1459 def test_invalid_email(self):
1460 with pytest.raises(ValueError):
1461 x509.RFC822Name(u"Name <email>")
1462
1463 with pytest.raises(ValueError):
1464 x509.RFC822Name(u"")
1465
1466 def test_single_label(self):
1467 gn = x509.RFC822Name(u"administrator")
1468 assert gn.value == u"administrator"
1469
1470 def test_idna(self):
1471 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1472 assert gn.value == u"email@em\xe5\xefl.com"
1473 assert gn._encoded == b"email@xn--eml-vla4c.com"
1474
Alex Gaynorb642dee2016-01-03 15:12:23 -05001475 def test_hash(self):
1476 g1 = x509.RFC822Name(u"email@host.com")
1477 g2 = x509.RFC822Name(u"email@host.com")
1478 g3 = x509.RFC822Name(u"admin@host.com")
1479
1480 assert hash(g1) == hash(g2)
1481 assert hash(g1) != hash(g3)
1482
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001483
Paul Kehrere28d6c42015-07-12 14:59:37 -05001484class TestUniformResourceIdentifier(object):
1485 def test_no_parsed_hostname(self):
1486 gn = x509.UniformResourceIdentifier(u"singlelabel")
1487 assert gn.value == u"singlelabel"
1488
1489 def test_with_port(self):
1490 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1491 assert gn.value == u"singlelabel:443/test"
1492
1493 def test_idna_no_port(self):
1494 gn = x509.UniformResourceIdentifier(
1495 u"http://\u043f\u044b\u043a\u0430.cryptography"
1496 )
1497 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1498 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1499
1500 def test_idna_with_port(self):
1501 gn = x509.UniformResourceIdentifier(
1502 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1503 )
1504 assert gn.value == (
1505 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1506 )
1507 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1508
1509 def test_query_and_fragment(self):
1510 gn = x509.UniformResourceIdentifier(
1511 u"ldap://cryptography:90/path?query=true#somedata"
1512 )
1513 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1514
Alex Gaynord1b56812016-01-03 15:14:34 -05001515 def test_hash(self):
1516 g1 = x509.UniformResourceIdentifier(u"http://host.com")
1517 g2 = x509.UniformResourceIdentifier(u"http://host.com")
1518 g3 = x509.UniformResourceIdentifier(u"http://other.com")
1519
1520 assert hash(g1) == hash(g2)
1521 assert hash(g1) != hash(g3)
1522
Paul Kehrere28d6c42015-07-12 14:59:37 -05001523
Paul Kehrer31bdf792015-03-25 14:11:00 -05001524class TestRegisteredID(object):
1525 def test_not_oid(self):
1526 with pytest.raises(TypeError):
1527 x509.RegisteredID(b"notanoid")
1528
1529 with pytest.raises(TypeError):
1530 x509.RegisteredID(1.3)
1531
1532 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001533 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001534 assert repr(gn) == (
1535 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1536 "e)>)>"
1537 )
1538
1539 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001540 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1541 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001542 assert gn == gn2
1543
1544 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001545 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001546 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001547 assert gn != gn2
1548 assert gn != object()
1549
1550
1551class TestIPAddress(object):
1552 def test_not_ipaddress(self):
1553 with pytest.raises(TypeError):
1554 x509.IPAddress(b"notanipaddress")
1555
1556 with pytest.raises(TypeError):
1557 x509.IPAddress(1.3)
1558
1559 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301560 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001561 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1562
Eeshan Gargf1234152015-04-29 18:41:00 +05301563 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001564 assert repr(gn2) == "<IPAddress(value=ff::)>"
1565
Paul Kehrereb177932015-05-17 18:33:33 -07001566 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1567 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1568
1569 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1570 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1571
Paul Kehrer31bdf792015-03-25 14:11:00 -05001572 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301573 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1574 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001575 assert gn == gn2
1576
1577 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301578 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1579 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001580 assert gn != gn2
1581 assert gn != object()
1582
1583
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001584class TestOtherName(object):
1585 def test_invalid_args(self):
1586 with pytest.raises(TypeError):
1587 x509.OtherName(b"notanobjectidentifier", b"derdata")
1588
1589 with pytest.raises(TypeError):
1590 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1591
1592 def test_repr(self):
1593 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1594 if six.PY3:
1595 assert repr(gn) == (
1596 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1597 "name=Unknown OID)>, value=b'derdata')>"
1598 )
1599 else:
1600 assert repr(gn) == (
1601 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1602 "name=Unknown OID)>, value='derdata')>"
1603 )
1604
1605 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1606 if six.PY3:
1607 assert repr(gn) == (
1608 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1609 "name=pseudonym)>, value=b'derdata')>"
1610 )
1611 else:
1612 assert repr(gn) == (
1613 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1614 "name=pseudonym)>, value='derdata')>"
1615 )
1616
1617 def test_eq(self):
1618 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1619 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1620 assert gn == gn2
1621
1622 def test_ne(self):
1623 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1624 assert gn != object()
1625
1626 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1627 assert gn != gn2
1628
1629 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1630 assert gn != gn2
1631
1632
Erik Trauschke2dcce902015-05-14 16:12:24 -07001633class TestGeneralNames(object):
1634 def test_get_values_for_type(self):
1635 gns = x509.GeneralNames(
1636 [x509.DNSName(u"cryptography.io")]
1637 )
1638 names = gns.get_values_for_type(x509.DNSName)
1639 assert names == [u"cryptography.io"]
1640
1641 def test_iter_names(self):
1642 gns = x509.GeneralNames([
1643 x509.DNSName(u"cryptography.io"),
1644 x509.DNSName(u"crypto.local"),
1645 ])
1646 assert len(gns) == 2
1647 assert list(gns) == [
1648 x509.DNSName(u"cryptography.io"),
1649 x509.DNSName(u"crypto.local"),
1650 ]
1651
Paul Kehrer8adb5962015-12-26 14:46:58 -06001652 def test_indexing(self):
1653 gn = x509.GeneralNames([
1654 x509.DNSName(u"cryptography.io"),
1655 x509.DNSName(u"crypto.local"),
1656 x509.DNSName(u"another.local"),
1657 x509.RFC822Name(u"email@another.local"),
1658 x509.UniformResourceIdentifier(u"http://another.local"),
1659 ])
1660 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001661 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001662
Erik Trauschke2dcce902015-05-14 16:12:24 -07001663 def test_invalid_general_names(self):
1664 with pytest.raises(TypeError):
1665 x509.GeneralNames(
1666 [x509.DNSName(u"cryptography.io"), "invalid"]
1667 )
1668
1669 def test_repr(self):
1670 gns = x509.GeneralNames(
1671 [
1672 x509.DNSName(u"cryptography.io")
1673 ]
1674 )
1675 assert repr(gns) == (
1676 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1677 )
1678
1679 def test_eq(self):
1680 gns = x509.GeneralNames(
1681 [x509.DNSName(u"cryptography.io")]
1682 )
1683 gns2 = x509.GeneralNames(
1684 [x509.DNSName(u"cryptography.io")]
1685 )
1686 assert gns == gns2
1687
1688 def test_ne(self):
1689 gns = x509.GeneralNames(
1690 [x509.DNSName(u"cryptography.io")]
1691 )
1692 gns2 = x509.GeneralNames(
1693 [x509.RFC822Name(u"admin@cryptography.io")]
1694 )
1695 assert gns != gns2
1696 assert gns != object()
1697
1698
Paul Kehrer99125c92015-06-07 18:37:10 -05001699class TestIssuerAlternativeName(object):
1700 def test_get_values_for_type(self):
1701 san = x509.IssuerAlternativeName(
1702 [x509.DNSName(u"cryptography.io")]
1703 )
1704 names = san.get_values_for_type(x509.DNSName)
1705 assert names == [u"cryptography.io"]
1706
1707 def test_iter_names(self):
1708 san = x509.IssuerAlternativeName([
1709 x509.DNSName(u"cryptography.io"),
1710 x509.DNSName(u"crypto.local"),
1711 ])
1712 assert len(san) == 2
1713 assert list(san) == [
1714 x509.DNSName(u"cryptography.io"),
1715 x509.DNSName(u"crypto.local"),
1716 ]
1717
Paul Kehrer5c999d32015-12-26 17:45:20 -06001718 def test_indexing(self):
1719 ian = x509.IssuerAlternativeName([
1720 x509.DNSName(u"cryptography.io"),
1721 x509.DNSName(u"crypto.local"),
1722 x509.DNSName(u"another.local"),
1723 x509.RFC822Name(u"email@another.local"),
1724 x509.UniformResourceIdentifier(u"http://another.local"),
1725 ])
1726 assert ian[-1] == ian[4]
1727 assert ian[2:6:2] == [ian[2], ian[4]]
1728
Paul Kehrer99125c92015-06-07 18:37:10 -05001729 def test_invalid_general_names(self):
1730 with pytest.raises(TypeError):
1731 x509.IssuerAlternativeName(
1732 [x509.DNSName(u"cryptography.io"), "invalid"]
1733 )
1734
1735 def test_repr(self):
1736 san = x509.IssuerAlternativeName(
1737 [
1738 x509.DNSName(u"cryptography.io")
1739 ]
1740 )
1741 assert repr(san) == (
1742 "<IssuerAlternativeName("
1743 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1744 )
1745
1746 def test_eq(self):
1747 san = x509.IssuerAlternativeName(
1748 [x509.DNSName(u"cryptography.io")]
1749 )
1750 san2 = x509.IssuerAlternativeName(
1751 [x509.DNSName(u"cryptography.io")]
1752 )
1753 assert san == san2
1754
1755 def test_ne(self):
1756 san = x509.IssuerAlternativeName(
1757 [x509.DNSName(u"cryptography.io")]
1758 )
1759 san2 = x509.IssuerAlternativeName(
1760 [x509.RFC822Name(u"admin@cryptography.io")]
1761 )
1762 assert san != san2
1763 assert san != object()
1764
1765
Alex Gaynorf1c17672015-06-20 14:20:20 -04001766@pytest.mark.requires_backend_interface(interface=RSABackend)
1767@pytest.mark.requires_backend_interface(interface=X509Backend)
1768class TestRSAIssuerAlternativeNameExtension(object):
1769 def test_uri(self, backend):
1770 cert = _load_cert(
1771 os.path.join("x509", "custom", "ian_uri.pem"),
1772 x509.load_pem_x509_certificate,
1773 backend,
1774 )
1775 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001776 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001777 )
1778 assert list(ext.value) == [
1779 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1780 ]
1781
1782
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001783class TestCRLNumber(object):
1784 def test_eq(self):
1785 crl_number = x509.CRLNumber(15)
1786 assert crl_number == x509.CRLNumber(15)
1787
1788 def test_ne(self):
1789 crl_number = x509.CRLNumber(15)
1790 assert crl_number != x509.CRLNumber(14)
1791 assert crl_number != object()
1792
1793 def test_repr(self):
1794 crl_number = x509.CRLNumber(15)
1795 assert repr(crl_number) == "<CRLNumber(15)>"
1796
Paul Kehrera9718fc2015-12-22 22:55:35 -06001797 def test_invalid_number(self):
1798 with pytest.raises(TypeError):
1799 x509.CRLNumber("notanumber")
1800
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001801 def test_hash(self):
1802 c1 = x509.CRLNumber(1)
1803 c2 = x509.CRLNumber(1)
1804 c3 = x509.CRLNumber(2)
1805 assert hash(c1) == hash(c2)
1806 assert hash(c1) != hash(c3)
1807
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001808
Paul Kehrer31bdf792015-03-25 14:11:00 -05001809class TestSubjectAlternativeName(object):
1810 def test_get_values_for_type(self):
1811 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301812 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001813 )
1814 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301815 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001816
1817 def test_iter_names(self):
1818 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301819 x509.DNSName(u"cryptography.io"),
1820 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001821 ])
1822 assert len(san) == 2
1823 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301824 x509.DNSName(u"cryptography.io"),
1825 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001826 ]
1827
Paul Kehrer8adb5962015-12-26 14:46:58 -06001828 def test_indexing(self):
1829 san = x509.SubjectAlternativeName([
1830 x509.DNSName(u"cryptography.io"),
1831 x509.DNSName(u"crypto.local"),
1832 x509.DNSName(u"another.local"),
1833 x509.RFC822Name(u"email@another.local"),
1834 x509.UniformResourceIdentifier(u"http://another.local"),
1835 ])
1836 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001837 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001838
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001839 def test_invalid_general_names(self):
1840 with pytest.raises(TypeError):
1841 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301842 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001843 )
1844
Paul Kehrer31bdf792015-03-25 14:11:00 -05001845 def test_repr(self):
1846 san = x509.SubjectAlternativeName(
1847 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301848 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001849 ]
1850 )
1851 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001852 "<SubjectAlternativeName("
1853 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001854 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001855
Paul Kehrer58cc3972015-05-13 10:00:41 -05001856 def test_eq(self):
1857 san = x509.SubjectAlternativeName(
1858 [x509.DNSName(u"cryptography.io")]
1859 )
1860 san2 = x509.SubjectAlternativeName(
1861 [x509.DNSName(u"cryptography.io")]
1862 )
1863 assert san == san2
1864
1865 def test_ne(self):
1866 san = x509.SubjectAlternativeName(
1867 [x509.DNSName(u"cryptography.io")]
1868 )
1869 san2 = x509.SubjectAlternativeName(
1870 [x509.RFC822Name(u"admin@cryptography.io")]
1871 )
1872 assert san != san2
1873 assert san != object()
1874
Paul Kehrer40f83382015-04-20 15:00:16 -05001875
1876@pytest.mark.requires_backend_interface(interface=RSABackend)
1877@pytest.mark.requires_backend_interface(interface=X509Backend)
1878class TestRSASubjectAlternativeNameExtension(object):
1879 def test_dns_name(self, backend):
1880 cert = _load_cert(
1881 os.path.join("x509", "cryptography.io.pem"),
1882 x509.load_pem_x509_certificate,
1883 backend
1884 )
1885 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001886 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001887 )
1888 assert ext is not None
1889 assert ext.critical is False
1890
1891 san = ext.value
1892
1893 dns = san.get_values_for_type(x509.DNSName)
1894 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001895
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001896 def test_wildcard_dns_name(self, backend):
1897 cert = _load_cert(
1898 os.path.join("x509", "wildcard_san.pem"),
1899 x509.load_pem_x509_certificate,
1900 backend
1901 )
1902 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001903 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001904 )
1905
1906 dns = ext.value.get_values_for_type(x509.DNSName)
1907 assert dns == [
1908 u'*.langui.sh',
1909 u'langui.sh',
1910 u'*.saseliminator.com',
1911 u'saseliminator.com'
1912 ]
1913
Dominic Chen87bb9572015-10-09 00:23:07 -04001914 def test_san_empty_hostname(self, backend):
1915 cert = _load_cert(
1916 os.path.join(
1917 "x509", "custom", "san_empty_hostname.pem"
1918 ),
1919 x509.load_pem_x509_certificate,
1920 backend
1921 )
1922 san = cert.extensions.get_extension_for_oid(
1923 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1924 )
1925
1926 dns = san.value.get_values_for_type(x509.DNSName)
1927 assert dns == [u'']
1928
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001929 def test_san_wildcard_idna_dns_name(self, backend):
1930 cert = _load_cert(
1931 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1932 x509.load_pem_x509_certificate,
1933 backend
1934 )
1935 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001936 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001937 )
1938
1939 dns = ext.value.get_values_for_type(x509.DNSName)
1940 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1941
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001942 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001943 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001944 os.path.join("x509", "san_x400address.der"),
1945 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001946 backend
1947 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001948 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001949 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001950
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001951 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001952
1953 def test_registered_id(self, backend):
1954 cert = _load_cert(
1955 os.path.join(
1956 "x509", "custom", "san_registered_id.pem"
1957 ),
1958 x509.load_pem_x509_certificate,
1959 backend
1960 )
1961 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001962 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001963 )
1964 assert ext is not None
1965 assert ext.critical is False
1966
1967 san = ext.value
1968 rid = san.get_values_for_type(x509.RegisteredID)
1969 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001970
1971 def test_uri(self, backend):
1972 cert = _load_cert(
1973 os.path.join(
1974 "x509", "custom", "san_uri_with_port.pem"
1975 ),
1976 x509.load_pem_x509_certificate,
1977 backend
1978 )
1979 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001980 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001981 )
1982 assert ext is not None
1983 uri = ext.value.get_values_for_type(
1984 x509.UniformResourceIdentifier
1985 )
1986 assert uri == [
1987 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1988 u"lo",
1989 u"http://someregulardomain.com",
1990 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001991
1992 def test_ipaddress(self, backend):
1993 cert = _load_cert(
1994 os.path.join(
1995 "x509", "custom", "san_ipaddr.pem"
1996 ),
1997 x509.load_pem_x509_certificate,
1998 backend
1999 )
2000 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002001 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05002002 )
2003 assert ext is not None
2004 assert ext.critical is False
2005
2006 san = ext.value
2007
2008 ip = san.get_values_for_type(x509.IPAddress)
2009 assert [
2010 ipaddress.ip_address(u"127.0.0.1"),
2011 ipaddress.ip_address(u"ff::")
2012 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05002013
2014 def test_dirname(self, backend):
2015 cert = _load_cert(
2016 os.path.join(
2017 "x509", "custom", "san_dirname.pem"
2018 ),
2019 x509.load_pem_x509_certificate,
2020 backend
2021 )
2022 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002023 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002024 )
2025 assert ext is not None
2026 assert ext.critical is False
2027
2028 san = ext.value
2029
2030 dirname = san.get_values_for_type(x509.DirectoryName)
2031 assert [
2032 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002033 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2034 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2035 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002036 ])
2037 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002038
2039 def test_rfc822name(self, backend):
2040 cert = _load_cert(
2041 os.path.join(
2042 "x509", "custom", "san_rfc822_idna.pem"
2043 ),
2044 x509.load_pem_x509_certificate,
2045 backend
2046 )
2047 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002048 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002049 )
2050 assert ext is not None
2051 assert ext.critical is False
2052
2053 san = ext.value
2054
2055 rfc822name = san.get_values_for_type(x509.RFC822Name)
2056 assert [u"email@em\xe5\xefl.com"] == rfc822name
2057
Paul Kehrerb8968812015-05-15 09:01:34 -07002058 def test_idna2003_invalid(self, backend):
2059 cert = _load_cert(
2060 os.path.join(
2061 "x509", "custom", "san_idna2003_dnsname.pem"
2062 ),
2063 x509.load_pem_x509_certificate,
2064 backend
2065 )
2066 with pytest.raises(UnicodeError):
2067 cert.extensions
2068
Paul Kehrere06cab42015-04-30 10:23:33 -05002069 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2070 cert = _load_cert(
2071 os.path.join(
2072 "x509", "custom", "san_idna_names.pem"
2073 ),
2074 x509.load_pem_x509_certificate,
2075 backend
2076 )
2077 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002078 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002079 )
2080 assert ext is not None
2081 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2082 dns_name = ext.value.get_values_for_type(x509.DNSName)
2083 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2084 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2085 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2086 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2087
2088 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2089 cert = _load_cert(
2090 os.path.join(
2091 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2092 ),
2093 x509.load_pem_x509_certificate,
2094 backend
2095 )
2096 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002097 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002098 )
2099 assert ext is not None
2100 assert ext.critical is False
2101
2102 san = ext.value
2103
2104 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2105 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2106 dns = san.get_values_for_type(x509.DNSName)
2107 ip = san.get_values_for_type(x509.IPAddress)
2108 dirname = san.get_values_for_type(x509.DirectoryName)
2109 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002110 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002111 assert [u"cryptography.io"] == dns
2112 assert [
2113 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002114 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002115 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002116 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002117 ),
2118 ])
2119 ] == dirname
2120 assert [
2121 ipaddress.ip_address(u"127.0.0.1"),
2122 ipaddress.ip_address(u"ff::")
2123 ] == ip
2124
2125 def test_invalid_rfc822name(self, backend):
2126 cert = _load_cert(
2127 os.path.join(
2128 "x509", "custom", "san_rfc822_names.pem"
2129 ),
2130 x509.load_pem_x509_certificate,
2131 backend
2132 )
2133 with pytest.raises(ValueError) as exc:
2134 cert.extensions
2135
2136 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002137
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002138 def test_other_name(self, backend):
2139 cert = _load_cert(
2140 os.path.join(
2141 "x509", "custom", "san_other_name.pem"
2142 ),
2143 x509.load_pem_x509_certificate,
2144 backend
2145 )
2146
2147 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002148 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002149 )
2150 assert ext is not None
2151 assert ext.critical is False
2152
Joshua Taubererd2afad32015-07-06 22:37:53 +00002153 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2154 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002155 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002156 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002157
2158 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002159 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002160
Marti4739cfc2016-08-02 04:03:25 +03002161 def test_certbuilder(self, backend):
2162 sans = [u'*.example.org', u'*.\xf5\xe4\xf6\xfc.example.com',
2163 u'foobar.example.net']
2164 private_key = RSA_KEY_2048.private_key(backend)
2165 builder = _make_certbuilder(private_key)
2166 builder = builder.add_extension(
2167 SubjectAlternativeName(list(map(DNSName, sans))), True)
2168
2169 cert = builder.sign(private_key, hashes.SHA1(), backend)
2170 result = [x.value for x in cert.extensions.get_extension_for_class(
2171 SubjectAlternativeName).value]
2172 assert result == sans
2173
Paul Kehrer94c69602015-05-02 19:29:40 -05002174
2175@pytest.mark.requires_backend_interface(interface=RSABackend)
2176@pytest.mark.requires_backend_interface(interface=X509Backend)
2177class TestExtendedKeyUsageExtension(object):
2178 def test_eku(self, backend):
2179 cert = _load_cert(
2180 os.path.join(
2181 "x509", "custom", "extended_key_usage.pem"
2182 ),
2183 x509.load_pem_x509_certificate,
2184 backend
2185 )
2186 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002187 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002188 )
2189 assert ext is not None
2190 assert ext.critical is False
2191
2192 assert [
2193 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2194 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2195 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2196 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2197 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2198 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2199 x509.ObjectIdentifier("2.5.29.37.0"),
2200 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2201 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002202
2203
2204class TestAccessDescription(object):
2205 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002206 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002207 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2208
2209 def test_invalid_access_location(self):
2210 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002211 x509.AccessDescription(
2212 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2213 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002214
Nick Bastind2ecf862015-12-13 05:44:46 -08002215 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002216 ad = x509.AccessDescription(
2217 ObjectIdentifier("2.999.1"),
2218 x509.UniformResourceIdentifier(u"http://example.com")
2219 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002220 assert ad is not None
2221
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002222 def test_repr(self):
2223 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002224 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002225 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2226 )
2227 assert repr(ad) == (
2228 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2229 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2230 "(value=http://ocsp.domain.com)>)>"
2231 )
2232
2233 def test_eq(self):
2234 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002235 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002236 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2237 )
2238 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002239 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002240 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2241 )
2242 assert ad == ad2
2243
2244 def test_ne(self):
2245 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002246 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002247 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2248 )
2249 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002250 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002251 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2252 )
2253 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002254 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002255 x509.UniformResourceIdentifier(u"http://notthesame")
2256 )
2257 assert ad != ad2
2258 assert ad != ad3
2259 assert ad != object()
2260
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302261 def test_hash(self):
2262 ad = x509.AccessDescription(
2263 AuthorityInformationAccessOID.OCSP,
2264 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2265 )
2266 ad2 = x509.AccessDescription(
2267 AuthorityInformationAccessOID.OCSP,
2268 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2269 )
2270 ad3 = x509.AccessDescription(
2271 AuthorityInformationAccessOID.CA_ISSUERS,
2272 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2273 )
2274 assert hash(ad) == hash(ad2)
2275 assert hash(ad) != hash(ad3)
2276
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002277
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002278class TestPolicyConstraints(object):
2279 def test_invalid_explicit_policy(self):
2280 with pytest.raises(TypeError):
2281 x509.PolicyConstraints("invalid", None)
2282
2283 def test_invalid_inhibit_policy(self):
2284 with pytest.raises(TypeError):
2285 x509.PolicyConstraints(None, "invalid")
2286
2287 def test_both_none(self):
2288 with pytest.raises(ValueError):
2289 x509.PolicyConstraints(None, None)
2290
2291 def test_repr(self):
2292 pc = x509.PolicyConstraints(0, None)
2293
2294 assert repr(pc) == (
2295 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2296 u"pping=None)>"
2297 )
2298
2299 def test_eq(self):
2300 pc = x509.PolicyConstraints(2, 1)
2301 pc2 = x509.PolicyConstraints(2, 1)
2302 assert pc == pc2
2303
2304 def test_ne(self):
2305 pc = x509.PolicyConstraints(2, 1)
2306 pc2 = x509.PolicyConstraints(2, 2)
2307 pc3 = x509.PolicyConstraints(3, 1)
2308 assert pc != pc2
2309 assert pc != pc3
2310 assert pc != object()
2311
2312
Alex Gaynora9885602016-02-27 09:53:46 -05002313@pytest.mark.requires_backend_interface(interface=RSABackend)
2314@pytest.mark.requires_backend_interface(interface=X509Backend)
2315class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002316 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002317 cert = _load_cert(
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002318 os.path.join("x509", "department-of-state-root.pem"),
Alex Gaynora9885602016-02-27 09:53:46 -05002319 x509.load_pem_x509_certificate,
2320 backend
2321 )
2322 ext = cert.extensions.get_extension_for_oid(
2323 ExtensionOID.POLICY_CONSTRAINTS,
2324 )
2325 assert ext.critical is True
2326
2327 assert ext.value == x509.PolicyConstraints(
2328 require_explicit_policy=None, inhibit_policy_mapping=0,
2329 )
2330
Alex Gaynorebb7fa12016-02-27 13:36:22 -05002331 def test_require_explicit_policy(self, backend):
2332 cert = _load_cert(
2333 os.path.join("x509", "custom", "policy_constraints_explicit.pem"),
2334 x509.load_pem_x509_certificate,
2335 backend
2336 )
2337 ext = cert.extensions.get_extension_for_oid(
2338 ExtensionOID.POLICY_CONSTRAINTS
2339 )
2340 assert ext.critical is True
2341 assert ext.value == x509.PolicyConstraints(
2342 require_explicit_policy=1, inhibit_policy_mapping=None,
2343 )
2344
Alex Gaynora9885602016-02-27 09:53:46 -05002345
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002346class TestAuthorityInformationAccess(object):
2347 def test_invalid_descriptions(self):
2348 with pytest.raises(TypeError):
2349 x509.AuthorityInformationAccess(["notanAccessDescription"])
2350
2351 def test_iter_len(self):
2352 aia = x509.AuthorityInformationAccess([
2353 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002354 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002355 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2356 ),
2357 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002358 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002359 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2360 )
2361 ])
2362 assert len(aia) == 2
2363 assert list(aia) == [
2364 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002365 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002366 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2367 ),
2368 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002369 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002370 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2371 )
2372 ]
2373
2374 def test_repr(self):
2375 aia = x509.AuthorityInformationAccess([
2376 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002377 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002378 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2379 ),
2380 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002381 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002382 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2383 )
2384 ])
2385 assert repr(aia) == (
2386 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2387 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2388 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2389 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2390 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2391 "fier(value=http://domain.com/ca.crt)>)>])>"
2392 )
2393
2394 def test_eq(self):
2395 aia = x509.AuthorityInformationAccess([
2396 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002397 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002398 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2399 ),
2400 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002401 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002402 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2403 )
2404 ])
2405 aia2 = x509.AuthorityInformationAccess([
2406 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002407 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002408 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2409 ),
2410 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002411 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002412 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2413 )
2414 ])
2415 assert aia == aia2
2416
2417 def test_ne(self):
2418 aia = x509.AuthorityInformationAccess([
2419 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002420 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002421 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2422 ),
2423 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002424 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002425 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2426 )
2427 ])
2428 aia2 = x509.AuthorityInformationAccess([
2429 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002430 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002431 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2432 ),
2433 ])
2434
2435 assert aia != aia2
2436 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002437
Paul Kehrerad4b3592015-12-27 17:27:40 -06002438 def test_indexing(self):
2439 aia = x509.AuthorityInformationAccess([
2440 x509.AccessDescription(
2441 AuthorityInformationAccessOID.OCSP,
2442 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2443 ),
2444 x509.AccessDescription(
2445 AuthorityInformationAccessOID.CA_ISSUERS,
2446 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2447 ),
2448 x509.AccessDescription(
2449 AuthorityInformationAccessOID.OCSP,
2450 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2451 ),
2452 x509.AccessDescription(
2453 AuthorityInformationAccessOID.OCSP,
2454 x509.UniformResourceIdentifier(u"http://ocsp3.domain.com")
2455 ),
2456 x509.AccessDescription(
2457 AuthorityInformationAccessOID.OCSP,
2458 x509.UniformResourceIdentifier(u"http://ocsp4.domain.com")
2459 ),
2460 ])
2461 assert aia[-1] == aia[4]
2462 assert aia[2:6:2] == [aia[2], aia[4]]
2463
Paul Kehrerd774de92015-05-03 10:52:25 -05002464
2465@pytest.mark.requires_backend_interface(interface=RSABackend)
2466@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002467class TestAuthorityInformationAccessExtension(object):
2468 def test_aia_ocsp_ca_issuers(self, backend):
2469 cert = _load_cert(
2470 os.path.join("x509", "cryptography.io.pem"),
2471 x509.load_pem_x509_certificate,
2472 backend
2473 )
2474 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002475 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002476 )
2477 assert ext is not None
2478 assert ext.critical is False
2479
2480 assert ext.value == x509.AuthorityInformationAccess([
2481 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002482 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002483 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2484 ),
2485 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002486 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002487 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2488 ),
2489 ])
2490
2491 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2492 cert = _load_cert(
2493 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2494 x509.load_pem_x509_certificate,
2495 backend
2496 )
2497 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002498 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002499 )
2500 assert ext is not None
2501 assert ext.critical is False
2502
2503 assert ext.value == x509.AuthorityInformationAccess([
2504 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002505 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002506 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2507 ),
2508 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002509 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002510 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2511 ),
2512 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002513 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002514 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002515 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2516 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002517 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002518 ]))
2519 ),
2520 ])
2521
2522 def test_aia_ocsp_only(self, backend):
2523 cert = _load_cert(
2524 os.path.join("x509", "custom", "aia_ocsp.pem"),
2525 x509.load_pem_x509_certificate,
2526 backend
2527 )
2528 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002529 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002530 )
2531 assert ext is not None
2532 assert ext.critical is False
2533
2534 assert ext.value == x509.AuthorityInformationAccess([
2535 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002536 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002537 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2538 ),
2539 ])
2540
2541 def test_aia_ca_issuers_only(self, backend):
2542 cert = _load_cert(
2543 os.path.join("x509", "custom", "aia_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.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002556 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002557 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2558 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002559 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002560 ]))
2561 ),
2562 ])
2563
2564
2565@pytest.mark.requires_backend_interface(interface=RSABackend)
2566@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002567class TestAuthorityKeyIdentifierExtension(object):
2568 def test_aki_keyid(self, backend):
2569 cert = _load_cert(
2570 os.path.join(
2571 "x509", "cryptography.io.pem"
2572 ),
2573 x509.load_pem_x509_certificate,
2574 backend
2575 )
2576 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002577 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002578 )
2579 assert ext is not None
2580 assert ext.critical is False
2581
2582 assert ext.value.key_identifier == (
2583 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2584 )
2585 assert ext.value.authority_cert_issuer is None
2586 assert ext.value.authority_cert_serial_number is None
2587
2588 def test_aki_all_fields(self, backend):
2589 cert = _load_cert(
2590 os.path.join(
2591 "x509", "custom", "authority_key_identifier.pem"
2592 ),
2593 x509.load_pem_x509_certificate,
2594 backend
2595 )
2596 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002597 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002598 )
2599 assert ext is not None
2600 assert ext.critical is False
2601
2602 assert ext.value.key_identifier == (
2603 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2604 )
2605 assert ext.value.authority_cert_issuer == [
2606 x509.DirectoryName(
2607 x509.Name([
2608 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002609 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002610 ),
2611 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002612 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002613 )
2614 ])
2615 )
2616 ]
2617 assert ext.value.authority_cert_serial_number == 3
2618
2619 def test_aki_no_keyid(self, backend):
2620 cert = _load_cert(
2621 os.path.join(
2622 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2623 ),
2624 x509.load_pem_x509_certificate,
2625 backend
2626 )
2627 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002628 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002629 )
2630 assert ext is not None
2631 assert ext.critical is False
2632
2633 assert ext.value.key_identifier is None
2634 assert ext.value.authority_cert_issuer == [
2635 x509.DirectoryName(
2636 x509.Name([
2637 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002638 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002639 ),
2640 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002641 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002642 )
2643 ])
2644 )
2645 ]
2646 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002647
Paul Kehrer253929a2015-08-05 17:30:39 +01002648 def test_from_certificate(self, backend):
2649 issuer_cert = _load_cert(
2650 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2651 x509.load_pem_x509_certificate,
2652 backend
2653 )
2654 cert = _load_cert(
2655 os.path.join("x509", "cryptography.io.pem"),
2656 x509.load_pem_x509_certificate,
2657 backend
2658 )
2659 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002660 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002661 )
2662 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2663 issuer_cert.public_key()
2664 )
2665 assert ext.value == aki
2666
Paul Kehrer61ff3562016-03-11 22:51:27 -04002667 def test_from_issuer_subject_key_identifier(self, backend):
2668 issuer_cert = _load_cert(
2669 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2670 x509.load_pem_x509_certificate,
2671 backend
2672 )
2673 cert = _load_cert(
2674 os.path.join("x509", "cryptography.io.pem"),
2675 x509.load_pem_x509_certificate,
2676 backend
2677 )
2678 ext = cert.extensions.get_extension_for_oid(
2679 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
2680 )
2681 ski = issuer_cert.extensions.get_extension_for_class(
2682 x509.SubjectKeyIdentifier
2683 )
2684 aki = x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier(
2685 ski
2686 )
2687 assert ext.value == aki
2688
Paul Kehrer5a485522015-05-06 00:29:12 -05002689
Paul Kehrere0017be2015-05-17 20:39:40 -06002690class TestNameConstraints(object):
2691 def test_ipaddress_wrong_type(self):
2692 with pytest.raises(TypeError):
2693 x509.NameConstraints(
2694 permitted_subtrees=[
2695 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2696 ],
2697 excluded_subtrees=None
2698 )
2699
2700 with pytest.raises(TypeError):
2701 x509.NameConstraints(
2702 permitted_subtrees=None,
2703 excluded_subtrees=[
2704 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2705 ]
2706 )
2707
2708 def test_ipaddress_allowed_type(self):
2709 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2710 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2711 nc = x509.NameConstraints(
2712 permitted_subtrees=permitted,
2713 excluded_subtrees=excluded
2714 )
2715 assert nc.permitted_subtrees == permitted
2716 assert nc.excluded_subtrees == excluded
2717
2718 def test_invalid_permitted_subtrees(self):
2719 with pytest.raises(TypeError):
2720 x509.NameConstraints("badpermitted", None)
2721
2722 def test_invalid_excluded_subtrees(self):
2723 with pytest.raises(TypeError):
2724 x509.NameConstraints(None, "badexcluded")
2725
2726 def test_no_subtrees(self):
2727 with pytest.raises(ValueError):
2728 x509.NameConstraints(None, None)
2729
2730 def test_permitted_none(self):
2731 excluded = [x509.DNSName(u"name.local")]
2732 nc = x509.NameConstraints(
2733 permitted_subtrees=None, excluded_subtrees=excluded
2734 )
2735 assert nc.permitted_subtrees is None
2736 assert nc.excluded_subtrees is not None
2737
2738 def test_excluded_none(self):
2739 permitted = [x509.DNSName(u"name.local")]
2740 nc = x509.NameConstraints(
2741 permitted_subtrees=permitted, excluded_subtrees=None
2742 )
2743 assert nc.permitted_subtrees is not None
2744 assert nc.excluded_subtrees is None
2745
2746 def test_repr(self):
2747 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2748 nc = x509.NameConstraints(
2749 permitted_subtrees=permitted,
2750 excluded_subtrees=None
2751 )
2752 assert repr(nc) == (
2753 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2754 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2755 )
2756
Paul Kehrer31894282015-06-21 21:46:41 -05002757 def test_eq(self):
2758 nc = x509.NameConstraints(
2759 permitted_subtrees=[x509.DNSName(u"name.local")],
2760 excluded_subtrees=[x509.DNSName(u"name2.local")]
2761 )
2762 nc2 = x509.NameConstraints(
2763 permitted_subtrees=[x509.DNSName(u"name.local")],
2764 excluded_subtrees=[x509.DNSName(u"name2.local")]
2765 )
2766 assert nc == nc2
2767
2768 def test_ne(self):
2769 nc = x509.NameConstraints(
2770 permitted_subtrees=[x509.DNSName(u"name.local")],
2771 excluded_subtrees=[x509.DNSName(u"name2.local")]
2772 )
2773 nc2 = x509.NameConstraints(
2774 permitted_subtrees=[x509.DNSName(u"name.local")],
2775 excluded_subtrees=None
2776 )
2777 nc3 = x509.NameConstraints(
2778 permitted_subtrees=None,
2779 excluded_subtrees=[x509.DNSName(u"name2.local")]
2780 )
2781
2782 assert nc != nc2
2783 assert nc != nc3
2784 assert nc != object()
2785
Paul Kehrere0017be2015-05-17 20:39:40 -06002786
Paul Kehrer870d7e82015-06-21 22:20:44 -05002787@pytest.mark.requires_backend_interface(interface=RSABackend)
2788@pytest.mark.requires_backend_interface(interface=X509Backend)
2789class TestNameConstraintsExtension(object):
2790 def test_permitted_excluded(self, backend):
2791 cert = _load_cert(
2792 os.path.join(
2793 "x509", "custom", "nc_permitted_excluded_2.pem"
2794 ),
2795 x509.load_pem_x509_certificate,
2796 backend
2797 )
2798 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002799 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002800 ).value
2801 assert nc == x509.NameConstraints(
2802 permitted_subtrees=[
2803 x509.DNSName(u"zombo.local"),
2804 ],
2805 excluded_subtrees=[
2806 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002807 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002808 ]))
2809 ]
2810 )
2811
2812 def test_permitted(self, backend):
2813 cert = _load_cert(
2814 os.path.join(
2815 "x509", "custom", "nc_permitted_2.pem"
2816 ),
2817 x509.load_pem_x509_certificate,
2818 backend
2819 )
2820 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002821 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002822 ).value
2823 assert nc == x509.NameConstraints(
2824 permitted_subtrees=[
2825 x509.DNSName(u"zombo.local"),
2826 ],
2827 excluded_subtrees=None
2828 )
2829
Paul Kehrer42376832015-07-01 18:10:32 -05002830 def test_permitted_with_leading_period(self, backend):
2831 cert = _load_cert(
2832 os.path.join(
2833 "x509", "custom", "nc_permitted.pem"
2834 ),
2835 x509.load_pem_x509_certificate,
2836 backend
2837 )
2838 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002839 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002840 ).value
2841 assert nc == x509.NameConstraints(
2842 permitted_subtrees=[
2843 x509.DNSName(u".cryptography.io"),
2844 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2845 ],
2846 excluded_subtrees=None
2847 )
2848
2849 def test_excluded_with_leading_period(self, backend):
2850 cert = _load_cert(
2851 os.path.join(
2852 "x509", "custom", "nc_excluded.pem"
2853 ),
2854 x509.load_pem_x509_certificate,
2855 backend
2856 )
2857 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002858 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002859 ).value
2860 assert nc == x509.NameConstraints(
2861 permitted_subtrees=None,
2862 excluded_subtrees=[
2863 x509.DNSName(u".cryptography.io"),
2864 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2865 ]
2866 )
2867
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002868 def test_permitted_excluded_with_ips(self, backend):
2869 cert = _load_cert(
2870 os.path.join(
2871 "x509", "custom", "nc_permitted_excluded.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 Kehrercfb8aa22015-07-01 19:16:36 -05002878 ).value
2879 assert nc == x509.NameConstraints(
2880 permitted_subtrees=[
2881 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2882 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2883 ],
2884 excluded_subtrees=[
2885 x509.DNSName(u".domain.com"),
2886 x509.UniformResourceIdentifier(u"http://test.local"),
2887 ]
2888 )
2889
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002890 def test_single_ip_netmask(self, backend):
2891 cert = _load_cert(
2892 os.path.join(
2893 "x509", "custom", "nc_single_ip_netmask.pem"
2894 ),
2895 x509.load_pem_x509_certificate,
2896 backend
2897 )
2898 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002899 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002900 ).value
2901 assert nc == x509.NameConstraints(
2902 permitted_subtrees=[
2903 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2904 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2905 ],
2906 excluded_subtrees=None
2907 )
2908
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002909 def test_invalid_netmask(self, backend):
2910 cert = _load_cert(
2911 os.path.join(
2912 "x509", "custom", "nc_invalid_ip_netmask.pem"
2913 ),
2914 x509.load_pem_x509_certificate,
2915 backend
2916 )
2917 with pytest.raises(ValueError):
2918 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002919 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002920 )
2921
Marti4739cfc2016-08-02 04:03:25 +03002922 def test_certbuilder(self, backend):
2923 permitted = [u'.example.org', u'.\xf5\xe4\xf6\xfc.example.com',
2924 u'foobar.example.net']
2925 private_key = RSA_KEY_2048.private_key(backend)
2926 builder = _make_certbuilder(private_key)
2927 builder = builder.add_extension(
2928 NameConstraints(permitted_subtrees=list(map(DNSName, permitted)),
2929 excluded_subtrees=[]), True)
2930
2931 cert = builder.sign(private_key, hashes.SHA1(), backend)
2932 result = [x.value for x in cert.extensions.get_extension_for_class(
2933 NameConstraints).value.permitted_subtrees]
2934 assert result == permitted
2935
Paul Kehrer870d7e82015-06-21 22:20:44 -05002936
Paul Kehrer5a485522015-05-06 00:29:12 -05002937class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002938 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002939 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002940 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002941
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002942 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002943 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002944 x509.DistributionPoint(None, "notname", None, None)
2945
2946 def test_distribution_point_full_and_relative_not_none(self):
2947 with pytest.raises(ValueError):
2948 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002949
2950 def test_crl_issuer_not_general_names(self):
2951 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002952 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002953
2954 def test_reason_not_reasonflags(self):
2955 with pytest.raises(TypeError):
2956 x509.DistributionPoint(
2957 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002958 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002959 frozenset(["notreasonflags"]),
2960 None
2961 )
2962
2963 def test_reason_not_frozenset(self):
2964 with pytest.raises(TypeError):
2965 x509.DistributionPoint(
2966 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2967 None,
2968 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002969 None
2970 )
2971
2972 def test_disallowed_reasons(self):
2973 with pytest.raises(ValueError):
2974 x509.DistributionPoint(
2975 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2976 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002977 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002978 None
2979 )
2980
2981 with pytest.raises(ValueError):
2982 x509.DistributionPoint(
2983 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2984 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002985 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002986 None
2987 )
2988
2989 def test_reason_only(self):
2990 with pytest.raises(ValueError):
2991 x509.DistributionPoint(
2992 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002993 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002994 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002995 None
2996 )
2997
2998 def test_eq(self):
2999 dp = x509.DistributionPoint(
3000 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003001 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003002 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003003 [
3004 x509.DirectoryName(
3005 x509.Name([
3006 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003007 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003008 )
3009 ])
3010 )
3011 ],
3012 )
3013 dp2 = x509.DistributionPoint(
3014 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003015 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003016 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003017 [
3018 x509.DirectoryName(
3019 x509.Name([
3020 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003021 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003022 )
3023 ])
3024 )
3025 ],
3026 )
3027 assert dp == dp2
3028
3029 def test_ne(self):
3030 dp = x509.DistributionPoint(
3031 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003032 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003033 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003034 [
3035 x509.DirectoryName(
3036 x509.Name([
3037 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003038 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003039 )
3040 ])
3041 )
3042 ],
3043 )
3044 dp2 = x509.DistributionPoint(
3045 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
3046 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003047 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003048 None
3049 )
3050 assert dp != dp2
3051 assert dp != object()
3052
3053 def test_repr(self):
3054 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003055 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003056 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003057 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05003058 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003059 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003060 [
3061 x509.DirectoryName(
3062 x509.Name([
3063 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003064 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05003065 )
3066 ])
3067 )
3068 ],
3069 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05003070 if six.PY3:
3071 assert repr(dp) == (
3072 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
3073 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05003074 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
3075 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
3076 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
3077 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003078 )
3079 else:
3080 assert repr(dp) == (
3081 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
3082 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05003083 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
3084 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
3085 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
3086 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003087 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003088
3089
3090class TestCRLDistributionPoints(object):
3091 def test_invalid_distribution_points(self):
3092 with pytest.raises(TypeError):
3093 x509.CRLDistributionPoints(["notadistributionpoint"])
3094
3095 def test_iter_len(self):
3096 cdp = x509.CRLDistributionPoints([
3097 x509.DistributionPoint(
3098 [x509.UniformResourceIdentifier(u"http://domain")],
3099 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003100 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003101 None
3102 ),
3103 x509.DistributionPoint(
3104 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003105 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003106 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003107 x509.ReasonFlags.key_compromise,
3108 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003109 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003110 None
3111 ),
3112 ])
3113 assert len(cdp) == 2
3114 assert list(cdp) == [
3115 x509.DistributionPoint(
3116 [x509.UniformResourceIdentifier(u"http://domain")],
3117 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003118 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003119 None
3120 ),
3121 x509.DistributionPoint(
3122 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003123 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003124 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003125 x509.ReasonFlags.key_compromise,
3126 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003127 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003128 None
3129 ),
3130 ]
3131
3132 def test_repr(self):
3133 cdp = x509.CRLDistributionPoints([
3134 x509.DistributionPoint(
3135 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003136 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003137 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003138 None
3139 ),
3140 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003141 if six.PY3:
3142 assert repr(cdp) == (
3143 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3144 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3145 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
3146 "romise'>}), crl_issuer=None)>])>"
3147 )
3148 else:
3149 assert repr(cdp) == (
3150 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3151 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3152 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
3153 "romise'>]), crl_issuer=None)>])>"
3154 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003155
3156 def test_eq(self):
3157 cdp = x509.CRLDistributionPoints([
3158 x509.DistributionPoint(
3159 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003160 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003161 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003162 x509.ReasonFlags.key_compromise,
3163 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003164 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003165 [x509.UniformResourceIdentifier(u"uri://thing")],
3166 ),
3167 ])
3168 cdp2 = x509.CRLDistributionPoints([
3169 x509.DistributionPoint(
3170 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003171 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003172 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003173 x509.ReasonFlags.key_compromise,
3174 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003175 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003176 [x509.UniformResourceIdentifier(u"uri://thing")],
3177 ),
3178 ])
3179 assert cdp == cdp2
3180
3181 def test_ne(self):
3182 cdp = x509.CRLDistributionPoints([
3183 x509.DistributionPoint(
3184 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003185 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003186 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003187 x509.ReasonFlags.key_compromise,
3188 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003189 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003190 [x509.UniformResourceIdentifier(u"uri://thing")],
3191 ),
3192 ])
3193 cdp2 = x509.CRLDistributionPoints([
3194 x509.DistributionPoint(
3195 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003196 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003197 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003198 x509.ReasonFlags.key_compromise,
3199 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003200 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003201 [x509.UniformResourceIdentifier(u"uri://thing")],
3202 ),
3203 ])
3204 cdp3 = x509.CRLDistributionPoints([
3205 x509.DistributionPoint(
3206 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003207 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003208 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003209 [x509.UniformResourceIdentifier(u"uri://thing")],
3210 ),
3211 ])
3212 cdp4 = x509.CRLDistributionPoints([
3213 x509.DistributionPoint(
3214 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003215 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003216 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003217 x509.ReasonFlags.key_compromise,
3218 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003219 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003220 [x509.UniformResourceIdentifier(u"uri://thing2")],
3221 ),
3222 ])
3223 assert cdp != cdp2
3224 assert cdp != cdp3
3225 assert cdp != cdp4
3226 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003227
Paul Kehreree2e92d2015-12-27 17:29:37 -06003228 def test_indexing(self):
3229 ci = x509.CRLDistributionPoints([
3230 x509.DistributionPoint(
3231 None, None, None,
3232 [x509.UniformResourceIdentifier(u"uri://thing")],
3233 ),
3234 x509.DistributionPoint(
3235 None, None, None,
3236 [x509.UniformResourceIdentifier(u"uri://thing2")],
3237 ),
3238 x509.DistributionPoint(
3239 None, None, None,
3240 [x509.UniformResourceIdentifier(u"uri://thing3")],
3241 ),
3242 x509.DistributionPoint(
3243 None, None, None,
3244 [x509.UniformResourceIdentifier(u"uri://thing4")],
3245 ),
3246 x509.DistributionPoint(
3247 None, None, None,
3248 [x509.UniformResourceIdentifier(u"uri://thing5")],
3249 ),
3250 ])
3251 assert ci[-1] == ci[4]
3252 assert ci[2:6:2] == [ci[2], ci[4]]
3253
Paul Kehrer9a10d592015-05-10 14:55:51 -05003254
3255@pytest.mark.requires_backend_interface(interface=RSABackend)
3256@pytest.mark.requires_backend_interface(interface=X509Backend)
3257class TestCRLDistributionPointsExtension(object):
3258 def test_fullname_and_crl_issuer(self, backend):
3259 cert = _load_cert(
3260 os.path.join(
3261 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3262 ),
3263 x509.load_der_x509_certificate,
3264 backend
3265 )
3266
3267 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003268 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003269 ).value
3270
3271 assert cdps == x509.CRLDistributionPoints([
3272 x509.DistributionPoint(
3273 full_name=[x509.DirectoryName(
3274 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003275 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003276 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003277 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003278 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003279 ),
3280 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003281 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003282 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003283 ),
3284 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003285 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003286 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003287 ),
3288 ])
3289 )],
3290 relative_name=None,
3291 reasons=None,
3292 crl_issuer=[x509.DirectoryName(
3293 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003294 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003295 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003296 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003297 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003298 ),
3299 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003300 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003301 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003302 ),
3303 ])
3304 )],
3305 )
3306 ])
3307
3308 def test_relativename_and_crl_issuer(self, backend):
3309 cert = _load_cert(
3310 os.path.join(
3311 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3312 ),
3313 x509.load_der_x509_certificate,
3314 backend
3315 )
3316
3317 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003318 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003319 ).value
3320
3321 assert cdps == x509.CRLDistributionPoints([
3322 x509.DistributionPoint(
3323 full_name=None,
3324 relative_name=x509.Name([
3325 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003326 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003327 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003328 ),
3329 ]),
3330 reasons=None,
3331 crl_issuer=[x509.DirectoryName(
3332 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003333 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003334 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003335 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003336 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003337 ),
3338 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003339 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003340 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003341 ),
3342 ])
3343 )],
3344 )
3345 ])
3346
3347 def test_fullname_crl_issuer_reasons(self, backend):
3348 cert = _load_cert(
3349 os.path.join(
3350 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3351 ),
3352 x509.load_pem_x509_certificate,
3353 backend
3354 )
3355
3356 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003357 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003358 ).value
3359
3360 assert cdps == x509.CRLDistributionPoints([
3361 x509.DistributionPoint(
3362 full_name=[x509.UniformResourceIdentifier(
3363 u"http://myhost.com/myca.crl"
3364 )],
3365 relative_name=None,
3366 reasons=frozenset([
3367 x509.ReasonFlags.key_compromise,
3368 x509.ReasonFlags.ca_compromise
3369 ]),
3370 crl_issuer=[x509.DirectoryName(
3371 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003372 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003373 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003374 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003375 ),
3376 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003377 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003378 ),
3379 ])
3380 )],
3381 )
3382 ])
3383
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003384 def test_all_reasons(self, backend):
3385 cert = _load_cert(
3386 os.path.join(
3387 "x509", "custom", "cdp_all_reasons.pem"
3388 ),
3389 x509.load_pem_x509_certificate,
3390 backend
3391 )
3392
3393 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003394 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003395 ).value
3396
3397 assert cdps == x509.CRLDistributionPoints([
3398 x509.DistributionPoint(
3399 full_name=[x509.UniformResourceIdentifier(
3400 u"http://domain.com/some.crl"
3401 )],
3402 relative_name=None,
3403 reasons=frozenset([
3404 x509.ReasonFlags.key_compromise,
3405 x509.ReasonFlags.ca_compromise,
3406 x509.ReasonFlags.affiliation_changed,
3407 x509.ReasonFlags.superseded,
3408 x509.ReasonFlags.privilege_withdrawn,
3409 x509.ReasonFlags.cessation_of_operation,
3410 x509.ReasonFlags.aa_compromise,
3411 x509.ReasonFlags.certificate_hold,
3412 ]),
3413 crl_issuer=None
3414 )
3415 ])
3416
3417 def test_single_reason(self, backend):
3418 cert = _load_cert(
3419 os.path.join(
3420 "x509", "custom", "cdp_reason_aa_compromise.pem"
3421 ),
3422 x509.load_pem_x509_certificate,
3423 backend
3424 )
3425
3426 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003427 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003428 ).value
3429
3430 assert cdps == x509.CRLDistributionPoints([
3431 x509.DistributionPoint(
3432 full_name=[x509.UniformResourceIdentifier(
3433 u"http://domain.com/some.crl"
3434 )],
3435 relative_name=None,
3436 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3437 crl_issuer=None
3438 )
3439 ])
3440
Paul Kehrer9a10d592015-05-10 14:55:51 -05003441 def test_crl_issuer_only(self, backend):
3442 cert = _load_cert(
3443 os.path.join(
3444 "x509", "custom", "cdp_crl_issuer.pem"
3445 ),
3446 x509.load_pem_x509_certificate,
3447 backend
3448 )
3449
3450 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003451 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003452 ).value
3453
3454 assert cdps == x509.CRLDistributionPoints([
3455 x509.DistributionPoint(
3456 full_name=None,
3457 relative_name=None,
3458 reasons=None,
3459 crl_issuer=[x509.DirectoryName(
3460 x509.Name([
3461 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003462 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003463 ),
3464 ])
3465 )],
3466 )
3467 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003468
Dominic Chen87bb9572015-10-09 00:23:07 -04003469 def test_crl_empty_hostname(self, backend):
3470 cert = _load_cert(
3471 os.path.join(
3472 "x509", "custom", "cdp_empty_hostname.pem"
3473 ),
3474 x509.load_pem_x509_certificate,
3475 backend
3476 )
3477
3478 cdps = cert.extensions.get_extension_for_oid(
3479 ExtensionOID.CRL_DISTRIBUTION_POINTS
3480 ).value
3481
3482 assert cdps == x509.CRLDistributionPoints([
3483 x509.DistributionPoint(
3484 full_name=[x509.UniformResourceIdentifier(
3485 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3486 )],
3487 relative_name=None,
3488 reasons=None,
3489 crl_issuer=None
3490 )
3491 ])
3492
Paul Kehrer16fae762015-05-01 23:14:20 -05003493
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003494@pytest.mark.requires_backend_interface(interface=RSABackend)
3495@pytest.mark.requires_backend_interface(interface=X509Backend)
3496class TestOCSPNoCheckExtension(object):
3497 def test_nocheck(self, backend):
3498 cert = _load_cert(
3499 os.path.join(
3500 "x509", "custom", "ocsp_nocheck.pem"
3501 ),
3502 x509.load_pem_x509_certificate,
3503 backend
3504 )
3505 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003506 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003507 )
3508 assert isinstance(ext.value, x509.OCSPNoCheck)
3509
3510
Paul Kehrer16fae762015-05-01 23:14:20 -05003511class TestInhibitAnyPolicy(object):
3512 def test_not_int(self):
3513 with pytest.raises(TypeError):
3514 x509.InhibitAnyPolicy("notint")
3515
3516 def test_negative_int(self):
3517 with pytest.raises(ValueError):
3518 x509.InhibitAnyPolicy(-1)
3519
3520 def test_repr(self):
3521 iap = x509.InhibitAnyPolicy(0)
3522 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3523
3524 def test_eq(self):
3525 iap = x509.InhibitAnyPolicy(1)
3526 iap2 = x509.InhibitAnyPolicy(1)
3527 assert iap == iap2
3528
3529 def test_ne(self):
3530 iap = x509.InhibitAnyPolicy(1)
3531 iap2 = x509.InhibitAnyPolicy(4)
3532 assert iap != iap2
3533 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003534
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303535 def test_hash(self):
3536 iap = x509.InhibitAnyPolicy(1)
3537 iap2 = x509.InhibitAnyPolicy(1)
3538 iap3 = x509.InhibitAnyPolicy(4)
3539 assert hash(iap) == hash(iap2)
3540 assert hash(iap) != hash(iap3)
3541
Paul Kehrerca6ce992015-06-17 22:13:15 -06003542
3543@pytest.mark.requires_backend_interface(interface=RSABackend)
3544@pytest.mark.requires_backend_interface(interface=X509Backend)
3545class TestInhibitAnyPolicyExtension(object):
3546 def test_nocheck(self, backend):
3547 cert = _load_cert(
3548 os.path.join(
3549 "x509", "custom", "inhibit_any_policy_5.pem"
3550 ),
3551 x509.load_pem_x509_certificate,
3552 backend
3553 )
3554 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003555 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003556 ).value
3557 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003558
3559
3560@pytest.mark.requires_backend_interface(interface=RSABackend)
3561@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003562class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003563 def test_invalid_certificate_policies_data(self, backend):
3564 cert = _load_cert(
3565 os.path.join(
3566 "x509", "custom", "cp_invalid.pem"
3567 ),
3568 x509.load_pem_x509_certificate,
3569 backend
3570 )
3571 with pytest.raises(ValueError):
3572 cert.extensions