blob: e7252623b8a4f5c58d7c5d350728cdb69edd27df [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 Kehrer49bb7562015-12-25 16:17:40 -060078class TestCertificateIssuer(object):
79 def test_iter_names(self):
80 ci = x509.CertificateIssuer([
81 x509.DNSName(u"cryptography.io"),
82 x509.DNSName(u"crypto.local"),
83 ])
84 assert len(ci) == 2
85 assert list(ci) == [
86 x509.DNSName(u"cryptography.io"),
87 x509.DNSName(u"crypto.local"),
88 ]
89
90 def test_eq(self):
91 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
92 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
93 assert ci1 == ci2
94
95 def test_ne(self):
96 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
97 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
98 assert ci1 != ci2
99 assert ci1 != object()
100
101 def test_repr(self):
102 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
103 assert repr(ci) == (
104 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
105 ")>])>)>"
106 )
107
108 def test_get_values_for_type(self):
109 ci = x509.CertificateIssuer(
110 [x509.DNSName(u"cryptography.io")]
111 )
112 names = ci.get_values_for_type(x509.DNSName)
113 assert names == [u"cryptography.io"]
114
115
Paul Kehrer7058ece2015-12-25 22:28:29 -0600116class TestCRLReason(object):
117 def test_invalid_reason_flags(self):
118 with pytest.raises(TypeError):
119 x509.CRLReason("notareason")
120
121 def test_eq(self):
122 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
123 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
124 assert reason1 == reason2
125
126 def test_ne(self):
127 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
128 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
129 assert reason1 != reason2
130 assert reason1 != object()
131
132 def test_repr(self):
133 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
134 assert repr(reason1) == (
135 "<CRLReason(reason=ReasonFlags.unspecified)>"
136 )
137
138
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600139class TestInvalidityDate(object):
140 def test_invalid_invalidity_date(self):
141 with pytest.raises(TypeError):
142 x509.InvalidityDate("notadate")
143
144 def test_eq(self):
145 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
146 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
147 assert invalid1 == invalid2
148
149 def test_ne(self):
150 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
151 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
152 assert invalid1 != invalid2
153 assert invalid1 != object()
154
155 def test_repr(self):
156 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
157 assert repr(invalid1) == (
158 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
159 )
160
Paul Kehrer67cde762015-12-26 11:37:14 -0600161 def test_hash(self):
162 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
163 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
164 invalid3 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
165 assert hash(invalid1) == hash(invalid2)
166 assert hash(invalid1) != hash(invalid3)
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600167
Paul Kehrerc0297dd2015-12-26 11:37:57 -0600168
Paul Kehrer2b622582015-04-15 11:04:29 -0400169class TestNoticeReference(object):
170 def test_notice_numbers_not_all_int(self):
171 with pytest.raises(TypeError):
172 x509.NoticeReference("org", [1, 2, "three"])
173
174 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500175 with pytest.raises(TypeError):
176 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400177
178 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500179 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400180
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500181 if six.PY3:
182 assert repr(nr) == (
183 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
184 "])>"
185 )
186 else:
187 assert repr(nr) == (
188 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
189 "4])>"
190 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400191
Paul Kehrerc56ab622015-05-03 09:56:31 -0500192 def test_eq(self):
193 nr = x509.NoticeReference("org", [1, 2])
194 nr2 = x509.NoticeReference("org", [1, 2])
195 assert nr == nr2
196
197 def test_ne(self):
198 nr = x509.NoticeReference("org", [1, 2])
199 nr2 = x509.NoticeReference("org", [1])
200 nr3 = x509.NoticeReference(None, [1, 2])
201 assert nr != nr2
202 assert nr != nr3
203 assert nr != object()
204
Paul Kehrer2b622582015-04-15 11:04:29 -0400205
206class TestUserNotice(object):
207 def test_notice_reference_invalid(self):
208 with pytest.raises(TypeError):
209 x509.UserNotice("invalid", None)
210
211 def test_notice_reference_none(self):
212 un = x509.UserNotice(None, "text")
213 assert un.notice_reference is None
214 assert un.explicit_text == "text"
215
216 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500217 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500218 if six.PY3:
219 assert repr(un) == (
220 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500221 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500222 )
223 else:
224 assert repr(un) == (
225 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500226 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500227 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400228
Paul Kehrerc56ab622015-05-03 09:56:31 -0500229 def test_eq(self):
230 nr = x509.NoticeReference("org", [1, 2])
231 nr2 = x509.NoticeReference("org", [1, 2])
232 un = x509.UserNotice(nr, "text")
233 un2 = x509.UserNotice(nr2, "text")
234 assert un == un2
235
236 def test_ne(self):
237 nr = x509.NoticeReference("org", [1, 2])
238 nr2 = x509.NoticeReference("org", [1])
239 un = x509.UserNotice(nr, "text")
240 un2 = x509.UserNotice(nr2, "text")
241 un3 = x509.UserNotice(nr, "text3")
242 assert un != un2
243 assert un != un3
244 assert un != object()
245
Paul Kehrer2b622582015-04-15 11:04:29 -0400246
Paul Kehrer2b622582015-04-15 11:04:29 -0400247class TestPolicyInformation(object):
248 def test_invalid_policy_identifier(self):
249 with pytest.raises(TypeError):
250 x509.PolicyInformation("notanoid", None)
251
252 def test_none_policy_qualifiers(self):
253 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
254 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
255 assert pi.policy_qualifiers is None
256
257 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500258 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400259 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
260 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
261 assert pi.policy_qualifiers == pq
262
263 def test_invalid_policy_identifiers(self):
264 with pytest.raises(TypeError):
265 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
266
267 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500268 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400269 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500270 if six.PY3:
271 assert repr(pi) == (
272 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
273 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500274 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500275 )
276 else:
277 assert repr(pi) == (
278 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
279 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500280 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500281 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400282
Paul Kehrerc56ab622015-05-03 09:56:31 -0500283 def test_eq(self):
284 pi = x509.PolicyInformation(
285 x509.ObjectIdentifier("1.2.3"),
286 [u"string", x509.UserNotice(None, u"hi")]
287 )
288 pi2 = x509.PolicyInformation(
289 x509.ObjectIdentifier("1.2.3"),
290 [u"string", x509.UserNotice(None, u"hi")]
291 )
292 assert pi == pi2
293
294 def test_ne(self):
295 pi = x509.PolicyInformation(
296 x509.ObjectIdentifier("1.2.3"), [u"string"]
297 )
298 pi2 = x509.PolicyInformation(
299 x509.ObjectIdentifier("1.2.3"), [u"string2"]
300 )
301 pi3 = x509.PolicyInformation(
302 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
303 )
304 assert pi != pi2
305 assert pi != pi3
306 assert pi != object()
307
Paul Kehrer2b622582015-04-15 11:04:29 -0400308
309class TestCertificatePolicies(object):
310 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500311 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400312 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
313 with pytest.raises(TypeError):
314 x509.CertificatePolicies([1, pi])
315
316 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500317 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400318 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
319 cp = x509.CertificatePolicies([pi])
320 assert len(cp) == 1
321 for policyinfo in cp:
322 assert policyinfo == pi
323
324 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500325 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400326 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
327 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500328 if six.PY3:
329 assert repr(cp) == (
330 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
331 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
332 "ers=['string'])>])>"
333 )
334 else:
335 assert repr(cp) == (
336 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
337 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
338 "ers=[u'string'])>])>"
339 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400340
Paul Kehrerc56ab622015-05-03 09:56:31 -0500341 def test_eq(self):
342 pi = x509.PolicyInformation(
343 x509.ObjectIdentifier("1.2.3"), [u"string"]
344 )
345 cp = x509.CertificatePolicies([pi])
346 pi2 = x509.PolicyInformation(
347 x509.ObjectIdentifier("1.2.3"), [u"string"]
348 )
349 cp2 = x509.CertificatePolicies([pi2])
350 assert cp == cp2
351
352 def test_ne(self):
353 pi = x509.PolicyInformation(
354 x509.ObjectIdentifier("1.2.3"), [u"string"]
355 )
356 cp = x509.CertificatePolicies([pi])
357 pi2 = x509.PolicyInformation(
358 x509.ObjectIdentifier("1.2.3"), [u"string2"]
359 )
360 cp2 = x509.CertificatePolicies([pi2])
361 assert cp != cp2
362 assert cp != object()
363
Paul Kehrer2b622582015-04-15 11:04:29 -0400364
Paul Kehrer11026fe2015-05-12 11:23:56 -0500365@pytest.mark.requires_backend_interface(interface=RSABackend)
366@pytest.mark.requires_backend_interface(interface=X509Backend)
367class TestCertificatePoliciesExtension(object):
368 def test_cps_uri_policy_qualifier(self, backend):
369 cert = _load_cert(
370 os.path.join("x509", "custom", "cp_cps_uri.pem"),
371 x509.load_pem_x509_certificate,
372 backend
373 )
374
375 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500376 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500377 ).value
378
379 assert cp == x509.CertificatePolicies([
380 x509.PolicyInformation(
381 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
382 [u"http://other.com/cps"]
383 )
384 ])
385
386 def test_user_notice_with_notice_reference(self, backend):
387 cert = _load_cert(
388 os.path.join(
389 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
390 ),
391 x509.load_pem_x509_certificate,
392 backend
393 )
394
395 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500396 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500397 ).value
398
399 assert cp == x509.CertificatePolicies([
400 x509.PolicyInformation(
401 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
402 [
403 u"http://example.com/cps",
404 u"http://other.com/cps",
405 x509.UserNotice(
406 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
407 u"thing"
408 )
409 ]
410 )
411 ])
412
413 def test_user_notice_with_explicit_text(self, backend):
414 cert = _load_cert(
415 os.path.join(
416 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
417 ),
418 x509.load_pem_x509_certificate,
419 backend
420 )
421
422 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500423 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500424 ).value
425
426 assert cp == x509.CertificatePolicies([
427 x509.PolicyInformation(
428 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
429 [x509.UserNotice(None, u"thing")]
430 )
431 ])
432
433 def test_user_notice_no_explicit_text(self, backend):
434 cert = _load_cert(
435 os.path.join(
436 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
437 ),
438 x509.load_pem_x509_certificate,
439 backend
440 )
441
442 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500443 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500444 ).value
445
446 assert cp == x509.CertificatePolicies([
447 x509.PolicyInformation(
448 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
449 [
450 x509.UserNotice(
451 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
452 None
453 )
454 ]
455 )
456 ])
457
458
Paul Kehrercecbbba2015-03-30 14:58:38 -0500459class TestKeyUsage(object):
460 def test_key_agreement_false_encipher_decipher_true(self):
461 with pytest.raises(ValueError):
462 x509.KeyUsage(
463 digital_signature=False,
464 content_commitment=False,
465 key_encipherment=False,
466 data_encipherment=False,
467 key_agreement=False,
468 key_cert_sign=False,
469 crl_sign=False,
470 encipher_only=True,
471 decipher_only=False
472 )
473
474 with pytest.raises(ValueError):
475 x509.KeyUsage(
476 digital_signature=False,
477 content_commitment=False,
478 key_encipherment=False,
479 data_encipherment=False,
480 key_agreement=False,
481 key_cert_sign=False,
482 crl_sign=False,
483 encipher_only=True,
484 decipher_only=True
485 )
486
487 with pytest.raises(ValueError):
488 x509.KeyUsage(
489 digital_signature=False,
490 content_commitment=False,
491 key_encipherment=False,
492 data_encipherment=False,
493 key_agreement=False,
494 key_cert_sign=False,
495 crl_sign=False,
496 encipher_only=False,
497 decipher_only=True
498 )
499
500 def test_properties_key_agreement_true(self):
501 ku = x509.KeyUsage(
502 digital_signature=True,
503 content_commitment=True,
504 key_encipherment=False,
505 data_encipherment=False,
506 key_agreement=False,
507 key_cert_sign=True,
508 crl_sign=False,
509 encipher_only=False,
510 decipher_only=False
511 )
512 assert ku.digital_signature is True
513 assert ku.content_commitment is True
514 assert ku.key_encipherment is False
515 assert ku.data_encipherment is False
516 assert ku.key_agreement is False
517 assert ku.key_cert_sign is True
518 assert ku.crl_sign is False
519
520 def test_key_agreement_true_properties(self):
521 ku = x509.KeyUsage(
522 digital_signature=False,
523 content_commitment=False,
524 key_encipherment=False,
525 data_encipherment=False,
526 key_agreement=True,
527 key_cert_sign=False,
528 crl_sign=False,
529 encipher_only=False,
530 decipher_only=True
531 )
532 assert ku.key_agreement is True
533 assert ku.encipher_only is False
534 assert ku.decipher_only is True
535
536 def test_key_agreement_false_properties(self):
537 ku = x509.KeyUsage(
538 digital_signature=False,
539 content_commitment=False,
540 key_encipherment=False,
541 data_encipherment=False,
542 key_agreement=False,
543 key_cert_sign=False,
544 crl_sign=False,
545 encipher_only=False,
546 decipher_only=False
547 )
548 assert ku.key_agreement is False
549 with pytest.raises(ValueError):
550 ku.encipher_only
551
552 with pytest.raises(ValueError):
553 ku.decipher_only
554
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500555 def test_repr_key_agreement_false(self):
556 ku = x509.KeyUsage(
557 digital_signature=True,
558 content_commitment=True,
559 key_encipherment=False,
560 data_encipherment=False,
561 key_agreement=False,
562 key_cert_sign=True,
563 crl_sign=False,
564 encipher_only=False,
565 decipher_only=False
566 )
567 assert repr(ku) == (
568 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
569 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400570 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
571 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500572 )
573
574 def test_repr_key_agreement_true(self):
575 ku = x509.KeyUsage(
576 digital_signature=True,
577 content_commitment=True,
578 key_encipherment=False,
579 data_encipherment=False,
580 key_agreement=True,
581 key_cert_sign=True,
582 crl_sign=False,
583 encipher_only=False,
584 decipher_only=False
585 )
586 assert repr(ku) == (
587 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
588 "cipherment=False, data_encipherment=False, key_agreement=True, k"
589 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
590 "only=False)>"
591 )
592
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500593 def test_eq(self):
594 ku = x509.KeyUsage(
595 digital_signature=False,
596 content_commitment=False,
597 key_encipherment=False,
598 data_encipherment=False,
599 key_agreement=True,
600 key_cert_sign=False,
601 crl_sign=False,
602 encipher_only=False,
603 decipher_only=True
604 )
605 ku2 = x509.KeyUsage(
606 digital_signature=False,
607 content_commitment=False,
608 key_encipherment=False,
609 data_encipherment=False,
610 key_agreement=True,
611 key_cert_sign=False,
612 crl_sign=False,
613 encipher_only=False,
614 decipher_only=True
615 )
616 assert ku == ku2
617
618 def test_ne(self):
619 ku = x509.KeyUsage(
620 digital_signature=False,
621 content_commitment=False,
622 key_encipherment=False,
623 data_encipherment=False,
624 key_agreement=True,
625 key_cert_sign=False,
626 crl_sign=False,
627 encipher_only=False,
628 decipher_only=True
629 )
630 ku2 = x509.KeyUsage(
631 digital_signature=False,
632 content_commitment=False,
633 key_encipherment=False,
634 data_encipherment=False,
635 key_agreement=False,
636 key_cert_sign=False,
637 crl_sign=False,
638 encipher_only=False,
639 decipher_only=False
640 )
641 assert ku != ku2
642 assert ku != object()
643
Paul Kehrercecbbba2015-03-30 14:58:38 -0500644
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500645class TestSubjectKeyIdentifier(object):
646 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400647 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500648 ski = x509.SubjectKeyIdentifier(value)
649 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500650
651 def test_repr(self):
652 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500653 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500654 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500655 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400656 if six.PY3:
657 assert repr(ext) == (
658 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
659 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
660 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
661 "\\xf7\\xff:\\xc9\')>)>"
662 )
663 else:
664 assert repr(ext) == (
665 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
666 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
667 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
668 "\\xf7\\xff:\\xc9\')>)>"
669 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500670
671 def test_eq(self):
672 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500673 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500674 )
675 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500676 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500677 )
678 assert ski == ski2
679
680 def test_ne(self):
681 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500682 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500683 )
684 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500685 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500686 )
687 assert ski != ski2
688 assert ski != object()
689
690
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400691class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500692 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400693 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500694 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400695
696 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500697 dirname = x509.DirectoryName(
698 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800699 x509.NameAttribute(
700 x509.ObjectIdentifier('2.999.1'),
701 u'value1'
702 ),
703 x509.NameAttribute(
704 x509.ObjectIdentifier('2.999.2'),
705 u'value2'
706 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500707 ])
708 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400709 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500710 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400711
712 def test_authority_issuer_none_serial_not_none(self):
713 with pytest.raises(ValueError):
714 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
715
716 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500717 dirname = x509.DirectoryName(
718 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800719 x509.NameAttribute(
720 x509.ObjectIdentifier('2.999.1'),
721 u'value1'
722 ),
723 x509.NameAttribute(
724 x509.ObjectIdentifier('2.999.2'),
725 u'value2'
726 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500727 ])
728 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400729 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500730 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400731
732 def test_authority_cert_serial_and_issuer_none(self):
733 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
734 assert aki.key_identifier == b"id"
735 assert aki.authority_cert_issuer is None
736 assert aki.authority_cert_serial_number is None
737
738 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500739 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500740 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500741 )
742 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400743
744 if six.PY3:
745 assert repr(aki) == (
746 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500747 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500748 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500749 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400750 )
751 else:
752 assert repr(aki) == (
753 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500754 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500755 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
756 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400757 )
758
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500759 def test_eq(self):
760 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500761 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500762 )
763 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
764 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500765 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500766 )
767 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
768 assert aki == aki2
769
770 def test_ne(self):
771 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500772 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500773 )
774 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500775 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500776 )
777 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
778 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
779 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
780 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
781 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
782 assert aki != aki2
783 assert aki != aki3
784 assert aki != aki4
785 assert aki != aki5
786 assert aki != object()
787
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400788
Paul Kehrer8cf26422015-03-21 09:50:24 -0500789class TestBasicConstraints(object):
790 def test_ca_not_boolean(self):
791 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500792 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500793
794 def test_path_length_not_ca(self):
795 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500796 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500797
798 def test_path_length_not_int(self):
799 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500800 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500801
802 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500803 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500804
805 def test_path_length_negative(self):
806 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500807 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500808
809 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500810 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500811 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500812 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500813 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500814
Paul Kehrer3a69b132015-05-13 10:03:46 -0500815 def test_eq(self):
816 na = x509.BasicConstraints(ca=True, path_length=None)
817 na2 = x509.BasicConstraints(ca=True, path_length=None)
818 assert na == na2
819
820 def test_ne(self):
821 na = x509.BasicConstraints(ca=True, path_length=None)
822 na2 = x509.BasicConstraints(ca=True, path_length=1)
823 na3 = x509.BasicConstraints(ca=False, path_length=None)
824 assert na != na2
825 assert na != na3
826 assert na != object()
827
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500828
Paul Kehrerffa2a152015-03-31 08:18:25 -0500829class TestExtendedKeyUsage(object):
830 def test_not_all_oids(self):
831 with pytest.raises(TypeError):
832 x509.ExtendedKeyUsage(["notoid"])
833
834 def test_iter_len(self):
835 eku = x509.ExtendedKeyUsage([
836 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
837 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
838 ])
839 assert len(eku) == 2
840 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500841 ExtendedKeyUsageOID.SERVER_AUTH,
842 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500843 ]
844
Paul Kehrer23d10c32015-04-02 23:12:32 -0500845 def test_repr(self):
846 eku = x509.ExtendedKeyUsage([
847 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
848 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
849 ])
850 assert repr(eku) == (
851 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
852 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
853 "tAuth)>])>"
854 )
855
Paul Kehrerb0476172015-05-02 19:34:51 -0500856 def test_eq(self):
857 eku = x509.ExtendedKeyUsage([
858 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
859 ])
860 eku2 = x509.ExtendedKeyUsage([
861 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
862 ])
863 assert eku == eku2
864
865 def test_ne(self):
866 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
867 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
868 assert eku != eku2
869 assert eku != object()
870
Paul Kehrerffa2a152015-03-31 08:18:25 -0500871
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500872@pytest.mark.requires_backend_interface(interface=RSABackend)
873@pytest.mark.requires_backend_interface(interface=X509Backend)
874class TestExtensions(object):
875 def test_no_extensions(self, backend):
876 cert = _load_cert(
877 os.path.join("x509", "verisign_md2_root.pem"),
878 x509.load_pem_x509_certificate,
879 backend
880 )
881 ext = cert.extensions
882 assert len(ext) == 0
883 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500884 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500885 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500886
Paul Kehrerd44e4132015-08-10 19:13:13 -0500887 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500888
889 def test_one_extension(self, backend):
890 cert = _load_cert(
891 os.path.join(
892 "x509", "custom", "basic_constraints_not_critical.pem"
893 ),
894 x509.load_pem_x509_certificate,
895 backend
896 )
897 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500898 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500899 assert ext is not None
900 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500901
902 def test_duplicate_extension(self, backend):
903 cert = _load_cert(
904 os.path.join(
905 "x509", "custom", "two_basic_constraints.pem"
906 ),
907 x509.load_pem_x509_certificate,
908 backend
909 )
910 with pytest.raises(x509.DuplicateExtension) as exc:
911 cert.extensions
912
Paul Kehrerd44e4132015-08-10 19:13:13 -0500913 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500914
915 def test_unsupported_critical_extension(self, backend):
916 cert = _load_cert(
917 os.path.join(
918 "x509", "custom", "unsupported_extension_critical.pem"
919 ),
920 x509.load_pem_x509_certificate,
921 backend
922 )
923 with pytest.raises(x509.UnsupportedExtension) as exc:
924 cert.extensions
925
926 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
927
928 def test_unsupported_extension(self, backend):
929 # TODO: this will raise an exception when all extensions are complete
930 cert = _load_cert(
931 os.path.join(
932 "x509", "custom", "unsupported_extension.pem"
933 ),
934 x509.load_pem_x509_certificate,
935 backend
936 )
937 extensions = cert.extensions
938 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500939
Phoebe Queenecae9812015-08-12 05:00:32 +0100940 def test_no_extensions_get_for_class(self, backend):
941 cert = _load_cert(
942 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100943 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100944 ),
945 x509.load_pem_x509_certificate,
946 backend
947 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100948 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100949 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100950 exts.get_extension_for_class(x509.IssuerAlternativeName)
951 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100952
Paul Kehrer5b90c972015-12-26 00:52:58 -0600953 def test_indexing(self, backend):
954 cert = _load_cert(
955 os.path.join("x509", "cryptography.io.pem"),
956 x509.load_pem_x509_certificate,
957 backend
958 )
959 exts = cert.extensions
960 assert exts[-1] == exts[7]
961 assert len(exts[3:5]) == 2
962 assert exts[2:4][0] == exts[2]
963 assert exts[2:4][1] == exts[3]
964
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100965 def test_one_extension_get_for_class(self, backend):
966 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100967 os.path.join(
968 "x509", "custom", "basic_constraints_not_critical.pem"
969 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100970 x509.load_pem_x509_certificate,
971 backend
972 )
973 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
974 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100975 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500976
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500977 def test_repr(self, backend):
978 cert = _load_cert(
979 os.path.join(
980 "x509", "custom", "basic_constraints_not_critical.pem"
981 ),
982 x509.load_pem_x509_certificate,
983 backend
984 )
985 assert repr(cert.extensions) == (
986 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
987 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
988 "alse, path_length=None)>)>])>"
989 )
990
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100991
Paul Kehrerfa56a232015-03-17 13:14:03 -0500992@pytest.mark.requires_backend_interface(interface=RSABackend)
993@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500994class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500995 def test_ca_true_pathlen_6(self, backend):
996 cert = _load_cert(
997 os.path.join(
998 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
999 ),
1000 x509.load_der_x509_certificate,
1001 backend
1002 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001003 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001004 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001005 )
1006 assert ext is not None
1007 assert ext.critical is True
1008 assert ext.value.ca is True
1009 assert ext.value.path_length == 6
1010
1011 def test_path_length_zero(self, backend):
1012 cert = _load_cert(
1013 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1014 x509.load_pem_x509_certificate,
1015 backend
1016 )
1017 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001018 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001019 )
1020 assert ext is not None
1021 assert ext.critical is True
1022 assert ext.value.ca is True
1023 assert ext.value.path_length == 0
1024
1025 def test_ca_true_no_pathlen(self, backend):
1026 cert = _load_cert(
1027 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1028 x509.load_der_x509_certificate,
1029 backend
1030 )
1031 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001032 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001033 )
1034 assert ext is not None
1035 assert ext.critical is True
1036 assert ext.value.ca is True
1037 assert ext.value.path_length is None
1038
1039 def test_ca_false(self, backend):
1040 cert = _load_cert(
1041 os.path.join("x509", "cryptography.io.pem"),
1042 x509.load_pem_x509_certificate,
1043 backend
1044 )
1045 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001046 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001047 )
1048 assert ext is not None
1049 assert ext.critical is True
1050 assert ext.value.ca is False
1051 assert ext.value.path_length is None
1052
1053 def test_no_basic_constraints(self, backend):
1054 cert = _load_cert(
1055 os.path.join(
1056 "x509",
1057 "PKITS_data",
1058 "certs",
1059 "ValidCertificatePathTest1EE.crt"
1060 ),
1061 x509.load_der_x509_certificate,
1062 backend
1063 )
1064 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001065 cert.extensions.get_extension_for_oid(
1066 ExtensionOID.BASIC_CONSTRAINTS
1067 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001068
1069 def test_basic_constraint_not_critical(self, backend):
1070 cert = _load_cert(
1071 os.path.join(
1072 "x509", "custom", "basic_constraints_not_critical.pem"
1073 ),
1074 x509.load_pem_x509_certificate,
1075 backend
1076 )
1077 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001078 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001079 )
1080 assert ext is not None
1081 assert ext.critical is False
1082 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001083
1084
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001085class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001086 @pytest.mark.requires_backend_interface(interface=RSABackend)
1087 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001088 def test_subject_key_identifier(self, backend):
1089 cert = _load_cert(
1090 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1091 x509.load_der_x509_certificate,
1092 backend
1093 )
1094 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001095 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001096 )
1097 ski = ext.value
1098 assert ext is not None
1099 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001100 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001101 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001102 )
1103
Paul Kehrerf22f6122015-08-05 12:57:13 +01001104 @pytest.mark.requires_backend_interface(interface=RSABackend)
1105 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001106 def test_no_subject_key_identifier(self, backend):
1107 cert = _load_cert(
1108 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1109 x509.load_pem_x509_certificate,
1110 backend
1111 )
1112 with pytest.raises(x509.ExtensionNotFound):
1113 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001114 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001115 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001116
Paul Kehrerf22f6122015-08-05 12:57:13 +01001117 @pytest.mark.requires_backend_interface(interface=RSABackend)
1118 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001119 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001120 cert = _load_cert(
1121 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1122 x509.load_der_x509_certificate,
1123 backend
1124 )
1125 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001126 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001127 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001128 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001129 cert.public_key()
1130 )
1131 assert ext.value == ski
1132
1133 @pytest.mark.requires_backend_interface(interface=DSABackend)
1134 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001135 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001136 cert = _load_cert(
1137 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1138 x509.load_pem_x509_certificate,
1139 backend
1140 )
1141
1142 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001143 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001144 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001145 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001146 cert.public_key()
1147 )
1148 assert ext.value == ski
1149
1150 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1151 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001152 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001153 _skip_curve_unsupported(backend, ec.SECP384R1())
1154 cert = _load_cert(
1155 os.path.join("x509", "ecdsa_root.pem"),
1156 x509.load_pem_x509_certificate,
1157 backend
1158 )
1159
1160 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001161 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001162 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001163 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001164 cert.public_key()
1165 )
1166 assert ext.value == ski
1167
Paul Kehrer5508ee22015-04-02 19:31:03 -05001168
1169@pytest.mark.requires_backend_interface(interface=RSABackend)
1170@pytest.mark.requires_backend_interface(interface=X509Backend)
1171class TestKeyUsageExtension(object):
1172 def test_no_key_usage(self, backend):
1173 cert = _load_cert(
1174 os.path.join("x509", "verisign_md2_root.pem"),
1175 x509.load_pem_x509_certificate,
1176 backend
1177 )
1178 ext = cert.extensions
1179 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001180 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001181
Paul Kehrerd44e4132015-08-10 19:13:13 -05001182 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001183
1184 def test_all_purposes(self, backend):
1185 cert = _load_cert(
1186 os.path.join(
1187 "x509", "custom", "all_key_usages.pem"
1188 ),
1189 x509.load_pem_x509_certificate,
1190 backend
1191 )
1192 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001193 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001194 assert ext is not None
1195
1196 ku = ext.value
1197 assert ku.digital_signature is True
1198 assert ku.content_commitment is True
1199 assert ku.key_encipherment is True
1200 assert ku.data_encipherment is True
1201 assert ku.key_agreement is True
1202 assert ku.key_cert_sign is True
1203 assert ku.crl_sign is True
1204 assert ku.encipher_only is True
1205 assert ku.decipher_only is True
1206
1207 def test_key_cert_sign_crl_sign(self, backend):
1208 cert = _load_cert(
1209 os.path.join(
1210 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1211 ),
1212 x509.load_der_x509_certificate,
1213 backend
1214 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001215 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001216 assert ext is not None
1217 assert ext.critical is True
1218
1219 ku = ext.value
1220 assert ku.digital_signature is False
1221 assert ku.content_commitment is False
1222 assert ku.key_encipherment is False
1223 assert ku.data_encipherment is False
1224 assert ku.key_agreement is False
1225 assert ku.key_cert_sign is True
1226 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001227
1228
1229@pytest.mark.parametrize(
1230 "name", [
1231 x509.RFC822Name,
1232 x509.DNSName,
1233 x509.UniformResourceIdentifier
1234 ]
1235)
1236class TestTextGeneralNames(object):
1237 def test_not_text(self, name):
1238 with pytest.raises(TypeError):
1239 name(b"notaunicodestring")
1240
1241 with pytest.raises(TypeError):
1242 name(1.3)
1243
1244 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301245 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001246 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1247
1248 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301249 gn = name(u"string")
1250 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001251 assert gn == gn2
1252
1253 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301254 gn = name(u"string")
1255 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001256 assert gn != gn2
1257 assert gn != object()
1258
1259
1260class TestDirectoryName(object):
1261 def test_not_name(self):
1262 with pytest.raises(TypeError):
1263 x509.DirectoryName(b"notaname")
1264
1265 with pytest.raises(TypeError):
1266 x509.DirectoryName(1.3)
1267
1268 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001269 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001270 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001271 if six.PY3:
1272 assert repr(gn) == (
1273 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1274 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1275 ">])>)>"
1276 )
1277 else:
1278 assert repr(gn) == (
1279 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1280 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1281 ")>])>)>"
1282 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001283
1284 def test_eq(self):
1285 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001286 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001287 ])
1288 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001289 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001290 ])
1291 gn = x509.DirectoryName(x509.Name([name]))
1292 gn2 = x509.DirectoryName(x509.Name([name2]))
1293 assert gn == gn2
1294
1295 def test_ne(self):
1296 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001297 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001298 ])
1299 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001300 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001301 ])
1302 gn = x509.DirectoryName(x509.Name([name]))
1303 gn2 = x509.DirectoryName(x509.Name([name2]))
1304 assert gn != gn2
1305 assert gn != object()
1306
1307
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001308class TestRFC822Name(object):
1309 def test_invalid_email(self):
1310 with pytest.raises(ValueError):
1311 x509.RFC822Name(u"Name <email>")
1312
1313 with pytest.raises(ValueError):
1314 x509.RFC822Name(u"")
1315
1316 def test_single_label(self):
1317 gn = x509.RFC822Name(u"administrator")
1318 assert gn.value == u"administrator"
1319
1320 def test_idna(self):
1321 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1322 assert gn.value == u"email@em\xe5\xefl.com"
1323 assert gn._encoded == b"email@xn--eml-vla4c.com"
1324
1325
Paul Kehrere28d6c42015-07-12 14:59:37 -05001326class TestUniformResourceIdentifier(object):
1327 def test_no_parsed_hostname(self):
1328 gn = x509.UniformResourceIdentifier(u"singlelabel")
1329 assert gn.value == u"singlelabel"
1330
1331 def test_with_port(self):
1332 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1333 assert gn.value == u"singlelabel:443/test"
1334
1335 def test_idna_no_port(self):
1336 gn = x509.UniformResourceIdentifier(
1337 u"http://\u043f\u044b\u043a\u0430.cryptography"
1338 )
1339 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1340 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1341
1342 def test_idna_with_port(self):
1343 gn = x509.UniformResourceIdentifier(
1344 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1345 )
1346 assert gn.value == (
1347 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1348 )
1349 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1350
1351 def test_query_and_fragment(self):
1352 gn = x509.UniformResourceIdentifier(
1353 u"ldap://cryptography:90/path?query=true#somedata"
1354 )
1355 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1356
1357
Paul Kehrer31bdf792015-03-25 14:11:00 -05001358class TestRegisteredID(object):
1359 def test_not_oid(self):
1360 with pytest.raises(TypeError):
1361 x509.RegisteredID(b"notanoid")
1362
1363 with pytest.raises(TypeError):
1364 x509.RegisteredID(1.3)
1365
1366 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001367 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001368 assert repr(gn) == (
1369 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1370 "e)>)>"
1371 )
1372
1373 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001374 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1375 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001376 assert gn == gn2
1377
1378 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001379 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001380 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001381 assert gn != gn2
1382 assert gn != object()
1383
1384
1385class TestIPAddress(object):
1386 def test_not_ipaddress(self):
1387 with pytest.raises(TypeError):
1388 x509.IPAddress(b"notanipaddress")
1389
1390 with pytest.raises(TypeError):
1391 x509.IPAddress(1.3)
1392
1393 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301394 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001395 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1396
Eeshan Gargf1234152015-04-29 18:41:00 +05301397 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001398 assert repr(gn2) == "<IPAddress(value=ff::)>"
1399
Paul Kehrereb177932015-05-17 18:33:33 -07001400 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1401 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1402
1403 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1404 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1405
Paul Kehrer31bdf792015-03-25 14:11:00 -05001406 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301407 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1408 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001409 assert gn == gn2
1410
1411 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301412 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1413 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001414 assert gn != gn2
1415 assert gn != object()
1416
1417
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001418class TestOtherName(object):
1419 def test_invalid_args(self):
1420 with pytest.raises(TypeError):
1421 x509.OtherName(b"notanobjectidentifier", b"derdata")
1422
1423 with pytest.raises(TypeError):
1424 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1425
1426 def test_repr(self):
1427 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1428 if six.PY3:
1429 assert repr(gn) == (
1430 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1431 "name=Unknown OID)>, value=b'derdata')>"
1432 )
1433 else:
1434 assert repr(gn) == (
1435 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1436 "name=Unknown OID)>, value='derdata')>"
1437 )
1438
1439 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1440 if six.PY3:
1441 assert repr(gn) == (
1442 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1443 "name=pseudonym)>, value=b'derdata')>"
1444 )
1445 else:
1446 assert repr(gn) == (
1447 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1448 "name=pseudonym)>, value='derdata')>"
1449 )
1450
1451 def test_eq(self):
1452 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1453 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1454 assert gn == gn2
1455
1456 def test_ne(self):
1457 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1458 assert gn != object()
1459
1460 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1461 assert gn != gn2
1462
1463 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1464 assert gn != gn2
1465
1466
Erik Trauschke2dcce902015-05-14 16:12:24 -07001467class TestGeneralNames(object):
1468 def test_get_values_for_type(self):
1469 gns = x509.GeneralNames(
1470 [x509.DNSName(u"cryptography.io")]
1471 )
1472 names = gns.get_values_for_type(x509.DNSName)
1473 assert names == [u"cryptography.io"]
1474
1475 def test_iter_names(self):
1476 gns = x509.GeneralNames([
1477 x509.DNSName(u"cryptography.io"),
1478 x509.DNSName(u"crypto.local"),
1479 ])
1480 assert len(gns) == 2
1481 assert list(gns) == [
1482 x509.DNSName(u"cryptography.io"),
1483 x509.DNSName(u"crypto.local"),
1484 ]
1485
Paul Kehrer8adb5962015-12-26 14:46:58 -06001486 def test_indexing(self):
1487 gn = x509.GeneralNames([
1488 x509.DNSName(u"cryptography.io"),
1489 x509.DNSName(u"crypto.local"),
1490 x509.DNSName(u"another.local"),
1491 x509.RFC822Name(u"email@another.local"),
1492 x509.UniformResourceIdentifier(u"http://another.local"),
1493 ])
1494 assert gn[-1] == gn[4]
1495 assert len(gn[1:3]) == 2
1496 assert gn[2:4][0] == gn[2]
1497 assert gn[2:5:2][1] == gn[4]
1498
Erik Trauschke2dcce902015-05-14 16:12:24 -07001499 def test_invalid_general_names(self):
1500 with pytest.raises(TypeError):
1501 x509.GeneralNames(
1502 [x509.DNSName(u"cryptography.io"), "invalid"]
1503 )
1504
1505 def test_repr(self):
1506 gns = x509.GeneralNames(
1507 [
1508 x509.DNSName(u"cryptography.io")
1509 ]
1510 )
1511 assert repr(gns) == (
1512 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1513 )
1514
1515 def test_eq(self):
1516 gns = x509.GeneralNames(
1517 [x509.DNSName(u"cryptography.io")]
1518 )
1519 gns2 = x509.GeneralNames(
1520 [x509.DNSName(u"cryptography.io")]
1521 )
1522 assert gns == gns2
1523
1524 def test_ne(self):
1525 gns = x509.GeneralNames(
1526 [x509.DNSName(u"cryptography.io")]
1527 )
1528 gns2 = x509.GeneralNames(
1529 [x509.RFC822Name(u"admin@cryptography.io")]
1530 )
1531 assert gns != gns2
1532 assert gns != object()
1533
1534
Paul Kehrer99125c92015-06-07 18:37:10 -05001535class TestIssuerAlternativeName(object):
1536 def test_get_values_for_type(self):
1537 san = x509.IssuerAlternativeName(
1538 [x509.DNSName(u"cryptography.io")]
1539 )
1540 names = san.get_values_for_type(x509.DNSName)
1541 assert names == [u"cryptography.io"]
1542
1543 def test_iter_names(self):
1544 san = x509.IssuerAlternativeName([
1545 x509.DNSName(u"cryptography.io"),
1546 x509.DNSName(u"crypto.local"),
1547 ])
1548 assert len(san) == 2
1549 assert list(san) == [
1550 x509.DNSName(u"cryptography.io"),
1551 x509.DNSName(u"crypto.local"),
1552 ]
1553
1554 def test_invalid_general_names(self):
1555 with pytest.raises(TypeError):
1556 x509.IssuerAlternativeName(
1557 [x509.DNSName(u"cryptography.io"), "invalid"]
1558 )
1559
1560 def test_repr(self):
1561 san = x509.IssuerAlternativeName(
1562 [
1563 x509.DNSName(u"cryptography.io")
1564 ]
1565 )
1566 assert repr(san) == (
1567 "<IssuerAlternativeName("
1568 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1569 )
1570
1571 def test_eq(self):
1572 san = x509.IssuerAlternativeName(
1573 [x509.DNSName(u"cryptography.io")]
1574 )
1575 san2 = x509.IssuerAlternativeName(
1576 [x509.DNSName(u"cryptography.io")]
1577 )
1578 assert san == san2
1579
1580 def test_ne(self):
1581 san = x509.IssuerAlternativeName(
1582 [x509.DNSName(u"cryptography.io")]
1583 )
1584 san2 = x509.IssuerAlternativeName(
1585 [x509.RFC822Name(u"admin@cryptography.io")]
1586 )
1587 assert san != san2
1588 assert san != object()
1589
1590
Alex Gaynorf1c17672015-06-20 14:20:20 -04001591@pytest.mark.requires_backend_interface(interface=RSABackend)
1592@pytest.mark.requires_backend_interface(interface=X509Backend)
1593class TestRSAIssuerAlternativeNameExtension(object):
1594 def test_uri(self, backend):
1595 cert = _load_cert(
1596 os.path.join("x509", "custom", "ian_uri.pem"),
1597 x509.load_pem_x509_certificate,
1598 backend,
1599 )
1600 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001601 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001602 )
1603 assert list(ext.value) == [
1604 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1605 ]
1606
1607
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001608class TestCRLNumber(object):
1609 def test_eq(self):
1610 crl_number = x509.CRLNumber(15)
1611 assert crl_number == x509.CRLNumber(15)
1612
1613 def test_ne(self):
1614 crl_number = x509.CRLNumber(15)
1615 assert crl_number != x509.CRLNumber(14)
1616 assert crl_number != object()
1617
1618 def test_repr(self):
1619 crl_number = x509.CRLNumber(15)
1620 assert repr(crl_number) == "<CRLNumber(15)>"
1621
Paul Kehrera9718fc2015-12-22 22:55:35 -06001622 def test_invalid_number(self):
1623 with pytest.raises(TypeError):
1624 x509.CRLNumber("notanumber")
1625
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001626 def test_hash(self):
1627 c1 = x509.CRLNumber(1)
1628 c2 = x509.CRLNumber(1)
1629 c3 = x509.CRLNumber(2)
1630 assert hash(c1) == hash(c2)
1631 assert hash(c1) != hash(c3)
1632
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001633
Paul Kehrer31bdf792015-03-25 14:11:00 -05001634class TestSubjectAlternativeName(object):
1635 def test_get_values_for_type(self):
1636 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301637 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001638 )
1639 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301640 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001641
1642 def test_iter_names(self):
1643 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301644 x509.DNSName(u"cryptography.io"),
1645 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001646 ])
1647 assert len(san) == 2
1648 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301649 x509.DNSName(u"cryptography.io"),
1650 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001651 ]
1652
Paul Kehrer8adb5962015-12-26 14:46:58 -06001653 def test_indexing(self):
1654 san = x509.SubjectAlternativeName([
1655 x509.DNSName(u"cryptography.io"),
1656 x509.DNSName(u"crypto.local"),
1657 x509.DNSName(u"another.local"),
1658 x509.RFC822Name(u"email@another.local"),
1659 x509.UniformResourceIdentifier(u"http://another.local"),
1660 ])
1661 assert san[-1] == san[4]
1662 assert len(san[1:3]) == 2
1663 assert san[2:4][0] == san[2]
1664 assert san[2:5:2][1] == san[4]
1665
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001666 def test_invalid_general_names(self):
1667 with pytest.raises(TypeError):
1668 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301669 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001670 )
1671
Paul Kehrer31bdf792015-03-25 14:11:00 -05001672 def test_repr(self):
1673 san = x509.SubjectAlternativeName(
1674 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301675 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001676 ]
1677 )
1678 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001679 "<SubjectAlternativeName("
1680 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001681 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001682
Paul Kehrer58cc3972015-05-13 10:00:41 -05001683 def test_eq(self):
1684 san = x509.SubjectAlternativeName(
1685 [x509.DNSName(u"cryptography.io")]
1686 )
1687 san2 = x509.SubjectAlternativeName(
1688 [x509.DNSName(u"cryptography.io")]
1689 )
1690 assert san == san2
1691
1692 def test_ne(self):
1693 san = x509.SubjectAlternativeName(
1694 [x509.DNSName(u"cryptography.io")]
1695 )
1696 san2 = x509.SubjectAlternativeName(
1697 [x509.RFC822Name(u"admin@cryptography.io")]
1698 )
1699 assert san != san2
1700 assert san != object()
1701
Paul Kehrer40f83382015-04-20 15:00:16 -05001702
1703@pytest.mark.requires_backend_interface(interface=RSABackend)
1704@pytest.mark.requires_backend_interface(interface=X509Backend)
1705class TestRSASubjectAlternativeNameExtension(object):
1706 def test_dns_name(self, backend):
1707 cert = _load_cert(
1708 os.path.join("x509", "cryptography.io.pem"),
1709 x509.load_pem_x509_certificate,
1710 backend
1711 )
1712 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001713 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001714 )
1715 assert ext is not None
1716 assert ext.critical is False
1717
1718 san = ext.value
1719
1720 dns = san.get_values_for_type(x509.DNSName)
1721 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001722
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001723 def test_wildcard_dns_name(self, backend):
1724 cert = _load_cert(
1725 os.path.join("x509", "wildcard_san.pem"),
1726 x509.load_pem_x509_certificate,
1727 backend
1728 )
1729 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001730 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001731 )
1732
1733 dns = ext.value.get_values_for_type(x509.DNSName)
1734 assert dns == [
1735 u'*.langui.sh',
1736 u'langui.sh',
1737 u'*.saseliminator.com',
1738 u'saseliminator.com'
1739 ]
1740
Dominic Chen87bb9572015-10-09 00:23:07 -04001741 def test_san_empty_hostname(self, backend):
1742 cert = _load_cert(
1743 os.path.join(
1744 "x509", "custom", "san_empty_hostname.pem"
1745 ),
1746 x509.load_pem_x509_certificate,
1747 backend
1748 )
1749 san = cert.extensions.get_extension_for_oid(
1750 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1751 )
1752
1753 dns = san.value.get_values_for_type(x509.DNSName)
1754 assert dns == [u'']
1755
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001756 def test_san_wildcard_idna_dns_name(self, backend):
1757 cert = _load_cert(
1758 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1759 x509.load_pem_x509_certificate,
1760 backend
1761 )
1762 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001763 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001764 )
1765
1766 dns = ext.value.get_values_for_type(x509.DNSName)
1767 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1768
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001769 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001770 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001771 os.path.join("x509", "san_x400address.der"),
1772 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001773 backend
1774 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001775 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001776 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001777
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001778 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001779
1780 def test_registered_id(self, backend):
1781 cert = _load_cert(
1782 os.path.join(
1783 "x509", "custom", "san_registered_id.pem"
1784 ),
1785 x509.load_pem_x509_certificate,
1786 backend
1787 )
1788 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001789 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001790 )
1791 assert ext is not None
1792 assert ext.critical is False
1793
1794 san = ext.value
1795 rid = san.get_values_for_type(x509.RegisteredID)
1796 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001797
1798 def test_uri(self, backend):
1799 cert = _load_cert(
1800 os.path.join(
1801 "x509", "custom", "san_uri_with_port.pem"
1802 ),
1803 x509.load_pem_x509_certificate,
1804 backend
1805 )
1806 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001807 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001808 )
1809 assert ext is not None
1810 uri = ext.value.get_values_for_type(
1811 x509.UniformResourceIdentifier
1812 )
1813 assert uri == [
1814 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1815 u"lo",
1816 u"http://someregulardomain.com",
1817 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001818
1819 def test_ipaddress(self, backend):
1820 cert = _load_cert(
1821 os.path.join(
1822 "x509", "custom", "san_ipaddr.pem"
1823 ),
1824 x509.load_pem_x509_certificate,
1825 backend
1826 )
1827 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001828 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001829 )
1830 assert ext is not None
1831 assert ext.critical is False
1832
1833 san = ext.value
1834
1835 ip = san.get_values_for_type(x509.IPAddress)
1836 assert [
1837 ipaddress.ip_address(u"127.0.0.1"),
1838 ipaddress.ip_address(u"ff::")
1839 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001840
1841 def test_dirname(self, backend):
1842 cert = _load_cert(
1843 os.path.join(
1844 "x509", "custom", "san_dirname.pem"
1845 ),
1846 x509.load_pem_x509_certificate,
1847 backend
1848 )
1849 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001850 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001851 )
1852 assert ext is not None
1853 assert ext.critical is False
1854
1855 san = ext.value
1856
1857 dirname = san.get_values_for_type(x509.DirectoryName)
1858 assert [
1859 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001860 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1861 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1862 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001863 ])
1864 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001865
1866 def test_rfc822name(self, backend):
1867 cert = _load_cert(
1868 os.path.join(
1869 "x509", "custom", "san_rfc822_idna.pem"
1870 ),
1871 x509.load_pem_x509_certificate,
1872 backend
1873 )
1874 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001875 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001876 )
1877 assert ext is not None
1878 assert ext.critical is False
1879
1880 san = ext.value
1881
1882 rfc822name = san.get_values_for_type(x509.RFC822Name)
1883 assert [u"email@em\xe5\xefl.com"] == rfc822name
1884
Paul Kehrerb8968812015-05-15 09:01:34 -07001885 def test_idna2003_invalid(self, backend):
1886 cert = _load_cert(
1887 os.path.join(
1888 "x509", "custom", "san_idna2003_dnsname.pem"
1889 ),
1890 x509.load_pem_x509_certificate,
1891 backend
1892 )
1893 with pytest.raises(UnicodeError):
1894 cert.extensions
1895
Paul Kehrere06cab42015-04-30 10:23:33 -05001896 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1897 cert = _load_cert(
1898 os.path.join(
1899 "x509", "custom", "san_idna_names.pem"
1900 ),
1901 x509.load_pem_x509_certificate,
1902 backend
1903 )
1904 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001905 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001906 )
1907 assert ext is not None
1908 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1909 dns_name = ext.value.get_values_for_type(x509.DNSName)
1910 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1911 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1912 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1913 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1914
1915 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1916 cert = _load_cert(
1917 os.path.join(
1918 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1919 ),
1920 x509.load_pem_x509_certificate,
1921 backend
1922 )
1923 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001924 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001925 )
1926 assert ext is not None
1927 assert ext.critical is False
1928
1929 san = ext.value
1930
1931 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1932 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1933 dns = san.get_values_for_type(x509.DNSName)
1934 ip = san.get_values_for_type(x509.IPAddress)
1935 dirname = san.get_values_for_type(x509.DirectoryName)
1936 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001937 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001938 assert [u"cryptography.io"] == dns
1939 assert [
1940 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001941 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001942 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001943 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001944 ),
1945 ])
1946 ] == dirname
1947 assert [
1948 ipaddress.ip_address(u"127.0.0.1"),
1949 ipaddress.ip_address(u"ff::")
1950 ] == ip
1951
1952 def test_invalid_rfc822name(self, backend):
1953 cert = _load_cert(
1954 os.path.join(
1955 "x509", "custom", "san_rfc822_names.pem"
1956 ),
1957 x509.load_pem_x509_certificate,
1958 backend
1959 )
1960 with pytest.raises(ValueError) as exc:
1961 cert.extensions
1962
1963 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001964
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001965 def test_other_name(self, backend):
1966 cert = _load_cert(
1967 os.path.join(
1968 "x509", "custom", "san_other_name.pem"
1969 ),
1970 x509.load_pem_x509_certificate,
1971 backend
1972 )
1973
1974 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001975 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001976 )
1977 assert ext is not None
1978 assert ext.critical is False
1979
Joshua Taubererd2afad32015-07-06 22:37:53 +00001980 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1981 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001982 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001983 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001984
1985 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001986 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001987
Paul Kehrer94c69602015-05-02 19:29:40 -05001988
1989@pytest.mark.requires_backend_interface(interface=RSABackend)
1990@pytest.mark.requires_backend_interface(interface=X509Backend)
1991class TestExtendedKeyUsageExtension(object):
1992 def test_eku(self, backend):
1993 cert = _load_cert(
1994 os.path.join(
1995 "x509", "custom", "extended_key_usage.pem"
1996 ),
1997 x509.load_pem_x509_certificate,
1998 backend
1999 )
2000 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002001 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05002002 )
2003 assert ext is not None
2004 assert ext.critical is False
2005
2006 assert [
2007 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
2008 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
2009 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
2010 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
2011 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
2012 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
2013 x509.ObjectIdentifier("2.5.29.37.0"),
2014 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
2015 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002016
2017
2018class TestAccessDescription(object):
2019 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08002020 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002021 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
2022
2023 def test_invalid_access_location(self):
2024 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05002025 x509.AccessDescription(
2026 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
2027 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002028
Nick Bastind2ecf862015-12-13 05:44:46 -08002029 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08002030 ad = x509.AccessDescription(
2031 ObjectIdentifier("2.999.1"),
2032 x509.UniformResourceIdentifier(u"http://example.com")
2033 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002034 assert ad is not None
2035
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002036 def test_repr(self):
2037 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002038 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002039 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2040 )
2041 assert repr(ad) == (
2042 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2043 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2044 "(value=http://ocsp.domain.com)>)>"
2045 )
2046
2047 def test_eq(self):
2048 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002049 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002050 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2051 )
2052 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002053 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002054 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2055 )
2056 assert ad == ad2
2057
2058 def test_ne(self):
2059 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002060 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002061 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2062 )
2063 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002064 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002065 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2066 )
2067 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002068 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002069 x509.UniformResourceIdentifier(u"http://notthesame")
2070 )
2071 assert ad != ad2
2072 assert ad != ad3
2073 assert ad != object()
2074
2075
2076class TestAuthorityInformationAccess(object):
2077 def test_invalid_descriptions(self):
2078 with pytest.raises(TypeError):
2079 x509.AuthorityInformationAccess(["notanAccessDescription"])
2080
2081 def test_iter_len(self):
2082 aia = x509.AuthorityInformationAccess([
2083 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002084 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002085 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2086 ),
2087 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002088 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002089 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2090 )
2091 ])
2092 assert len(aia) == 2
2093 assert list(aia) == [
2094 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002095 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002096 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2097 ),
2098 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002099 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002100 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2101 )
2102 ]
2103
2104 def test_repr(self):
2105 aia = x509.AuthorityInformationAccess([
2106 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002107 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002108 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2109 ),
2110 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002111 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002112 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2113 )
2114 ])
2115 assert repr(aia) == (
2116 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2117 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2118 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2119 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2120 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2121 "fier(value=http://domain.com/ca.crt)>)>])>"
2122 )
2123
2124 def test_eq(self):
2125 aia = x509.AuthorityInformationAccess([
2126 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002127 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002128 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2129 ),
2130 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002131 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002132 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2133 )
2134 ])
2135 aia2 = x509.AuthorityInformationAccess([
2136 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002137 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002138 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2139 ),
2140 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002141 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002142 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2143 )
2144 ])
2145 assert aia == aia2
2146
2147 def test_ne(self):
2148 aia = x509.AuthorityInformationAccess([
2149 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002150 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002151 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2152 ),
2153 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002154 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002155 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2156 )
2157 ])
2158 aia2 = x509.AuthorityInformationAccess([
2159 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002160 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002161 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2162 ),
2163 ])
2164
2165 assert aia != aia2
2166 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002167
2168
2169@pytest.mark.requires_backend_interface(interface=RSABackend)
2170@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002171class TestAuthorityInformationAccessExtension(object):
2172 def test_aia_ocsp_ca_issuers(self, backend):
2173 cert = _load_cert(
2174 os.path.join("x509", "cryptography.io.pem"),
2175 x509.load_pem_x509_certificate,
2176 backend
2177 )
2178 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002179 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002180 )
2181 assert ext is not None
2182 assert ext.critical is False
2183
2184 assert ext.value == x509.AuthorityInformationAccess([
2185 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002186 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002187 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2188 ),
2189 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002190 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002191 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2192 ),
2193 ])
2194
2195 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2196 cert = _load_cert(
2197 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2198 x509.load_pem_x509_certificate,
2199 backend
2200 )
2201 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002202 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002203 )
2204 assert ext is not None
2205 assert ext.critical is False
2206
2207 assert ext.value == x509.AuthorityInformationAccess([
2208 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002209 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002210 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2211 ),
2212 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002213 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002214 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2215 ),
2216 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002217 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002218 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002219 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2220 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002221 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002222 ]))
2223 ),
2224 ])
2225
2226 def test_aia_ocsp_only(self, backend):
2227 cert = _load_cert(
2228 os.path.join("x509", "custom", "aia_ocsp.pem"),
2229 x509.load_pem_x509_certificate,
2230 backend
2231 )
2232 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002233 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002234 )
2235 assert ext is not None
2236 assert ext.critical is False
2237
2238 assert ext.value == x509.AuthorityInformationAccess([
2239 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002240 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002241 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2242 ),
2243 ])
2244
2245 def test_aia_ca_issuers_only(self, backend):
2246 cert = _load_cert(
2247 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2248 x509.load_pem_x509_certificate,
2249 backend
2250 )
2251 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002252 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002253 )
2254 assert ext is not None
2255 assert ext.critical is False
2256
2257 assert ext.value == x509.AuthorityInformationAccess([
2258 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002259 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002260 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002261 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2262 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002263 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002264 ]))
2265 ),
2266 ])
2267
2268
2269@pytest.mark.requires_backend_interface(interface=RSABackend)
2270@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002271class TestAuthorityKeyIdentifierExtension(object):
2272 def test_aki_keyid(self, backend):
2273 cert = _load_cert(
2274 os.path.join(
2275 "x509", "cryptography.io.pem"
2276 ),
2277 x509.load_pem_x509_certificate,
2278 backend
2279 )
2280 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002281 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002282 )
2283 assert ext is not None
2284 assert ext.critical is False
2285
2286 assert ext.value.key_identifier == (
2287 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2288 )
2289 assert ext.value.authority_cert_issuer is None
2290 assert ext.value.authority_cert_serial_number is None
2291
2292 def test_aki_all_fields(self, backend):
2293 cert = _load_cert(
2294 os.path.join(
2295 "x509", "custom", "authority_key_identifier.pem"
2296 ),
2297 x509.load_pem_x509_certificate,
2298 backend
2299 )
2300 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002301 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002302 )
2303 assert ext is not None
2304 assert ext.critical is False
2305
2306 assert ext.value.key_identifier == (
2307 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2308 )
2309 assert ext.value.authority_cert_issuer == [
2310 x509.DirectoryName(
2311 x509.Name([
2312 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002313 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002314 ),
2315 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002316 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002317 )
2318 ])
2319 )
2320 ]
2321 assert ext.value.authority_cert_serial_number == 3
2322
2323 def test_aki_no_keyid(self, backend):
2324 cert = _load_cert(
2325 os.path.join(
2326 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2327 ),
2328 x509.load_pem_x509_certificate,
2329 backend
2330 )
2331 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002332 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002333 )
2334 assert ext is not None
2335 assert ext.critical is False
2336
2337 assert ext.value.key_identifier is None
2338 assert ext.value.authority_cert_issuer == [
2339 x509.DirectoryName(
2340 x509.Name([
2341 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002342 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002343 ),
2344 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002345 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002346 )
2347 ])
2348 )
2349 ]
2350 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002351
Paul Kehrer253929a2015-08-05 17:30:39 +01002352 def test_from_certificate(self, backend):
2353 issuer_cert = _load_cert(
2354 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2355 x509.load_pem_x509_certificate,
2356 backend
2357 )
2358 cert = _load_cert(
2359 os.path.join("x509", "cryptography.io.pem"),
2360 x509.load_pem_x509_certificate,
2361 backend
2362 )
2363 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002364 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002365 )
2366 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2367 issuer_cert.public_key()
2368 )
2369 assert ext.value == aki
2370
Paul Kehrer5a485522015-05-06 00:29:12 -05002371
Paul Kehrere0017be2015-05-17 20:39:40 -06002372class TestNameConstraints(object):
2373 def test_ipaddress_wrong_type(self):
2374 with pytest.raises(TypeError):
2375 x509.NameConstraints(
2376 permitted_subtrees=[
2377 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2378 ],
2379 excluded_subtrees=None
2380 )
2381
2382 with pytest.raises(TypeError):
2383 x509.NameConstraints(
2384 permitted_subtrees=None,
2385 excluded_subtrees=[
2386 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2387 ]
2388 )
2389
2390 def test_ipaddress_allowed_type(self):
2391 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2392 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2393 nc = x509.NameConstraints(
2394 permitted_subtrees=permitted,
2395 excluded_subtrees=excluded
2396 )
2397 assert nc.permitted_subtrees == permitted
2398 assert nc.excluded_subtrees == excluded
2399
2400 def test_invalid_permitted_subtrees(self):
2401 with pytest.raises(TypeError):
2402 x509.NameConstraints("badpermitted", None)
2403
2404 def test_invalid_excluded_subtrees(self):
2405 with pytest.raises(TypeError):
2406 x509.NameConstraints(None, "badexcluded")
2407
2408 def test_no_subtrees(self):
2409 with pytest.raises(ValueError):
2410 x509.NameConstraints(None, None)
2411
2412 def test_permitted_none(self):
2413 excluded = [x509.DNSName(u"name.local")]
2414 nc = x509.NameConstraints(
2415 permitted_subtrees=None, excluded_subtrees=excluded
2416 )
2417 assert nc.permitted_subtrees is None
2418 assert nc.excluded_subtrees is not None
2419
2420 def test_excluded_none(self):
2421 permitted = [x509.DNSName(u"name.local")]
2422 nc = x509.NameConstraints(
2423 permitted_subtrees=permitted, excluded_subtrees=None
2424 )
2425 assert nc.permitted_subtrees is not None
2426 assert nc.excluded_subtrees is None
2427
2428 def test_repr(self):
2429 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2430 nc = x509.NameConstraints(
2431 permitted_subtrees=permitted,
2432 excluded_subtrees=None
2433 )
2434 assert repr(nc) == (
2435 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2436 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2437 )
2438
Paul Kehrer31894282015-06-21 21:46:41 -05002439 def test_eq(self):
2440 nc = x509.NameConstraints(
2441 permitted_subtrees=[x509.DNSName(u"name.local")],
2442 excluded_subtrees=[x509.DNSName(u"name2.local")]
2443 )
2444 nc2 = x509.NameConstraints(
2445 permitted_subtrees=[x509.DNSName(u"name.local")],
2446 excluded_subtrees=[x509.DNSName(u"name2.local")]
2447 )
2448 assert nc == nc2
2449
2450 def test_ne(self):
2451 nc = x509.NameConstraints(
2452 permitted_subtrees=[x509.DNSName(u"name.local")],
2453 excluded_subtrees=[x509.DNSName(u"name2.local")]
2454 )
2455 nc2 = x509.NameConstraints(
2456 permitted_subtrees=[x509.DNSName(u"name.local")],
2457 excluded_subtrees=None
2458 )
2459 nc3 = x509.NameConstraints(
2460 permitted_subtrees=None,
2461 excluded_subtrees=[x509.DNSName(u"name2.local")]
2462 )
2463
2464 assert nc != nc2
2465 assert nc != nc3
2466 assert nc != object()
2467
Paul Kehrere0017be2015-05-17 20:39:40 -06002468
Paul Kehrer870d7e82015-06-21 22:20:44 -05002469@pytest.mark.requires_backend_interface(interface=RSABackend)
2470@pytest.mark.requires_backend_interface(interface=X509Backend)
2471class TestNameConstraintsExtension(object):
2472 def test_permitted_excluded(self, backend):
2473 cert = _load_cert(
2474 os.path.join(
2475 "x509", "custom", "nc_permitted_excluded_2.pem"
2476 ),
2477 x509.load_pem_x509_certificate,
2478 backend
2479 )
2480 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002481 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002482 ).value
2483 assert nc == x509.NameConstraints(
2484 permitted_subtrees=[
2485 x509.DNSName(u"zombo.local"),
2486 ],
2487 excluded_subtrees=[
2488 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002489 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002490 ]))
2491 ]
2492 )
2493
2494 def test_permitted(self, backend):
2495 cert = _load_cert(
2496 os.path.join(
2497 "x509", "custom", "nc_permitted_2.pem"
2498 ),
2499 x509.load_pem_x509_certificate,
2500 backend
2501 )
2502 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002503 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002504 ).value
2505 assert nc == x509.NameConstraints(
2506 permitted_subtrees=[
2507 x509.DNSName(u"zombo.local"),
2508 ],
2509 excluded_subtrees=None
2510 )
2511
Paul Kehrer42376832015-07-01 18:10:32 -05002512 def test_permitted_with_leading_period(self, backend):
2513 cert = _load_cert(
2514 os.path.join(
2515 "x509", "custom", "nc_permitted.pem"
2516 ),
2517 x509.load_pem_x509_certificate,
2518 backend
2519 )
2520 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002521 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002522 ).value
2523 assert nc == x509.NameConstraints(
2524 permitted_subtrees=[
2525 x509.DNSName(u".cryptography.io"),
2526 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2527 ],
2528 excluded_subtrees=None
2529 )
2530
2531 def test_excluded_with_leading_period(self, backend):
2532 cert = _load_cert(
2533 os.path.join(
2534 "x509", "custom", "nc_excluded.pem"
2535 ),
2536 x509.load_pem_x509_certificate,
2537 backend
2538 )
2539 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002540 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002541 ).value
2542 assert nc == x509.NameConstraints(
2543 permitted_subtrees=None,
2544 excluded_subtrees=[
2545 x509.DNSName(u".cryptography.io"),
2546 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2547 ]
2548 )
2549
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002550 def test_permitted_excluded_with_ips(self, backend):
2551 cert = _load_cert(
2552 os.path.join(
2553 "x509", "custom", "nc_permitted_excluded.pem"
2554 ),
2555 x509.load_pem_x509_certificate,
2556 backend
2557 )
2558 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002559 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002560 ).value
2561 assert nc == x509.NameConstraints(
2562 permitted_subtrees=[
2563 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2564 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2565 ],
2566 excluded_subtrees=[
2567 x509.DNSName(u".domain.com"),
2568 x509.UniformResourceIdentifier(u"http://test.local"),
2569 ]
2570 )
2571
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002572 def test_single_ip_netmask(self, backend):
2573 cert = _load_cert(
2574 os.path.join(
2575 "x509", "custom", "nc_single_ip_netmask.pem"
2576 ),
2577 x509.load_pem_x509_certificate,
2578 backend
2579 )
2580 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002581 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002582 ).value
2583 assert nc == x509.NameConstraints(
2584 permitted_subtrees=[
2585 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2586 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2587 ],
2588 excluded_subtrees=None
2589 )
2590
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002591 def test_invalid_netmask(self, backend):
2592 cert = _load_cert(
2593 os.path.join(
2594 "x509", "custom", "nc_invalid_ip_netmask.pem"
2595 ),
2596 x509.load_pem_x509_certificate,
2597 backend
2598 )
2599 with pytest.raises(ValueError):
2600 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002601 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002602 )
2603
Paul Kehrer870d7e82015-06-21 22:20:44 -05002604
Paul Kehrer5a485522015-05-06 00:29:12 -05002605class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002606 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002607 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002608 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002609
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002610 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002611 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002612 x509.DistributionPoint(None, "notname", None, None)
2613
2614 def test_distribution_point_full_and_relative_not_none(self):
2615 with pytest.raises(ValueError):
2616 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002617
2618 def test_crl_issuer_not_general_names(self):
2619 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002620 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002621
2622 def test_reason_not_reasonflags(self):
2623 with pytest.raises(TypeError):
2624 x509.DistributionPoint(
2625 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002626 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002627 frozenset(["notreasonflags"]),
2628 None
2629 )
2630
2631 def test_reason_not_frozenset(self):
2632 with pytest.raises(TypeError):
2633 x509.DistributionPoint(
2634 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2635 None,
2636 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002637 None
2638 )
2639
2640 def test_disallowed_reasons(self):
2641 with pytest.raises(ValueError):
2642 x509.DistributionPoint(
2643 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2644 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002645 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002646 None
2647 )
2648
2649 with pytest.raises(ValueError):
2650 x509.DistributionPoint(
2651 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2652 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002653 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002654 None
2655 )
2656
2657 def test_reason_only(self):
2658 with pytest.raises(ValueError):
2659 x509.DistributionPoint(
2660 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002661 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002662 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002663 None
2664 )
2665
2666 def test_eq(self):
2667 dp = x509.DistributionPoint(
2668 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002669 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002670 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002671 [
2672 x509.DirectoryName(
2673 x509.Name([
2674 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002675 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002676 )
2677 ])
2678 )
2679 ],
2680 )
2681 dp2 = x509.DistributionPoint(
2682 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002683 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002684 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002685 [
2686 x509.DirectoryName(
2687 x509.Name([
2688 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002689 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002690 )
2691 ])
2692 )
2693 ],
2694 )
2695 assert dp == dp2
2696
2697 def test_ne(self):
2698 dp = x509.DistributionPoint(
2699 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002700 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002701 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002702 [
2703 x509.DirectoryName(
2704 x509.Name([
2705 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002706 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002707 )
2708 ])
2709 )
2710 ],
2711 )
2712 dp2 = x509.DistributionPoint(
2713 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2714 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002715 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002716 None
2717 )
2718 assert dp != dp2
2719 assert dp != object()
2720
2721 def test_repr(self):
2722 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002723 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002724 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002725 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002726 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002727 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002728 [
2729 x509.DirectoryName(
2730 x509.Name([
2731 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002732 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002733 )
2734 ])
2735 )
2736 ],
2737 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002738 if six.PY3:
2739 assert repr(dp) == (
2740 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2741 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002742 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2743 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2744 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2745 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002746 )
2747 else:
2748 assert repr(dp) == (
2749 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2750 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002751 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2752 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2753 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2754 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002755 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002756
2757
2758class TestCRLDistributionPoints(object):
2759 def test_invalid_distribution_points(self):
2760 with pytest.raises(TypeError):
2761 x509.CRLDistributionPoints(["notadistributionpoint"])
2762
2763 def test_iter_len(self):
2764 cdp = x509.CRLDistributionPoints([
2765 x509.DistributionPoint(
2766 [x509.UniformResourceIdentifier(u"http://domain")],
2767 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002768 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002769 None
2770 ),
2771 x509.DistributionPoint(
2772 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002773 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002774 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002775 x509.ReasonFlags.key_compromise,
2776 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002777 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002778 None
2779 ),
2780 ])
2781 assert len(cdp) == 2
2782 assert list(cdp) == [
2783 x509.DistributionPoint(
2784 [x509.UniformResourceIdentifier(u"http://domain")],
2785 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002786 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002787 None
2788 ),
2789 x509.DistributionPoint(
2790 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002791 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002792 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002793 x509.ReasonFlags.key_compromise,
2794 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002795 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002796 None
2797 ),
2798 ]
2799
2800 def test_repr(self):
2801 cdp = x509.CRLDistributionPoints([
2802 x509.DistributionPoint(
2803 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002804 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002805 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002806 None
2807 ),
2808 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002809 if six.PY3:
2810 assert repr(cdp) == (
2811 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2812 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2813 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2814 "romise'>}), crl_issuer=None)>])>"
2815 )
2816 else:
2817 assert repr(cdp) == (
2818 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2819 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2820 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2821 "romise'>]), crl_issuer=None)>])>"
2822 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002823
2824 def test_eq(self):
2825 cdp = x509.CRLDistributionPoints([
2826 x509.DistributionPoint(
2827 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002828 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002829 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002830 x509.ReasonFlags.key_compromise,
2831 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002832 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002833 [x509.UniformResourceIdentifier(u"uri://thing")],
2834 ),
2835 ])
2836 cdp2 = x509.CRLDistributionPoints([
2837 x509.DistributionPoint(
2838 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002839 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002840 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002841 x509.ReasonFlags.key_compromise,
2842 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002843 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002844 [x509.UniformResourceIdentifier(u"uri://thing")],
2845 ),
2846 ])
2847 assert cdp == cdp2
2848
2849 def test_ne(self):
2850 cdp = x509.CRLDistributionPoints([
2851 x509.DistributionPoint(
2852 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002853 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002854 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002855 x509.ReasonFlags.key_compromise,
2856 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002857 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002858 [x509.UniformResourceIdentifier(u"uri://thing")],
2859 ),
2860 ])
2861 cdp2 = x509.CRLDistributionPoints([
2862 x509.DistributionPoint(
2863 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002864 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002865 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002866 x509.ReasonFlags.key_compromise,
2867 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002868 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002869 [x509.UniformResourceIdentifier(u"uri://thing")],
2870 ),
2871 ])
2872 cdp3 = x509.CRLDistributionPoints([
2873 x509.DistributionPoint(
2874 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002875 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002876 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002877 [x509.UniformResourceIdentifier(u"uri://thing")],
2878 ),
2879 ])
2880 cdp4 = x509.CRLDistributionPoints([
2881 x509.DistributionPoint(
2882 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002883 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002884 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002885 x509.ReasonFlags.key_compromise,
2886 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002887 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002888 [x509.UniformResourceIdentifier(u"uri://thing2")],
2889 ),
2890 ])
2891 assert cdp != cdp2
2892 assert cdp != cdp3
2893 assert cdp != cdp4
2894 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002895
2896
2897@pytest.mark.requires_backend_interface(interface=RSABackend)
2898@pytest.mark.requires_backend_interface(interface=X509Backend)
2899class TestCRLDistributionPointsExtension(object):
2900 def test_fullname_and_crl_issuer(self, backend):
2901 cert = _load_cert(
2902 os.path.join(
2903 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2904 ),
2905 x509.load_der_x509_certificate,
2906 backend
2907 )
2908
2909 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002910 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002911 ).value
2912
2913 assert cdps == x509.CRLDistributionPoints([
2914 x509.DistributionPoint(
2915 full_name=[x509.DirectoryName(
2916 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002917 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002918 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002919 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002920 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002921 ),
2922 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002923 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002924 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002925 ),
2926 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002927 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002928 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002929 ),
2930 ])
2931 )],
2932 relative_name=None,
2933 reasons=None,
2934 crl_issuer=[x509.DirectoryName(
2935 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002936 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002937 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002938 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002939 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002940 ),
2941 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002942 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002943 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002944 ),
2945 ])
2946 )],
2947 )
2948 ])
2949
2950 def test_relativename_and_crl_issuer(self, backend):
2951 cert = _load_cert(
2952 os.path.join(
2953 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2954 ),
2955 x509.load_der_x509_certificate,
2956 backend
2957 )
2958
2959 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002960 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002961 ).value
2962
2963 assert cdps == x509.CRLDistributionPoints([
2964 x509.DistributionPoint(
2965 full_name=None,
2966 relative_name=x509.Name([
2967 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002968 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002969 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002970 ),
2971 ]),
2972 reasons=None,
2973 crl_issuer=[x509.DirectoryName(
2974 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002975 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002976 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002977 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002978 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002979 ),
2980 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002981 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002982 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002983 ),
2984 ])
2985 )],
2986 )
2987 ])
2988
2989 def test_fullname_crl_issuer_reasons(self, backend):
2990 cert = _load_cert(
2991 os.path.join(
2992 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2993 ),
2994 x509.load_pem_x509_certificate,
2995 backend
2996 )
2997
2998 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002999 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003000 ).value
3001
3002 assert cdps == x509.CRLDistributionPoints([
3003 x509.DistributionPoint(
3004 full_name=[x509.UniformResourceIdentifier(
3005 u"http://myhost.com/myca.crl"
3006 )],
3007 relative_name=None,
3008 reasons=frozenset([
3009 x509.ReasonFlags.key_compromise,
3010 x509.ReasonFlags.ca_compromise
3011 ]),
3012 crl_issuer=[x509.DirectoryName(
3013 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05003014 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05003015 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003016 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003017 ),
3018 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003019 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003020 ),
3021 ])
3022 )],
3023 )
3024 ])
3025
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003026 def test_all_reasons(self, backend):
3027 cert = _load_cert(
3028 os.path.join(
3029 "x509", "custom", "cdp_all_reasons.pem"
3030 ),
3031 x509.load_pem_x509_certificate,
3032 backend
3033 )
3034
3035 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003036 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003037 ).value
3038
3039 assert cdps == x509.CRLDistributionPoints([
3040 x509.DistributionPoint(
3041 full_name=[x509.UniformResourceIdentifier(
3042 u"http://domain.com/some.crl"
3043 )],
3044 relative_name=None,
3045 reasons=frozenset([
3046 x509.ReasonFlags.key_compromise,
3047 x509.ReasonFlags.ca_compromise,
3048 x509.ReasonFlags.affiliation_changed,
3049 x509.ReasonFlags.superseded,
3050 x509.ReasonFlags.privilege_withdrawn,
3051 x509.ReasonFlags.cessation_of_operation,
3052 x509.ReasonFlags.aa_compromise,
3053 x509.ReasonFlags.certificate_hold,
3054 ]),
3055 crl_issuer=None
3056 )
3057 ])
3058
3059 def test_single_reason(self, backend):
3060 cert = _load_cert(
3061 os.path.join(
3062 "x509", "custom", "cdp_reason_aa_compromise.pem"
3063 ),
3064 x509.load_pem_x509_certificate,
3065 backend
3066 )
3067
3068 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003069 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003070 ).value
3071
3072 assert cdps == x509.CRLDistributionPoints([
3073 x509.DistributionPoint(
3074 full_name=[x509.UniformResourceIdentifier(
3075 u"http://domain.com/some.crl"
3076 )],
3077 relative_name=None,
3078 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3079 crl_issuer=None
3080 )
3081 ])
3082
Paul Kehrer9a10d592015-05-10 14:55:51 -05003083 def test_crl_issuer_only(self, backend):
3084 cert = _load_cert(
3085 os.path.join(
3086 "x509", "custom", "cdp_crl_issuer.pem"
3087 ),
3088 x509.load_pem_x509_certificate,
3089 backend
3090 )
3091
3092 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003093 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003094 ).value
3095
3096 assert cdps == x509.CRLDistributionPoints([
3097 x509.DistributionPoint(
3098 full_name=None,
3099 relative_name=None,
3100 reasons=None,
3101 crl_issuer=[x509.DirectoryName(
3102 x509.Name([
3103 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003104 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003105 ),
3106 ])
3107 )],
3108 )
3109 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003110
Dominic Chen87bb9572015-10-09 00:23:07 -04003111 def test_crl_empty_hostname(self, backend):
3112 cert = _load_cert(
3113 os.path.join(
3114 "x509", "custom", "cdp_empty_hostname.pem"
3115 ),
3116 x509.load_pem_x509_certificate,
3117 backend
3118 )
3119
3120 cdps = cert.extensions.get_extension_for_oid(
3121 ExtensionOID.CRL_DISTRIBUTION_POINTS
3122 ).value
3123
3124 assert cdps == x509.CRLDistributionPoints([
3125 x509.DistributionPoint(
3126 full_name=[x509.UniformResourceIdentifier(
3127 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3128 )],
3129 relative_name=None,
3130 reasons=None,
3131 crl_issuer=None
3132 )
3133 ])
3134
Paul Kehrer16fae762015-05-01 23:14:20 -05003135
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003136@pytest.mark.requires_backend_interface(interface=RSABackend)
3137@pytest.mark.requires_backend_interface(interface=X509Backend)
3138class TestOCSPNoCheckExtension(object):
3139 def test_nocheck(self, backend):
3140 cert = _load_cert(
3141 os.path.join(
3142 "x509", "custom", "ocsp_nocheck.pem"
3143 ),
3144 x509.load_pem_x509_certificate,
3145 backend
3146 )
3147 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003148 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003149 )
3150 assert isinstance(ext.value, x509.OCSPNoCheck)
3151
3152
Paul Kehrer16fae762015-05-01 23:14:20 -05003153class TestInhibitAnyPolicy(object):
3154 def test_not_int(self):
3155 with pytest.raises(TypeError):
3156 x509.InhibitAnyPolicy("notint")
3157
3158 def test_negative_int(self):
3159 with pytest.raises(ValueError):
3160 x509.InhibitAnyPolicy(-1)
3161
3162 def test_repr(self):
3163 iap = x509.InhibitAnyPolicy(0)
3164 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3165
3166 def test_eq(self):
3167 iap = x509.InhibitAnyPolicy(1)
3168 iap2 = x509.InhibitAnyPolicy(1)
3169 assert iap == iap2
3170
3171 def test_ne(self):
3172 iap = x509.InhibitAnyPolicy(1)
3173 iap2 = x509.InhibitAnyPolicy(4)
3174 assert iap != iap2
3175 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003176
3177
3178@pytest.mark.requires_backend_interface(interface=RSABackend)
3179@pytest.mark.requires_backend_interface(interface=X509Backend)
3180class TestInhibitAnyPolicyExtension(object):
3181 def test_nocheck(self, backend):
3182 cert = _load_cert(
3183 os.path.join(
3184 "x509", "custom", "inhibit_any_policy_5.pem"
3185 ),
3186 x509.load_pem_x509_certificate,
3187 backend
3188 )
3189 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003190 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003191 ).value
3192 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003193
3194
3195@pytest.mark.requires_backend_interface(interface=RSABackend)
3196@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003197class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003198 def test_invalid_certificate_policies_data(self, backend):
3199 cert = _load_cert(
3200 os.path.join(
3201 "x509", "custom", "cp_invalid.pem"
3202 ),
3203 x509.load_pem_x509_certificate,
3204 backend
3205 )
3206 with pytest.raises(ValueError):
3207 cert.extensions