blob: fd579d6f2ad51b7d8129a2343f881649a0881b8f [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
Paul Kehrer0d943bb2016-01-05 19:02:32 -0600838 def test_authority_cert_serial_zero(self):
839 dns = x509.DNSName(u"SomeIssuer")
840 aki = x509.AuthorityKeyIdentifier(b"id", [dns], 0)
841 assert aki.key_identifier == b"id"
842 assert aki.authority_cert_issuer == [dns]
843 assert aki.authority_cert_serial_number == 0
844
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400845 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500846 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500847 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500848 )
849 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400850
851 if six.PY3:
852 assert repr(aki) == (
853 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500854 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500855 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500856 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400857 )
858 else:
859 assert repr(aki) == (
860 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500861 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500862 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
863 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400864 )
865
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500866 def test_eq(self):
867 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500868 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500869 )
870 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
871 dirname2 = 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 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
875 assert aki == aki2
876
877 def test_ne(self):
878 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500879 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500880 )
881 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500882 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500883 )
884 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
885 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
886 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
887 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
888 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
889 assert aki != aki2
890 assert aki != aki3
891 assert aki != aki4
892 assert aki != aki5
893 assert aki != object()
894
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400895
Paul Kehrer8cf26422015-03-21 09:50:24 -0500896class TestBasicConstraints(object):
897 def test_ca_not_boolean(self):
898 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500899 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500900
901 def test_path_length_not_ca(self):
902 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500903 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500904
905 def test_path_length_not_int(self):
906 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500907 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500908
909 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500910 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500911
912 def test_path_length_negative(self):
913 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500914 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500915
916 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500917 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500918 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500919 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500920 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500921
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600922 def test_hash(self):
923 na = x509.BasicConstraints(ca=True, path_length=None)
924 na2 = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600925 na3 = x509.BasicConstraints(ca=True, path_length=0)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600926 assert hash(na) == hash(na2)
Paul Kehrerb39af8d2015-12-27 14:30:19 -0600927 assert hash(na) != hash(na3)
Paul Kehrer2eb69f62015-12-27 11:46:11 -0600928
Paul Kehrer3a69b132015-05-13 10:03:46 -0500929 def test_eq(self):
930 na = x509.BasicConstraints(ca=True, path_length=None)
931 na2 = x509.BasicConstraints(ca=True, path_length=None)
932 assert na == na2
933
934 def test_ne(self):
935 na = x509.BasicConstraints(ca=True, path_length=None)
936 na2 = x509.BasicConstraints(ca=True, path_length=1)
937 na3 = x509.BasicConstraints(ca=False, path_length=None)
938 assert na != na2
939 assert na != na3
940 assert na != object()
941
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500942
Paul Kehrerffa2a152015-03-31 08:18:25 -0500943class TestExtendedKeyUsage(object):
944 def test_not_all_oids(self):
945 with pytest.raises(TypeError):
946 x509.ExtendedKeyUsage(["notoid"])
947
948 def test_iter_len(self):
949 eku = x509.ExtendedKeyUsage([
950 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
951 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
952 ])
953 assert len(eku) == 2
954 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500955 ExtendedKeyUsageOID.SERVER_AUTH,
956 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500957 ]
958
Paul Kehrer23d10c32015-04-02 23:12:32 -0500959 def test_repr(self):
960 eku = x509.ExtendedKeyUsage([
961 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
962 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
963 ])
964 assert repr(eku) == (
965 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
966 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
967 "tAuth)>])>"
968 )
969
Paul Kehrerb0476172015-05-02 19:34:51 -0500970 def test_eq(self):
971 eku = x509.ExtendedKeyUsage([
972 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
973 ])
974 eku2 = x509.ExtendedKeyUsage([
975 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
976 ])
977 assert eku == eku2
978
979 def test_ne(self):
980 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
981 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
982 assert eku != eku2
983 assert eku != object()
984
Paul Kehrerffa2a152015-03-31 08:18:25 -0500985
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500986@pytest.mark.requires_backend_interface(interface=RSABackend)
987@pytest.mark.requires_backend_interface(interface=X509Backend)
988class TestExtensions(object):
989 def test_no_extensions(self, backend):
990 cert = _load_cert(
991 os.path.join("x509", "verisign_md2_root.pem"),
992 x509.load_pem_x509_certificate,
993 backend
994 )
995 ext = cert.extensions
996 assert len(ext) == 0
997 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500998 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500999 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001000
Paul Kehrerd44e4132015-08-10 19:13:13 -05001001 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001002
1003 def test_one_extension(self, backend):
1004 cert = _load_cert(
1005 os.path.join(
1006 "x509", "custom", "basic_constraints_not_critical.pem"
1007 ),
1008 x509.load_pem_x509_certificate,
1009 backend
1010 )
1011 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001012 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001013 assert ext is not None
1014 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001015
1016 def test_duplicate_extension(self, backend):
1017 cert = _load_cert(
1018 os.path.join(
1019 "x509", "custom", "two_basic_constraints.pem"
1020 ),
1021 x509.load_pem_x509_certificate,
1022 backend
1023 )
1024 with pytest.raises(x509.DuplicateExtension) as exc:
1025 cert.extensions
1026
Paul Kehrerd44e4132015-08-10 19:13:13 -05001027 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001028
1029 def test_unsupported_critical_extension(self, backend):
1030 cert = _load_cert(
1031 os.path.join(
1032 "x509", "custom", "unsupported_extension_critical.pem"
1033 ),
1034 x509.load_pem_x509_certificate,
1035 backend
1036 )
1037 with pytest.raises(x509.UnsupportedExtension) as exc:
1038 cert.extensions
1039
1040 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
1041
Paul Kehrer58ddc112015-12-30 20:19:00 -06001042 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001043 def test_unsupported_extension(self, backend):
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001044 cert = _load_cert(
1045 os.path.join(
Paul Kehrer58ddc112015-12-30 20:19:00 -06001046 "x509", "custom", "unsupported_extension_2.pem"
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05001047 ),
1048 x509.load_pem_x509_certificate,
1049 backend
1050 )
1051 extensions = cert.extensions
Paul Kehrer58ddc112015-12-30 20:19:00 -06001052 assert len(extensions) == 2
1053 assert extensions[0].critical is False
1054 assert extensions[0].oid == x509.ObjectIdentifier(
1055 "1.3.6.1.4.1.41482.2"
1056 )
1057 assert extensions[0].value == x509.UnrecognizedExtension(
1058 x509.ObjectIdentifier("1.3.6.1.4.1.41482.2"),
1059 b"1.3.6.1.4.1.41482.1.2"
1060 )
1061 assert extensions[1].critical is False
1062 assert extensions[1].oid == x509.ObjectIdentifier(
1063 "1.3.6.1.4.1.45724.2.1.1"
1064 )
1065 assert extensions[1].value == x509.UnrecognizedExtension(
1066 x509.ObjectIdentifier("1.3.6.1.4.1.45724.2.1.1"),
1067 b"\x03\x02\x040"
1068 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001069
Phoebe Queenecae9812015-08-12 05:00:32 +01001070 def test_no_extensions_get_for_class(self, backend):
1071 cert = _load_cert(
1072 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001073 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +01001074 ),
1075 x509.load_pem_x509_certificate,
1076 backend
1077 )
Phoebe Queenc93752b2015-08-12 10:54:46 +01001078 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +01001079 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +01001080 exts.get_extension_for_class(x509.IssuerAlternativeName)
1081 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +01001082
Paul Kehrere69c5fe2015-12-30 21:03:26 -06001083 def test_unrecognized_extension_for_class(self):
1084 exts = x509.Extensions([])
1085 with pytest.raises(TypeError):
1086 exts.get_extension_for_class(x509.UnrecognizedExtension)
1087
Paul Kehrer5b90c972015-12-26 00:52:58 -06001088 def test_indexing(self, backend):
1089 cert = _load_cert(
1090 os.path.join("x509", "cryptography.io.pem"),
1091 x509.load_pem_x509_certificate,
1092 backend
1093 )
1094 exts = cert.extensions
1095 assert exts[-1] == exts[7]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001096 assert exts[2:6:2] == [exts[2], exts[4]]
Paul Kehrer5b90c972015-12-26 00:52:58 -06001097
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001098 def test_one_extension_get_for_class(self, backend):
1099 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001100 os.path.join(
1101 "x509", "custom", "basic_constraints_not_critical.pem"
1102 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001103 x509.load_pem_x509_certificate,
1104 backend
1105 )
1106 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
1107 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +01001108 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -05001109
Paul Kehrerafbe75b2015-10-20 08:08:43 -05001110 def test_repr(self, backend):
1111 cert = _load_cert(
1112 os.path.join(
1113 "x509", "custom", "basic_constraints_not_critical.pem"
1114 ),
1115 x509.load_pem_x509_certificate,
1116 backend
1117 )
1118 assert repr(cert.extensions) == (
1119 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
1120 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
1121 "alse, path_length=None)>)>])>"
1122 )
1123
Phoebe Queen2cc111a2015-08-12 04:14:22 +01001124
Paul Kehrerfa56a232015-03-17 13:14:03 -05001125@pytest.mark.requires_backend_interface(interface=RSABackend)
1126@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -05001127class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -05001128 def test_ca_true_pathlen_6(self, backend):
1129 cert = _load_cert(
1130 os.path.join(
1131 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1132 ),
1133 x509.load_der_x509_certificate,
1134 backend
1135 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001136 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001137 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001138 )
1139 assert ext is not None
1140 assert ext.critical is True
1141 assert ext.value.ca is True
1142 assert ext.value.path_length == 6
1143
1144 def test_path_length_zero(self, backend):
1145 cert = _load_cert(
1146 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1147 x509.load_pem_x509_certificate,
1148 backend
1149 )
1150 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001151 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001152 )
1153 assert ext is not None
1154 assert ext.critical is True
1155 assert ext.value.ca is True
1156 assert ext.value.path_length == 0
1157
1158 def test_ca_true_no_pathlen(self, backend):
1159 cert = _load_cert(
1160 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1161 x509.load_der_x509_certificate,
1162 backend
1163 )
1164 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001165 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001166 )
1167 assert ext is not None
1168 assert ext.critical is True
1169 assert ext.value.ca is True
1170 assert ext.value.path_length is None
1171
1172 def test_ca_false(self, backend):
1173 cert = _load_cert(
1174 os.path.join("x509", "cryptography.io.pem"),
1175 x509.load_pem_x509_certificate,
1176 backend
1177 )
1178 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001179 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001180 )
1181 assert ext is not None
1182 assert ext.critical is True
1183 assert ext.value.ca is False
1184 assert ext.value.path_length is None
1185
1186 def test_no_basic_constraints(self, backend):
1187 cert = _load_cert(
1188 os.path.join(
1189 "x509",
1190 "PKITS_data",
1191 "certs",
1192 "ValidCertificatePathTest1EE.crt"
1193 ),
1194 x509.load_der_x509_certificate,
1195 backend
1196 )
1197 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001198 cert.extensions.get_extension_for_oid(
1199 ExtensionOID.BASIC_CONSTRAINTS
1200 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001201
1202 def test_basic_constraint_not_critical(self, backend):
1203 cert = _load_cert(
1204 os.path.join(
1205 "x509", "custom", "basic_constraints_not_critical.pem"
1206 ),
1207 x509.load_pem_x509_certificate,
1208 backend
1209 )
1210 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001211 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001212 )
1213 assert ext is not None
1214 assert ext.critical is False
1215 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001216
1217
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001218class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001219 @pytest.mark.requires_backend_interface(interface=RSABackend)
1220 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001221 def test_subject_key_identifier(self, backend):
1222 cert = _load_cert(
1223 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1224 x509.load_der_x509_certificate,
1225 backend
1226 )
1227 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001228 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001229 )
1230 ski = ext.value
1231 assert ext is not None
1232 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001233 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001234 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001235 )
1236
Paul Kehrerf22f6122015-08-05 12:57:13 +01001237 @pytest.mark.requires_backend_interface(interface=RSABackend)
1238 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001239 def test_no_subject_key_identifier(self, backend):
1240 cert = _load_cert(
1241 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1242 x509.load_pem_x509_certificate,
1243 backend
1244 )
1245 with pytest.raises(x509.ExtensionNotFound):
1246 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001247 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001248 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001249
Paul Kehrerf22f6122015-08-05 12:57:13 +01001250 @pytest.mark.requires_backend_interface(interface=RSABackend)
1251 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001252 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001253 cert = _load_cert(
1254 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1255 x509.load_der_x509_certificate,
1256 backend
1257 )
1258 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001259 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001260 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001261 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001262 cert.public_key()
1263 )
1264 assert ext.value == ski
1265
1266 @pytest.mark.requires_backend_interface(interface=DSABackend)
1267 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001268 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001269 cert = _load_cert(
1270 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1271 x509.load_pem_x509_certificate,
1272 backend
1273 )
1274
1275 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001276 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001277 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001278 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001279 cert.public_key()
1280 )
1281 assert ext.value == ski
1282
1283 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1284 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001285 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001286 _skip_curve_unsupported(backend, ec.SECP384R1())
1287 cert = _load_cert(
1288 os.path.join("x509", "ecdsa_root.pem"),
1289 x509.load_pem_x509_certificate,
1290 backend
1291 )
1292
1293 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001294 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001295 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001296 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001297 cert.public_key()
1298 )
1299 assert ext.value == ski
1300
Paul Kehrer5508ee22015-04-02 19:31:03 -05001301
1302@pytest.mark.requires_backend_interface(interface=RSABackend)
1303@pytest.mark.requires_backend_interface(interface=X509Backend)
1304class TestKeyUsageExtension(object):
1305 def test_no_key_usage(self, backend):
1306 cert = _load_cert(
1307 os.path.join("x509", "verisign_md2_root.pem"),
1308 x509.load_pem_x509_certificate,
1309 backend
1310 )
1311 ext = cert.extensions
1312 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001313 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001314
Paul Kehrerd44e4132015-08-10 19:13:13 -05001315 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001316
1317 def test_all_purposes(self, backend):
1318 cert = _load_cert(
1319 os.path.join(
1320 "x509", "custom", "all_key_usages.pem"
1321 ),
1322 x509.load_pem_x509_certificate,
1323 backend
1324 )
1325 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001326 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001327 assert ext is not None
1328
1329 ku = ext.value
1330 assert ku.digital_signature is True
1331 assert ku.content_commitment is True
1332 assert ku.key_encipherment is True
1333 assert ku.data_encipherment is True
1334 assert ku.key_agreement is True
1335 assert ku.key_cert_sign is True
1336 assert ku.crl_sign is True
1337 assert ku.encipher_only is True
1338 assert ku.decipher_only is True
1339
1340 def test_key_cert_sign_crl_sign(self, backend):
1341 cert = _load_cert(
1342 os.path.join(
1343 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1344 ),
1345 x509.load_der_x509_certificate,
1346 backend
1347 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001348 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001349 assert ext is not None
1350 assert ext.critical is True
1351
1352 ku = ext.value
1353 assert ku.digital_signature is False
1354 assert ku.content_commitment is False
1355 assert ku.key_encipherment is False
1356 assert ku.data_encipherment is False
1357 assert ku.key_agreement is False
1358 assert ku.key_cert_sign is True
1359 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001360
1361
1362@pytest.mark.parametrize(
1363 "name", [
1364 x509.RFC822Name,
1365 x509.DNSName,
1366 x509.UniformResourceIdentifier
1367 ]
1368)
1369class TestTextGeneralNames(object):
1370 def test_not_text(self, name):
1371 with pytest.raises(TypeError):
1372 name(b"notaunicodestring")
1373
1374 with pytest.raises(TypeError):
1375 name(1.3)
1376
1377 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301378 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001379 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1380
1381 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301382 gn = name(u"string")
1383 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001384 assert gn == gn2
1385
1386 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301387 gn = name(u"string")
1388 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001389 assert gn != gn2
1390 assert gn != object()
1391
1392
1393class TestDirectoryName(object):
1394 def test_not_name(self):
1395 with pytest.raises(TypeError):
1396 x509.DirectoryName(b"notaname")
1397
1398 with pytest.raises(TypeError):
1399 x509.DirectoryName(1.3)
1400
1401 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001402 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001403 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001404 if six.PY3:
1405 assert repr(gn) == (
1406 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1407 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1408 ">])>)>"
1409 )
1410 else:
1411 assert repr(gn) == (
1412 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1413 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1414 ")>])>)>"
1415 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001416
1417 def test_eq(self):
1418 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001419 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001420 ])
1421 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001422 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001423 ])
1424 gn = x509.DirectoryName(x509.Name([name]))
1425 gn2 = x509.DirectoryName(x509.Name([name2]))
1426 assert gn == gn2
1427
1428 def test_ne(self):
1429 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001430 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001431 ])
1432 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001433 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001434 ])
1435 gn = x509.DirectoryName(x509.Name([name]))
1436 gn2 = x509.DirectoryName(x509.Name([name2]))
1437 assert gn != gn2
1438 assert gn != object()
1439
1440
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001441class TestRFC822Name(object):
1442 def test_invalid_email(self):
1443 with pytest.raises(ValueError):
1444 x509.RFC822Name(u"Name <email>")
1445
1446 with pytest.raises(ValueError):
1447 x509.RFC822Name(u"")
1448
1449 def test_single_label(self):
1450 gn = x509.RFC822Name(u"administrator")
1451 assert gn.value == u"administrator"
1452
1453 def test_idna(self):
1454 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1455 assert gn.value == u"email@em\xe5\xefl.com"
1456 assert gn._encoded == b"email@xn--eml-vla4c.com"
1457
Alex Gaynorb642dee2016-01-03 15:12:23 -05001458 def test_hash(self):
1459 g1 = x509.RFC822Name(u"email@host.com")
1460 g2 = x509.RFC822Name(u"email@host.com")
1461 g3 = x509.RFC822Name(u"admin@host.com")
1462
1463 assert hash(g1) == hash(g2)
1464 assert hash(g1) != hash(g3)
1465
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001466
Paul Kehrere28d6c42015-07-12 14:59:37 -05001467class TestUniformResourceIdentifier(object):
1468 def test_no_parsed_hostname(self):
1469 gn = x509.UniformResourceIdentifier(u"singlelabel")
1470 assert gn.value == u"singlelabel"
1471
1472 def test_with_port(self):
1473 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1474 assert gn.value == u"singlelabel:443/test"
1475
1476 def test_idna_no_port(self):
1477 gn = x509.UniformResourceIdentifier(
1478 u"http://\u043f\u044b\u043a\u0430.cryptography"
1479 )
1480 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1481 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1482
1483 def test_idna_with_port(self):
1484 gn = x509.UniformResourceIdentifier(
1485 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1486 )
1487 assert gn.value == (
1488 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1489 )
1490 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1491
1492 def test_query_and_fragment(self):
1493 gn = x509.UniformResourceIdentifier(
1494 u"ldap://cryptography:90/path?query=true#somedata"
1495 )
1496 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1497
Alex Gaynord1b56812016-01-03 15:14:34 -05001498 def test_hash(self):
1499 g1 = x509.UniformResourceIdentifier(u"http://host.com")
1500 g2 = x509.UniformResourceIdentifier(u"http://host.com")
1501 g3 = x509.UniformResourceIdentifier(u"http://other.com")
1502
1503 assert hash(g1) == hash(g2)
1504 assert hash(g1) != hash(g3)
1505
Paul Kehrere28d6c42015-07-12 14:59:37 -05001506
Paul Kehrer31bdf792015-03-25 14:11:00 -05001507class TestRegisteredID(object):
1508 def test_not_oid(self):
1509 with pytest.raises(TypeError):
1510 x509.RegisteredID(b"notanoid")
1511
1512 with pytest.raises(TypeError):
1513 x509.RegisteredID(1.3)
1514
1515 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001516 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001517 assert repr(gn) == (
1518 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1519 "e)>)>"
1520 )
1521
1522 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001523 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1524 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001525 assert gn == gn2
1526
1527 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001528 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001529 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001530 assert gn != gn2
1531 assert gn != object()
1532
1533
1534class TestIPAddress(object):
1535 def test_not_ipaddress(self):
1536 with pytest.raises(TypeError):
1537 x509.IPAddress(b"notanipaddress")
1538
1539 with pytest.raises(TypeError):
1540 x509.IPAddress(1.3)
1541
1542 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301543 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001544 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1545
Eeshan Gargf1234152015-04-29 18:41:00 +05301546 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001547 assert repr(gn2) == "<IPAddress(value=ff::)>"
1548
Paul Kehrereb177932015-05-17 18:33:33 -07001549 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1550 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1551
1552 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1553 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1554
Paul Kehrer31bdf792015-03-25 14:11:00 -05001555 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301556 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1557 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001558 assert gn == gn2
1559
1560 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301561 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1562 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001563 assert gn != gn2
1564 assert gn != object()
1565
1566
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001567class TestOtherName(object):
1568 def test_invalid_args(self):
1569 with pytest.raises(TypeError):
1570 x509.OtherName(b"notanobjectidentifier", b"derdata")
1571
1572 with pytest.raises(TypeError):
1573 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1574
1575 def test_repr(self):
1576 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1577 if six.PY3:
1578 assert repr(gn) == (
1579 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1580 "name=Unknown OID)>, value=b'derdata')>"
1581 )
1582 else:
1583 assert repr(gn) == (
1584 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1585 "name=Unknown OID)>, value='derdata')>"
1586 )
1587
1588 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1589 if six.PY3:
1590 assert repr(gn) == (
1591 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1592 "name=pseudonym)>, value=b'derdata')>"
1593 )
1594 else:
1595 assert repr(gn) == (
1596 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1597 "name=pseudonym)>, value='derdata')>"
1598 )
1599
1600 def test_eq(self):
1601 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1602 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1603 assert gn == gn2
1604
1605 def test_ne(self):
1606 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1607 assert gn != object()
1608
1609 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1610 assert gn != gn2
1611
1612 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1613 assert gn != gn2
1614
1615
Erik Trauschke2dcce902015-05-14 16:12:24 -07001616class TestGeneralNames(object):
1617 def test_get_values_for_type(self):
1618 gns = x509.GeneralNames(
1619 [x509.DNSName(u"cryptography.io")]
1620 )
1621 names = gns.get_values_for_type(x509.DNSName)
1622 assert names == [u"cryptography.io"]
1623
1624 def test_iter_names(self):
1625 gns = x509.GeneralNames([
1626 x509.DNSName(u"cryptography.io"),
1627 x509.DNSName(u"crypto.local"),
1628 ])
1629 assert len(gns) == 2
1630 assert list(gns) == [
1631 x509.DNSName(u"cryptography.io"),
1632 x509.DNSName(u"crypto.local"),
1633 ]
1634
Paul Kehrer8adb5962015-12-26 14:46:58 -06001635 def test_indexing(self):
1636 gn = x509.GeneralNames([
1637 x509.DNSName(u"cryptography.io"),
1638 x509.DNSName(u"crypto.local"),
1639 x509.DNSName(u"another.local"),
1640 x509.RFC822Name(u"email@another.local"),
1641 x509.UniformResourceIdentifier(u"http://another.local"),
1642 ])
1643 assert gn[-1] == gn[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001644 assert gn[2:6:2] == [gn[2], gn[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001645
Erik Trauschke2dcce902015-05-14 16:12:24 -07001646 def test_invalid_general_names(self):
1647 with pytest.raises(TypeError):
1648 x509.GeneralNames(
1649 [x509.DNSName(u"cryptography.io"), "invalid"]
1650 )
1651
1652 def test_repr(self):
1653 gns = x509.GeneralNames(
1654 [
1655 x509.DNSName(u"cryptography.io")
1656 ]
1657 )
1658 assert repr(gns) == (
1659 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1660 )
1661
1662 def test_eq(self):
1663 gns = x509.GeneralNames(
1664 [x509.DNSName(u"cryptography.io")]
1665 )
1666 gns2 = x509.GeneralNames(
1667 [x509.DNSName(u"cryptography.io")]
1668 )
1669 assert gns == gns2
1670
1671 def test_ne(self):
1672 gns = x509.GeneralNames(
1673 [x509.DNSName(u"cryptography.io")]
1674 )
1675 gns2 = x509.GeneralNames(
1676 [x509.RFC822Name(u"admin@cryptography.io")]
1677 )
1678 assert gns != gns2
1679 assert gns != object()
1680
1681
Paul Kehrer99125c92015-06-07 18:37:10 -05001682class TestIssuerAlternativeName(object):
1683 def test_get_values_for_type(self):
1684 san = x509.IssuerAlternativeName(
1685 [x509.DNSName(u"cryptography.io")]
1686 )
1687 names = san.get_values_for_type(x509.DNSName)
1688 assert names == [u"cryptography.io"]
1689
1690 def test_iter_names(self):
1691 san = x509.IssuerAlternativeName([
1692 x509.DNSName(u"cryptography.io"),
1693 x509.DNSName(u"crypto.local"),
1694 ])
1695 assert len(san) == 2
1696 assert list(san) == [
1697 x509.DNSName(u"cryptography.io"),
1698 x509.DNSName(u"crypto.local"),
1699 ]
1700
Paul Kehrer5c999d32015-12-26 17:45:20 -06001701 def test_indexing(self):
1702 ian = x509.IssuerAlternativeName([
1703 x509.DNSName(u"cryptography.io"),
1704 x509.DNSName(u"crypto.local"),
1705 x509.DNSName(u"another.local"),
1706 x509.RFC822Name(u"email@another.local"),
1707 x509.UniformResourceIdentifier(u"http://another.local"),
1708 ])
1709 assert ian[-1] == ian[4]
1710 assert ian[2:6:2] == [ian[2], ian[4]]
1711
Paul Kehrer99125c92015-06-07 18:37:10 -05001712 def test_invalid_general_names(self):
1713 with pytest.raises(TypeError):
1714 x509.IssuerAlternativeName(
1715 [x509.DNSName(u"cryptography.io"), "invalid"]
1716 )
1717
1718 def test_repr(self):
1719 san = x509.IssuerAlternativeName(
1720 [
1721 x509.DNSName(u"cryptography.io")
1722 ]
1723 )
1724 assert repr(san) == (
1725 "<IssuerAlternativeName("
1726 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1727 )
1728
1729 def test_eq(self):
1730 san = x509.IssuerAlternativeName(
1731 [x509.DNSName(u"cryptography.io")]
1732 )
1733 san2 = x509.IssuerAlternativeName(
1734 [x509.DNSName(u"cryptography.io")]
1735 )
1736 assert san == san2
1737
1738 def test_ne(self):
1739 san = x509.IssuerAlternativeName(
1740 [x509.DNSName(u"cryptography.io")]
1741 )
1742 san2 = x509.IssuerAlternativeName(
1743 [x509.RFC822Name(u"admin@cryptography.io")]
1744 )
1745 assert san != san2
1746 assert san != object()
1747
1748
Alex Gaynorf1c17672015-06-20 14:20:20 -04001749@pytest.mark.requires_backend_interface(interface=RSABackend)
1750@pytest.mark.requires_backend_interface(interface=X509Backend)
1751class TestRSAIssuerAlternativeNameExtension(object):
1752 def test_uri(self, backend):
1753 cert = _load_cert(
1754 os.path.join("x509", "custom", "ian_uri.pem"),
1755 x509.load_pem_x509_certificate,
1756 backend,
1757 )
1758 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001759 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001760 )
1761 assert list(ext.value) == [
1762 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1763 ]
1764
1765
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001766class TestCRLNumber(object):
1767 def test_eq(self):
1768 crl_number = x509.CRLNumber(15)
1769 assert crl_number == x509.CRLNumber(15)
1770
1771 def test_ne(self):
1772 crl_number = x509.CRLNumber(15)
1773 assert crl_number != x509.CRLNumber(14)
1774 assert crl_number != object()
1775
1776 def test_repr(self):
1777 crl_number = x509.CRLNumber(15)
1778 assert repr(crl_number) == "<CRLNumber(15)>"
1779
Paul Kehrera9718fc2015-12-22 22:55:35 -06001780 def test_invalid_number(self):
1781 with pytest.raises(TypeError):
1782 x509.CRLNumber("notanumber")
1783
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001784 def test_hash(self):
1785 c1 = x509.CRLNumber(1)
1786 c2 = x509.CRLNumber(1)
1787 c3 = x509.CRLNumber(2)
1788 assert hash(c1) == hash(c2)
1789 assert hash(c1) != hash(c3)
1790
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001791
Paul Kehrer31bdf792015-03-25 14:11:00 -05001792class TestSubjectAlternativeName(object):
1793 def test_get_values_for_type(self):
1794 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301795 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001796 )
1797 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301798 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001799
1800 def test_iter_names(self):
1801 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301802 x509.DNSName(u"cryptography.io"),
1803 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001804 ])
1805 assert len(san) == 2
1806 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301807 x509.DNSName(u"cryptography.io"),
1808 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001809 ]
1810
Paul Kehrer8adb5962015-12-26 14:46:58 -06001811 def test_indexing(self):
1812 san = x509.SubjectAlternativeName([
1813 x509.DNSName(u"cryptography.io"),
1814 x509.DNSName(u"crypto.local"),
1815 x509.DNSName(u"another.local"),
1816 x509.RFC822Name(u"email@another.local"),
1817 x509.UniformResourceIdentifier(u"http://another.local"),
1818 ])
1819 assert san[-1] == san[4]
Alex Gaynorf0dd2e72015-12-26 16:50:29 -05001820 assert san[2:6:2] == [san[2], san[4]]
Paul Kehrer8adb5962015-12-26 14:46:58 -06001821
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001822 def test_invalid_general_names(self):
1823 with pytest.raises(TypeError):
1824 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301825 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001826 )
1827
Paul Kehrer31bdf792015-03-25 14:11:00 -05001828 def test_repr(self):
1829 san = x509.SubjectAlternativeName(
1830 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301831 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001832 ]
1833 )
1834 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001835 "<SubjectAlternativeName("
1836 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001837 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001838
Paul Kehrer58cc3972015-05-13 10:00:41 -05001839 def test_eq(self):
1840 san = x509.SubjectAlternativeName(
1841 [x509.DNSName(u"cryptography.io")]
1842 )
1843 san2 = x509.SubjectAlternativeName(
1844 [x509.DNSName(u"cryptography.io")]
1845 )
1846 assert san == san2
1847
1848 def test_ne(self):
1849 san = x509.SubjectAlternativeName(
1850 [x509.DNSName(u"cryptography.io")]
1851 )
1852 san2 = x509.SubjectAlternativeName(
1853 [x509.RFC822Name(u"admin@cryptography.io")]
1854 )
1855 assert san != san2
1856 assert san != object()
1857
Paul Kehrer40f83382015-04-20 15:00:16 -05001858
1859@pytest.mark.requires_backend_interface(interface=RSABackend)
1860@pytest.mark.requires_backend_interface(interface=X509Backend)
1861class TestRSASubjectAlternativeNameExtension(object):
1862 def test_dns_name(self, backend):
1863 cert = _load_cert(
1864 os.path.join("x509", "cryptography.io.pem"),
1865 x509.load_pem_x509_certificate,
1866 backend
1867 )
1868 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001869 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001870 )
1871 assert ext is not None
1872 assert ext.critical is False
1873
1874 san = ext.value
1875
1876 dns = san.get_values_for_type(x509.DNSName)
1877 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001878
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001879 def test_wildcard_dns_name(self, backend):
1880 cert = _load_cert(
1881 os.path.join("x509", "wildcard_san.pem"),
1882 x509.load_pem_x509_certificate,
1883 backend
1884 )
1885 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001886 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001887 )
1888
1889 dns = ext.value.get_values_for_type(x509.DNSName)
1890 assert dns == [
1891 u'*.langui.sh',
1892 u'langui.sh',
1893 u'*.saseliminator.com',
1894 u'saseliminator.com'
1895 ]
1896
Dominic Chen87bb9572015-10-09 00:23:07 -04001897 def test_san_empty_hostname(self, backend):
1898 cert = _load_cert(
1899 os.path.join(
1900 "x509", "custom", "san_empty_hostname.pem"
1901 ),
1902 x509.load_pem_x509_certificate,
1903 backend
1904 )
1905 san = cert.extensions.get_extension_for_oid(
1906 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1907 )
1908
1909 dns = san.value.get_values_for_type(x509.DNSName)
1910 assert dns == [u'']
1911
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001912 def test_san_wildcard_idna_dns_name(self, backend):
1913 cert = _load_cert(
1914 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1915 x509.load_pem_x509_certificate,
1916 backend
1917 )
1918 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001919 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001920 )
1921
1922 dns = ext.value.get_values_for_type(x509.DNSName)
1923 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1924
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001925 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001926 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001927 os.path.join("x509", "san_x400address.der"),
1928 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001929 backend
1930 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001931 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001932 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001933
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001934 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001935
1936 def test_registered_id(self, backend):
1937 cert = _load_cert(
1938 os.path.join(
1939 "x509", "custom", "san_registered_id.pem"
1940 ),
1941 x509.load_pem_x509_certificate,
1942 backend
1943 )
1944 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001945 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001946 )
1947 assert ext is not None
1948 assert ext.critical is False
1949
1950 san = ext.value
1951 rid = san.get_values_for_type(x509.RegisteredID)
1952 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001953
1954 def test_uri(self, backend):
1955 cert = _load_cert(
1956 os.path.join(
1957 "x509", "custom", "san_uri_with_port.pem"
1958 ),
1959 x509.load_pem_x509_certificate,
1960 backend
1961 )
1962 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001963 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001964 )
1965 assert ext is not None
1966 uri = ext.value.get_values_for_type(
1967 x509.UniformResourceIdentifier
1968 )
1969 assert uri == [
1970 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1971 u"lo",
1972 u"http://someregulardomain.com",
1973 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001974
1975 def test_ipaddress(self, backend):
1976 cert = _load_cert(
1977 os.path.join(
1978 "x509", "custom", "san_ipaddr.pem"
1979 ),
1980 x509.load_pem_x509_certificate,
1981 backend
1982 )
1983 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001984 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001985 )
1986 assert ext is not None
1987 assert ext.critical is False
1988
1989 san = ext.value
1990
1991 ip = san.get_values_for_type(x509.IPAddress)
1992 assert [
1993 ipaddress.ip_address(u"127.0.0.1"),
1994 ipaddress.ip_address(u"ff::")
1995 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001996
1997 def test_dirname(self, backend):
1998 cert = _load_cert(
1999 os.path.join(
2000 "x509", "custom", "san_dirname.pem"
2001 ),
2002 x509.load_pem_x509_certificate,
2003 backend
2004 )
2005 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002006 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05002007 )
2008 assert ext is not None
2009 assert ext.critical is False
2010
2011 san = ext.value
2012
2013 dirname = san.get_values_for_type(x509.DirectoryName)
2014 assert [
2015 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002016 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
2017 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
2018 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05002019 ])
2020 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05002021
2022 def test_rfc822name(self, backend):
2023 cert = _load_cert(
2024 os.path.join(
2025 "x509", "custom", "san_rfc822_idna.pem"
2026 ),
2027 x509.load_pem_x509_certificate,
2028 backend
2029 )
2030 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002031 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002032 )
2033 assert ext is not None
2034 assert ext.critical is False
2035
2036 san = ext.value
2037
2038 rfc822name = san.get_values_for_type(x509.RFC822Name)
2039 assert [u"email@em\xe5\xefl.com"] == rfc822name
2040
Paul Kehrerb8968812015-05-15 09:01:34 -07002041 def test_idna2003_invalid(self, backend):
2042 cert = _load_cert(
2043 os.path.join(
2044 "x509", "custom", "san_idna2003_dnsname.pem"
2045 ),
2046 x509.load_pem_x509_certificate,
2047 backend
2048 )
2049 with pytest.raises(UnicodeError):
2050 cert.extensions
2051
Paul Kehrere06cab42015-04-30 10:23:33 -05002052 def test_unicode_rfc822_name_dns_name_uri(self, backend):
2053 cert = _load_cert(
2054 os.path.join(
2055 "x509", "custom", "san_idna_names.pem"
2056 ),
2057 x509.load_pem_x509_certificate,
2058 backend
2059 )
2060 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002061 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002062 )
2063 assert ext is not None
2064 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
2065 dns_name = ext.value.get_values_for_type(x509.DNSName)
2066 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
2067 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
2068 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
2069 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
2070
2071 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
2072 cert = _load_cert(
2073 os.path.join(
2074 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
2075 ),
2076 x509.load_pem_x509_certificate,
2077 backend
2078 )
2079 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002080 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05002081 )
2082 assert ext is not None
2083 assert ext.critical is False
2084
2085 san = ext.value
2086
2087 rfc822_name = san.get_values_for_type(x509.RFC822Name)
2088 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
2089 dns = san.get_values_for_type(x509.DNSName)
2090 ip = san.get_values_for_type(x509.IPAddress)
2091 dirname = san.get_values_for_type(x509.DirectoryName)
2092 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05002093 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05002094 assert [u"cryptography.io"] == dns
2095 assert [
2096 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002097 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05002098 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002099 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05002100 ),
2101 ])
2102 ] == dirname
2103 assert [
2104 ipaddress.ip_address(u"127.0.0.1"),
2105 ipaddress.ip_address(u"ff::")
2106 ] == ip
2107
2108 def test_invalid_rfc822name(self, backend):
2109 cert = _load_cert(
2110 os.path.join(
2111 "x509", "custom", "san_rfc822_names.pem"
2112 ),
2113 x509.load_pem_x509_certificate,
2114 backend
2115 )
2116 with pytest.raises(ValueError) as exc:
2117 cert.extensions
2118
2119 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05002120
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002121 def test_other_name(self, backend):
2122 cert = _load_cert(
2123 os.path.join(
2124 "x509", "custom", "san_other_name.pem"
2125 ),
2126 x509.load_pem_x509_certificate,
2127 backend
2128 )
2129
2130 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002131 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002132 )
2133 assert ext is not None
2134 assert ext.critical is False
2135
Joshua Taubererd2afad32015-07-06 22:37:53 +00002136 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
2137 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002138 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00002139 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002140
2141 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00002142 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00002143
Paul Kehrer94c69602015-05-02 19:29:40 -05002144
2145@pytest.mark.requires_backend_interface(interface=RSABackend)
2146@pytest.mark.requires_backend_interface(interface=X509Backend)
2147class TestExtendedKeyUsageExtension(object):
2148 def test_eku(self, backend):
2149 cert = _load_cert(
2150 os.path.join(
2151 "x509", "custom", "extended_key_usage.pem"
2152 ),
2153 x509.load_pem_x509_certificate,
2154 backend
2155 )
2156 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002157 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002158 )
2159 assert ext is not None
2160 assert ext.critical is False
2161
2162 assert [
2163 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2164 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2165 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2166 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2167 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2168 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2169 x509.ObjectIdentifier("2.5.29.37.0"),
2170 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2171 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002172
2173
2174class TestAccessDescription(object):
2175 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002176 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002177 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2178
2179 def test_invalid_access_location(self):
2180 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002181 x509.AccessDescription(
2182 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2183 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002184
Nick Bastind2ecf862015-12-13 05:44:46 -08002185 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002186 ad = x509.AccessDescription(
2187 ObjectIdentifier("2.999.1"),
2188 x509.UniformResourceIdentifier(u"http://example.com")
2189 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002190 assert ad is not None
2191
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002192 def test_repr(self):
2193 ad = 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 repr(ad) == (
2198 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2199 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2200 "(value=http://ocsp.domain.com)>)>"
2201 )
2202
2203 def test_eq(self):
2204 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002205 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002206 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2207 )
2208 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002209 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002210 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2211 )
2212 assert ad == ad2
2213
2214 def test_ne(self):
2215 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002216 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002217 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2218 )
2219 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002220 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002221 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2222 )
2223 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002224 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002225 x509.UniformResourceIdentifier(u"http://notthesame")
2226 )
2227 assert ad != ad2
2228 assert ad != ad3
2229 assert ad != object()
2230
Eeshan Gargd8e0d852016-01-31 16:46:22 -03302231 def test_hash(self):
2232 ad = x509.AccessDescription(
2233 AuthorityInformationAccessOID.OCSP,
2234 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2235 )
2236 ad2 = x509.AccessDescription(
2237 AuthorityInformationAccessOID.OCSP,
2238 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2239 )
2240 ad3 = x509.AccessDescription(
2241 AuthorityInformationAccessOID.CA_ISSUERS,
2242 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2243 )
2244 assert hash(ad) == hash(ad2)
2245 assert hash(ad) != hash(ad3)
2246
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002247
Paul Kehrer7e8fe9d2015-05-18 09:53:47 -07002248class TestPolicyConstraints(object):
2249 def test_invalid_explicit_policy(self):
2250 with pytest.raises(TypeError):
2251 x509.PolicyConstraints("invalid", None)
2252
2253 def test_invalid_inhibit_policy(self):
2254 with pytest.raises(TypeError):
2255 x509.PolicyConstraints(None, "invalid")
2256
2257 def test_both_none(self):
2258 with pytest.raises(ValueError):
2259 x509.PolicyConstraints(None, None)
2260
2261 def test_repr(self):
2262 pc = x509.PolicyConstraints(0, None)
2263
2264 assert repr(pc) == (
2265 u"<PolicyConstraints(require_explicit_policy=0, inhibit_policy_ma"
2266 u"pping=None)>"
2267 )
2268
2269 def test_eq(self):
2270 pc = x509.PolicyConstraints(2, 1)
2271 pc2 = x509.PolicyConstraints(2, 1)
2272 assert pc == pc2
2273
2274 def test_ne(self):
2275 pc = x509.PolicyConstraints(2, 1)
2276 pc2 = x509.PolicyConstraints(2, 2)
2277 pc3 = x509.PolicyConstraints(3, 1)
2278 assert pc != pc2
2279 assert pc != pc3
2280 assert pc != object()
2281
2282
Alex Gaynora9885602016-02-27 09:53:46 -05002283@pytest.mark.requires_backend_interface(interface=RSABackend)
2284@pytest.mark.requires_backend_interface(interface=X509Backend)
2285class TestPolicyConstraintsExtension(object):
Alex Gaynor3f040c42016-02-27 10:01:00 -05002286 def test_inhibit_policy_mapping(self, backend):
Alex Gaynora9885602016-02-27 09:53:46 -05002287 cert = _load_cert(
2288 os.path.join(
2289 "x509", "department-of-state-root.pem"
2290 ),
2291 x509.load_pem_x509_certificate,
2292 backend
2293 )
2294 ext = cert.extensions.get_extension_for_oid(
2295 ExtensionOID.POLICY_CONSTRAINTS,
2296 )
2297 assert ext.critical is True
2298
2299 assert ext.value == x509.PolicyConstraints(
2300 require_explicit_policy=None, inhibit_policy_mapping=0,
2301 )
2302
2303
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002304class TestAuthorityInformationAccess(object):
2305 def test_invalid_descriptions(self):
2306 with pytest.raises(TypeError):
2307 x509.AuthorityInformationAccess(["notanAccessDescription"])
2308
2309 def test_iter_len(self):
2310 aia = x509.AuthorityInformationAccess([
2311 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002312 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002313 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2314 ),
2315 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002316 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002317 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2318 )
2319 ])
2320 assert len(aia) == 2
2321 assert list(aia) == [
2322 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002323 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002324 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2325 ),
2326 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002327 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002328 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2329 )
2330 ]
2331
2332 def test_repr(self):
2333 aia = x509.AuthorityInformationAccess([
2334 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002335 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002336 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2337 ),
2338 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002339 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002340 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2341 )
2342 ])
2343 assert repr(aia) == (
2344 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2345 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2346 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2347 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2348 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2349 "fier(value=http://domain.com/ca.crt)>)>])>"
2350 )
2351
2352 def test_eq(self):
2353 aia = x509.AuthorityInformationAccess([
2354 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002355 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002356 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2357 ),
2358 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002359 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002360 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2361 )
2362 ])
2363 aia2 = x509.AuthorityInformationAccess([
2364 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002365 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002366 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2367 ),
2368 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002369 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002370 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2371 )
2372 ])
2373 assert aia == aia2
2374
2375 def test_ne(self):
2376 aia = x509.AuthorityInformationAccess([
2377 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002378 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002379 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2380 ),
2381 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002382 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002383 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2384 )
2385 ])
2386 aia2 = x509.AuthorityInformationAccess([
2387 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002388 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002389 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2390 ),
2391 ])
2392
2393 assert aia != aia2
2394 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002395
Paul Kehrerad4b3592015-12-27 17:27:40 -06002396 def test_indexing(self):
2397 aia = x509.AuthorityInformationAccess([
2398 x509.AccessDescription(
2399 AuthorityInformationAccessOID.OCSP,
2400 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2401 ),
2402 x509.AccessDescription(
2403 AuthorityInformationAccessOID.CA_ISSUERS,
2404 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2405 ),
2406 x509.AccessDescription(
2407 AuthorityInformationAccessOID.OCSP,
2408 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2409 ),
2410 x509.AccessDescription(
2411 AuthorityInformationAccessOID.OCSP,
2412 x509.UniformResourceIdentifier(u"http://ocsp3.domain.com")
2413 ),
2414 x509.AccessDescription(
2415 AuthorityInformationAccessOID.OCSP,
2416 x509.UniformResourceIdentifier(u"http://ocsp4.domain.com")
2417 ),
2418 ])
2419 assert aia[-1] == aia[4]
2420 assert aia[2:6:2] == [aia[2], aia[4]]
2421
Paul Kehrerd774de92015-05-03 10:52:25 -05002422
2423@pytest.mark.requires_backend_interface(interface=RSABackend)
2424@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002425class TestAuthorityInformationAccessExtension(object):
2426 def test_aia_ocsp_ca_issuers(self, backend):
2427 cert = _load_cert(
2428 os.path.join("x509", "cryptography.io.pem"),
2429 x509.load_pem_x509_certificate,
2430 backend
2431 )
2432 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002433 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002434 )
2435 assert ext is not None
2436 assert ext.critical is False
2437
2438 assert ext.value == x509.AuthorityInformationAccess([
2439 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002440 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002441 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2442 ),
2443 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002444 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002445 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2446 ),
2447 ])
2448
2449 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2450 cert = _load_cert(
2451 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2452 x509.load_pem_x509_certificate,
2453 backend
2454 )
2455 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002456 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002457 )
2458 assert ext is not None
2459 assert ext.critical is False
2460
2461 assert ext.value == x509.AuthorityInformationAccess([
2462 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002463 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002464 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2465 ),
2466 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002467 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002468 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2469 ),
2470 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002471 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002472 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002473 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2474 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002475 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002476 ]))
2477 ),
2478 ])
2479
2480 def test_aia_ocsp_only(self, backend):
2481 cert = _load_cert(
2482 os.path.join("x509", "custom", "aia_ocsp.pem"),
2483 x509.load_pem_x509_certificate,
2484 backend
2485 )
2486 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002487 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002488 )
2489 assert ext is not None
2490 assert ext.critical is False
2491
2492 assert ext.value == x509.AuthorityInformationAccess([
2493 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002494 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002495 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2496 ),
2497 ])
2498
2499 def test_aia_ca_issuers_only(self, backend):
2500 cert = _load_cert(
2501 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2502 x509.load_pem_x509_certificate,
2503 backend
2504 )
2505 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002506 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002507 )
2508 assert ext is not None
2509 assert ext.critical is False
2510
2511 assert ext.value == x509.AuthorityInformationAccess([
2512 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002513 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002514 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002515 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2516 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002517 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002518 ]))
2519 ),
2520 ])
2521
2522
2523@pytest.mark.requires_backend_interface(interface=RSABackend)
2524@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002525class TestAuthorityKeyIdentifierExtension(object):
2526 def test_aki_keyid(self, backend):
2527 cert = _load_cert(
2528 os.path.join(
2529 "x509", "cryptography.io.pem"
2530 ),
2531 x509.load_pem_x509_certificate,
2532 backend
2533 )
2534 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002535 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002536 )
2537 assert ext is not None
2538 assert ext.critical is False
2539
2540 assert ext.value.key_identifier == (
2541 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2542 )
2543 assert ext.value.authority_cert_issuer is None
2544 assert ext.value.authority_cert_serial_number is None
2545
2546 def test_aki_all_fields(self, backend):
2547 cert = _load_cert(
2548 os.path.join(
2549 "x509", "custom", "authority_key_identifier.pem"
2550 ),
2551 x509.load_pem_x509_certificate,
2552 backend
2553 )
2554 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002555 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002556 )
2557 assert ext is not None
2558 assert ext.critical is False
2559
2560 assert ext.value.key_identifier == (
2561 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2562 )
2563 assert ext.value.authority_cert_issuer == [
2564 x509.DirectoryName(
2565 x509.Name([
2566 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002567 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002568 ),
2569 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002570 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002571 )
2572 ])
2573 )
2574 ]
2575 assert ext.value.authority_cert_serial_number == 3
2576
2577 def test_aki_no_keyid(self, backend):
2578 cert = _load_cert(
2579 os.path.join(
2580 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2581 ),
2582 x509.load_pem_x509_certificate,
2583 backend
2584 )
2585 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002586 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002587 )
2588 assert ext is not None
2589 assert ext.critical is False
2590
2591 assert ext.value.key_identifier is None
2592 assert ext.value.authority_cert_issuer == [
2593 x509.DirectoryName(
2594 x509.Name([
2595 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002596 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002597 ),
2598 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002599 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002600 )
2601 ])
2602 )
2603 ]
2604 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002605
Paul Kehrer253929a2015-08-05 17:30:39 +01002606 def test_from_certificate(self, backend):
2607 issuer_cert = _load_cert(
2608 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2609 x509.load_pem_x509_certificate,
2610 backend
2611 )
2612 cert = _load_cert(
2613 os.path.join("x509", "cryptography.io.pem"),
2614 x509.load_pem_x509_certificate,
2615 backend
2616 )
2617 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002618 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002619 )
2620 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2621 issuer_cert.public_key()
2622 )
2623 assert ext.value == aki
2624
Paul Kehrer5a485522015-05-06 00:29:12 -05002625
Paul Kehrere0017be2015-05-17 20:39:40 -06002626class TestNameConstraints(object):
2627 def test_ipaddress_wrong_type(self):
2628 with pytest.raises(TypeError):
2629 x509.NameConstraints(
2630 permitted_subtrees=[
2631 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2632 ],
2633 excluded_subtrees=None
2634 )
2635
2636 with pytest.raises(TypeError):
2637 x509.NameConstraints(
2638 permitted_subtrees=None,
2639 excluded_subtrees=[
2640 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2641 ]
2642 )
2643
2644 def test_ipaddress_allowed_type(self):
2645 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2646 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2647 nc = x509.NameConstraints(
2648 permitted_subtrees=permitted,
2649 excluded_subtrees=excluded
2650 )
2651 assert nc.permitted_subtrees == permitted
2652 assert nc.excluded_subtrees == excluded
2653
2654 def test_invalid_permitted_subtrees(self):
2655 with pytest.raises(TypeError):
2656 x509.NameConstraints("badpermitted", None)
2657
2658 def test_invalid_excluded_subtrees(self):
2659 with pytest.raises(TypeError):
2660 x509.NameConstraints(None, "badexcluded")
2661
2662 def test_no_subtrees(self):
2663 with pytest.raises(ValueError):
2664 x509.NameConstraints(None, None)
2665
2666 def test_permitted_none(self):
2667 excluded = [x509.DNSName(u"name.local")]
2668 nc = x509.NameConstraints(
2669 permitted_subtrees=None, excluded_subtrees=excluded
2670 )
2671 assert nc.permitted_subtrees is None
2672 assert nc.excluded_subtrees is not None
2673
2674 def test_excluded_none(self):
2675 permitted = [x509.DNSName(u"name.local")]
2676 nc = x509.NameConstraints(
2677 permitted_subtrees=permitted, excluded_subtrees=None
2678 )
2679 assert nc.permitted_subtrees is not None
2680 assert nc.excluded_subtrees is None
2681
2682 def test_repr(self):
2683 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2684 nc = x509.NameConstraints(
2685 permitted_subtrees=permitted,
2686 excluded_subtrees=None
2687 )
2688 assert repr(nc) == (
2689 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2690 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2691 )
2692
Paul Kehrer31894282015-06-21 21:46:41 -05002693 def test_eq(self):
2694 nc = x509.NameConstraints(
2695 permitted_subtrees=[x509.DNSName(u"name.local")],
2696 excluded_subtrees=[x509.DNSName(u"name2.local")]
2697 )
2698 nc2 = x509.NameConstraints(
2699 permitted_subtrees=[x509.DNSName(u"name.local")],
2700 excluded_subtrees=[x509.DNSName(u"name2.local")]
2701 )
2702 assert nc == nc2
2703
2704 def test_ne(self):
2705 nc = x509.NameConstraints(
2706 permitted_subtrees=[x509.DNSName(u"name.local")],
2707 excluded_subtrees=[x509.DNSName(u"name2.local")]
2708 )
2709 nc2 = x509.NameConstraints(
2710 permitted_subtrees=[x509.DNSName(u"name.local")],
2711 excluded_subtrees=None
2712 )
2713 nc3 = x509.NameConstraints(
2714 permitted_subtrees=None,
2715 excluded_subtrees=[x509.DNSName(u"name2.local")]
2716 )
2717
2718 assert nc != nc2
2719 assert nc != nc3
2720 assert nc != object()
2721
Paul Kehrere0017be2015-05-17 20:39:40 -06002722
Paul Kehrer870d7e82015-06-21 22:20:44 -05002723@pytest.mark.requires_backend_interface(interface=RSABackend)
2724@pytest.mark.requires_backend_interface(interface=X509Backend)
2725class TestNameConstraintsExtension(object):
2726 def test_permitted_excluded(self, backend):
2727 cert = _load_cert(
2728 os.path.join(
2729 "x509", "custom", "nc_permitted_excluded_2.pem"
2730 ),
2731 x509.load_pem_x509_certificate,
2732 backend
2733 )
2734 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002735 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002736 ).value
2737 assert nc == x509.NameConstraints(
2738 permitted_subtrees=[
2739 x509.DNSName(u"zombo.local"),
2740 ],
2741 excluded_subtrees=[
2742 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002743 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002744 ]))
2745 ]
2746 )
2747
2748 def test_permitted(self, backend):
2749 cert = _load_cert(
2750 os.path.join(
2751 "x509", "custom", "nc_permitted_2.pem"
2752 ),
2753 x509.load_pem_x509_certificate,
2754 backend
2755 )
2756 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002757 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002758 ).value
2759 assert nc == x509.NameConstraints(
2760 permitted_subtrees=[
2761 x509.DNSName(u"zombo.local"),
2762 ],
2763 excluded_subtrees=None
2764 )
2765
Paul Kehrer42376832015-07-01 18:10:32 -05002766 def test_permitted_with_leading_period(self, backend):
2767 cert = _load_cert(
2768 os.path.join(
2769 "x509", "custom", "nc_permitted.pem"
2770 ),
2771 x509.load_pem_x509_certificate,
2772 backend
2773 )
2774 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002775 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002776 ).value
2777 assert nc == x509.NameConstraints(
2778 permitted_subtrees=[
2779 x509.DNSName(u".cryptography.io"),
2780 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2781 ],
2782 excluded_subtrees=None
2783 )
2784
2785 def test_excluded_with_leading_period(self, backend):
2786 cert = _load_cert(
2787 os.path.join(
2788 "x509", "custom", "nc_excluded.pem"
2789 ),
2790 x509.load_pem_x509_certificate,
2791 backend
2792 )
2793 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002794 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002795 ).value
2796 assert nc == x509.NameConstraints(
2797 permitted_subtrees=None,
2798 excluded_subtrees=[
2799 x509.DNSName(u".cryptography.io"),
2800 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2801 ]
2802 )
2803
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002804 def test_permitted_excluded_with_ips(self, backend):
2805 cert = _load_cert(
2806 os.path.join(
2807 "x509", "custom", "nc_permitted_excluded.pem"
2808 ),
2809 x509.load_pem_x509_certificate,
2810 backend
2811 )
2812 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002813 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002814 ).value
2815 assert nc == x509.NameConstraints(
2816 permitted_subtrees=[
2817 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2818 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2819 ],
2820 excluded_subtrees=[
2821 x509.DNSName(u".domain.com"),
2822 x509.UniformResourceIdentifier(u"http://test.local"),
2823 ]
2824 )
2825
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002826 def test_single_ip_netmask(self, backend):
2827 cert = _load_cert(
2828 os.path.join(
2829 "x509", "custom", "nc_single_ip_netmask.pem"
2830 ),
2831 x509.load_pem_x509_certificate,
2832 backend
2833 )
2834 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002835 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002836 ).value
2837 assert nc == x509.NameConstraints(
2838 permitted_subtrees=[
2839 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2840 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2841 ],
2842 excluded_subtrees=None
2843 )
2844
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002845 def test_invalid_netmask(self, backend):
2846 cert = _load_cert(
2847 os.path.join(
2848 "x509", "custom", "nc_invalid_ip_netmask.pem"
2849 ),
2850 x509.load_pem_x509_certificate,
2851 backend
2852 )
2853 with pytest.raises(ValueError):
2854 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002855 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002856 )
2857
Paul Kehrer870d7e82015-06-21 22:20:44 -05002858
Paul Kehrer5a485522015-05-06 00:29:12 -05002859class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002860 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002861 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002862 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002863
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002864 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002865 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002866 x509.DistributionPoint(None, "notname", None, None)
2867
2868 def test_distribution_point_full_and_relative_not_none(self):
2869 with pytest.raises(ValueError):
2870 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002871
2872 def test_crl_issuer_not_general_names(self):
2873 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002874 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002875
2876 def test_reason_not_reasonflags(self):
2877 with pytest.raises(TypeError):
2878 x509.DistributionPoint(
2879 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002880 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002881 frozenset(["notreasonflags"]),
2882 None
2883 )
2884
2885 def test_reason_not_frozenset(self):
2886 with pytest.raises(TypeError):
2887 x509.DistributionPoint(
2888 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2889 None,
2890 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002891 None
2892 )
2893
2894 def test_disallowed_reasons(self):
2895 with pytest.raises(ValueError):
2896 x509.DistributionPoint(
2897 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2898 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002899 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002900 None
2901 )
2902
2903 with pytest.raises(ValueError):
2904 x509.DistributionPoint(
2905 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2906 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002907 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002908 None
2909 )
2910
2911 def test_reason_only(self):
2912 with pytest.raises(ValueError):
2913 x509.DistributionPoint(
2914 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002915 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002916 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002917 None
2918 )
2919
2920 def test_eq(self):
2921 dp = x509.DistributionPoint(
2922 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002923 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002924 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002925 [
2926 x509.DirectoryName(
2927 x509.Name([
2928 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002929 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002930 )
2931 ])
2932 )
2933 ],
2934 )
2935 dp2 = x509.DistributionPoint(
2936 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002937 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002938 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002939 [
2940 x509.DirectoryName(
2941 x509.Name([
2942 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002943 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002944 )
2945 ])
2946 )
2947 ],
2948 )
2949 assert dp == dp2
2950
2951 def test_ne(self):
2952 dp = x509.DistributionPoint(
2953 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002954 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002955 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002956 [
2957 x509.DirectoryName(
2958 x509.Name([
2959 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002960 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002961 )
2962 ])
2963 )
2964 ],
2965 )
2966 dp2 = x509.DistributionPoint(
2967 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2968 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002969 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002970 None
2971 )
2972 assert dp != dp2
2973 assert dp != object()
2974
2975 def test_repr(self):
2976 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002977 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002978 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002979 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002980 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002981 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002982 [
2983 x509.DirectoryName(
2984 x509.Name([
2985 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002986 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002987 )
2988 ])
2989 )
2990 ],
2991 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002992 if six.PY3:
2993 assert repr(dp) == (
2994 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2995 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002996 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2997 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2998 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2999 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003000 )
3001 else:
3002 assert repr(dp) == (
3003 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
3004 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05003005 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
3006 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
3007 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
3008 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05003009 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003010
3011
3012class TestCRLDistributionPoints(object):
3013 def test_invalid_distribution_points(self):
3014 with pytest.raises(TypeError):
3015 x509.CRLDistributionPoints(["notadistributionpoint"])
3016
3017 def test_iter_len(self):
3018 cdp = x509.CRLDistributionPoints([
3019 x509.DistributionPoint(
3020 [x509.UniformResourceIdentifier(u"http://domain")],
3021 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003022 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003023 None
3024 ),
3025 x509.DistributionPoint(
3026 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003027 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003028 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003029 x509.ReasonFlags.key_compromise,
3030 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003031 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003032 None
3033 ),
3034 ])
3035 assert len(cdp) == 2
3036 assert list(cdp) == [
3037 x509.DistributionPoint(
3038 [x509.UniformResourceIdentifier(u"http://domain")],
3039 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003040 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05003041 None
3042 ),
3043 x509.DistributionPoint(
3044 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003045 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003046 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003047 x509.ReasonFlags.key_compromise,
3048 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003049 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003050 None
3051 ),
3052 ]
3053
3054 def test_repr(self):
3055 cdp = x509.CRLDistributionPoints([
3056 x509.DistributionPoint(
3057 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003058 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05003059 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003060 None
3061 ),
3062 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05003063 if six.PY3:
3064 assert repr(cdp) == (
3065 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3066 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3067 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
3068 "romise'>}), crl_issuer=None)>])>"
3069 )
3070 else:
3071 assert repr(cdp) == (
3072 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
3073 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
3074 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
3075 "romise'>]), crl_issuer=None)>])>"
3076 )
Paul Kehrer5a485522015-05-06 00:29:12 -05003077
3078 def test_eq(self):
3079 cdp = x509.CRLDistributionPoints([
3080 x509.DistributionPoint(
3081 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003082 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003083 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003084 x509.ReasonFlags.key_compromise,
3085 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003086 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003087 [x509.UniformResourceIdentifier(u"uri://thing")],
3088 ),
3089 ])
3090 cdp2 = x509.CRLDistributionPoints([
3091 x509.DistributionPoint(
3092 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003093 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003094 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003095 x509.ReasonFlags.key_compromise,
3096 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003097 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003098 [x509.UniformResourceIdentifier(u"uri://thing")],
3099 ),
3100 ])
3101 assert cdp == cdp2
3102
3103 def test_ne(self):
3104 cdp = x509.CRLDistributionPoints([
3105 x509.DistributionPoint(
3106 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003107 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003108 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003109 x509.ReasonFlags.key_compromise,
3110 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003111 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003112 [x509.UniformResourceIdentifier(u"uri://thing")],
3113 ),
3114 ])
3115 cdp2 = x509.CRLDistributionPoints([
3116 x509.DistributionPoint(
3117 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003118 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003119 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003120 x509.ReasonFlags.key_compromise,
3121 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003122 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003123 [x509.UniformResourceIdentifier(u"uri://thing")],
3124 ),
3125 ])
3126 cdp3 = x509.CRLDistributionPoints([
3127 x509.DistributionPoint(
3128 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003129 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003130 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003131 [x509.UniformResourceIdentifier(u"uri://thing")],
3132 ),
3133 ])
3134 cdp4 = x509.CRLDistributionPoints([
3135 x509.DistributionPoint(
3136 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003137 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003138 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05003139 x509.ReasonFlags.key_compromise,
3140 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05003141 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05003142 [x509.UniformResourceIdentifier(u"uri://thing2")],
3143 ),
3144 ])
3145 assert cdp != cdp2
3146 assert cdp != cdp3
3147 assert cdp != cdp4
3148 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05003149
Paul Kehreree2e92d2015-12-27 17:29:37 -06003150 def test_indexing(self):
3151 ci = x509.CRLDistributionPoints([
3152 x509.DistributionPoint(
3153 None, None, None,
3154 [x509.UniformResourceIdentifier(u"uri://thing")],
3155 ),
3156 x509.DistributionPoint(
3157 None, None, None,
3158 [x509.UniformResourceIdentifier(u"uri://thing2")],
3159 ),
3160 x509.DistributionPoint(
3161 None, None, None,
3162 [x509.UniformResourceIdentifier(u"uri://thing3")],
3163 ),
3164 x509.DistributionPoint(
3165 None, None, None,
3166 [x509.UniformResourceIdentifier(u"uri://thing4")],
3167 ),
3168 x509.DistributionPoint(
3169 None, None, None,
3170 [x509.UniformResourceIdentifier(u"uri://thing5")],
3171 ),
3172 ])
3173 assert ci[-1] == ci[4]
3174 assert ci[2:6:2] == [ci[2], ci[4]]
3175
Paul Kehrer9a10d592015-05-10 14:55:51 -05003176
3177@pytest.mark.requires_backend_interface(interface=RSABackend)
3178@pytest.mark.requires_backend_interface(interface=X509Backend)
3179class TestCRLDistributionPointsExtension(object):
3180 def test_fullname_and_crl_issuer(self, backend):
3181 cert = _load_cert(
3182 os.path.join(
3183 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
3184 ),
3185 x509.load_der_x509_certificate,
3186 backend
3187 )
3188
3189 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003190 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003191 ).value
3192
3193 assert cdps == x509.CRLDistributionPoints([
3194 x509.DistributionPoint(
3195 full_name=[x509.DirectoryName(
3196 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003197 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003198 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003199 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003200 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003201 ),
3202 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003203 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003204 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003205 ),
3206 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003207 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003208 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003209 ),
3210 ])
3211 )],
3212 relative_name=None,
3213 reasons=None,
3214 crl_issuer=[x509.DirectoryName(
3215 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003216 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003217 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003218 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003219 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003220 ),
3221 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003222 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003223 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003224 ),
3225 ])
3226 )],
3227 )
3228 ])
3229
3230 def test_relativename_and_crl_issuer(self, backend):
3231 cert = _load_cert(
3232 os.path.join(
3233 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
3234 ),
3235 x509.load_der_x509_certificate,
3236 backend
3237 )
3238
3239 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003240 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003241 ).value
3242
3243 assert cdps == x509.CRLDistributionPoints([
3244 x509.DistributionPoint(
3245 full_name=None,
3246 relative_name=x509.Name([
3247 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003248 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003249 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003250 ),
3251 ]),
3252 reasons=None,
3253 crl_issuer=[x509.DirectoryName(
3254 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003255 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003256 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003257 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003258 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003259 ),
3260 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003261 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05003262 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003263 ),
3264 ])
3265 )],
3266 )
3267 ])
3268
3269 def test_fullname_crl_issuer_reasons(self, backend):
3270 cert = _load_cert(
3271 os.path.join(
3272 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
3273 ),
3274 x509.load_pem_x509_certificate,
3275 backend
3276 )
3277
3278 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003279 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003280 ).value
3281
3282 assert cdps == x509.CRLDistributionPoints([
3283 x509.DistributionPoint(
3284 full_name=[x509.UniformResourceIdentifier(
3285 u"http://myhost.com/myca.crl"
3286 )],
3287 relative_name=None,
3288 reasons=frozenset([
3289 x509.ReasonFlags.key_compromise,
3290 x509.ReasonFlags.ca_compromise
3291 ]),
3292 crl_issuer=[x509.DirectoryName(
3293 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003294 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003295 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003296 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003297 ),
3298 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003299 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003300 ),
3301 ])
3302 )],
3303 )
3304 ])
3305
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003306 def test_all_reasons(self, backend):
3307 cert = _load_cert(
3308 os.path.join(
3309 "x509", "custom", "cdp_all_reasons.pem"
3310 ),
3311 x509.load_pem_x509_certificate,
3312 backend
3313 )
3314
3315 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003316 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003317 ).value
3318
3319 assert cdps == x509.CRLDistributionPoints([
3320 x509.DistributionPoint(
3321 full_name=[x509.UniformResourceIdentifier(
3322 u"http://domain.com/some.crl"
3323 )],
3324 relative_name=None,
3325 reasons=frozenset([
3326 x509.ReasonFlags.key_compromise,
3327 x509.ReasonFlags.ca_compromise,
3328 x509.ReasonFlags.affiliation_changed,
3329 x509.ReasonFlags.superseded,
3330 x509.ReasonFlags.privilege_withdrawn,
3331 x509.ReasonFlags.cessation_of_operation,
3332 x509.ReasonFlags.aa_compromise,
3333 x509.ReasonFlags.certificate_hold,
3334 ]),
3335 crl_issuer=None
3336 )
3337 ])
3338
3339 def test_single_reason(self, backend):
3340 cert = _load_cert(
3341 os.path.join(
3342 "x509", "custom", "cdp_reason_aa_compromise.pem"
3343 ),
3344 x509.load_pem_x509_certificate,
3345 backend
3346 )
3347
3348 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003349 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003350 ).value
3351
3352 assert cdps == x509.CRLDistributionPoints([
3353 x509.DistributionPoint(
3354 full_name=[x509.UniformResourceIdentifier(
3355 u"http://domain.com/some.crl"
3356 )],
3357 relative_name=None,
3358 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3359 crl_issuer=None
3360 )
3361 ])
3362
Paul Kehrer9a10d592015-05-10 14:55:51 -05003363 def test_crl_issuer_only(self, backend):
3364 cert = _load_cert(
3365 os.path.join(
3366 "x509", "custom", "cdp_crl_issuer.pem"
3367 ),
3368 x509.load_pem_x509_certificate,
3369 backend
3370 )
3371
3372 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003373 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003374 ).value
3375
3376 assert cdps == x509.CRLDistributionPoints([
3377 x509.DistributionPoint(
3378 full_name=None,
3379 relative_name=None,
3380 reasons=None,
3381 crl_issuer=[x509.DirectoryName(
3382 x509.Name([
3383 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003384 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003385 ),
3386 ])
3387 )],
3388 )
3389 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003390
Dominic Chen87bb9572015-10-09 00:23:07 -04003391 def test_crl_empty_hostname(self, backend):
3392 cert = _load_cert(
3393 os.path.join(
3394 "x509", "custom", "cdp_empty_hostname.pem"
3395 ),
3396 x509.load_pem_x509_certificate,
3397 backend
3398 )
3399
3400 cdps = cert.extensions.get_extension_for_oid(
3401 ExtensionOID.CRL_DISTRIBUTION_POINTS
3402 ).value
3403
3404 assert cdps == x509.CRLDistributionPoints([
3405 x509.DistributionPoint(
3406 full_name=[x509.UniformResourceIdentifier(
3407 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3408 )],
3409 relative_name=None,
3410 reasons=None,
3411 crl_issuer=None
3412 )
3413 ])
3414
Paul Kehrer16fae762015-05-01 23:14:20 -05003415
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003416@pytest.mark.requires_backend_interface(interface=RSABackend)
3417@pytest.mark.requires_backend_interface(interface=X509Backend)
3418class TestOCSPNoCheckExtension(object):
3419 def test_nocheck(self, backend):
3420 cert = _load_cert(
3421 os.path.join(
3422 "x509", "custom", "ocsp_nocheck.pem"
3423 ),
3424 x509.load_pem_x509_certificate,
3425 backend
3426 )
3427 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003428 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003429 )
3430 assert isinstance(ext.value, x509.OCSPNoCheck)
3431
3432
Paul Kehrer16fae762015-05-01 23:14:20 -05003433class TestInhibitAnyPolicy(object):
3434 def test_not_int(self):
3435 with pytest.raises(TypeError):
3436 x509.InhibitAnyPolicy("notint")
3437
3438 def test_negative_int(self):
3439 with pytest.raises(ValueError):
3440 x509.InhibitAnyPolicy(-1)
3441
3442 def test_repr(self):
3443 iap = x509.InhibitAnyPolicy(0)
3444 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3445
3446 def test_eq(self):
3447 iap = x509.InhibitAnyPolicy(1)
3448 iap2 = x509.InhibitAnyPolicy(1)
3449 assert iap == iap2
3450
3451 def test_ne(self):
3452 iap = x509.InhibitAnyPolicy(1)
3453 iap2 = x509.InhibitAnyPolicy(4)
3454 assert iap != iap2
3455 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003456
Eeshan Garg0a0293e2016-02-01 12:56:40 -03303457 def test_hash(self):
3458 iap = x509.InhibitAnyPolicy(1)
3459 iap2 = x509.InhibitAnyPolicy(1)
3460 iap3 = x509.InhibitAnyPolicy(4)
3461 assert hash(iap) == hash(iap2)
3462 assert hash(iap) != hash(iap3)
3463
Paul Kehrerca6ce992015-06-17 22:13:15 -06003464
3465@pytest.mark.requires_backend_interface(interface=RSABackend)
3466@pytest.mark.requires_backend_interface(interface=X509Backend)
3467class TestInhibitAnyPolicyExtension(object):
3468 def test_nocheck(self, backend):
3469 cert = _load_cert(
3470 os.path.join(
3471 "x509", "custom", "inhibit_any_policy_5.pem"
3472 ),
3473 x509.load_pem_x509_certificate,
3474 backend
3475 )
3476 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003477 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003478 ).value
3479 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003480
3481
3482@pytest.mark.requires_backend_interface(interface=RSABackend)
3483@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003484class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003485 def test_invalid_certificate_policies_data(self, backend):
3486 cert = _load_cert(
3487 os.path.join(
3488 "x509", "custom", "cp_invalid.pem"
3489 ),
3490 x509.load_pem_x509_certificate,
3491 backend
3492 )
3493 with pytest.raises(ValueError):
3494 cert.extensions