blob: 450f192d54d25d23b7eb28d34f1fcbf0e28b47f8 [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)
20from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050021from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080022 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
23 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050024)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025
Paul Kehrerf22f6122015-08-05 12:57:13 +010026from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050027from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050028
29
Paul Kehrer85894662015-03-22 13:19:31 -050030class TestExtension(object):
31 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050032 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050033 with pytest.raises(TypeError):
34 x509.Extension("notanoid", True, bc)
35
36 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050037 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050038 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050039 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050040
41 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050042 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050043 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050044 assert repr(ext) == (
45 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
46 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
47 "_length=None)>)>"
48 )
49
Paul Kehrer58e870c2015-05-17 09:15:30 -070050 def test_eq(self):
51 ext1 = x509.Extension(
52 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
53 )
54 ext2 = x509.Extension(
55 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
56 )
57 assert ext1 == ext2
58
59 def test_ne(self):
60 ext1 = x509.Extension(
61 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
62 )
63 ext2 = x509.Extension(
64 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
65 )
66 ext3 = x509.Extension(
67 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
68 )
69 ext4 = x509.Extension(
70 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
71 )
72 assert ext1 != ext2
73 assert ext1 != ext3
74 assert ext1 != ext4
75 assert ext1 != object()
76
Paul Kehrer85894662015-03-22 13:19:31 -050077
Paul Kehrer14fd6972015-12-30 10:58:25 -060078class TestUnrecognizedExtension(object):
79 def test_invalid_oid(self):
80 with pytest.raises(TypeError):
81 x509.UnrecognizedExtension("notanoid", b"somedata")
82
83 def test_eq(self):
84 ext1 = x509.UnrecognizedExtension(
85 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
86 )
87 ext2 = x509.UnrecognizedExtension(
88 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
89 )
90 assert ext1 == ext2
91
92 def test_ne(self):
93 ext1 = x509.UnrecognizedExtension(
94 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
95 )
96 ext2 = x509.UnrecognizedExtension(
97 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x02"
98 )
99 ext3 = x509.UnrecognizedExtension(
100 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
101 )
102 assert ext1 != ext2
103 assert ext1 != ext3
104 assert ext1 != object()
105
106 def test_repr(self):
107 ext1 = x509.UnrecognizedExtension(
108 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
109 )
Paul Kehrer50e9dd82015-12-30 12:20:55 -0600110 if six.PY3:
111 assert repr(ext1) == (
112 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
113 "name=Unknown OID)>, value=b'\\x03\\x02\\x01')>"
114 )
115 else:
116 assert repr(ext1) == (
117 "<UnrecognizedExtension(oid=<ObjectIdentifier(oid=1.2.3.4, "
118 "name=Unknown OID)>, value='\\x03\\x02\\x01')>"
119 )
Paul Kehrer14fd6972015-12-30 10:58:25 -0600120
121 def test_hash(self):
122 ext1 = x509.UnrecognizedExtension(
123 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
124 )
125 ext2 = x509.UnrecognizedExtension(
126 x509.ObjectIdentifier("1.2.3.4"), b"\x03\x02\x01"
127 )
128 ext3 = x509.UnrecognizedExtension(
129 x509.ObjectIdentifier("1.2.3.5"), b"\x03\x02\x01"
130 )
131 assert hash(ext1) == hash(ext2)
132 assert hash(ext1) != hash(ext3)
133
134
Paul Kehrer49bb7562015-12-25 16:17:40 -0600135class TestCertificateIssuer(object):
136 def test_iter_names(self):
137 ci = x509.CertificateIssuer([
138 x509.DNSName(u"cryptography.io"),
139 x509.DNSName(u"crypto.local"),
140 ])
141 assert len(ci) == 2
142 assert list(ci) == [
143 x509.DNSName(u"cryptography.io"),
144 x509.DNSName(u"crypto.local"),
145 ]
146
Paul Kehrer5c999d32015-12-26 17:45:20 -0600147 def test_indexing(self):
148 ci = x509.CertificateIssuer([
149 x509.DNSName(u"cryptography.io"),
150 x509.DNSName(u"crypto.local"),
151 x509.DNSName(u"another.local"),
152 x509.RFC822Name(u"email@another.local"),
153 x509.UniformResourceIdentifier(u"http://another.local"),
154 ])
155 assert ci[-1] == ci[4]
156 assert ci[2:6:2] == [ci[2], ci[4]]
157
Paul Kehrer49bb7562015-12-25 16:17:40 -0600158 def test_eq(self):
159 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
160 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
161 assert ci1 == ci2
162
163 def test_ne(self):
164 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
165 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
166 assert ci1 != ci2
167 assert ci1 != object()
168
169 def test_repr(self):
170 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
171 assert repr(ci) == (
172 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
173 ")>])>)>"
174 )
175
176 def test_get_values_for_type(self):
177 ci = x509.CertificateIssuer(
178 [x509.DNSName(u"cryptography.io")]
179 )
180 names = ci.get_values_for_type(x509.DNSName)
181 assert names == [u"cryptography.io"]
182
183
Paul Kehrer7058ece2015-12-25 22:28:29 -0600184class TestCRLReason(object):
185 def test_invalid_reason_flags(self):
186 with pytest.raises(TypeError):
187 x509.CRLReason("notareason")
188
189 def test_eq(self):
190 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
191 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
192 assert reason1 == reason2
193
194 def test_ne(self):
195 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
196 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
197 assert reason1 != reason2
198 assert reason1 != object()
199
Alex Gaynor07d5cae2015-12-27 15:30:39 -0500200 def test_hash(self):
201 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
202 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
203 reason3 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
204
205 assert hash(reason1) == hash(reason2)
206 assert hash(reason1) != hash(reason3)
207
Paul Kehrer7058ece2015-12-25 22:28:29 -0600208 def test_repr(self):
209 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
210 assert repr(reason1) == (
211 "<CRLReason(reason=ReasonFlags.unspecified)>"
212 )
213
214
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600215class TestInvalidityDate(object):
216 def test_invalid_invalidity_date(self):
217 with pytest.raises(TypeError):
218 x509.InvalidityDate("notadate")
219
220 def test_eq(self):
221 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
222 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
223 assert invalid1 == invalid2
224
225 def test_ne(self):
226 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
227 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
228 assert invalid1 != invalid2
229 assert invalid1 != object()
230
231 def test_repr(self):
232 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
233 assert repr(invalid1) == (
234 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
235 )
236
Paul Kehrer67cde762015-12-26 11:37:14 -0600237 def test_hash(self):
238 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
239 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
240 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
241 assert hash(invalid1) == hash(invalid2)
242 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600243
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600244
Paul Kehrer2b622582015-04-15 11:04:29 -0400245class TestNoticeReference(object):
246 def test_notice_numbers_not_all_int(self):
247 with pytest.raises(TypeError):
248 x509.NoticeReference("org", [1, 2, "three"])
249
250 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500251 with pytest.raises(TypeError):
252 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400253
254 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500255 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400256
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500257 if six.PY3:
258 assert repr(nr) == (
259 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
260 "])>"
261 )
262 else:
263 assert repr(nr) == (
264 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
265 "4])>"
266 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400267
Paul Kehrerc56ab622015-05-03 09:56:31 -0500268 def test_eq(self):
269 nr = x509.NoticeReference("org", [1, 2])
270 nr2 = x509.NoticeReference("org", [1, 2])
271 assert nr == nr2
272
273 def test_ne(self):
274 nr = x509.NoticeReference("org", [1, 2])
275 nr2 = x509.NoticeReference("org", [1])
276 nr3 = x509.NoticeReference(None, [1, 2])
277 assert nr != nr2
278 assert nr != nr3
279 assert nr != object()
280
Paul Kehrer2b622582015-04-15 11:04:29 -0400281
282class TestUserNotice(object):
283 def test_notice_reference_invalid(self):
284 with pytest.raises(TypeError):
285 x509.UserNotice("invalid", None)
286
287 def test_notice_reference_none(self):
288 un = x509.UserNotice(None, "text")
289 assert un.notice_reference is None
290 assert un.explicit_text == "text"
291
292 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500293 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500294 if six.PY3:
295 assert repr(un) == (
296 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500297 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500298 )
299 else:
300 assert repr(un) == (
301 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500302 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500303 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400304
Paul Kehrerc56ab622015-05-03 09:56:31 -0500305 def test_eq(self):
306 nr = x509.NoticeReference("org", [1, 2])
307 nr2 = x509.NoticeReference("org", [1, 2])
308 un = x509.UserNotice(nr, "text")
309 un2 = x509.UserNotice(nr2, "text")
310 assert un == un2
311
312 def test_ne(self):
313 nr = x509.NoticeReference("org", [1, 2])
314 nr2 = x509.NoticeReference("org", [1])
315 un = x509.UserNotice(nr, "text")
316 un2 = x509.UserNotice(nr2, "text")
317 un3 = x509.UserNotice(nr, "text3")
318 assert un != un2
319 assert un != un3
320 assert un != object()
321
Paul Kehrer2b622582015-04-15 11:04:29 -0400322
Paul Kehrer2b622582015-04-15 11:04:29 -0400323class TestPolicyInformation(object):
324 def test_invalid_policy_identifier(self):
325 with pytest.raises(TypeError):
326 x509.PolicyInformation("notanoid", None)
327
328 def test_none_policy_qualifiers(self):
329 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
330 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
331 assert pi.policy_qualifiers is None
332
333 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500334 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400335 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
336 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
337 assert pi.policy_qualifiers == pq
338
339 def test_invalid_policy_identifiers(self):
340 with pytest.raises(TypeError):
341 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
342
343 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500344 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400345 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500346 if six.PY3:
347 assert repr(pi) == (
348 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
349 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500350 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500351 )
352 else:
353 assert repr(pi) == (
354 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
355 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500356 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500357 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400358
Paul Kehrerc56ab622015-05-03 09:56:31 -0500359 def test_eq(self):
360 pi = x509.PolicyInformation(
361 x509.ObjectIdentifier("1.2.3"),
362 [u"string", x509.UserNotice(None, u"hi")]
363 )
364 pi2 = x509.PolicyInformation(
365 x509.ObjectIdentifier("1.2.3"),
366 [u"string", x509.UserNotice(None, u"hi")]
367 )
368 assert pi == pi2
369
370 def test_ne(self):
371 pi = x509.PolicyInformation(
372 x509.ObjectIdentifier("1.2.3"), [u"string"]
373 )
374 pi2 = x509.PolicyInformation(
375 x509.ObjectIdentifier("1.2.3"), [u"string2"]
376 )
377 pi3 = x509.PolicyInformation(
378 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
379 )
380 assert pi != pi2
381 assert pi != pi3
382 assert pi != object()
383
Paul Kehrer2b622582015-04-15 11:04:29 -0400384
385class TestCertificatePolicies(object):
386 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500387 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400388 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
389 with pytest.raises(TypeError):
390 x509.CertificatePolicies([1, pi])
391
392 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500393 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400394 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
395 cp = x509.CertificatePolicies([pi])
396 assert len(cp) == 1
397 for policyinfo in cp:
398 assert policyinfo == pi
399
400 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500401 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400402 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
403 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500404 if six.PY3:
405 assert repr(cp) == (
406 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
407 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
408 "ers=['string'])>])>"
409 )
410 else:
411 assert repr(cp) == (
412 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
413 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
414 "ers=[u'string'])>])>"
415 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400416
Paul Kehrerc56ab622015-05-03 09:56:31 -0500417 def test_eq(self):
418 pi = x509.PolicyInformation(
419 x509.ObjectIdentifier("1.2.3"), [u"string"]
420 )
421 cp = x509.CertificatePolicies([pi])
422 pi2 = x509.PolicyInformation(
423 x509.ObjectIdentifier("1.2.3"), [u"string"]
424 )
425 cp2 = x509.CertificatePolicies([pi2])
426 assert cp == cp2
427
428 def test_ne(self):
429 pi = x509.PolicyInformation(
430 x509.ObjectIdentifier("1.2.3"), [u"string"]
431 )
432 cp = x509.CertificatePolicies([pi])
433 pi2 = x509.PolicyInformation(
434 x509.ObjectIdentifier("1.2.3"), [u"string2"]
435 )
436 cp2 = x509.CertificatePolicies([pi2])
437 assert cp != cp2
438 assert cp != object()
439
Paul Kehrere8db7bd2015-12-27 17:32:57 -0600440 def test_indexing(self):
441 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [u"test"])
442 pi2 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.4"), [u"test"])
443 pi3 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.5"), [u"test"])
444 pi4 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.6"), [u"test"])
445 pi5 = x509.PolicyInformation(x509.ObjectIdentifier("1.2.7"), [u"test"])
446 cp = x509.CertificatePolicies([pi, pi2, pi3, pi4, pi5])
447 assert cp[-1] == cp[4]
448 assert cp[2:6:2] == [cp[2], cp[4]]
449
Paul Kehrer2b622582015-04-15 11:04:29 -0400450
Paul Kehrer11026fe2015-05-12 11:23:56 -0500451@pytest.mark.requires_backend_interface(interface=RSABackend)
452@pytest.mark.requires_backend_interface(interface=X509Backend)
453class TestCertificatePoliciesExtension(object):
454 def test_cps_uri_policy_qualifier(self, backend):
455 cert = _load_cert(
456 os.path.join("x509", "custom", "cp_cps_uri.pem"),
457 x509.load_pem_x509_certificate,
458 backend
459 )
460
461 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500462 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500463 ).value
464
465 assert cp == x509.CertificatePolicies([
466 x509.PolicyInformation(
467 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
468 [u"http://other.com/cps"]
469 )
470 ])
471
472 def test_user_notice_with_notice_reference(self, backend):
473 cert = _load_cert(
474 os.path.join(
475 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
476 ),
477 x509.load_pem_x509_certificate,
478 backend
479 )
480
481 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500482 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500483 ).value
484
485 assert cp == x509.CertificatePolicies([
486 x509.PolicyInformation(
487 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
488 [
489 u"http://example.com/cps",
490 u"http://other.com/cps",
491 x509.UserNotice(
492 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
493 u"thing"
494 )
495 ]
496 )
497 ])
498
499 def test_user_notice_with_explicit_text(self, backend):
500 cert = _load_cert(
501 os.path.join(
502 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
503 ),
504 x509.load_pem_x509_certificate,
505 backend
506 )
507
508 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500509 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500510 ).value
511
512 assert cp == x509.CertificatePolicies([
513 x509.PolicyInformation(
514 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
515 [x509.UserNotice(None, u"thing")]
516 )
517 ])
518
519 def test_user_notice_no_explicit_text(self, backend):
520 cert = _load_cert(
521 os.path.join(
522 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
523 ),
524 x509.load_pem_x509_certificate,
525 backend
526 )
527
528 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500529 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500530 ).value
531
532 assert cp == x509.CertificatePolicies([
533 x509.PolicyInformation(
534 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
535 [
536 x509.UserNotice(
537 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
538 None
539 )
540 ]
541 )
542 ])
543
544
Paul Kehrercecbbba2015-03-30 14:58:38 -0500545class TestKeyUsage(object):
546 def test_key_agreement_false_encipher_decipher_true(self):
547 with pytest.raises(ValueError):
548 x509.KeyUsage(
549 digital_signature=False,
550 content_commitment=False,
551 key_encipherment=False,
552 data_encipherment=False,
553 key_agreement=False,
554 key_cert_sign=False,
555 crl_sign=False,
556 encipher_only=True,
557 decipher_only=False
558 )
559
560 with pytest.raises(ValueError):
561 x509.KeyUsage(
562 digital_signature=False,
563 content_commitment=False,
564 key_encipherment=False,
565 data_encipherment=False,
566 key_agreement=False,
567 key_cert_sign=False,
568 crl_sign=False,
569 encipher_only=True,
570 decipher_only=True
571 )
572
573 with pytest.raises(ValueError):
574 x509.KeyUsage(
575 digital_signature=False,
576 content_commitment=False,
577 key_encipherment=False,
578 data_encipherment=False,
579 key_agreement=False,
580 key_cert_sign=False,
581 crl_sign=False,
582 encipher_only=False,
583 decipher_only=True
584 )
585
586 def test_properties_key_agreement_true(self):
587 ku = x509.KeyUsage(
588 digital_signature=True,
589 content_commitment=True,
590 key_encipherment=False,
591 data_encipherment=False,
592 key_agreement=False,
593 key_cert_sign=True,
594 crl_sign=False,
595 encipher_only=False,
596 decipher_only=False
597 )
598 assert ku.digital_signature is True
599 assert ku.content_commitment is True
600 assert ku.key_encipherment is False
601 assert ku.data_encipherment is False
602 assert ku.key_agreement is False
603 assert ku.key_cert_sign is True
604 assert ku.crl_sign is False
605
606 def test_key_agreement_true_properties(self):
607 ku = x509.KeyUsage(
608 digital_signature=False,
609 content_commitment=False,
610 key_encipherment=False,
611 data_encipherment=False,
612 key_agreement=True,
613 key_cert_sign=False,
614 crl_sign=False,
615 encipher_only=False,
616 decipher_only=True
617 )
618 assert ku.key_agreement is True
619 assert ku.encipher_only is False
620 assert ku.decipher_only is True
621
622 def test_key_agreement_false_properties(self):
623 ku = x509.KeyUsage(
624 digital_signature=False,
625 content_commitment=False,
626 key_encipherment=False,
627 data_encipherment=False,
628 key_agreement=False,
629 key_cert_sign=False,
630 crl_sign=False,
631 encipher_only=False,
632 decipher_only=False
633 )
634 assert ku.key_agreement is False
635 with pytest.raises(ValueError):
636 ku.encipher_only
637
638 with pytest.raises(ValueError):
639 ku.decipher_only
640
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500641 def test_repr_key_agreement_false(self):
642 ku = x509.KeyUsage(
643 digital_signature=True,
644 content_commitment=True,
645 key_encipherment=False,
646 data_encipherment=False,
647 key_agreement=False,
648 key_cert_sign=True,
649 crl_sign=False,
650 encipher_only=False,
651 decipher_only=False
652 )
653 assert repr(ku) == (
654 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
655 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400656 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
657 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500658 )
659
660 def test_repr_key_agreement_true(self):
661 ku = x509.KeyUsage(
662 digital_signature=True,
663 content_commitment=True,
664 key_encipherment=False,
665 data_encipherment=False,
666 key_agreement=True,
667 key_cert_sign=True,
668 crl_sign=False,
669 encipher_only=False,
670 decipher_only=False
671 )
672 assert repr(ku) == (
673 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
674 "cipherment=False, data_encipherment=False, key_agreement=True, k"
675 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
676 "only=False)>"
677 )
678
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500679 def test_eq(self):
680 ku = x509.KeyUsage(
681 digital_signature=False,
682 content_commitment=False,
683 key_encipherment=False,
684 data_encipherment=False,
685 key_agreement=True,
686 key_cert_sign=False,
687 crl_sign=False,
688 encipher_only=False,
689 decipher_only=True
690 )
691 ku2 = x509.KeyUsage(
692 digital_signature=False,
693 content_commitment=False,
694 key_encipherment=False,
695 data_encipherment=False,
696 key_agreement=True,
697 key_cert_sign=False,
698 crl_sign=False,
699 encipher_only=False,
700 decipher_only=True
701 )
702 assert ku == ku2
703
704 def test_ne(self):
705 ku = x509.KeyUsage(
706 digital_signature=False,
707 content_commitment=False,
708 key_encipherment=False,
709 data_encipherment=False,
710 key_agreement=True,
711 key_cert_sign=False,
712 crl_sign=False,
713 encipher_only=False,
714 decipher_only=True
715 )
716 ku2 = x509.KeyUsage(
717 digital_signature=False,
718 content_commitment=False,
719 key_encipherment=False,
720 data_encipherment=False,
721 key_agreement=False,
722 key_cert_sign=False,
723 crl_sign=False,
724 encipher_only=False,
725 decipher_only=False
726 )
727 assert ku != ku2
728 assert ku != object()
729
Paul Kehrercecbbba2015-03-30 14:58:38 -0500730
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500731class TestSubjectKeyIdentifier(object):
732 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400733 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500734 ski = x509.SubjectKeyIdentifier(value)
735 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500736
737 def test_repr(self):
738 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500739 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500740 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500741 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400742 if six.PY3:
743 assert repr(ext) == (
744 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
745 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
746 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
747 "\\xf7\\xff:\\xc9\')>)>"
748 )
749 else:
750 assert repr(ext) == (
751 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
752 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
753 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
754 "\\xf7\\xff:\\xc9\')>)>"
755 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500756
757 def test_eq(self):
758 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500759 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500760 )
761 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500762 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500763 )
764 assert ski == ski2
765
766 def test_ne(self):
767 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500768 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500769 )
770 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500771 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500772 )
773 assert ski != ski2
774 assert ski != object()
775
Alex Gaynor410fe352015-12-26 15:01:25 -0500776 def test_hash(self):
777 ski1 = x509.SubjectKeyIdentifier(
778 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
779 )
780 ski2 = x509.SubjectKeyIdentifier(
781 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
782 )
783 ski3 = x509.SubjectKeyIdentifier(
784 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
785 )
786
787 assert hash(ski1) == hash(ski2)
788 assert hash(ski1) != hash(ski3)
789
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500790
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400791class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500792 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400793 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500794 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400795
796 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500797 dirname = x509.DirectoryName(
798 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800799 x509.NameAttribute(
800 x509.ObjectIdentifier('2.999.1'),
801 u'value1'
802 ),
803 x509.NameAttribute(
804 x509.ObjectIdentifier('2.999.2'),
805 u'value2'
806 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500807 ])
808 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400809 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500810 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400811
812 def test_authority_issuer_none_serial_not_none(self):
813 with pytest.raises(ValueError):
814 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
815
816 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500817 dirname = x509.DirectoryName(
818 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800819 x509.NameAttribute(
820 x509.ObjectIdentifier('2.999.1'),
821 u'value1'
822 ),
823 x509.NameAttribute(
824 x509.ObjectIdentifier('2.999.2'),
825 u'value2'
826 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500827 ])
828 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400829 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500830 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400831
832 def test_authority_cert_serial_and_issuer_none(self):
833 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
834 assert aki.key_identifier == b"id"
835 assert aki.authority_cert_issuer is None
836 assert aki.authority_cert_serial_number is None
837
838 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500839 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500840 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500841 )
842 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400843
844 if six.PY3:
845 assert repr(aki) == (
846 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500847 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500848 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500849 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400850 )
851 else:
852 assert repr(aki) == (
853 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500854 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500855 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
856 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400857 )
858
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500859 def test_eq(self):
860 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500861 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500862 )
863 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
864 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500865 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500866 )
867 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
868 assert aki == aki2
869
870 def test_ne(self):
871 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500872 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500873 )
874 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500875 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500876 )
877 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
878 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
879 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
880 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
881 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
882 assert aki != aki2
883 assert aki != aki3
884 assert aki != aki4
885 assert aki != aki5
886 assert aki != object()
887
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400888
Paul Kehrer8cf26422015-03-21 09:50:24 -0500889class TestBasicConstraints(object):
890 def test_ca_not_boolean(self):
891 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500892 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500893
894 def test_path_length_not_ca(self):
895 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500896 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500897
898 def test_path_length_not_int(self):
899 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500900 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500901
902 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500903 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500904
905 def test_path_length_negative(self):
906 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500907 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500908
909 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500910 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500911 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500912 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500913 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500914
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600915 def test_hash(self):
916 na = x509.BasicConstraints(ca=True, path_length=None)
917 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600918 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600919 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600920 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600921
Paul Kehrer3a69b132015-05-13 10:03:46 -0500922 def test_eq(self):
923 na = x509.BasicConstraints(ca=True, path_length=None)
924 na2 = x509.BasicConstraints(ca=True, path_length=None)
925 assert na == na2
926
927 def test_ne(self):
928 na = x509.BasicConstraints(ca=True, path_length=None)
929 na2 = x509.BasicConstraints(ca=True, path_length=1)
930 na3 = x509.BasicConstraints(ca=False, path_length=None)
931 assert na != na2
932 assert na != na3
933 assert na != object()
934
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500935
Paul Kehrerffa2a152015-03-31 08:18:25 -0500936class TestExtendedKeyUsage(object):
937 def test_not_all_oids(self):
938 with pytest.raises(TypeError):
939 x509.ExtendedKeyUsage(["notoid"])
940
941 def test_iter_len(self):
942 eku = x509.ExtendedKeyUsage([
943 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
944 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
945 ])
946 assert len(eku) == 2
947 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500948 ExtendedKeyUsageOID.SERVER_AUTH,
949 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500950 ]
951
Paul Kehrer23d10c32015-04-02 23:12:32 -0500952 def test_repr(self):
953 eku = x509.ExtendedKeyUsage([
954 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
955 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
956 ])
957 assert repr(eku) == (
958 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
959 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
960 "tAuth)>])>"
961 )
962
Paul Kehrerb0476172015-05-02 19:34:51 -0500963 def test_eq(self):
964 eku = x509.ExtendedKeyUsage([
965 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
966 ])
967 eku2 = x509.ExtendedKeyUsage([
968 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
969 ])
970 assert eku == eku2
971
972 def test_ne(self):
973 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
974 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
975 assert eku != eku2
976 assert eku != object()
977
Paul Kehrerffa2a152015-03-31 08:18:25 -0500978
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500979@pytest.mark.requires_backend_interface(interface=RSABackend)
980@pytest.mark.requires_backend_interface(interface=X509Backend)
981class TestExtensions(object):
982 def test_no_extensions(self, backend):
983 cert = _load_cert(
984 os.path.join("x509", "verisign_md2_root.pem"),
985 x509.load_pem_x509_certificate,
986 backend
987 )
988 ext = cert.extensions
989 assert len(ext) == 0
990 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500991 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500992 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500993
Paul Kehrerd44e4132015-08-10 19:13:13 -0500994 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500995
996 def test_one_extension(self, backend):
997 cert = _load_cert(
998 os.path.join(
999 "x509", "custom", "basic_constraints_not_critical.pem"
1000 ),
1001 x509.load_pem_x509_certificate,
1002 backend
1003 )
1004 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001005 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001006 assert ext is not None
1007 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001008
1009 def test_duplicate_extension(self, backend):
1010 cert = _load_cert(
1011 os.path.join(
1012 "x509", "custom", "two_basic_constraints.pem"
1013 ),
1014 x509.load_pem_x509_certificate,
1015 backend
1016 )
1017 with pytest.raises(x509.DuplicateExtension) as exc:
1018 cert.extensions
1019
Paul Kehrerd44e4132015-08-10 19:13:13 -05001020 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001021
1022 def test_unsupported_critical_extension(self, backend):
1023 cert = _load_cert(
1024 os.path.join(
1025 "x509", "custom", "unsupported_extension_critical.pem"
1026 ),
1027 x509.load_pem_x509_certificate,
1028 backend
1029 )
1030 with pytest.raises(x509.UnsupportedExtension) as exc:
1031 cert.extensions
1032
1033 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
1034
Paul Kehrer58ddc112015-12-30 20:19:00 -06001035 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001036 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001037 cert = _load_cert(
1038 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001039 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001040 ),
1041 x509.load_pem_x509_certificate,
1042 backend
1043 )
1044 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001045 assert len(extensions) == 2
1046 assert extensions[0].critical is False
1047 assert extensions[0].oid == x509.ObjectIdentifier(
1048 "1.3.6.1.4.1.41482.2"
1049 )
1050 assert extensions[0].value == x509.UnrecognizedExtension(
1051 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1052 b"1.3.6.1.4.1.41482.1.2"
1053 )
1054 assert extensions[1].critical is False
1055 assert extensions[1].oid == x509.ObjectIdentifier(
1056 "1.3.6.1.4.1.45724.2.1.1"
1057 )
1058 assert extensions[1].value == x509.UnrecognizedExtension(
1059 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1060 b"\x03\x02\x040"
1061 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001062
Phoebe Queenecae9812015-08-12 05:00:32 +01001063 def test_no_extensions_get_for_class(self, backend):
1064 cert = _load_cert(
1065 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001066 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001067 ),
1068 x509.load_pem_x509_certificate,
1069 backend
1070 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001071 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001072 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001073 exts.get_extension_for_class(x509.IssuerAlternativeName)
1074 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001075
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001076 def test_unrecognized_extension_for_class(self):
1077 exts = x509.Extensions([])
1078 with pytest.raises(TypeError):
1079 exts.get_extension_for_class(x509.UnrecognizedExtension)
1080
Paul Kehrer5b90c972015-12-26 00:52:58 -06001081 def test_indexing(self, backend):
1082 cert = _load_cert(
1083 os.path.join("x509", "cryptography.io.pem"),
1084 x509.load_pem_x509_certificate,
1085 backend
1086 )
1087 exts = cert.extensions
1088 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001089 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001090
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001091 def test_one_extension_get_for_class(self, backend):
1092 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001093 os.path.join(
1094 "x509", "custom", "basic_constraints_not_critical.pem"
1095 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001096 x509.load_pem_x509_certificate,
1097 backend
1098 )
1099 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1100 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001101 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001102
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001103 def test_repr(self, backend):
1104 cert = _load_cert(
1105 os.path.join(
1106 "x509", "custom", "basic_constraints_not_critical.pem"
1107 ),
1108 x509.load_pem_x509_certificate,
1109 backend
1110 )
1111 assert repr(cert.extensions) == (
1112 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1113 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1114 "alse, path_length=None)>)>])>"
1115 )
1116
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001117
Paul Kehrerfa56a232015-03-17 13:14:03 -05001118@pytest.mark.requires_backend_interface(interface=RSABackend)
1119@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001120class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001121 def test_ca_true_pathlen_6(self, backend):
1122 cert = _load_cert(
1123 os.path.join(
1124 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1125 ),
1126 x509.load_der_x509_certificate,
1127 backend
1128 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001129 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001130 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001131 )
1132 assert ext is not None
1133 assert ext.critical is True
1134 assert ext.value.ca is True
1135 assert ext.value.path_length == 6
1136
1137 def test_path_length_zero(self, backend):
1138 cert = _load_cert(
1139 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1140 x509.load_pem_x509_certificate,
1141 backend
1142 )
1143 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001144 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001145 )
1146 assert ext is not None
1147 assert ext.critical is True
1148 assert ext.value.ca is True
1149 assert ext.value.path_length == 0
1150
1151 def test_ca_true_no_pathlen(self, backend):
1152 cert = _load_cert(
1153 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1154 x509.load_der_x509_certificate,
1155 backend
1156 )
1157 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001158 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001159 )
1160 assert ext is not None
1161 assert ext.critical is True
1162 assert ext.value.ca is True
1163 assert ext.value.path_length is None
1164
1165 def test_ca_false(self, backend):
1166 cert = _load_cert(
1167 os.path.join("x509", "cryptography.io.pem"),
1168 x509.load_pem_x509_certificate,
1169 backend
1170 )
1171 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001172 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001173 )
1174 assert ext is not None
1175 assert ext.critical is True
1176 assert ext.value.ca is False
1177 assert ext.value.path_length is None
1178
1179 def test_no_basic_constraints(self, backend):
1180 cert = _load_cert(
1181 os.path.join(
1182 "x509",
1183 "PKITS_data",
1184 "certs",
1185 "ValidCertificatePathTest1EE.crt"
1186 ),
1187 x509.load_der_x509_certificate,
1188 backend
1189 )
1190 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001191 cert.extensions.get_extension_for_oid(
1192 ExtensionOID.BASIC_CONSTRAINTS
1193 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001194
1195 def test_basic_constraint_not_critical(self, backend):
1196 cert = _load_cert(
1197 os.path.join(
1198 "x509", "custom", "basic_constraints_not_critical.pem"
1199 ),
1200 x509.load_pem_x509_certificate,
1201 backend
1202 )
1203 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001204 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001205 )
1206 assert ext is not None
1207 assert ext.critical is False
1208 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001209
1210
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001211class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001212 @pytest.mark.requires_backend_interface(interface=RSABackend)
1213 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001214 def test_subject_key_identifier(self, backend):
1215 cert = _load_cert(
1216 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1217 x509.load_der_x509_certificate,
1218 backend
1219 )
1220 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001221 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001222 )
1223 ski = ext.value
1224 assert ext is not None
1225 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001226 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001227 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001228 )
1229
Paul Kehrerf22f6122015-08-05 12:57:13 +01001230 @pytest.mark.requires_backend_interface(interface=RSABackend)
1231 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001232 def test_no_subject_key_identifier(self, backend):
1233 cert = _load_cert(
1234 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1235 x509.load_pem_x509_certificate,
1236 backend
1237 )
1238 with pytest.raises(x509.ExtensionNotFound):
1239 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001240 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001241 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001242
Paul Kehrerf22f6122015-08-05 12:57:13 +01001243 @pytest.mark.requires_backend_interface(interface=RSABackend)
1244 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001245 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001246 cert = _load_cert(
1247 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1248 x509.load_der_x509_certificate,
1249 backend
1250 )
1251 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001252 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001253 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001254 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001255 cert.public_key()
1256 )
1257 assert ext.value == ski
1258
1259 @pytest.mark.requires_backend_interface(interface=DSABackend)
1260 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001261 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001262 cert = _load_cert(
1263 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1264 x509.load_pem_x509_certificate,
1265 backend
1266 )
1267
1268 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001269 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001270 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001271 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001272 cert.public_key()
1273 )
1274 assert ext.value == ski
1275
1276 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1277 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001278 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001279 _skip_curve_unsupported(backend, ec.SECP384R1())
1280 cert = _load_cert(
1281 os.path.join("x509", "ecdsa_root.pem"),
1282 x509.load_pem_x509_certificate,
1283 backend
1284 )
1285
1286 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001287 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001288 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001289 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001290 cert.public_key()
1291 )
1292 assert ext.value == ski
1293
Paul Kehrer5508ee22015-04-02 19:31:03 -05001294
1295@pytest.mark.requires_backend_interface(interface=RSABackend)
1296@pytest.mark.requires_backend_interface(interface=X509Backend)
1297class TestKeyUsageExtension(object):
1298 def test_no_key_usage(self, backend):
1299 cert = _load_cert(
1300 os.path.join("x509", "verisign_md2_root.pem"),
1301 x509.load_pem_x509_certificate,
1302 backend
1303 )
1304 ext = cert.extensions
1305 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001306 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001307
Paul Kehrerd44e4132015-08-10 19:13:13 -05001308 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001309
1310 def test_all_purposes(self, backend):
1311 cert = _load_cert(
1312 os.path.join(
1313 "x509", "custom", "all_key_usages.pem"
1314 ),
1315 x509.load_pem_x509_certificate,
1316 backend
1317 )
1318 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001319 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001320 assert ext is not None
1321
1322 ku = ext.value
1323 assert ku.digital_signature is True
1324 assert ku.content_commitment is True
1325 assert ku.key_encipherment is True
1326 assert ku.data_encipherment is True
1327 assert ku.key_agreement is True
1328 assert ku.key_cert_sign is True
1329 assert ku.crl_sign is True
1330 assert ku.encipher_only is True
1331 assert ku.decipher_only is True
1332
1333 def test_key_cert_sign_crl_sign(self, backend):
1334 cert = _load_cert(
1335 os.path.join(
1336 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1337 ),
1338 x509.load_der_x509_certificate,
1339 backend
1340 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001341 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001342 assert ext is not None
1343 assert ext.critical is True
1344
1345 ku = ext.value
1346 assert ku.digital_signature is False
1347 assert ku.content_commitment is False
1348 assert ku.key_encipherment is False
1349 assert ku.data_encipherment is False
1350 assert ku.key_agreement is False
1351 assert ku.key_cert_sign is True
1352 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001353
1354
1355@pytest.mark.parametrize(
1356 "name", [
1357 x509.RFC822Name,
1358 x509.DNSName,
1359 x509.UniformResourceIdentifier
1360 ]
1361)
1362class TestTextGeneralNames(object):
1363 def test_not_text(self, name):
1364 with pytest.raises(TypeError):
1365 name(b"notaunicodestring")
1366
1367 with pytest.raises(TypeError):
1368 name(1.3)
1369
1370 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301371 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001372 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1373
1374 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301375 gn = name(u"string")
1376 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001377 assert gn == gn2
1378
1379 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301380 gn = name(u"string")
1381 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001382 assert gn != gn2
1383 assert gn != object()
1384
1385
1386class TestDirectoryName(object):
1387 def test_not_name(self):
1388 with pytest.raises(TypeError):
1389 x509.DirectoryName(b"notaname")
1390
1391 with pytest.raises(TypeError):
1392 x509.DirectoryName(1.3)
1393
1394 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001395 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001396 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001397 if six.PY3:
1398 assert repr(gn) == (
1399 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1400 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1401 ">])>)>"
1402 )
1403 else:
1404 assert repr(gn) == (
1405 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1406 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1407 ")>])>)>"
1408 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001409
1410 def test_eq(self):
1411 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001412 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001413 ])
1414 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001415 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001416 ])
1417 gn = x509.DirectoryName(x509.Name([name]))
1418 gn2 = x509.DirectoryName(x509.Name([name2]))
1419 assert gn == gn2
1420
1421 def test_ne(self):
1422 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001423 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001424 ])
1425 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001426 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001427 ])
1428 gn = x509.DirectoryName(x509.Name([name]))
1429 gn2 = x509.DirectoryName(x509.Name([name2]))
1430 assert gn != gn2
1431 assert gn != object()
1432
1433
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001434class TestRFC822Name(object):
1435 def test_invalid_email(self):
1436 with pytest.raises(ValueError):
1437 x509.RFC822Name(u"Name <email>")
1438
1439 with pytest.raises(ValueError):
1440 x509.RFC822Name(u"")
1441
1442 def test_single_label(self):
1443 gn = x509.RFC822Name(u"administrator")
1444 assert gn.value == u"administrator"
1445
1446 def test_idna(self):
1447 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1448 assert gn.value == u"email@em\xe5\xefl.com"
1449 assert gn._encoded == b"email@xn--eml-vla4c.com"
1450
Alex Gaynorb642dee2016-01-03 15:12:23 -05001451 def test_hash(self):
1452 g1 = x509.RFC822Name(u"email@host.com")
1453 g2 = x509.RFC822Name(u"email@host.com")
1454 g3 = x509.RFC822Name(u"admin@host.com")
1455
1456 assert hash(g1) == hash(g2)
1457 assert hash(g1) != hash(g3)
1458
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001459
Paul Kehrere28d6c42015-07-12 14:59:37 -05001460class TestUniformResourceIdentifier(object):
1461 def test_no_parsed_hostname(self):
1462 gn = x509.UniformResourceIdentifier(u"singlelabel")
1463 assert gn.value == u"singlelabel"
1464
1465 def test_with_port(self):
1466 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1467 assert gn.value == u"singlelabel:443/test"
1468
1469 def test_idna_no_port(self):
1470 gn = x509.UniformResourceIdentifier(
1471 u"http://\u043f\u044b\u043a\u0430.cryptography"
1472 )
1473 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1474 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1475
1476 def test_idna_with_port(self):
1477 gn = x509.UniformResourceIdentifier(
1478 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1479 )
1480 assert gn.value == (
1481 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1482 )
1483 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1484
1485 def test_query_and_fragment(self):
1486 gn = x509.UniformResourceIdentifier(
1487 u"ldap://cryptography:90/path?query=true#somedata"
1488 )
1489 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1490
1491
Paul Kehrer31bdf792015-03-25 14:11:00 -05001492class TestRegisteredID(object):
1493 def test_not_oid(self):
1494 with pytest.raises(TypeError):
1495 x509.RegisteredID(b"notanoid")
1496
1497 with pytest.raises(TypeError):
1498 x509.RegisteredID(1.3)
1499
1500 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001501 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001502 assert repr(gn) == (
1503 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1504 "e)>)>"
1505 )
1506
1507 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001508 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1509 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001510 assert gn == gn2
1511
1512 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001513 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001514 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001515 assert gn != gn2
1516 assert gn != object()
1517
1518
1519class TestIPAddress(object):
1520 def test_not_ipaddress(self):
1521 with pytest.raises(TypeError):
1522 x509.IPAddress(b"notanipaddress")
1523
1524 with pytest.raises(TypeError):
1525 x509.IPAddress(1.3)
1526
1527 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301528 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001529 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1530
Eeshan Gargf1234152015-04-29 18:41:00 +05301531 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001532 assert repr(gn2) == "<IPAddress(value=ff::)>"
1533
Paul Kehrereb177932015-05-17 18:33:33 -07001534 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1535 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1536
1537 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1538 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1539
Paul Kehrer31bdf792015-03-25 14:11:00 -05001540 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301541 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1542 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001543 assert gn == gn2
1544
1545 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301546 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1547 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001548 assert gn != gn2
1549 assert gn != object()
1550
1551
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001552class TestOtherName(object):
1553 def test_invalid_args(self):
1554 with pytest.raises(TypeError):
1555 x509.OtherName(b"notanobjectidentifier", b"derdata")
1556
1557 with pytest.raises(TypeError):
1558 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1559
1560 def test_repr(self):
1561 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1562 if six.PY3:
1563 assert repr(gn) == (
1564 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1565 "name=Unknown OID)>, value=b'derdata')>"
1566 )
1567 else:
1568 assert repr(gn) == (
1569 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1570 "name=Unknown OID)>, value='derdata')>"
1571 )
1572
1573 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1574 if six.PY3:
1575 assert repr(gn) == (
1576 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1577 "name=pseudonym)>, value=b'derdata')>"
1578 )
1579 else:
1580 assert repr(gn) == (
1581 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1582 "name=pseudonym)>, value='derdata')>"
1583 )
1584
1585 def test_eq(self):
1586 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1587 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1588 assert gn == gn2
1589
1590 def test_ne(self):
1591 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1592 assert gn != object()
1593
1594 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1595 assert gn != gn2
1596
1597 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1598 assert gn != gn2
1599
1600
Erik Trauschke2dcce902015-05-14 16:12:24 -07001601class TestGeneralNames(object):
1602 def test_get_values_for_type(self):
1603 gns = x509.GeneralNames(
1604 [x509.DNSName(u"cryptography.io")]
1605 )
1606 names = gns.get_values_for_type(x509.DNSName)
1607 assert names == [u"cryptography.io"]
1608
1609 def test_iter_names(self):
1610 gns = x509.GeneralNames([
1611 x509.DNSName(u"cryptography.io"),
1612 x509.DNSName(u"crypto.local"),
1613 ])
1614 assert len(gns) == 2
1615 assert list(gns) == [
1616 x509.DNSName(u"cryptography.io"),
1617 x509.DNSName(u"crypto.local"),
1618 ]
1619
Paul Kehrer8adb5962015-12-26 14:46:58 -06001620 def test_indexing(self):
1621 gn = x509.GeneralNames([
1622 x509.DNSName(u"cryptography.io"),
1623 x509.DNSName(u"crypto.local"),
1624 x509.DNSName(u"another.local"),
1625 x509.RFC822Name(u"email@another.local"),
1626 x509.UniformResourceIdentifier(u"http://another.local"),
1627 ])
1628 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001629 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001630
Erik Trauschke2dcce902015-05-14 16:12:24 -07001631 def test_invalid_general_names(self):
1632 with pytest.raises(TypeError):
1633 x509.GeneralNames(
1634 [x509.DNSName(u"cryptography.io"), "invalid"]
1635 )
1636
1637 def test_repr(self):
1638 gns = x509.GeneralNames(
1639 [
1640 x509.DNSName(u"cryptography.io")
1641 ]
1642 )
1643 assert repr(gns) == (
1644 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1645 )
1646
1647 def test_eq(self):
1648 gns = x509.GeneralNames(
1649 [x509.DNSName(u"cryptography.io")]
1650 )
1651 gns2 = x509.GeneralNames(
1652 [x509.DNSName(u"cryptography.io")]
1653 )
1654 assert gns == gns2
1655
1656 def test_ne(self):
1657 gns = x509.GeneralNames(
1658 [x509.DNSName(u"cryptography.io")]
1659 )
1660 gns2 = x509.GeneralNames(
1661 [x509.RFC822Name(u"admin@cryptography.io")]
1662 )
1663 assert gns != gns2
1664 assert gns != object()
1665
1666
Paul Kehrer99125c92015-06-07 18:37:10 -05001667class TestIssuerAlternativeName(object):
1668 def test_get_values_for_type(self):
1669 san = x509.IssuerAlternativeName(
1670 [x509.DNSName(u"cryptography.io")]
1671 )
1672 names = san.get_values_for_type(x509.DNSName)
1673 assert names == [u"cryptography.io"]
1674
1675 def test_iter_names(self):
1676 san = x509.IssuerAlternativeName([
1677 x509.DNSName(u"cryptography.io"),
1678 x509.DNSName(u"crypto.local"),
1679 ])
1680 assert len(san) == 2
1681 assert list(san) == [
1682 x509.DNSName(u"cryptography.io"),
1683 x509.DNSName(u"crypto.local"),
1684 ]
1685
Paul Kehrer5c999d32015-12-26 17:45:20 -06001686 def test_indexing(self):
1687 ian = x509.IssuerAlternativeName([
1688 x509.DNSName(u"cryptography.io"),
1689 x509.DNSName(u"crypto.local"),
1690 x509.DNSName(u"another.local"),
1691 x509.RFC822Name(u"email@another.local"),
1692 x509.UniformResourceIdentifier(u"http://another.local"),
1693 ])
1694 assert ian[-1] == ian[4]
1695 assert ian[2:6:2] == [ian[2], ian[4]]
1696
Paul Kehrer99125c92015-06-07 18:37:10 -05001697 def test_invalid_general_names(self):
1698 with pytest.raises(TypeError):
1699 x509.IssuerAlternativeName(
1700 [x509.DNSName(u"cryptography.io"), "invalid"]
1701 )
1702
1703 def test_repr(self):
1704 san = x509.IssuerAlternativeName(
1705 [
1706 x509.DNSName(u"cryptography.io")
1707 ]
1708 )
1709 assert repr(san) == (
1710 "<IssuerAlternativeName("
1711 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1712 )
1713
1714 def test_eq(self):
1715 san = x509.IssuerAlternativeName(
1716 [x509.DNSName(u"cryptography.io")]
1717 )
1718 san2 = x509.IssuerAlternativeName(
1719 [x509.DNSName(u"cryptography.io")]
1720 )
1721 assert san == san2
1722
1723 def test_ne(self):
1724 san = x509.IssuerAlternativeName(
1725 [x509.DNSName(u"cryptography.io")]
1726 )
1727 san2 = x509.IssuerAlternativeName(
1728 [x509.RFC822Name(u"admin@cryptography.io")]
1729 )
1730 assert san != san2
1731 assert san != object()
1732
1733
Alex Gaynorf1c17672015-06-20 14:20:20 -04001734@pytest.mark.requires_backend_interface(interface=RSABackend)
1735@pytest.mark.requires_backend_interface(interface=X509Backend)
1736class TestRSAIssuerAlternativeNameExtension(object):
1737 def test_uri(self, backend):
1738 cert = _load_cert(
1739 os.path.join("x509", "custom", "ian_uri.pem"),
1740 x509.load_pem_x509_certificate,
1741 backend,
1742 )
1743 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001744 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001745 )
1746 assert list(ext.value) == [
1747 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1748 ]
1749
1750
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001751class TestCRLNumber(object):
1752 def test_eq(self):
1753 crl_number = x509.CRLNumber(15)
1754 assert crl_number == x509.CRLNumber(15)
1755
1756 def test_ne(self):
1757 crl_number = x509.CRLNumber(15)
1758 assert crl_number != x509.CRLNumber(14)
1759 assert crl_number != object()
1760
1761 def test_repr(self):
1762 crl_number = x509.CRLNumber(15)
1763 assert repr(crl_number) == "<CRLNumber(15)>"
1764
Paul Kehrera9718fc2015-12-22 22:55:35 -06001765 def test_invalid_number(self):
1766 with pytest.raises(TypeError):
1767 x509.CRLNumber("notanumber")
1768
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001769 def test_hash(self):
1770 c1 = x509.CRLNumber(1)
1771 c2 = x509.CRLNumber(1)
1772 c3 = x509.CRLNumber(2)
1773 assert hash(c1) == hash(c2)
1774 assert hash(c1) != hash(c3)
1775
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001776
Paul Kehrer31bdf792015-03-25 14:11:00 -05001777class TestSubjectAlternativeName(object):
1778 def test_get_values_for_type(self):
1779 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301780 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001781 )
1782 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301783 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001784
1785 def test_iter_names(self):
1786 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301787 x509.DNSName(u"cryptography.io"),
1788 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001789 ])
1790 assert len(san) == 2
1791 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301792 x509.DNSName(u"cryptography.io"),
1793 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001794 ]
1795
Paul Kehrer8adb5962015-12-26 14:46:58 -06001796 def test_indexing(self):
1797 san = x509.SubjectAlternativeName([
1798 x509.DNSName(u"cryptography.io"),
1799 x509.DNSName(u"crypto.local"),
1800 x509.DNSName(u"another.local"),
1801 x509.RFC822Name(u"email@another.local"),
1802 x509.UniformResourceIdentifier(u"http://another.local"),
1803 ])
1804 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001805 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001806
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001807 def test_invalid_general_names(self):
1808 with pytest.raises(TypeError):
1809 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301810 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001811 )
1812
Paul Kehrer31bdf792015-03-25 14:11:00 -05001813 def test_repr(self):
1814 san = x509.SubjectAlternativeName(
1815 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301816 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001817 ]
1818 )
1819 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001820 "<SubjectAlternativeName("
1821 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001822 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001823
Paul Kehrer58cc3972015-05-13 10:00:41 -05001824 def test_eq(self):
1825 san = x509.SubjectAlternativeName(
1826 [x509.DNSName(u"cryptography.io")]
1827 )
1828 san2 = x509.SubjectAlternativeName(
1829 [x509.DNSName(u"cryptography.io")]
1830 )
1831 assert san == san2
1832
1833 def test_ne(self):
1834 san = x509.SubjectAlternativeName(
1835 [x509.DNSName(u"cryptography.io")]
1836 )
1837 san2 = x509.SubjectAlternativeName(
1838 [x509.RFC822Name(u"admin@cryptography.io")]
1839 )
1840 assert san != san2
1841 assert san != object()
1842
Paul Kehrer40f83382015-04-20 15:00:16 -05001843
1844@pytest.mark.requires_backend_interface(interface=RSABackend)
1845@pytest.mark.requires_backend_interface(interface=X509Backend)
1846class TestRSASubjectAlternativeNameExtension(object):
1847 def test_dns_name(self, backend):
1848 cert = _load_cert(
1849 os.path.join("x509", "cryptography.io.pem"),
1850 x509.load_pem_x509_certificate,
1851 backend
1852 )
1853 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001854 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001855 )
1856 assert ext is not None
1857 assert ext.critical is False
1858
1859 san = ext.value
1860
1861 dns = san.get_values_for_type(x509.DNSName)
1862 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001863
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001864 def test_wildcard_dns_name(self, backend):
1865 cert = _load_cert(
1866 os.path.join("x509", "wildcard_san.pem"),
1867 x509.load_pem_x509_certificate,
1868 backend
1869 )
1870 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001871 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001872 )
1873
1874 dns = ext.value.get_values_for_type(x509.DNSName)
1875 assert dns == [
1876 u'*.langui.sh',
1877 u'langui.sh',
1878 u'*.saseliminator.com',
1879 u'saseliminator.com'
1880 ]
1881
Dominic Chen87bb9572015-10-09 00:23:07 -04001882 def test_san_empty_hostname(self, backend):
1883 cert = _load_cert(
1884 os.path.join(
1885 "x509", "custom", "san_empty_hostname.pem"
1886 ),
1887 x509.load_pem_x509_certificate,
1888 backend
1889 )
1890 san = cert.extensions.get_extension_for_oid(
1891 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1892 )
1893
1894 dns = san.value.get_values_for_type(x509.DNSName)
1895 assert dns == [u'']
1896
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001897 def test_san_wildcard_idna_dns_name(self, backend):
1898 cert = _load_cert(
1899 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1900 x509.load_pem_x509_certificate,
1901 backend
1902 )
1903 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001904 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001905 )
1906
1907 dns = ext.value.get_values_for_type(x509.DNSName)
1908 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1909
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001910 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001911 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001912 os.path.join("x509", "san_x400address.der"),
1913 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001914 backend
1915 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001916 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001917 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001918
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001919 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001920
1921 def test_registered_id(self, backend):
1922 cert = _load_cert(
1923 os.path.join(
1924 "x509", "custom", "san_registered_id.pem"
1925 ),
1926 x509.load_pem_x509_certificate,
1927 backend
1928 )
1929 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001930 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001931 )
1932 assert ext is not None
1933 assert ext.critical is False
1934
1935 san = ext.value
1936 rid = san.get_values_for_type(x509.RegisteredID)
1937 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001938
1939 def test_uri(self, backend):
1940 cert = _load_cert(
1941 os.path.join(
1942 "x509", "custom", "san_uri_with_port.pem"
1943 ),
1944 x509.load_pem_x509_certificate,
1945 backend
1946 )
1947 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001948 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001949 )
1950 assert ext is not None
1951 uri = ext.value.get_values_for_type(
1952 x509.UniformResourceIdentifier
1953 )
1954 assert uri == [
1955 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1956 u"lo",
1957 u"http://someregulardomain.com",
1958 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001959
1960 def test_ipaddress(self, backend):
1961 cert = _load_cert(
1962 os.path.join(
1963 "x509", "custom", "san_ipaddr.pem"
1964 ),
1965 x509.load_pem_x509_certificate,
1966 backend
1967 )
1968 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001969 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001970 )
1971 assert ext is not None
1972 assert ext.critical is False
1973
1974 san = ext.value
1975
1976 ip = san.get_values_for_type(x509.IPAddress)
1977 assert [
1978 ipaddress.ip_address(u"127.0.0.1"),
1979 ipaddress.ip_address(u"ff::")
1980 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001981
1982 def test_dirname(self, backend):
1983 cert = _load_cert(
1984 os.path.join(
1985 "x509", "custom", "san_dirname.pem"
1986 ),
1987 x509.load_pem_x509_certificate,
1988 backend
1989 )
1990 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001991 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001992 )
1993 assert ext is not None
1994 assert ext.critical is False
1995
1996 san = ext.value
1997
1998 dirname = san.get_values_for_type(x509.DirectoryName)
1999 assert [
2000 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002001 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2002 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2003 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002004 ])
2005 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002006
2007 def test_rfc822name(self, backend):
2008 cert = _load_cert(
2009 os.path.join(
2010 "x509", "custom", "san_rfc822_idna.pem"
2011 ),
2012 x509.load_pem_x509_certificate,
2013 backend
2014 )
2015 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002016 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002017 )
2018 assert ext is not None
2019 assert ext.critical is False
2020
2021 san = ext.value
2022
2023 rfc822name = san.get_values_for_type(x509.RFC822Name)
2024 assert [u"email@em\xe5\xefl.com"] == rfc822name
2025
Paul Kehrerb8968812015-05-15 09:01:34 -07002026 def test_idna2003_invalid(self, backend):
2027 cert = _load_cert(
2028 os.path.join(
2029 "x509", "custom", "san_idna2003_dnsname.pem"
2030 ),
2031 x509.load_pem_x509_certificate,
2032 backend
2033 )
2034 with pytest.raises(UnicodeError):
2035 cert.extensions
2036
Paul Kehrere06cab42015-04-30 10:23:33 -05002037 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2038 cert = _load_cert(
2039 os.path.join(
2040 "x509", "custom", "san_idna_names.pem"
2041 ),
2042 x509.load_pem_x509_certificate,
2043 backend
2044 )
2045 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002046 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002047 )
2048 assert ext is not None
2049 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2050 dns_name = ext.value.get_values_for_type(x509.DNSName)
2051 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2052 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2053 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2054 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2055
2056 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2057 cert = _load_cert(
2058 os.path.join(
2059 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2060 ),
2061 x509.load_pem_x509_certificate,
2062 backend
2063 )
2064 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002065 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002066 )
2067 assert ext is not None
2068 assert ext.critical is False
2069
2070 san = ext.value
2071
2072 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2073 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2074 dns = san.get_values_for_type(x509.DNSName)
2075 ip = san.get_values_for_type(x509.IPAddress)
2076 dirname = san.get_values_for_type(x509.DirectoryName)
2077 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002078 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002079 assert [u"cryptography.io"] == dns
2080 assert [
2081 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002082 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002083 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002084 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002085 ),
2086 ])
2087 ] == dirname
2088 assert [
2089 ipaddress.ip_address(u"127.0.0.1"),
2090 ipaddress.ip_address(u"ff::")
2091 ] == ip
2092
2093 def test_invalid_rfc822name(self, backend):
2094 cert = _load_cert(
2095 os.path.join(
2096 "x509", "custom", "san_rfc822_names.pem"
2097 ),
2098 x509.load_pem_x509_certificate,
2099 backend
2100 )
2101 with pytest.raises(ValueError) as exc:
2102 cert.extensions
2103
2104 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002105
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002106 def test_other_name(self, backend):
2107 cert = _load_cert(
2108 os.path.join(
2109 "x509", "custom", "san_other_name.pem"
2110 ),
2111 x509.load_pem_x509_certificate,
2112 backend
2113 )
2114
2115 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002116 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002117 )
2118 assert ext is not None
2119 assert ext.critical is False
2120
Joshua Taubererd2afad32015-07-06 22:37:53 +00002121 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2122 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002123 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002124 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002125
2126 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002127 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002128
Paul Kehrer94c69602015-05-02 19:29:40 -05002129
2130@pytest.mark.requires_backend_interface(interface=RSABackend)
2131@pytest.mark.requires_backend_interface(interface=X509Backend)
2132class TestExtendedKeyUsageExtension(object):
2133 def test_eku(self, backend):
2134 cert = _load_cert(
2135 os.path.join(
2136 "x509", "custom", "extended_key_usage.pem"
2137 ),
2138 x509.load_pem_x509_certificate,
2139 backend
2140 )
2141 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002142 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002143 )
2144 assert ext is not None
2145 assert ext.critical is False
2146
2147 assert [
2148 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2149 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2150 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2151 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2152 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2153 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2154 x509.ObjectIdentifier("2.5.29.37.0"),
2155 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2156 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002157
2158
2159class TestAccessDescription(object):
2160 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002161 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002162 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2163
2164 def test_invalid_access_location(self):
2165 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002166 x509.AccessDescription(
2167 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2168 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002169
Nick Bastind2ecf862015-12-13 05:44:46 -08002170 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002171 ad = x509.AccessDescription(
2172 ObjectIdentifier("2.999.1"),
2173 x509.UniformResourceIdentifier(u"http://example.com")
2174 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002175 assert ad is not None
2176
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002177 def test_repr(self):
2178 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002179 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002180 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2181 )
2182 assert repr(ad) == (
2183 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2184 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2185 "(value=http://ocsp.domain.com)>)>"
2186 )
2187
2188 def test_eq(self):
2189 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002190 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002191 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2192 )
2193 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002194 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002195 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2196 )
2197 assert ad == ad2
2198
2199 def test_ne(self):
2200 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002201 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002202 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2203 )
2204 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002205 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002206 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2207 )
2208 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002209 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002210 x509.UniformResourceIdentifier(u"http://notthesame")
2211 )
2212 assert ad != ad2
2213 assert ad != ad3
2214 assert ad != object()
2215
2216
2217class TestAuthorityInformationAccess(object):
2218 def test_invalid_descriptions(self):
2219 with pytest.raises(TypeError):
2220 x509.AuthorityInformationAccess(["notanAccessDescription"])
2221
2222 def test_iter_len(self):
2223 aia = x509.AuthorityInformationAccess([
2224 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002225 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002226 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2227 ),
2228 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002229 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002230 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2231 )
2232 ])
2233 assert len(aia) == 2
2234 assert list(aia) == [
2235 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002236 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002237 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2238 ),
2239 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002240 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002241 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2242 )
2243 ]
2244
2245 def test_repr(self):
2246 aia = x509.AuthorityInformationAccess([
2247 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002248 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002249 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2250 ),
2251 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002252 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002253 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2254 )
2255 ])
2256 assert repr(aia) == (
2257 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2258 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2259 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2260 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2261 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2262 "fier(value=http://domain.com/ca.crt)>)>])>"
2263 )
2264
2265 def test_eq(self):
2266 aia = x509.AuthorityInformationAccess([
2267 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002268 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002269 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2270 ),
2271 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002272 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002273 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2274 )
2275 ])
2276 aia2 = x509.AuthorityInformationAccess([
2277 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002278 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002279 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2280 ),
2281 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002282 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002283 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2284 )
2285 ])
2286 assert aia == aia2
2287
2288 def test_ne(self):
2289 aia = x509.AuthorityInformationAccess([
2290 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002291 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002292 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2293 ),
2294 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002295 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002296 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2297 )
2298 ])
2299 aia2 = x509.AuthorityInformationAccess([
2300 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002301 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002302 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2303 ),
2304 ])
2305
2306 assert aia != aia2
2307 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002308
Paul Kehrerad4b3592015-12-27 17:27:40 -06002309 def test_indexing(self):
2310 aia = x509.AuthorityInformationAccess([
2311 x509.AccessDescription(
2312 AuthorityInformationAccessOID.OCSP,
2313 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2314 ),
2315 x509.AccessDescription(
2316 AuthorityInformationAccessOID.CA_ISSUERS,
2317 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2318 ),
2319 x509.AccessDescription(
2320 AuthorityInformationAccessOID.OCSP,
2321 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2322 ),
2323 x509.AccessDescription(
2324 AuthorityInformationAccessOID.OCSP,
2325 x509.UniformResourceIdentifier(u"http://ocsp3.domain.com")
2326 ),
2327 x509.AccessDescription(
2328 AuthorityInformationAccessOID.OCSP,
2329 x509.UniformResourceIdentifier(u"http://ocsp4.domain.com")
2330 ),
2331 ])
2332 assert aia[-1] == aia[4]
2333 assert aia[2:6:2] == [aia[2], aia[4]]
2334
Paul Kehrerd774de92015-05-03 10:52:25 -05002335
2336@pytest.mark.requires_backend_interface(interface=RSABackend)
2337@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002338class TestAuthorityInformationAccessExtension(object):
2339 def test_aia_ocsp_ca_issuers(self, backend):
2340 cert = _load_cert(
2341 os.path.join("x509", "cryptography.io.pem"),
2342 x509.load_pem_x509_certificate,
2343 backend
2344 )
2345 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002346 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002347 )
2348 assert ext is not None
2349 assert ext.critical is False
2350
2351 assert ext.value == x509.AuthorityInformationAccess([
2352 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002353 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002354 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2355 ),
2356 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002357 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002358 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2359 ),
2360 ])
2361
2362 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2363 cert = _load_cert(
2364 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2365 x509.load_pem_x509_certificate,
2366 backend
2367 )
2368 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002369 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002370 )
2371 assert ext is not None
2372 assert ext.critical is False
2373
2374 assert ext.value == x509.AuthorityInformationAccess([
2375 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002376 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002377 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2378 ),
2379 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002380 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002381 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2382 ),
2383 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002384 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002385 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002386 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2387 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002388 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002389 ]))
2390 ),
2391 ])
2392
2393 def test_aia_ocsp_only(self, backend):
2394 cert = _load_cert(
2395 os.path.join("x509", "custom", "aia_ocsp.pem"),
2396 x509.load_pem_x509_certificate,
2397 backend
2398 )
2399 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002400 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002401 )
2402 assert ext is not None
2403 assert ext.critical is False
2404
2405 assert ext.value == x509.AuthorityInformationAccess([
2406 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002407 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002408 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2409 ),
2410 ])
2411
2412 def test_aia_ca_issuers_only(self, backend):
2413 cert = _load_cert(
2414 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2415 x509.load_pem_x509_certificate,
2416 backend
2417 )
2418 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002419 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002420 )
2421 assert ext is not None
2422 assert ext.critical is False
2423
2424 assert ext.value == x509.AuthorityInformationAccess([
2425 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002426 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002427 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002428 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2429 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002430 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002431 ]))
2432 ),
2433 ])
2434
2435
2436@pytest.mark.requires_backend_interface(interface=RSABackend)
2437@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002438class TestAuthorityKeyIdentifierExtension(object):
2439 def test_aki_keyid(self, backend):
2440 cert = _load_cert(
2441 os.path.join(
2442 "x509", "cryptography.io.pem"
2443 ),
2444 x509.load_pem_x509_certificate,
2445 backend
2446 )
2447 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002448 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002449 )
2450 assert ext is not None
2451 assert ext.critical is False
2452
2453 assert ext.value.key_identifier == (
2454 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2455 )
2456 assert ext.value.authority_cert_issuer is None
2457 assert ext.value.authority_cert_serial_number is None
2458
2459 def test_aki_all_fields(self, backend):
2460 cert = _load_cert(
2461 os.path.join(
2462 "x509", "custom", "authority_key_identifier.pem"
2463 ),
2464 x509.load_pem_x509_certificate,
2465 backend
2466 )
2467 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002468 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002469 )
2470 assert ext is not None
2471 assert ext.critical is False
2472
2473 assert ext.value.key_identifier == (
2474 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2475 )
2476 assert ext.value.authority_cert_issuer == [
2477 x509.DirectoryName(
2478 x509.Name([
2479 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002480 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002481 ),
2482 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002483 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002484 )
2485 ])
2486 )
2487 ]
2488 assert ext.value.authority_cert_serial_number == 3
2489
2490 def test_aki_no_keyid(self, backend):
2491 cert = _load_cert(
2492 os.path.join(
2493 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2494 ),
2495 x509.load_pem_x509_certificate,
2496 backend
2497 )
2498 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002499 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002500 )
2501 assert ext is not None
2502 assert ext.critical is False
2503
2504 assert ext.value.key_identifier is None
2505 assert ext.value.authority_cert_issuer == [
2506 x509.DirectoryName(
2507 x509.Name([
2508 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002509 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002510 ),
2511 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002512 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002513 )
2514 ])
2515 )
2516 ]
2517 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002518
Paul Kehrer253929a2015-08-05 17:30:39 +01002519 def test_from_certificate(self, backend):
2520 issuer_cert = _load_cert(
2521 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2522 x509.load_pem_x509_certificate,
2523 backend
2524 )
2525 cert = _load_cert(
2526 os.path.join("x509", "cryptography.io.pem"),
2527 x509.load_pem_x509_certificate,
2528 backend
2529 )
2530 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002531 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002532 )
2533 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2534 issuer_cert.public_key()
2535 )
2536 assert ext.value == aki
2537
Paul Kehrer5a485522015-05-06 00:29:12 -05002538
Paul Kehrere0017be2015-05-17 20:39:40 -06002539class TestNameConstraints(object):
2540 def test_ipaddress_wrong_type(self):
2541 with pytest.raises(TypeError):
2542 x509.NameConstraints(
2543 permitted_subtrees=[
2544 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2545 ],
2546 excluded_subtrees=None
2547 )
2548
2549 with pytest.raises(TypeError):
2550 x509.NameConstraints(
2551 permitted_subtrees=None,
2552 excluded_subtrees=[
2553 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2554 ]
2555 )
2556
2557 def test_ipaddress_allowed_type(self):
2558 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2559 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2560 nc = x509.NameConstraints(
2561 permitted_subtrees=permitted,
2562 excluded_subtrees=excluded
2563 )
2564 assert nc.permitted_subtrees == permitted
2565 assert nc.excluded_subtrees == excluded
2566
2567 def test_invalid_permitted_subtrees(self):
2568 with pytest.raises(TypeError):
2569 x509.NameConstraints("badpermitted", None)
2570
2571 def test_invalid_excluded_subtrees(self):
2572 with pytest.raises(TypeError):
2573 x509.NameConstraints(None, "badexcluded")
2574
2575 def test_no_subtrees(self):
2576 with pytest.raises(ValueError):
2577 x509.NameConstraints(None, None)
2578
2579 def test_permitted_none(self):
2580 excluded = [x509.DNSName(u"name.local")]
2581 nc = x509.NameConstraints(
2582 permitted_subtrees=None, excluded_subtrees=excluded
2583 )
2584 assert nc.permitted_subtrees is None
2585 assert nc.excluded_subtrees is not None
2586
2587 def test_excluded_none(self):
2588 permitted = [x509.DNSName(u"name.local")]
2589 nc = x509.NameConstraints(
2590 permitted_subtrees=permitted, excluded_subtrees=None
2591 )
2592 assert nc.permitted_subtrees is not None
2593 assert nc.excluded_subtrees is None
2594
2595 def test_repr(self):
2596 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2597 nc = x509.NameConstraints(
2598 permitted_subtrees=permitted,
2599 excluded_subtrees=None
2600 )
2601 assert repr(nc) == (
2602 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2603 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2604 )
2605
Paul Kehrer31894282015-06-21 21:46:41 -05002606 def test_eq(self):
2607 nc = x509.NameConstraints(
2608 permitted_subtrees=[x509.DNSName(u"name.local")],
2609 excluded_subtrees=[x509.DNSName(u"name2.local")]
2610 )
2611 nc2 = x509.NameConstraints(
2612 permitted_subtrees=[x509.DNSName(u"name.local")],
2613 excluded_subtrees=[x509.DNSName(u"name2.local")]
2614 )
2615 assert nc == nc2
2616
2617 def test_ne(self):
2618 nc = x509.NameConstraints(
2619 permitted_subtrees=[x509.DNSName(u"name.local")],
2620 excluded_subtrees=[x509.DNSName(u"name2.local")]
2621 )
2622 nc2 = x509.NameConstraints(
2623 permitted_subtrees=[x509.DNSName(u"name.local")],
2624 excluded_subtrees=None
2625 )
2626 nc3 = x509.NameConstraints(
2627 permitted_subtrees=None,
2628 excluded_subtrees=[x509.DNSName(u"name2.local")]
2629 )
2630
2631 assert nc != nc2
2632 assert nc != nc3
2633 assert nc != object()
2634
Paul Kehrere0017be2015-05-17 20:39:40 -06002635
Paul Kehrer870d7e82015-06-21 22:20:44 -05002636@pytest.mark.requires_backend_interface(interface=RSABackend)
2637@pytest.mark.requires_backend_interface(interface=X509Backend)
2638class TestNameConstraintsExtension(object):
2639 def test_permitted_excluded(self, backend):
2640 cert = _load_cert(
2641 os.path.join(
2642 "x509", "custom", "nc_permitted_excluded_2.pem"
2643 ),
2644 x509.load_pem_x509_certificate,
2645 backend
2646 )
2647 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002648 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002649 ).value
2650 assert nc == x509.NameConstraints(
2651 permitted_subtrees=[
2652 x509.DNSName(u"zombo.local"),
2653 ],
2654 excluded_subtrees=[
2655 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002656 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002657 ]))
2658 ]
2659 )
2660
2661 def test_permitted(self, backend):
2662 cert = _load_cert(
2663 os.path.join(
2664 "x509", "custom", "nc_permitted_2.pem"
2665 ),
2666 x509.load_pem_x509_certificate,
2667 backend
2668 )
2669 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002670 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002671 ).value
2672 assert nc == x509.NameConstraints(
2673 permitted_subtrees=[
2674 x509.DNSName(u"zombo.local"),
2675 ],
2676 excluded_subtrees=None
2677 )
2678
Paul Kehrer42376832015-07-01 18:10:32 -05002679 def test_permitted_with_leading_period(self, backend):
2680 cert = _load_cert(
2681 os.path.join(
2682 "x509", "custom", "nc_permitted.pem"
2683 ),
2684 x509.load_pem_x509_certificate,
2685 backend
2686 )
2687 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002688 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002689 ).value
2690 assert nc == x509.NameConstraints(
2691 permitted_subtrees=[
2692 x509.DNSName(u".cryptography.io"),
2693 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2694 ],
2695 excluded_subtrees=None
2696 )
2697
2698 def test_excluded_with_leading_period(self, backend):
2699 cert = _load_cert(
2700 os.path.join(
2701 "x509", "custom", "nc_excluded.pem"
2702 ),
2703 x509.load_pem_x509_certificate,
2704 backend
2705 )
2706 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002707 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002708 ).value
2709 assert nc == x509.NameConstraints(
2710 permitted_subtrees=None,
2711 excluded_subtrees=[
2712 x509.DNSName(u".cryptography.io"),
2713 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2714 ]
2715 )
2716
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002717 def test_permitted_excluded_with_ips(self, backend):
2718 cert = _load_cert(
2719 os.path.join(
2720 "x509", "custom", "nc_permitted_excluded.pem"
2721 ),
2722 x509.load_pem_x509_certificate,
2723 backend
2724 )
2725 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002726 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002727 ).value
2728 assert nc == x509.NameConstraints(
2729 permitted_subtrees=[
2730 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2731 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2732 ],
2733 excluded_subtrees=[
2734 x509.DNSName(u".domain.com"),
2735 x509.UniformResourceIdentifier(u"http://test.local"),
2736 ]
2737 )
2738
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002739 def test_single_ip_netmask(self, backend):
2740 cert = _load_cert(
2741 os.path.join(
2742 "x509", "custom", "nc_single_ip_netmask.pem"
2743 ),
2744 x509.load_pem_x509_certificate,
2745 backend
2746 )
2747 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002748 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002749 ).value
2750 assert nc == x509.NameConstraints(
2751 permitted_subtrees=[
2752 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2753 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2754 ],
2755 excluded_subtrees=None
2756 )
2757
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002758 def test_invalid_netmask(self, backend):
2759 cert = _load_cert(
2760 os.path.join(
2761 "x509", "custom", "nc_invalid_ip_netmask.pem"
2762 ),
2763 x509.load_pem_x509_certificate,
2764 backend
2765 )
2766 with pytest.raises(ValueError):
2767 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002768 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002769 )
2770
Paul Kehrer870d7e82015-06-21 22:20:44 -05002771
Paul Kehrer5a485522015-05-06 00:29:12 -05002772class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002773 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002774 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002775 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002776
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002777 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002778 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002779 x509.DistributionPoint(None, "notname", None, None)
2780
2781 def test_distribution_point_full_and_relative_not_none(self):
2782 with pytest.raises(ValueError):
2783 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002784
2785 def test_crl_issuer_not_general_names(self):
2786 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002787 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002788
2789 def test_reason_not_reasonflags(self):
2790 with pytest.raises(TypeError):
2791 x509.DistributionPoint(
2792 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002793 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002794 frozenset(["notreasonflags"]),
2795 None
2796 )
2797
2798 def test_reason_not_frozenset(self):
2799 with pytest.raises(TypeError):
2800 x509.DistributionPoint(
2801 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2802 None,
2803 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002804 None
2805 )
2806
2807 def test_disallowed_reasons(self):
2808 with pytest.raises(ValueError):
2809 x509.DistributionPoint(
2810 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2811 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002812 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002813 None
2814 )
2815
2816 with pytest.raises(ValueError):
2817 x509.DistributionPoint(
2818 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2819 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002820 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002821 None
2822 )
2823
2824 def test_reason_only(self):
2825 with pytest.raises(ValueError):
2826 x509.DistributionPoint(
2827 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002828 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002829 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002830 None
2831 )
2832
2833 def test_eq(self):
2834 dp = x509.DistributionPoint(
2835 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002836 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002837 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002838 [
2839 x509.DirectoryName(
2840 x509.Name([
2841 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002842 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002843 )
2844 ])
2845 )
2846 ],
2847 )
2848 dp2 = x509.DistributionPoint(
2849 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002850 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002851 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002852 [
2853 x509.DirectoryName(
2854 x509.Name([
2855 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002856 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002857 )
2858 ])
2859 )
2860 ],
2861 )
2862 assert dp == dp2
2863
2864 def test_ne(self):
2865 dp = x509.DistributionPoint(
2866 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002867 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002868 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002869 [
2870 x509.DirectoryName(
2871 x509.Name([
2872 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002873 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002874 )
2875 ])
2876 )
2877 ],
2878 )
2879 dp2 = x509.DistributionPoint(
2880 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2881 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002882 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002883 None
2884 )
2885 assert dp != dp2
2886 assert dp != object()
2887
2888 def test_repr(self):
2889 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002890 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002891 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002892 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002893 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002894 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002895 [
2896 x509.DirectoryName(
2897 x509.Name([
2898 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002899 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002900 )
2901 ])
2902 )
2903 ],
2904 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002905 if six.PY3:
2906 assert repr(dp) == (
2907 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2908 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002909 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2910 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2911 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2912 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002913 )
2914 else:
2915 assert repr(dp) == (
2916 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2917 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002918 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2919 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2920 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2921 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002922 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002923
2924
2925class TestCRLDistributionPoints(object):
2926 def test_invalid_distribution_points(self):
2927 with pytest.raises(TypeError):
2928 x509.CRLDistributionPoints(["notadistributionpoint"])
2929
2930 def test_iter_len(self):
2931 cdp = x509.CRLDistributionPoints([
2932 x509.DistributionPoint(
2933 [x509.UniformResourceIdentifier(u"http://domain")],
2934 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002935 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002936 None
2937 ),
2938 x509.DistributionPoint(
2939 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002940 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002941 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002942 x509.ReasonFlags.key_compromise,
2943 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002944 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002945 None
2946 ),
2947 ])
2948 assert len(cdp) == 2
2949 assert list(cdp) == [
2950 x509.DistributionPoint(
2951 [x509.UniformResourceIdentifier(u"http://domain")],
2952 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002953 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002954 None
2955 ),
2956 x509.DistributionPoint(
2957 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002958 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002959 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002960 x509.ReasonFlags.key_compromise,
2961 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002962 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002963 None
2964 ),
2965 ]
2966
2967 def test_repr(self):
2968 cdp = x509.CRLDistributionPoints([
2969 x509.DistributionPoint(
2970 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002971 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002972 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002973 None
2974 ),
2975 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002976 if six.PY3:
2977 assert repr(cdp) == (
2978 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2979 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2980 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2981 "romise'>}), crl_issuer=None)>])>"
2982 )
2983 else:
2984 assert repr(cdp) == (
2985 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2986 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2987 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2988 "romise'>]), crl_issuer=None)>])>"
2989 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002990
2991 def test_eq(self):
2992 cdp = x509.CRLDistributionPoints([
2993 x509.DistributionPoint(
2994 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002995 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002996 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002997 x509.ReasonFlags.key_compromise,
2998 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002999 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003000 [x509.UniformResourceIdentifier(u"uri://thing")],
3001 ),
3002 ])
3003 cdp2 = x509.CRLDistributionPoints([
3004 x509.DistributionPoint(
3005 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003006 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003007 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003008 x509.ReasonFlags.key_compromise,
3009 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003010 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003011 [x509.UniformResourceIdentifier(u"uri://thing")],
3012 ),
3013 ])
3014 assert cdp == cdp2
3015
3016 def test_ne(self):
3017 cdp = x509.CRLDistributionPoints([
3018 x509.DistributionPoint(
3019 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003020 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003021 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003022 x509.ReasonFlags.key_compromise,
3023 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003024 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003025 [x509.UniformResourceIdentifier(u"uri://thing")],
3026 ),
3027 ])
3028 cdp2 = x509.CRLDistributionPoints([
3029 x509.DistributionPoint(
3030 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003031 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003032 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003033 x509.ReasonFlags.key_compromise,
3034 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003035 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003036 [x509.UniformResourceIdentifier(u"uri://thing")],
3037 ),
3038 ])
3039 cdp3 = x509.CRLDistributionPoints([
3040 x509.DistributionPoint(
3041 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003042 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003043 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003044 [x509.UniformResourceIdentifier(u"uri://thing")],
3045 ),
3046 ])
3047 cdp4 = x509.CRLDistributionPoints([
3048 x509.DistributionPoint(
3049 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003050 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003051 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003052 x509.ReasonFlags.key_compromise,
3053 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003054 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003055 [x509.UniformResourceIdentifier(u"uri://thing2")],
3056 ),
3057 ])
3058 assert cdp != cdp2
3059 assert cdp != cdp3
3060 assert cdp != cdp4
3061 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003062
Paul Kehreree2e92d2015-12-27 17:29:37 -06003063 def test_indexing(self):
3064 ci = x509.CRLDistributionPoints([
3065 x509.DistributionPoint(
3066 None, None, None,
3067 [x509.UniformResourceIdentifier(u"uri://thing")],
3068 ),
3069 x509.DistributionPoint(
3070 None, None, None,
3071 [x509.UniformResourceIdentifier(u"uri://thing2")],
3072 ),
3073 x509.DistributionPoint(
3074 None, None, None,
3075 [x509.UniformResourceIdentifier(u"uri://thing3")],
3076 ),
3077 x509.DistributionPoint(
3078 None, None, None,
3079 [x509.UniformResourceIdentifier(u"uri://thing4")],
3080 ),
3081 x509.DistributionPoint(
3082 None, None, None,
3083 [x509.UniformResourceIdentifier(u"uri://thing5")],
3084 ),
3085 ])
3086 assert ci[-1] == ci[4]
3087 assert ci[2:6:2] == [ci[2], ci[4]]
3088
Paul Kehrer9a10d592015-05-10 14:55:51 -05003089
3090@pytest.mark.requires_backend_interface(interface=RSABackend)
3091@pytest.mark.requires_backend_interface(interface=X509Backend)
3092class TestCRLDistributionPointsExtension(object):
3093 def test_fullname_and_crl_issuer(self, backend):
3094 cert = _load_cert(
3095 os.path.join(
3096 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3097 ),
3098 x509.load_der_x509_certificate,
3099 backend
3100 )
3101
3102 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003103 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003104 ).value
3105
3106 assert cdps == x509.CRLDistributionPoints([
3107 x509.DistributionPoint(
3108 full_name=[x509.DirectoryName(
3109 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003110 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003111 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003112 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003113 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003114 ),
3115 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003116 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003117 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003118 ),
3119 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003120 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003121 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003122 ),
3123 ])
3124 )],
3125 relative_name=None,
3126 reasons=None,
3127 crl_issuer=[x509.DirectoryName(
3128 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003129 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003130 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003131 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003132 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003133 ),
3134 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003135 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003136 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003137 ),
3138 ])
3139 )],
3140 )
3141 ])
3142
3143 def test_relativename_and_crl_issuer(self, backend):
3144 cert = _load_cert(
3145 os.path.join(
3146 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3147 ),
3148 x509.load_der_x509_certificate,
3149 backend
3150 )
3151
3152 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003153 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003154 ).value
3155
3156 assert cdps == x509.CRLDistributionPoints([
3157 x509.DistributionPoint(
3158 full_name=None,
3159 relative_name=x509.Name([
3160 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003161 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003162 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003163 ),
3164 ]),
3165 reasons=None,
3166 crl_issuer=[x509.DirectoryName(
3167 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003168 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003169 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003170 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003171 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003172 ),
3173 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003174 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003175 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003176 ),
3177 ])
3178 )],
3179 )
3180 ])
3181
3182 def test_fullname_crl_issuer_reasons(self, backend):
3183 cert = _load_cert(
3184 os.path.join(
3185 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3186 ),
3187 x509.load_pem_x509_certificate,
3188 backend
3189 )
3190
3191 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003192 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003193 ).value
3194
3195 assert cdps == x509.CRLDistributionPoints([
3196 x509.DistributionPoint(
3197 full_name=[x509.UniformResourceIdentifier(
3198 u"http://myhost.com/myca.crl"
3199 )],
3200 relative_name=None,
3201 reasons=frozenset([
3202 x509.ReasonFlags.key_compromise,
3203 x509.ReasonFlags.ca_compromise
3204 ]),
3205 crl_issuer=[x509.DirectoryName(
3206 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003207 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003208 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003209 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003210 ),
3211 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003212 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003213 ),
3214 ])
3215 )],
3216 )
3217 ])
3218
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003219 def test_all_reasons(self, backend):
3220 cert = _load_cert(
3221 os.path.join(
3222 "x509", "custom", "cdp_all_reasons.pem"
3223 ),
3224 x509.load_pem_x509_certificate,
3225 backend
3226 )
3227
3228 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003229 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003230 ).value
3231
3232 assert cdps == x509.CRLDistributionPoints([
3233 x509.DistributionPoint(
3234 full_name=[x509.UniformResourceIdentifier(
3235 u"http://domain.com/some.crl"
3236 )],
3237 relative_name=None,
3238 reasons=frozenset([
3239 x509.ReasonFlags.key_compromise,
3240 x509.ReasonFlags.ca_compromise,
3241 x509.ReasonFlags.affiliation_changed,
3242 x509.ReasonFlags.superseded,
3243 x509.ReasonFlags.privilege_withdrawn,
3244 x509.ReasonFlags.cessation_of_operation,
3245 x509.ReasonFlags.aa_compromise,
3246 x509.ReasonFlags.certificate_hold,
3247 ]),
3248 crl_issuer=None
3249 )
3250 ])
3251
3252 def test_single_reason(self, backend):
3253 cert = _load_cert(
3254 os.path.join(
3255 "x509", "custom", "cdp_reason_aa_compromise.pem"
3256 ),
3257 x509.load_pem_x509_certificate,
3258 backend
3259 )
3260
3261 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003262 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003263 ).value
3264
3265 assert cdps == x509.CRLDistributionPoints([
3266 x509.DistributionPoint(
3267 full_name=[x509.UniformResourceIdentifier(
3268 u"http://domain.com/some.crl"
3269 )],
3270 relative_name=None,
3271 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3272 crl_issuer=None
3273 )
3274 ])
3275
Paul Kehrer9a10d592015-05-10 14:55:51 -05003276 def test_crl_issuer_only(self, backend):
3277 cert = _load_cert(
3278 os.path.join(
3279 "x509", "custom", "cdp_crl_issuer.pem"
3280 ),
3281 x509.load_pem_x509_certificate,
3282 backend
3283 )
3284
3285 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003286 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003287 ).value
3288
3289 assert cdps == x509.CRLDistributionPoints([
3290 x509.DistributionPoint(
3291 full_name=None,
3292 relative_name=None,
3293 reasons=None,
3294 crl_issuer=[x509.DirectoryName(
3295 x509.Name([
3296 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003297 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003298 ),
3299 ])
3300 )],
3301 )
3302 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003303
Dominic Chen87bb9572015-10-09 00:23:07 -04003304 def test_crl_empty_hostname(self, backend):
3305 cert = _load_cert(
3306 os.path.join(
3307 "x509", "custom", "cdp_empty_hostname.pem"
3308 ),
3309 x509.load_pem_x509_certificate,
3310 backend
3311 )
3312
3313 cdps = cert.extensions.get_extension_for_oid(
3314 ExtensionOID.CRL_DISTRIBUTION_POINTS
3315 ).value
3316
3317 assert cdps == x509.CRLDistributionPoints([
3318 x509.DistributionPoint(
3319 full_name=[x509.UniformResourceIdentifier(
3320 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3321 )],
3322 relative_name=None,
3323 reasons=None,
3324 crl_issuer=None
3325 )
3326 ])
3327
Paul Kehrer16fae762015-05-01 23:14:20 -05003328
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003329@pytest.mark.requires_backend_interface(interface=RSABackend)
3330@pytest.mark.requires_backend_interface(interface=X509Backend)
3331class TestOCSPNoCheckExtension(object):
3332 def test_nocheck(self, backend):
3333 cert = _load_cert(
3334 os.path.join(
3335 "x509", "custom", "ocsp_nocheck.pem"
3336 ),
3337 x509.load_pem_x509_certificate,
3338 backend
3339 )
3340 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003341 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003342 )
3343 assert isinstance(ext.value, x509.OCSPNoCheck)
3344
3345
Paul Kehrer16fae762015-05-01 23:14:20 -05003346class TestInhibitAnyPolicy(object):
3347 def test_not_int(self):
3348 with pytest.raises(TypeError):
3349 x509.InhibitAnyPolicy("notint")
3350
3351 def test_negative_int(self):
3352 with pytest.raises(ValueError):
3353 x509.InhibitAnyPolicy(-1)
3354
3355 def test_repr(self):
3356 iap = x509.InhibitAnyPolicy(0)
3357 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3358
3359 def test_eq(self):
3360 iap = x509.InhibitAnyPolicy(1)
3361 iap2 = x509.InhibitAnyPolicy(1)
3362 assert iap == iap2
3363
3364 def test_ne(self):
3365 iap = x509.InhibitAnyPolicy(1)
3366 iap2 = x509.InhibitAnyPolicy(4)
3367 assert iap != iap2
3368 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003369
3370
3371@pytest.mark.requires_backend_interface(interface=RSABackend)
3372@pytest.mark.requires_backend_interface(interface=X509Backend)
3373class TestInhibitAnyPolicyExtension(object):
3374 def test_nocheck(self, backend):
3375 cert = _load_cert(
3376 os.path.join(
3377 "x509", "custom", "inhibit_any_policy_5.pem"
3378 ),
3379 x509.load_pem_x509_certificate,
3380 backend
3381 )
3382 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003383 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003384 ).value
3385 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003386
3387
3388@pytest.mark.requires_backend_interface(interface=RSABackend)
3389@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003390class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003391 def test_invalid_certificate_policies_data(self, backend):
3392 cert = _load_cert(
3393 os.path.join(
3394 "x509", "custom", "cp_invalid.pem"
3395 ),
3396 x509.load_pem_x509_certificate,
3397 backend
3398 )
3399 with pytest.raises(ValueError):
3400 cert.extensions