blob: d0f4cac9acba8755f8921e81f5e5995ab042333e [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 Kehrer2b622582015-04-15 11:04:29 -0400168class TestNoticeReference(object):
169 def test_notice_numbers_not_all_int(self):
170 with pytest.raises(TypeError):
171 x509.NoticeReference("org", [1, 2, "three"])
172
173 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500174 with pytest.raises(TypeError):
175 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400176
177 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500178 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400179
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500180 if six.PY3:
181 assert repr(nr) == (
182 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
183 "])>"
184 )
185 else:
186 assert repr(nr) == (
187 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
188 "4])>"
189 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400190
Paul Kehrerc56ab622015-05-03 09:56:31 -0500191 def test_eq(self):
192 nr = x509.NoticeReference("org", [1, 2])
193 nr2 = x509.NoticeReference("org", [1, 2])
194 assert nr == nr2
195
196 def test_ne(self):
197 nr = x509.NoticeReference("org", [1, 2])
198 nr2 = x509.NoticeReference("org", [1])
199 nr3 = x509.NoticeReference(None, [1, 2])
200 assert nr != nr2
201 assert nr != nr3
202 assert nr != object()
203
Paul Kehrer2b622582015-04-15 11:04:29 -0400204
205class TestUserNotice(object):
206 def test_notice_reference_invalid(self):
207 with pytest.raises(TypeError):
208 x509.UserNotice("invalid", None)
209
210 def test_notice_reference_none(self):
211 un = x509.UserNotice(None, "text")
212 assert un.notice_reference is None
213 assert un.explicit_text == "text"
214
215 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500216 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500217 if six.PY3:
218 assert repr(un) == (
219 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500220 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500221 )
222 else:
223 assert repr(un) == (
224 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500225 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500226 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400227
Paul Kehrerc56ab622015-05-03 09:56:31 -0500228 def test_eq(self):
229 nr = x509.NoticeReference("org", [1, 2])
230 nr2 = x509.NoticeReference("org", [1, 2])
231 un = x509.UserNotice(nr, "text")
232 un2 = x509.UserNotice(nr2, "text")
233 assert un == un2
234
235 def test_ne(self):
236 nr = x509.NoticeReference("org", [1, 2])
237 nr2 = x509.NoticeReference("org", [1])
238 un = x509.UserNotice(nr, "text")
239 un2 = x509.UserNotice(nr2, "text")
240 un3 = x509.UserNotice(nr, "text3")
241 assert un != un2
242 assert un != un3
243 assert un != object()
244
Paul Kehrer2b622582015-04-15 11:04:29 -0400245
Paul Kehrer2b622582015-04-15 11:04:29 -0400246class TestPolicyInformation(object):
247 def test_invalid_policy_identifier(self):
248 with pytest.raises(TypeError):
249 x509.PolicyInformation("notanoid", None)
250
251 def test_none_policy_qualifiers(self):
252 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
253 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
254 assert pi.policy_qualifiers is None
255
256 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500257 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400258 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
259 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
260 assert pi.policy_qualifiers == pq
261
262 def test_invalid_policy_identifiers(self):
263 with pytest.raises(TypeError):
264 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
265
266 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500267 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400268 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500269 if six.PY3:
270 assert repr(pi) == (
271 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
272 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500273 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500274 )
275 else:
276 assert repr(pi) == (
277 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
278 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500279 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500280 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400281
Paul Kehrerc56ab622015-05-03 09:56:31 -0500282 def test_eq(self):
283 pi = x509.PolicyInformation(
284 x509.ObjectIdentifier("1.2.3"),
285 [u"string", x509.UserNotice(None, u"hi")]
286 )
287 pi2 = x509.PolicyInformation(
288 x509.ObjectIdentifier("1.2.3"),
289 [u"string", x509.UserNotice(None, u"hi")]
290 )
291 assert pi == pi2
292
293 def test_ne(self):
294 pi = x509.PolicyInformation(
295 x509.ObjectIdentifier("1.2.3"), [u"string"]
296 )
297 pi2 = x509.PolicyInformation(
298 x509.ObjectIdentifier("1.2.3"), [u"string2"]
299 )
300 pi3 = x509.PolicyInformation(
301 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
302 )
303 assert pi != pi2
304 assert pi != pi3
305 assert pi != object()
306
Paul Kehrer2b622582015-04-15 11:04:29 -0400307
308class TestCertificatePolicies(object):
309 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500310 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400311 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
312 with pytest.raises(TypeError):
313 x509.CertificatePolicies([1, pi])
314
315 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500316 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400317 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
318 cp = x509.CertificatePolicies([pi])
319 assert len(cp) == 1
320 for policyinfo in cp:
321 assert policyinfo == pi
322
323 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500324 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400325 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
326 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500327 if six.PY3:
328 assert repr(cp) == (
329 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
330 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
331 "ers=['string'])>])>"
332 )
333 else:
334 assert repr(cp) == (
335 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
336 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
337 "ers=[u'string'])>])>"
338 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400339
Paul Kehrerc56ab622015-05-03 09:56:31 -0500340 def test_eq(self):
341 pi = x509.PolicyInformation(
342 x509.ObjectIdentifier("1.2.3"), [u"string"]
343 )
344 cp = x509.CertificatePolicies([pi])
345 pi2 = x509.PolicyInformation(
346 x509.ObjectIdentifier("1.2.3"), [u"string"]
347 )
348 cp2 = x509.CertificatePolicies([pi2])
349 assert cp == cp2
350
351 def test_ne(self):
352 pi = x509.PolicyInformation(
353 x509.ObjectIdentifier("1.2.3"), [u"string"]
354 )
355 cp = x509.CertificatePolicies([pi])
356 pi2 = x509.PolicyInformation(
357 x509.ObjectIdentifier("1.2.3"), [u"string2"]
358 )
359 cp2 = x509.CertificatePolicies([pi2])
360 assert cp != cp2
361 assert cp != object()
362
Paul Kehrer2b622582015-04-15 11:04:29 -0400363
Paul Kehrer11026fe2015-05-12 11:23:56 -0500364@pytest.mark.requires_backend_interface(interface=RSABackend)
365@pytest.mark.requires_backend_interface(interface=X509Backend)
366class TestCertificatePoliciesExtension(object):
367 def test_cps_uri_policy_qualifier(self, backend):
368 cert = _load_cert(
369 os.path.join("x509", "custom", "cp_cps_uri.pem"),
370 x509.load_pem_x509_certificate,
371 backend
372 )
373
374 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500375 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500376 ).value
377
378 assert cp == x509.CertificatePolicies([
379 x509.PolicyInformation(
380 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
381 [u"http://other.com/cps"]
382 )
383 ])
384
385 def test_user_notice_with_notice_reference(self, backend):
386 cert = _load_cert(
387 os.path.join(
388 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
389 ),
390 x509.load_pem_x509_certificate,
391 backend
392 )
393
394 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500395 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500396 ).value
397
398 assert cp == x509.CertificatePolicies([
399 x509.PolicyInformation(
400 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
401 [
402 u"http://example.com/cps",
403 u"http://other.com/cps",
404 x509.UserNotice(
405 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
406 u"thing"
407 )
408 ]
409 )
410 ])
411
412 def test_user_notice_with_explicit_text(self, backend):
413 cert = _load_cert(
414 os.path.join(
415 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
416 ),
417 x509.load_pem_x509_certificate,
418 backend
419 )
420
421 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500422 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500423 ).value
424
425 assert cp == x509.CertificatePolicies([
426 x509.PolicyInformation(
427 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
428 [x509.UserNotice(None, u"thing")]
429 )
430 ])
431
432 def test_user_notice_no_explicit_text(self, backend):
433 cert = _load_cert(
434 os.path.join(
435 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
436 ),
437 x509.load_pem_x509_certificate,
438 backend
439 )
440
441 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500442 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500443 ).value
444
445 assert cp == x509.CertificatePolicies([
446 x509.PolicyInformation(
447 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
448 [
449 x509.UserNotice(
450 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
451 None
452 )
453 ]
454 )
455 ])
456
457
Paul Kehrercecbbba2015-03-30 14:58:38 -0500458class TestKeyUsage(object):
459 def test_key_agreement_false_encipher_decipher_true(self):
460 with pytest.raises(ValueError):
461 x509.KeyUsage(
462 digital_signature=False,
463 content_commitment=False,
464 key_encipherment=False,
465 data_encipherment=False,
466 key_agreement=False,
467 key_cert_sign=False,
468 crl_sign=False,
469 encipher_only=True,
470 decipher_only=False
471 )
472
473 with pytest.raises(ValueError):
474 x509.KeyUsage(
475 digital_signature=False,
476 content_commitment=False,
477 key_encipherment=False,
478 data_encipherment=False,
479 key_agreement=False,
480 key_cert_sign=False,
481 crl_sign=False,
482 encipher_only=True,
483 decipher_only=True
484 )
485
486 with pytest.raises(ValueError):
487 x509.KeyUsage(
488 digital_signature=False,
489 content_commitment=False,
490 key_encipherment=False,
491 data_encipherment=False,
492 key_agreement=False,
493 key_cert_sign=False,
494 crl_sign=False,
495 encipher_only=False,
496 decipher_only=True
497 )
498
499 def test_properties_key_agreement_true(self):
500 ku = x509.KeyUsage(
501 digital_signature=True,
502 content_commitment=True,
503 key_encipherment=False,
504 data_encipherment=False,
505 key_agreement=False,
506 key_cert_sign=True,
507 crl_sign=False,
508 encipher_only=False,
509 decipher_only=False
510 )
511 assert ku.digital_signature is True
512 assert ku.content_commitment is True
513 assert ku.key_encipherment is False
514 assert ku.data_encipherment is False
515 assert ku.key_agreement is False
516 assert ku.key_cert_sign is True
517 assert ku.crl_sign is False
518
519 def test_key_agreement_true_properties(self):
520 ku = x509.KeyUsage(
521 digital_signature=False,
522 content_commitment=False,
523 key_encipherment=False,
524 data_encipherment=False,
525 key_agreement=True,
526 key_cert_sign=False,
527 crl_sign=False,
528 encipher_only=False,
529 decipher_only=True
530 )
531 assert ku.key_agreement is True
532 assert ku.encipher_only is False
533 assert ku.decipher_only is True
534
535 def test_key_agreement_false_properties(self):
536 ku = x509.KeyUsage(
537 digital_signature=False,
538 content_commitment=False,
539 key_encipherment=False,
540 data_encipherment=False,
541 key_agreement=False,
542 key_cert_sign=False,
543 crl_sign=False,
544 encipher_only=False,
545 decipher_only=False
546 )
547 assert ku.key_agreement is False
548 with pytest.raises(ValueError):
549 ku.encipher_only
550
551 with pytest.raises(ValueError):
552 ku.decipher_only
553
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500554 def test_repr_key_agreement_false(self):
555 ku = x509.KeyUsage(
556 digital_signature=True,
557 content_commitment=True,
558 key_encipherment=False,
559 data_encipherment=False,
560 key_agreement=False,
561 key_cert_sign=True,
562 crl_sign=False,
563 encipher_only=False,
564 decipher_only=False
565 )
566 assert repr(ku) == (
567 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
568 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400569 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
570 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500571 )
572
573 def test_repr_key_agreement_true(self):
574 ku = x509.KeyUsage(
575 digital_signature=True,
576 content_commitment=True,
577 key_encipherment=False,
578 data_encipherment=False,
579 key_agreement=True,
580 key_cert_sign=True,
581 crl_sign=False,
582 encipher_only=False,
583 decipher_only=False
584 )
585 assert repr(ku) == (
586 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
587 "cipherment=False, data_encipherment=False, key_agreement=True, k"
588 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
589 "only=False)>"
590 )
591
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500592 def test_eq(self):
593 ku = x509.KeyUsage(
594 digital_signature=False,
595 content_commitment=False,
596 key_encipherment=False,
597 data_encipherment=False,
598 key_agreement=True,
599 key_cert_sign=False,
600 crl_sign=False,
601 encipher_only=False,
602 decipher_only=True
603 )
604 ku2 = x509.KeyUsage(
605 digital_signature=False,
606 content_commitment=False,
607 key_encipherment=False,
608 data_encipherment=False,
609 key_agreement=True,
610 key_cert_sign=False,
611 crl_sign=False,
612 encipher_only=False,
613 decipher_only=True
614 )
615 assert ku == ku2
616
617 def test_ne(self):
618 ku = x509.KeyUsage(
619 digital_signature=False,
620 content_commitment=False,
621 key_encipherment=False,
622 data_encipherment=False,
623 key_agreement=True,
624 key_cert_sign=False,
625 crl_sign=False,
626 encipher_only=False,
627 decipher_only=True
628 )
629 ku2 = x509.KeyUsage(
630 digital_signature=False,
631 content_commitment=False,
632 key_encipherment=False,
633 data_encipherment=False,
634 key_agreement=False,
635 key_cert_sign=False,
636 crl_sign=False,
637 encipher_only=False,
638 decipher_only=False
639 )
640 assert ku != ku2
641 assert ku != object()
642
Paul Kehrercecbbba2015-03-30 14:58:38 -0500643
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500644class TestSubjectKeyIdentifier(object):
645 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400646 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500647 ski = x509.SubjectKeyIdentifier(value)
648 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500649
650 def test_repr(self):
651 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500652 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500653 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500654 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400655 if six.PY3:
656 assert repr(ext) == (
657 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
658 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
659 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
660 "\\xf7\\xff:\\xc9\')>)>"
661 )
662 else:
663 assert repr(ext) == (
664 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
665 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
666 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
667 "\\xf7\\xff:\\xc9\')>)>"
668 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500669
670 def test_eq(self):
671 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500672 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500673 )
674 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500675 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500676 )
677 assert ski == ski2
678
679 def test_ne(self):
680 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500681 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500682 )
683 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500684 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500685 )
686 assert ski != ski2
687 assert ski != object()
688
689
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400690class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500691 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400692 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500693 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400694
695 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500696 dirname = x509.DirectoryName(
697 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800698 x509.NameAttribute(
699 x509.ObjectIdentifier('2.999.1'),
700 u'value1'
701 ),
702 x509.NameAttribute(
703 x509.ObjectIdentifier('2.999.2'),
704 u'value2'
705 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500706 ])
707 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400708 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500709 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400710
711 def test_authority_issuer_none_serial_not_none(self):
712 with pytest.raises(ValueError):
713 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
714
715 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500716 dirname = x509.DirectoryName(
717 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800718 x509.NameAttribute(
719 x509.ObjectIdentifier('2.999.1'),
720 u'value1'
721 ),
722 x509.NameAttribute(
723 x509.ObjectIdentifier('2.999.2'),
724 u'value2'
725 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500726 ])
727 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400728 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500729 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400730
731 def test_authority_cert_serial_and_issuer_none(self):
732 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
733 assert aki.key_identifier == b"id"
734 assert aki.authority_cert_issuer is None
735 assert aki.authority_cert_serial_number is None
736
737 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500738 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500739 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500740 )
741 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400742
743 if six.PY3:
744 assert repr(aki) == (
745 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500746 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500747 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500748 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400749 )
750 else:
751 assert repr(aki) == (
752 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500753 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500754 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
755 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400756 )
757
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500758 def test_eq(self):
759 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500760 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500761 )
762 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
763 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500764 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500765 )
766 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
767 assert aki == aki2
768
769 def test_ne(self):
770 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500771 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500772 )
773 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500774 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500775 )
776 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
777 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
778 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
779 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
780 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
781 assert aki != aki2
782 assert aki != aki3
783 assert aki != aki4
784 assert aki != aki5
785 assert aki != object()
786
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400787
Paul Kehrer8cf26422015-03-21 09:50:24 -0500788class TestBasicConstraints(object):
789 def test_ca_not_boolean(self):
790 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500791 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500792
793 def test_path_length_not_ca(self):
794 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500795 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500796
797 def test_path_length_not_int(self):
798 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500799 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500800
801 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500802 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500803
804 def test_path_length_negative(self):
805 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500806 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500807
808 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500809 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500810 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500811 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500812 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500813
Paul Kehrer3a69b132015-05-13 10:03:46 -0500814 def test_eq(self):
815 na = x509.BasicConstraints(ca=True, path_length=None)
816 na2 = x509.BasicConstraints(ca=True, path_length=None)
817 assert na == na2
818
819 def test_ne(self):
820 na = x509.BasicConstraints(ca=True, path_length=None)
821 na2 = x509.BasicConstraints(ca=True, path_length=1)
822 na3 = x509.BasicConstraints(ca=False, path_length=None)
823 assert na != na2
824 assert na != na3
825 assert na != object()
826
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500827
Paul Kehrerffa2a152015-03-31 08:18:25 -0500828class TestExtendedKeyUsage(object):
829 def test_not_all_oids(self):
830 with pytest.raises(TypeError):
831 x509.ExtendedKeyUsage(["notoid"])
832
833 def test_iter_len(self):
834 eku = x509.ExtendedKeyUsage([
835 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
836 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
837 ])
838 assert len(eku) == 2
839 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500840 ExtendedKeyUsageOID.SERVER_AUTH,
841 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500842 ]
843
Paul Kehrer23d10c32015-04-02 23:12:32 -0500844 def test_repr(self):
845 eku = x509.ExtendedKeyUsage([
846 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
847 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
848 ])
849 assert repr(eku) == (
850 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
851 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
852 "tAuth)>])>"
853 )
854
Paul Kehrerb0476172015-05-02 19:34:51 -0500855 def test_eq(self):
856 eku = x509.ExtendedKeyUsage([
857 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
858 ])
859 eku2 = x509.ExtendedKeyUsage([
860 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
861 ])
862 assert eku == eku2
863
864 def test_ne(self):
865 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
866 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
867 assert eku != eku2
868 assert eku != object()
869
Paul Kehrerffa2a152015-03-31 08:18:25 -0500870
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500871@pytest.mark.requires_backend_interface(interface=RSABackend)
872@pytest.mark.requires_backend_interface(interface=X509Backend)
873class TestExtensions(object):
874 def test_no_extensions(self, backend):
875 cert = _load_cert(
876 os.path.join("x509", "verisign_md2_root.pem"),
877 x509.load_pem_x509_certificate,
878 backend
879 )
880 ext = cert.extensions
881 assert len(ext) == 0
882 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500883 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500884 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500885
Paul Kehrerd44e4132015-08-10 19:13:13 -0500886 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500887
888 def test_one_extension(self, backend):
889 cert = _load_cert(
890 os.path.join(
891 "x509", "custom", "basic_constraints_not_critical.pem"
892 ),
893 x509.load_pem_x509_certificate,
894 backend
895 )
896 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500897 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500898 assert ext is not None
899 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500900
901 def test_duplicate_extension(self, backend):
902 cert = _load_cert(
903 os.path.join(
904 "x509", "custom", "two_basic_constraints.pem"
905 ),
906 x509.load_pem_x509_certificate,
907 backend
908 )
909 with pytest.raises(x509.DuplicateExtension) as exc:
910 cert.extensions
911
Paul Kehrerd44e4132015-08-10 19:13:13 -0500912 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500913
914 def test_unsupported_critical_extension(self, backend):
915 cert = _load_cert(
916 os.path.join(
917 "x509", "custom", "unsupported_extension_critical.pem"
918 ),
919 x509.load_pem_x509_certificate,
920 backend
921 )
922 with pytest.raises(x509.UnsupportedExtension) as exc:
923 cert.extensions
924
925 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
926
927 def test_unsupported_extension(self, backend):
928 # TODO: this will raise an exception when all extensions are complete
929 cert = _load_cert(
930 os.path.join(
931 "x509", "custom", "unsupported_extension.pem"
932 ),
933 x509.load_pem_x509_certificate,
934 backend
935 )
936 extensions = cert.extensions
937 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500938
Phoebe Queenecae9812015-08-12 05:00:32 +0100939 def test_no_extensions_get_for_class(self, backend):
940 cert = _load_cert(
941 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100942 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100943 ),
944 x509.load_pem_x509_certificate,
945 backend
946 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100947 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100948 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100949 exts.get_extension_for_class(x509.IssuerAlternativeName)
950 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100951
Paul Kehrer5b90c972015-12-26 00:52:58 -0600952 def test_indexing(self, backend):
953 cert = _load_cert(
954 os.path.join("x509", "cryptography.io.pem"),
955 x509.load_pem_x509_certificate,
956 backend
957 )
958 exts = cert.extensions
959 assert exts[-1] == exts[7]
960 assert len(exts[3:5]) == 2
961 assert exts[2:4][0] == exts[2]
962 assert exts[2:4][1] == exts[3]
963
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100964 def test_one_extension_get_for_class(self, backend):
965 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100966 os.path.join(
967 "x509", "custom", "basic_constraints_not_critical.pem"
968 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100969 x509.load_pem_x509_certificate,
970 backend
971 )
972 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
973 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100974 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500975
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500976 def test_repr(self, backend):
977 cert = _load_cert(
978 os.path.join(
979 "x509", "custom", "basic_constraints_not_critical.pem"
980 ),
981 x509.load_pem_x509_certificate,
982 backend
983 )
984 assert repr(cert.extensions) == (
985 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
986 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
987 "alse, path_length=None)>)>])>"
988 )
989
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100990
Paul Kehrerfa56a232015-03-17 13:14:03 -0500991@pytest.mark.requires_backend_interface(interface=RSABackend)
992@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500993class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500994 def test_ca_true_pathlen_6(self, backend):
995 cert = _load_cert(
996 os.path.join(
997 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
998 ),
999 x509.load_der_x509_certificate,
1000 backend
1001 )
Phoebe Queen062dec72015-08-12 11:42:23 +01001002 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001003 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001004 )
1005 assert ext is not None
1006 assert ext.critical is True
1007 assert ext.value.ca is True
1008 assert ext.value.path_length == 6
1009
1010 def test_path_length_zero(self, backend):
1011 cert = _load_cert(
1012 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1013 x509.load_pem_x509_certificate,
1014 backend
1015 )
1016 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001017 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001018 )
1019 assert ext is not None
1020 assert ext.critical is True
1021 assert ext.value.ca is True
1022 assert ext.value.path_length == 0
1023
1024 def test_ca_true_no_pathlen(self, backend):
1025 cert = _load_cert(
1026 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1027 x509.load_der_x509_certificate,
1028 backend
1029 )
1030 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001031 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001032 )
1033 assert ext is not None
1034 assert ext.critical is True
1035 assert ext.value.ca is True
1036 assert ext.value.path_length is None
1037
1038 def test_ca_false(self, backend):
1039 cert = _load_cert(
1040 os.path.join("x509", "cryptography.io.pem"),
1041 x509.load_pem_x509_certificate,
1042 backend
1043 )
1044 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001045 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001046 )
1047 assert ext is not None
1048 assert ext.critical is True
1049 assert ext.value.ca is False
1050 assert ext.value.path_length is None
1051
1052 def test_no_basic_constraints(self, backend):
1053 cert = _load_cert(
1054 os.path.join(
1055 "x509",
1056 "PKITS_data",
1057 "certs",
1058 "ValidCertificatePathTest1EE.crt"
1059 ),
1060 x509.load_der_x509_certificate,
1061 backend
1062 )
1063 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001064 cert.extensions.get_extension_for_oid(
1065 ExtensionOID.BASIC_CONSTRAINTS
1066 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001067
1068 def test_basic_constraint_not_critical(self, backend):
1069 cert = _load_cert(
1070 os.path.join(
1071 "x509", "custom", "basic_constraints_not_critical.pem"
1072 ),
1073 x509.load_pem_x509_certificate,
1074 backend
1075 )
1076 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001077 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001078 )
1079 assert ext is not None
1080 assert ext.critical is False
1081 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001082
1083
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001084class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001085 @pytest.mark.requires_backend_interface(interface=RSABackend)
1086 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001087 def test_subject_key_identifier(self, backend):
1088 cert = _load_cert(
1089 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1090 x509.load_der_x509_certificate,
1091 backend
1092 )
1093 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001094 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001095 )
1096 ski = ext.value
1097 assert ext is not None
1098 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001099 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001100 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001101 )
1102
Paul Kehrerf22f6122015-08-05 12:57:13 +01001103 @pytest.mark.requires_backend_interface(interface=RSABackend)
1104 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001105 def test_no_subject_key_identifier(self, backend):
1106 cert = _load_cert(
1107 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1108 x509.load_pem_x509_certificate,
1109 backend
1110 )
1111 with pytest.raises(x509.ExtensionNotFound):
1112 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001113 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001114 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001115
Paul Kehrerf22f6122015-08-05 12:57:13 +01001116 @pytest.mark.requires_backend_interface(interface=RSABackend)
1117 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001118 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001119 cert = _load_cert(
1120 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1121 x509.load_der_x509_certificate,
1122 backend
1123 )
1124 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001125 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001126 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001127 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001128 cert.public_key()
1129 )
1130 assert ext.value == ski
1131
1132 @pytest.mark.requires_backend_interface(interface=DSABackend)
1133 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001134 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001135 cert = _load_cert(
1136 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1137 x509.load_pem_x509_certificate,
1138 backend
1139 )
1140
1141 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001142 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001143 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001144 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001145 cert.public_key()
1146 )
1147 assert ext.value == ski
1148
1149 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1150 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001151 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001152 _skip_curve_unsupported(backend, ec.SECP384R1())
1153 cert = _load_cert(
1154 os.path.join("x509", "ecdsa_root.pem"),
1155 x509.load_pem_x509_certificate,
1156 backend
1157 )
1158
1159 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001160 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001161 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001162 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001163 cert.public_key()
1164 )
1165 assert ext.value == ski
1166
Paul Kehrer5508ee22015-04-02 19:31:03 -05001167
1168@pytest.mark.requires_backend_interface(interface=RSABackend)
1169@pytest.mark.requires_backend_interface(interface=X509Backend)
1170class TestKeyUsageExtension(object):
1171 def test_no_key_usage(self, backend):
1172 cert = _load_cert(
1173 os.path.join("x509", "verisign_md2_root.pem"),
1174 x509.load_pem_x509_certificate,
1175 backend
1176 )
1177 ext = cert.extensions
1178 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001179 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001180
Paul Kehrerd44e4132015-08-10 19:13:13 -05001181 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001182
1183 def test_all_purposes(self, backend):
1184 cert = _load_cert(
1185 os.path.join(
1186 "x509", "custom", "all_key_usages.pem"
1187 ),
1188 x509.load_pem_x509_certificate,
1189 backend
1190 )
1191 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001192 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001193 assert ext is not None
1194
1195 ku = ext.value
1196 assert ku.digital_signature is True
1197 assert ku.content_commitment is True
1198 assert ku.key_encipherment is True
1199 assert ku.data_encipherment is True
1200 assert ku.key_agreement is True
1201 assert ku.key_cert_sign is True
1202 assert ku.crl_sign is True
1203 assert ku.encipher_only is True
1204 assert ku.decipher_only is True
1205
1206 def test_key_cert_sign_crl_sign(self, backend):
1207 cert = _load_cert(
1208 os.path.join(
1209 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1210 ),
1211 x509.load_der_x509_certificate,
1212 backend
1213 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001214 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001215 assert ext is not None
1216 assert ext.critical is True
1217
1218 ku = ext.value
1219 assert ku.digital_signature is False
1220 assert ku.content_commitment is False
1221 assert ku.key_encipherment is False
1222 assert ku.data_encipherment is False
1223 assert ku.key_agreement is False
1224 assert ku.key_cert_sign is True
1225 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001226
1227
1228@pytest.mark.parametrize(
1229 "name", [
1230 x509.RFC822Name,
1231 x509.DNSName,
1232 x509.UniformResourceIdentifier
1233 ]
1234)
1235class TestTextGeneralNames(object):
1236 def test_not_text(self, name):
1237 with pytest.raises(TypeError):
1238 name(b"notaunicodestring")
1239
1240 with pytest.raises(TypeError):
1241 name(1.3)
1242
1243 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301244 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001245 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1246
1247 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301248 gn = name(u"string")
1249 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001250 assert gn == gn2
1251
1252 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301253 gn = name(u"string")
1254 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001255 assert gn != gn2
1256 assert gn != object()
1257
1258
1259class TestDirectoryName(object):
1260 def test_not_name(self):
1261 with pytest.raises(TypeError):
1262 x509.DirectoryName(b"notaname")
1263
1264 with pytest.raises(TypeError):
1265 x509.DirectoryName(1.3)
1266
1267 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001268 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001269 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001270 if six.PY3:
1271 assert repr(gn) == (
1272 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1273 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1274 ">])>)>"
1275 )
1276 else:
1277 assert repr(gn) == (
1278 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1279 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1280 ")>])>)>"
1281 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001282
1283 def test_eq(self):
1284 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001285 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001286 ])
1287 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001288 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001289 ])
1290 gn = x509.DirectoryName(x509.Name([name]))
1291 gn2 = x509.DirectoryName(x509.Name([name2]))
1292 assert gn == gn2
1293
1294 def test_ne(self):
1295 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001296 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001297 ])
1298 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001299 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001300 ])
1301 gn = x509.DirectoryName(x509.Name([name]))
1302 gn2 = x509.DirectoryName(x509.Name([name2]))
1303 assert gn != gn2
1304 assert gn != object()
1305
1306
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001307class TestRFC822Name(object):
1308 def test_invalid_email(self):
1309 with pytest.raises(ValueError):
1310 x509.RFC822Name(u"Name <email>")
1311
1312 with pytest.raises(ValueError):
1313 x509.RFC822Name(u"")
1314
1315 def test_single_label(self):
1316 gn = x509.RFC822Name(u"administrator")
1317 assert gn.value == u"administrator"
1318
1319 def test_idna(self):
1320 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1321 assert gn.value == u"email@em\xe5\xefl.com"
1322 assert gn._encoded == b"email@xn--eml-vla4c.com"
1323
1324
Paul Kehrere28d6c42015-07-12 14:59:37 -05001325class TestUniformResourceIdentifier(object):
1326 def test_no_parsed_hostname(self):
1327 gn = x509.UniformResourceIdentifier(u"singlelabel")
1328 assert gn.value == u"singlelabel"
1329
1330 def test_with_port(self):
1331 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1332 assert gn.value == u"singlelabel:443/test"
1333
1334 def test_idna_no_port(self):
1335 gn = x509.UniformResourceIdentifier(
1336 u"http://\u043f\u044b\u043a\u0430.cryptography"
1337 )
1338 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1339 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1340
1341 def test_idna_with_port(self):
1342 gn = x509.UniformResourceIdentifier(
1343 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1344 )
1345 assert gn.value == (
1346 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1347 )
1348 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1349
1350 def test_query_and_fragment(self):
1351 gn = x509.UniformResourceIdentifier(
1352 u"ldap://cryptography:90/path?query=true#somedata"
1353 )
1354 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1355
1356
Paul Kehrer31bdf792015-03-25 14:11:00 -05001357class TestRegisteredID(object):
1358 def test_not_oid(self):
1359 with pytest.raises(TypeError):
1360 x509.RegisteredID(b"notanoid")
1361
1362 with pytest.raises(TypeError):
1363 x509.RegisteredID(1.3)
1364
1365 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001366 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001367 assert repr(gn) == (
1368 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1369 "e)>)>"
1370 )
1371
1372 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001373 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1374 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001375 assert gn == gn2
1376
1377 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001378 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001379 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001380 assert gn != gn2
1381 assert gn != object()
1382
1383
1384class TestIPAddress(object):
1385 def test_not_ipaddress(self):
1386 with pytest.raises(TypeError):
1387 x509.IPAddress(b"notanipaddress")
1388
1389 with pytest.raises(TypeError):
1390 x509.IPAddress(1.3)
1391
1392 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301393 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001394 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1395
Eeshan Gargf1234152015-04-29 18:41:00 +05301396 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001397 assert repr(gn2) == "<IPAddress(value=ff::)>"
1398
Paul Kehrereb177932015-05-17 18:33:33 -07001399 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1400 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1401
1402 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1403 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1404
Paul Kehrer31bdf792015-03-25 14:11:00 -05001405 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301406 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1407 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001408 assert gn == gn2
1409
1410 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301411 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1412 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001413 assert gn != gn2
1414 assert gn != object()
1415
1416
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001417class TestOtherName(object):
1418 def test_invalid_args(self):
1419 with pytest.raises(TypeError):
1420 x509.OtherName(b"notanobjectidentifier", b"derdata")
1421
1422 with pytest.raises(TypeError):
1423 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1424
1425 def test_repr(self):
1426 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1427 if six.PY3:
1428 assert repr(gn) == (
1429 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1430 "name=Unknown OID)>, value=b'derdata')>"
1431 )
1432 else:
1433 assert repr(gn) == (
1434 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1435 "name=Unknown OID)>, value='derdata')>"
1436 )
1437
1438 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1439 if six.PY3:
1440 assert repr(gn) == (
1441 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1442 "name=pseudonym)>, value=b'derdata')>"
1443 )
1444 else:
1445 assert repr(gn) == (
1446 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1447 "name=pseudonym)>, value='derdata')>"
1448 )
1449
1450 def test_eq(self):
1451 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1452 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1453 assert gn == gn2
1454
1455 def test_ne(self):
1456 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1457 assert gn != object()
1458
1459 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1460 assert gn != gn2
1461
1462 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1463 assert gn != gn2
1464
1465
Erik Trauschke2dcce902015-05-14 16:12:24 -07001466class TestGeneralNames(object):
1467 def test_get_values_for_type(self):
1468 gns = x509.GeneralNames(
1469 [x509.DNSName(u"cryptography.io")]
1470 )
1471 names = gns.get_values_for_type(x509.DNSName)
1472 assert names == [u"cryptography.io"]
1473
1474 def test_iter_names(self):
1475 gns = x509.GeneralNames([
1476 x509.DNSName(u"cryptography.io"),
1477 x509.DNSName(u"crypto.local"),
1478 ])
1479 assert len(gns) == 2
1480 assert list(gns) == [
1481 x509.DNSName(u"cryptography.io"),
1482 x509.DNSName(u"crypto.local"),
1483 ]
1484
1485 def test_invalid_general_names(self):
1486 with pytest.raises(TypeError):
1487 x509.GeneralNames(
1488 [x509.DNSName(u"cryptography.io"), "invalid"]
1489 )
1490
1491 def test_repr(self):
1492 gns = x509.GeneralNames(
1493 [
1494 x509.DNSName(u"cryptography.io")
1495 ]
1496 )
1497 assert repr(gns) == (
1498 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1499 )
1500
1501 def test_eq(self):
1502 gns = x509.GeneralNames(
1503 [x509.DNSName(u"cryptography.io")]
1504 )
1505 gns2 = x509.GeneralNames(
1506 [x509.DNSName(u"cryptography.io")]
1507 )
1508 assert gns == gns2
1509
1510 def test_ne(self):
1511 gns = x509.GeneralNames(
1512 [x509.DNSName(u"cryptography.io")]
1513 )
1514 gns2 = x509.GeneralNames(
1515 [x509.RFC822Name(u"admin@cryptography.io")]
1516 )
1517 assert gns != gns2
1518 assert gns != object()
1519
1520
Paul Kehrer99125c92015-06-07 18:37:10 -05001521class TestIssuerAlternativeName(object):
1522 def test_get_values_for_type(self):
1523 san = x509.IssuerAlternativeName(
1524 [x509.DNSName(u"cryptography.io")]
1525 )
1526 names = san.get_values_for_type(x509.DNSName)
1527 assert names == [u"cryptography.io"]
1528
1529 def test_iter_names(self):
1530 san = x509.IssuerAlternativeName([
1531 x509.DNSName(u"cryptography.io"),
1532 x509.DNSName(u"crypto.local"),
1533 ])
1534 assert len(san) == 2
1535 assert list(san) == [
1536 x509.DNSName(u"cryptography.io"),
1537 x509.DNSName(u"crypto.local"),
1538 ]
1539
1540 def test_invalid_general_names(self):
1541 with pytest.raises(TypeError):
1542 x509.IssuerAlternativeName(
1543 [x509.DNSName(u"cryptography.io"), "invalid"]
1544 )
1545
1546 def test_repr(self):
1547 san = x509.IssuerAlternativeName(
1548 [
1549 x509.DNSName(u"cryptography.io")
1550 ]
1551 )
1552 assert repr(san) == (
1553 "<IssuerAlternativeName("
1554 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1555 )
1556
1557 def test_eq(self):
1558 san = x509.IssuerAlternativeName(
1559 [x509.DNSName(u"cryptography.io")]
1560 )
1561 san2 = x509.IssuerAlternativeName(
1562 [x509.DNSName(u"cryptography.io")]
1563 )
1564 assert san == san2
1565
1566 def test_ne(self):
1567 san = x509.IssuerAlternativeName(
1568 [x509.DNSName(u"cryptography.io")]
1569 )
1570 san2 = x509.IssuerAlternativeName(
1571 [x509.RFC822Name(u"admin@cryptography.io")]
1572 )
1573 assert san != san2
1574 assert san != object()
1575
1576
Alex Gaynorf1c17672015-06-20 14:20:20 -04001577@pytest.mark.requires_backend_interface(interface=RSABackend)
1578@pytest.mark.requires_backend_interface(interface=X509Backend)
1579class TestRSAIssuerAlternativeNameExtension(object):
1580 def test_uri(self, backend):
1581 cert = _load_cert(
1582 os.path.join("x509", "custom", "ian_uri.pem"),
1583 x509.load_pem_x509_certificate,
1584 backend,
1585 )
1586 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001587 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001588 )
1589 assert list(ext.value) == [
1590 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1591 ]
1592
1593
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001594class TestCRLNumber(object):
1595 def test_eq(self):
1596 crl_number = x509.CRLNumber(15)
1597 assert crl_number == x509.CRLNumber(15)
1598
1599 def test_ne(self):
1600 crl_number = x509.CRLNumber(15)
1601 assert crl_number != x509.CRLNumber(14)
1602 assert crl_number != object()
1603
1604 def test_repr(self):
1605 crl_number = x509.CRLNumber(15)
1606 assert repr(crl_number) == "<CRLNumber(15)>"
1607
Paul Kehrera9718fc2015-12-22 22:55:35 -06001608 def test_invalid_number(self):
1609 with pytest.raises(TypeError):
1610 x509.CRLNumber("notanumber")
1611
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001612
Paul Kehrer31bdf792015-03-25 14:11:00 -05001613class TestSubjectAlternativeName(object):
1614 def test_get_values_for_type(self):
1615 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301616 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001617 )
1618 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301619 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001620
1621 def test_iter_names(self):
1622 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301623 x509.DNSName(u"cryptography.io"),
1624 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001625 ])
1626 assert len(san) == 2
1627 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301628 x509.DNSName(u"cryptography.io"),
1629 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001630 ]
1631
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001632 def test_invalid_general_names(self):
1633 with pytest.raises(TypeError):
1634 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301635 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001636 )
1637
Paul Kehrer31bdf792015-03-25 14:11:00 -05001638 def test_repr(self):
1639 san = x509.SubjectAlternativeName(
1640 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301641 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001642 ]
1643 )
1644 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001645 "<SubjectAlternativeName("
1646 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001647 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001648
Paul Kehrer58cc3972015-05-13 10:00:41 -05001649 def test_eq(self):
1650 san = x509.SubjectAlternativeName(
1651 [x509.DNSName(u"cryptography.io")]
1652 )
1653 san2 = x509.SubjectAlternativeName(
1654 [x509.DNSName(u"cryptography.io")]
1655 )
1656 assert san == san2
1657
1658 def test_ne(self):
1659 san = x509.SubjectAlternativeName(
1660 [x509.DNSName(u"cryptography.io")]
1661 )
1662 san2 = x509.SubjectAlternativeName(
1663 [x509.RFC822Name(u"admin@cryptography.io")]
1664 )
1665 assert san != san2
1666 assert san != object()
1667
Paul Kehrer40f83382015-04-20 15:00:16 -05001668
1669@pytest.mark.requires_backend_interface(interface=RSABackend)
1670@pytest.mark.requires_backend_interface(interface=X509Backend)
1671class TestRSASubjectAlternativeNameExtension(object):
1672 def test_dns_name(self, backend):
1673 cert = _load_cert(
1674 os.path.join("x509", "cryptography.io.pem"),
1675 x509.load_pem_x509_certificate,
1676 backend
1677 )
1678 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001679 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001680 )
1681 assert ext is not None
1682 assert ext.critical is False
1683
1684 san = ext.value
1685
1686 dns = san.get_values_for_type(x509.DNSName)
1687 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001688
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001689 def test_wildcard_dns_name(self, backend):
1690 cert = _load_cert(
1691 os.path.join("x509", "wildcard_san.pem"),
1692 x509.load_pem_x509_certificate,
1693 backend
1694 )
1695 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001696 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001697 )
1698
1699 dns = ext.value.get_values_for_type(x509.DNSName)
1700 assert dns == [
1701 u'*.langui.sh',
1702 u'langui.sh',
1703 u'*.saseliminator.com',
1704 u'saseliminator.com'
1705 ]
1706
Dominic Chen87bb9572015-10-09 00:23:07 -04001707 def test_san_empty_hostname(self, backend):
1708 cert = _load_cert(
1709 os.path.join(
1710 "x509", "custom", "san_empty_hostname.pem"
1711 ),
1712 x509.load_pem_x509_certificate,
1713 backend
1714 )
1715 san = cert.extensions.get_extension_for_oid(
1716 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1717 )
1718
1719 dns = san.value.get_values_for_type(x509.DNSName)
1720 assert dns == [u'']
1721
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001722 def test_san_wildcard_idna_dns_name(self, backend):
1723 cert = _load_cert(
1724 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1725 x509.load_pem_x509_certificate,
1726 backend
1727 )
1728 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001729 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001730 )
1731
1732 dns = ext.value.get_values_for_type(x509.DNSName)
1733 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1734
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001735 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001736 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001737 os.path.join("x509", "san_x400address.der"),
1738 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001739 backend
1740 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001741 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001742 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001743
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001744 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001745
1746 def test_registered_id(self, backend):
1747 cert = _load_cert(
1748 os.path.join(
1749 "x509", "custom", "san_registered_id.pem"
1750 ),
1751 x509.load_pem_x509_certificate,
1752 backend
1753 )
1754 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001755 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001756 )
1757 assert ext is not None
1758 assert ext.critical is False
1759
1760 san = ext.value
1761 rid = san.get_values_for_type(x509.RegisteredID)
1762 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001763
1764 def test_uri(self, backend):
1765 cert = _load_cert(
1766 os.path.join(
1767 "x509", "custom", "san_uri_with_port.pem"
1768 ),
1769 x509.load_pem_x509_certificate,
1770 backend
1771 )
1772 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001773 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001774 )
1775 assert ext is not None
1776 uri = ext.value.get_values_for_type(
1777 x509.UniformResourceIdentifier
1778 )
1779 assert uri == [
1780 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1781 u"lo",
1782 u"http://someregulardomain.com",
1783 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001784
1785 def test_ipaddress(self, backend):
1786 cert = _load_cert(
1787 os.path.join(
1788 "x509", "custom", "san_ipaddr.pem"
1789 ),
1790 x509.load_pem_x509_certificate,
1791 backend
1792 )
1793 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001794 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001795 )
1796 assert ext is not None
1797 assert ext.critical is False
1798
1799 san = ext.value
1800
1801 ip = san.get_values_for_type(x509.IPAddress)
1802 assert [
1803 ipaddress.ip_address(u"127.0.0.1"),
1804 ipaddress.ip_address(u"ff::")
1805 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001806
1807 def test_dirname(self, backend):
1808 cert = _load_cert(
1809 os.path.join(
1810 "x509", "custom", "san_dirname.pem"
1811 ),
1812 x509.load_pem_x509_certificate,
1813 backend
1814 )
1815 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001816 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001817 )
1818 assert ext is not None
1819 assert ext.critical is False
1820
1821 san = ext.value
1822
1823 dirname = san.get_values_for_type(x509.DirectoryName)
1824 assert [
1825 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001826 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1827 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1828 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001829 ])
1830 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001831
1832 def test_rfc822name(self, backend):
1833 cert = _load_cert(
1834 os.path.join(
1835 "x509", "custom", "san_rfc822_idna.pem"
1836 ),
1837 x509.load_pem_x509_certificate,
1838 backend
1839 )
1840 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001841 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001842 )
1843 assert ext is not None
1844 assert ext.critical is False
1845
1846 san = ext.value
1847
1848 rfc822name = san.get_values_for_type(x509.RFC822Name)
1849 assert [u"email@em\xe5\xefl.com"] == rfc822name
1850
Paul Kehrerb8968812015-05-15 09:01:34 -07001851 def test_idna2003_invalid(self, backend):
1852 cert = _load_cert(
1853 os.path.join(
1854 "x509", "custom", "san_idna2003_dnsname.pem"
1855 ),
1856 x509.load_pem_x509_certificate,
1857 backend
1858 )
1859 with pytest.raises(UnicodeError):
1860 cert.extensions
1861
Paul Kehrere06cab42015-04-30 10:23:33 -05001862 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1863 cert = _load_cert(
1864 os.path.join(
1865 "x509", "custom", "san_idna_names.pem"
1866 ),
1867 x509.load_pem_x509_certificate,
1868 backend
1869 )
1870 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001871 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001872 )
1873 assert ext is not None
1874 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1875 dns_name = ext.value.get_values_for_type(x509.DNSName)
1876 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1877 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1878 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1879 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1880
1881 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1882 cert = _load_cert(
1883 os.path.join(
1884 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1885 ),
1886 x509.load_pem_x509_certificate,
1887 backend
1888 )
1889 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001890 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001891 )
1892 assert ext is not None
1893 assert ext.critical is False
1894
1895 san = ext.value
1896
1897 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1898 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1899 dns = san.get_values_for_type(x509.DNSName)
1900 ip = san.get_values_for_type(x509.IPAddress)
1901 dirname = san.get_values_for_type(x509.DirectoryName)
1902 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001903 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001904 assert [u"cryptography.io"] == dns
1905 assert [
1906 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001907 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001908 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001909 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001910 ),
1911 ])
1912 ] == dirname
1913 assert [
1914 ipaddress.ip_address(u"127.0.0.1"),
1915 ipaddress.ip_address(u"ff::")
1916 ] == ip
1917
1918 def test_invalid_rfc822name(self, backend):
1919 cert = _load_cert(
1920 os.path.join(
1921 "x509", "custom", "san_rfc822_names.pem"
1922 ),
1923 x509.load_pem_x509_certificate,
1924 backend
1925 )
1926 with pytest.raises(ValueError) as exc:
1927 cert.extensions
1928
1929 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001930
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001931 def test_other_name(self, backend):
1932 cert = _load_cert(
1933 os.path.join(
1934 "x509", "custom", "san_other_name.pem"
1935 ),
1936 x509.load_pem_x509_certificate,
1937 backend
1938 )
1939
1940 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001941 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001942 )
1943 assert ext is not None
1944 assert ext.critical is False
1945
Joshua Taubererd2afad32015-07-06 22:37:53 +00001946 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1947 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001948 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001949 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001950
1951 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001952 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001953
Paul Kehrer94c69602015-05-02 19:29:40 -05001954
1955@pytest.mark.requires_backend_interface(interface=RSABackend)
1956@pytest.mark.requires_backend_interface(interface=X509Backend)
1957class TestExtendedKeyUsageExtension(object):
1958 def test_eku(self, backend):
1959 cert = _load_cert(
1960 os.path.join(
1961 "x509", "custom", "extended_key_usage.pem"
1962 ),
1963 x509.load_pem_x509_certificate,
1964 backend
1965 )
1966 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001967 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001968 )
1969 assert ext is not None
1970 assert ext.critical is False
1971
1972 assert [
1973 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1974 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1975 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1976 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1977 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1978 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1979 x509.ObjectIdentifier("2.5.29.37.0"),
1980 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1981 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001982
1983
1984class TestAccessDescription(object):
1985 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001986 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001987 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1988
1989 def test_invalid_access_location(self):
1990 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001991 x509.AccessDescription(
1992 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1993 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001994
Nick Bastind2ecf862015-12-13 05:44:46 -08001995 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001996 ad = x509.AccessDescription(
1997 ObjectIdentifier("2.999.1"),
1998 x509.UniformResourceIdentifier(u"http://example.com")
1999 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08002000 assert ad is not None
2001
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002002 def test_repr(self):
2003 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002004 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002005 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2006 )
2007 assert repr(ad) == (
2008 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2009 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2010 "(value=http://ocsp.domain.com)>)>"
2011 )
2012
2013 def test_eq(self):
2014 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002015 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002016 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2017 )
2018 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002019 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002020 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2021 )
2022 assert ad == ad2
2023
2024 def test_ne(self):
2025 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002026 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002027 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2028 )
2029 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002030 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002031 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2032 )
2033 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002034 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002035 x509.UniformResourceIdentifier(u"http://notthesame")
2036 )
2037 assert ad != ad2
2038 assert ad != ad3
2039 assert ad != object()
2040
2041
2042class TestAuthorityInformationAccess(object):
2043 def test_invalid_descriptions(self):
2044 with pytest.raises(TypeError):
2045 x509.AuthorityInformationAccess(["notanAccessDescription"])
2046
2047 def test_iter_len(self):
2048 aia = x509.AuthorityInformationAccess([
2049 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002050 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002051 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2052 ),
2053 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002054 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002055 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2056 )
2057 ])
2058 assert len(aia) == 2
2059 assert list(aia) == [
2060 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002061 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002062 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2063 ),
2064 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002065 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002066 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2067 )
2068 ]
2069
2070 def test_repr(self):
2071 aia = x509.AuthorityInformationAccess([
2072 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002073 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002074 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2075 ),
2076 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002077 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002078 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2079 )
2080 ])
2081 assert repr(aia) == (
2082 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2083 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2084 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2085 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2086 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2087 "fier(value=http://domain.com/ca.crt)>)>])>"
2088 )
2089
2090 def test_eq(self):
2091 aia = x509.AuthorityInformationAccess([
2092 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002093 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002094 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2095 ),
2096 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002097 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002098 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2099 )
2100 ])
2101 aia2 = x509.AuthorityInformationAccess([
2102 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002103 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002104 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2105 ),
2106 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002107 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002108 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2109 )
2110 ])
2111 assert aia == aia2
2112
2113 def test_ne(self):
2114 aia = x509.AuthorityInformationAccess([
2115 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002116 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002117 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2118 ),
2119 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002120 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002121 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2122 )
2123 ])
2124 aia2 = x509.AuthorityInformationAccess([
2125 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002126 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002127 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2128 ),
2129 ])
2130
2131 assert aia != aia2
2132 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002133
2134
2135@pytest.mark.requires_backend_interface(interface=RSABackend)
2136@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002137class TestAuthorityInformationAccessExtension(object):
2138 def test_aia_ocsp_ca_issuers(self, backend):
2139 cert = _load_cert(
2140 os.path.join("x509", "cryptography.io.pem"),
2141 x509.load_pem_x509_certificate,
2142 backend
2143 )
2144 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002145 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002146 )
2147 assert ext is not None
2148 assert ext.critical is False
2149
2150 assert ext.value == x509.AuthorityInformationAccess([
2151 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002152 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002153 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2154 ),
2155 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002156 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002157 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2158 ),
2159 ])
2160
2161 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2162 cert = _load_cert(
2163 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2164 x509.load_pem_x509_certificate,
2165 backend
2166 )
2167 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002168 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002169 )
2170 assert ext is not None
2171 assert ext.critical is False
2172
2173 assert ext.value == x509.AuthorityInformationAccess([
2174 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002175 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002176 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2177 ),
2178 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002179 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002180 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2181 ),
2182 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002183 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002184 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002185 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2186 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002187 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002188 ]))
2189 ),
2190 ])
2191
2192 def test_aia_ocsp_only(self, backend):
2193 cert = _load_cert(
2194 os.path.join("x509", "custom", "aia_ocsp.pem"),
2195 x509.load_pem_x509_certificate,
2196 backend
2197 )
2198 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002199 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002200 )
2201 assert ext is not None
2202 assert ext.critical is False
2203
2204 assert ext.value == x509.AuthorityInformationAccess([
2205 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002206 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002207 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2208 ),
2209 ])
2210
2211 def test_aia_ca_issuers_only(self, backend):
2212 cert = _load_cert(
2213 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2214 x509.load_pem_x509_certificate,
2215 backend
2216 )
2217 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002218 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002219 )
2220 assert ext is not None
2221 assert ext.critical is False
2222
2223 assert ext.value == x509.AuthorityInformationAccess([
2224 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002225 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002226 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002227 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2228 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002229 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002230 ]))
2231 ),
2232 ])
2233
2234
2235@pytest.mark.requires_backend_interface(interface=RSABackend)
2236@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002237class TestAuthorityKeyIdentifierExtension(object):
2238 def test_aki_keyid(self, backend):
2239 cert = _load_cert(
2240 os.path.join(
2241 "x509", "cryptography.io.pem"
2242 ),
2243 x509.load_pem_x509_certificate,
2244 backend
2245 )
2246 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002247 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002248 )
2249 assert ext is not None
2250 assert ext.critical is False
2251
2252 assert ext.value.key_identifier == (
2253 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2254 )
2255 assert ext.value.authority_cert_issuer is None
2256 assert ext.value.authority_cert_serial_number is None
2257
2258 def test_aki_all_fields(self, backend):
2259 cert = _load_cert(
2260 os.path.join(
2261 "x509", "custom", "authority_key_identifier.pem"
2262 ),
2263 x509.load_pem_x509_certificate,
2264 backend
2265 )
2266 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002267 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002268 )
2269 assert ext is not None
2270 assert ext.critical is False
2271
2272 assert ext.value.key_identifier == (
2273 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2274 )
2275 assert ext.value.authority_cert_issuer == [
2276 x509.DirectoryName(
2277 x509.Name([
2278 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002279 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002280 ),
2281 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002282 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002283 )
2284 ])
2285 )
2286 ]
2287 assert ext.value.authority_cert_serial_number == 3
2288
2289 def test_aki_no_keyid(self, backend):
2290 cert = _load_cert(
2291 os.path.join(
2292 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2293 ),
2294 x509.load_pem_x509_certificate,
2295 backend
2296 )
2297 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002298 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002299 )
2300 assert ext is not None
2301 assert ext.critical is False
2302
2303 assert ext.value.key_identifier is None
2304 assert ext.value.authority_cert_issuer == [
2305 x509.DirectoryName(
2306 x509.Name([
2307 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002308 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002309 ),
2310 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002311 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002312 )
2313 ])
2314 )
2315 ]
2316 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002317
Paul Kehrer253929a2015-08-05 17:30:39 +01002318 def test_from_certificate(self, backend):
2319 issuer_cert = _load_cert(
2320 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2321 x509.load_pem_x509_certificate,
2322 backend
2323 )
2324 cert = _load_cert(
2325 os.path.join("x509", "cryptography.io.pem"),
2326 x509.load_pem_x509_certificate,
2327 backend
2328 )
2329 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002330 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002331 )
2332 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2333 issuer_cert.public_key()
2334 )
2335 assert ext.value == aki
2336
Paul Kehrer5a485522015-05-06 00:29:12 -05002337
Paul Kehrere0017be2015-05-17 20:39:40 -06002338class TestNameConstraints(object):
2339 def test_ipaddress_wrong_type(self):
2340 with pytest.raises(TypeError):
2341 x509.NameConstraints(
2342 permitted_subtrees=[
2343 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2344 ],
2345 excluded_subtrees=None
2346 )
2347
2348 with pytest.raises(TypeError):
2349 x509.NameConstraints(
2350 permitted_subtrees=None,
2351 excluded_subtrees=[
2352 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2353 ]
2354 )
2355
2356 def test_ipaddress_allowed_type(self):
2357 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2358 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2359 nc = x509.NameConstraints(
2360 permitted_subtrees=permitted,
2361 excluded_subtrees=excluded
2362 )
2363 assert nc.permitted_subtrees == permitted
2364 assert nc.excluded_subtrees == excluded
2365
2366 def test_invalid_permitted_subtrees(self):
2367 with pytest.raises(TypeError):
2368 x509.NameConstraints("badpermitted", None)
2369
2370 def test_invalid_excluded_subtrees(self):
2371 with pytest.raises(TypeError):
2372 x509.NameConstraints(None, "badexcluded")
2373
2374 def test_no_subtrees(self):
2375 with pytest.raises(ValueError):
2376 x509.NameConstraints(None, None)
2377
2378 def test_permitted_none(self):
2379 excluded = [x509.DNSName(u"name.local")]
2380 nc = x509.NameConstraints(
2381 permitted_subtrees=None, excluded_subtrees=excluded
2382 )
2383 assert nc.permitted_subtrees is None
2384 assert nc.excluded_subtrees is not None
2385
2386 def test_excluded_none(self):
2387 permitted = [x509.DNSName(u"name.local")]
2388 nc = x509.NameConstraints(
2389 permitted_subtrees=permitted, excluded_subtrees=None
2390 )
2391 assert nc.permitted_subtrees is not None
2392 assert nc.excluded_subtrees is None
2393
2394 def test_repr(self):
2395 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2396 nc = x509.NameConstraints(
2397 permitted_subtrees=permitted,
2398 excluded_subtrees=None
2399 )
2400 assert repr(nc) == (
2401 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2402 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2403 )
2404
Paul Kehrer31894282015-06-21 21:46:41 -05002405 def test_eq(self):
2406 nc = x509.NameConstraints(
2407 permitted_subtrees=[x509.DNSName(u"name.local")],
2408 excluded_subtrees=[x509.DNSName(u"name2.local")]
2409 )
2410 nc2 = x509.NameConstraints(
2411 permitted_subtrees=[x509.DNSName(u"name.local")],
2412 excluded_subtrees=[x509.DNSName(u"name2.local")]
2413 )
2414 assert nc == nc2
2415
2416 def test_ne(self):
2417 nc = x509.NameConstraints(
2418 permitted_subtrees=[x509.DNSName(u"name.local")],
2419 excluded_subtrees=[x509.DNSName(u"name2.local")]
2420 )
2421 nc2 = x509.NameConstraints(
2422 permitted_subtrees=[x509.DNSName(u"name.local")],
2423 excluded_subtrees=None
2424 )
2425 nc3 = x509.NameConstraints(
2426 permitted_subtrees=None,
2427 excluded_subtrees=[x509.DNSName(u"name2.local")]
2428 )
2429
2430 assert nc != nc2
2431 assert nc != nc3
2432 assert nc != object()
2433
Paul Kehrere0017be2015-05-17 20:39:40 -06002434
Paul Kehrer870d7e82015-06-21 22:20:44 -05002435@pytest.mark.requires_backend_interface(interface=RSABackend)
2436@pytest.mark.requires_backend_interface(interface=X509Backend)
2437class TestNameConstraintsExtension(object):
2438 def test_permitted_excluded(self, backend):
2439 cert = _load_cert(
2440 os.path.join(
2441 "x509", "custom", "nc_permitted_excluded_2.pem"
2442 ),
2443 x509.load_pem_x509_certificate,
2444 backend
2445 )
2446 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002447 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002448 ).value
2449 assert nc == x509.NameConstraints(
2450 permitted_subtrees=[
2451 x509.DNSName(u"zombo.local"),
2452 ],
2453 excluded_subtrees=[
2454 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002455 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002456 ]))
2457 ]
2458 )
2459
2460 def test_permitted(self, backend):
2461 cert = _load_cert(
2462 os.path.join(
2463 "x509", "custom", "nc_permitted_2.pem"
2464 ),
2465 x509.load_pem_x509_certificate,
2466 backend
2467 )
2468 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002469 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002470 ).value
2471 assert nc == x509.NameConstraints(
2472 permitted_subtrees=[
2473 x509.DNSName(u"zombo.local"),
2474 ],
2475 excluded_subtrees=None
2476 )
2477
Paul Kehrer42376832015-07-01 18:10:32 -05002478 def test_permitted_with_leading_period(self, backend):
2479 cert = _load_cert(
2480 os.path.join(
2481 "x509", "custom", "nc_permitted.pem"
2482 ),
2483 x509.load_pem_x509_certificate,
2484 backend
2485 )
2486 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002487 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002488 ).value
2489 assert nc == x509.NameConstraints(
2490 permitted_subtrees=[
2491 x509.DNSName(u".cryptography.io"),
2492 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2493 ],
2494 excluded_subtrees=None
2495 )
2496
2497 def test_excluded_with_leading_period(self, backend):
2498 cert = _load_cert(
2499 os.path.join(
2500 "x509", "custom", "nc_excluded.pem"
2501 ),
2502 x509.load_pem_x509_certificate,
2503 backend
2504 )
2505 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002506 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002507 ).value
2508 assert nc == x509.NameConstraints(
2509 permitted_subtrees=None,
2510 excluded_subtrees=[
2511 x509.DNSName(u".cryptography.io"),
2512 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2513 ]
2514 )
2515
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002516 def test_permitted_excluded_with_ips(self, backend):
2517 cert = _load_cert(
2518 os.path.join(
2519 "x509", "custom", "nc_permitted_excluded.pem"
2520 ),
2521 x509.load_pem_x509_certificate,
2522 backend
2523 )
2524 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002525 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002526 ).value
2527 assert nc == x509.NameConstraints(
2528 permitted_subtrees=[
2529 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2530 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2531 ],
2532 excluded_subtrees=[
2533 x509.DNSName(u".domain.com"),
2534 x509.UniformResourceIdentifier(u"http://test.local"),
2535 ]
2536 )
2537
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002538 def test_single_ip_netmask(self, backend):
2539 cert = _load_cert(
2540 os.path.join(
2541 "x509", "custom", "nc_single_ip_netmask.pem"
2542 ),
2543 x509.load_pem_x509_certificate,
2544 backend
2545 )
2546 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002547 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002548 ).value
2549 assert nc == x509.NameConstraints(
2550 permitted_subtrees=[
2551 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2552 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2553 ],
2554 excluded_subtrees=None
2555 )
2556
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002557 def test_invalid_netmask(self, backend):
2558 cert = _load_cert(
2559 os.path.join(
2560 "x509", "custom", "nc_invalid_ip_netmask.pem"
2561 ),
2562 x509.load_pem_x509_certificate,
2563 backend
2564 )
2565 with pytest.raises(ValueError):
2566 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002567 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002568 )
2569
Paul Kehrer870d7e82015-06-21 22:20:44 -05002570
Paul Kehrer5a485522015-05-06 00:29:12 -05002571class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002572 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002573 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002574 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002575
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002576 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002577 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002578 x509.DistributionPoint(None, "notname", None, None)
2579
2580 def test_distribution_point_full_and_relative_not_none(self):
2581 with pytest.raises(ValueError):
2582 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002583
2584 def test_crl_issuer_not_general_names(self):
2585 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002586 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002587
2588 def test_reason_not_reasonflags(self):
2589 with pytest.raises(TypeError):
2590 x509.DistributionPoint(
2591 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002592 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002593 frozenset(["notreasonflags"]),
2594 None
2595 )
2596
2597 def test_reason_not_frozenset(self):
2598 with pytest.raises(TypeError):
2599 x509.DistributionPoint(
2600 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2601 None,
2602 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002603 None
2604 )
2605
2606 def test_disallowed_reasons(self):
2607 with pytest.raises(ValueError):
2608 x509.DistributionPoint(
2609 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2610 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002611 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002612 None
2613 )
2614
2615 with pytest.raises(ValueError):
2616 x509.DistributionPoint(
2617 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2618 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002619 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002620 None
2621 )
2622
2623 def test_reason_only(self):
2624 with pytest.raises(ValueError):
2625 x509.DistributionPoint(
2626 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002627 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002628 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002629 None
2630 )
2631
2632 def test_eq(self):
2633 dp = x509.DistributionPoint(
2634 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002635 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002636 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002637 [
2638 x509.DirectoryName(
2639 x509.Name([
2640 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002641 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002642 )
2643 ])
2644 )
2645 ],
2646 )
2647 dp2 = x509.DistributionPoint(
2648 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002649 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002650 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002651 [
2652 x509.DirectoryName(
2653 x509.Name([
2654 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002655 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002656 )
2657 ])
2658 )
2659 ],
2660 )
2661 assert dp == dp2
2662
2663 def test_ne(self):
2664 dp = x509.DistributionPoint(
2665 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002666 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002667 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002668 [
2669 x509.DirectoryName(
2670 x509.Name([
2671 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002672 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002673 )
2674 ])
2675 )
2676 ],
2677 )
2678 dp2 = x509.DistributionPoint(
2679 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2680 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002681 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002682 None
2683 )
2684 assert dp != dp2
2685 assert dp != object()
2686
2687 def test_repr(self):
2688 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002689 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002690 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002691 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002692 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002693 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002694 [
2695 x509.DirectoryName(
2696 x509.Name([
2697 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002698 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002699 )
2700 ])
2701 )
2702 ],
2703 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002704 if six.PY3:
2705 assert repr(dp) == (
2706 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2707 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002708 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2709 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2710 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2711 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002712 )
2713 else:
2714 assert repr(dp) == (
2715 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2716 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002717 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2718 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2719 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2720 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002721 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002722
2723
2724class TestCRLDistributionPoints(object):
2725 def test_invalid_distribution_points(self):
2726 with pytest.raises(TypeError):
2727 x509.CRLDistributionPoints(["notadistributionpoint"])
2728
2729 def test_iter_len(self):
2730 cdp = x509.CRLDistributionPoints([
2731 x509.DistributionPoint(
2732 [x509.UniformResourceIdentifier(u"http://domain")],
2733 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002734 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002735 None
2736 ),
2737 x509.DistributionPoint(
2738 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002739 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002740 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002741 x509.ReasonFlags.key_compromise,
2742 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002743 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002744 None
2745 ),
2746 ])
2747 assert len(cdp) == 2
2748 assert list(cdp) == [
2749 x509.DistributionPoint(
2750 [x509.UniformResourceIdentifier(u"http://domain")],
2751 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002752 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002753 None
2754 ),
2755 x509.DistributionPoint(
2756 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002757 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002758 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002759 x509.ReasonFlags.key_compromise,
2760 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002761 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002762 None
2763 ),
2764 ]
2765
2766 def test_repr(self):
2767 cdp = x509.CRLDistributionPoints([
2768 x509.DistributionPoint(
2769 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002770 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002771 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002772 None
2773 ),
2774 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002775 if six.PY3:
2776 assert repr(cdp) == (
2777 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2778 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2779 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2780 "romise'>}), crl_issuer=None)>])>"
2781 )
2782 else:
2783 assert repr(cdp) == (
2784 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2785 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2786 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2787 "romise'>]), crl_issuer=None)>])>"
2788 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002789
2790 def test_eq(self):
2791 cdp = x509.CRLDistributionPoints([
2792 x509.DistributionPoint(
2793 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002794 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002795 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002796 x509.ReasonFlags.key_compromise,
2797 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002798 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002799 [x509.UniformResourceIdentifier(u"uri://thing")],
2800 ),
2801 ])
2802 cdp2 = x509.CRLDistributionPoints([
2803 x509.DistributionPoint(
2804 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002805 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002806 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002807 x509.ReasonFlags.key_compromise,
2808 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002809 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002810 [x509.UniformResourceIdentifier(u"uri://thing")],
2811 ),
2812 ])
2813 assert cdp == cdp2
2814
2815 def test_ne(self):
2816 cdp = x509.CRLDistributionPoints([
2817 x509.DistributionPoint(
2818 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002819 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002820 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002821 x509.ReasonFlags.key_compromise,
2822 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002823 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002824 [x509.UniformResourceIdentifier(u"uri://thing")],
2825 ),
2826 ])
2827 cdp2 = x509.CRLDistributionPoints([
2828 x509.DistributionPoint(
2829 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002830 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002831 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002832 x509.ReasonFlags.key_compromise,
2833 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002834 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002835 [x509.UniformResourceIdentifier(u"uri://thing")],
2836 ),
2837 ])
2838 cdp3 = x509.CRLDistributionPoints([
2839 x509.DistributionPoint(
2840 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002841 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002842 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002843 [x509.UniformResourceIdentifier(u"uri://thing")],
2844 ),
2845 ])
2846 cdp4 = x509.CRLDistributionPoints([
2847 x509.DistributionPoint(
2848 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002849 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002850 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002851 x509.ReasonFlags.key_compromise,
2852 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002853 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002854 [x509.UniformResourceIdentifier(u"uri://thing2")],
2855 ),
2856 ])
2857 assert cdp != cdp2
2858 assert cdp != cdp3
2859 assert cdp != cdp4
2860 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002861
2862
2863@pytest.mark.requires_backend_interface(interface=RSABackend)
2864@pytest.mark.requires_backend_interface(interface=X509Backend)
2865class TestCRLDistributionPointsExtension(object):
2866 def test_fullname_and_crl_issuer(self, backend):
2867 cert = _load_cert(
2868 os.path.join(
2869 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2870 ),
2871 x509.load_der_x509_certificate,
2872 backend
2873 )
2874
2875 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002876 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002877 ).value
2878
2879 assert cdps == x509.CRLDistributionPoints([
2880 x509.DistributionPoint(
2881 full_name=[x509.DirectoryName(
2882 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002883 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002884 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002885 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002886 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002887 ),
2888 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002889 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002890 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002891 ),
2892 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002893 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002894 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002895 ),
2896 ])
2897 )],
2898 relative_name=None,
2899 reasons=None,
2900 crl_issuer=[x509.DirectoryName(
2901 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002902 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002903 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002904 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002905 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002906 ),
2907 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002908 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002909 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002910 ),
2911 ])
2912 )],
2913 )
2914 ])
2915
2916 def test_relativename_and_crl_issuer(self, backend):
2917 cert = _load_cert(
2918 os.path.join(
2919 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2920 ),
2921 x509.load_der_x509_certificate,
2922 backend
2923 )
2924
2925 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002926 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002927 ).value
2928
2929 assert cdps == x509.CRLDistributionPoints([
2930 x509.DistributionPoint(
2931 full_name=None,
2932 relative_name=x509.Name([
2933 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002934 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002935 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002936 ),
2937 ]),
2938 reasons=None,
2939 crl_issuer=[x509.DirectoryName(
2940 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002941 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002942 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002943 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002944 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002945 ),
2946 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002947 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002948 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002949 ),
2950 ])
2951 )],
2952 )
2953 ])
2954
2955 def test_fullname_crl_issuer_reasons(self, backend):
2956 cert = _load_cert(
2957 os.path.join(
2958 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2959 ),
2960 x509.load_pem_x509_certificate,
2961 backend
2962 )
2963
2964 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002965 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002966 ).value
2967
2968 assert cdps == x509.CRLDistributionPoints([
2969 x509.DistributionPoint(
2970 full_name=[x509.UniformResourceIdentifier(
2971 u"http://myhost.com/myca.crl"
2972 )],
2973 relative_name=None,
2974 reasons=frozenset([
2975 x509.ReasonFlags.key_compromise,
2976 x509.ReasonFlags.ca_compromise
2977 ]),
2978 crl_issuer=[x509.DirectoryName(
2979 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002980 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002981 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002982 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002983 ),
2984 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002985 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002986 ),
2987 ])
2988 )],
2989 )
2990 ])
2991
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002992 def test_all_reasons(self, backend):
2993 cert = _load_cert(
2994 os.path.join(
2995 "x509", "custom", "cdp_all_reasons.pem"
2996 ),
2997 x509.load_pem_x509_certificate,
2998 backend
2999 )
3000
3001 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003002 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003003 ).value
3004
3005 assert cdps == x509.CRLDistributionPoints([
3006 x509.DistributionPoint(
3007 full_name=[x509.UniformResourceIdentifier(
3008 u"http://domain.com/some.crl"
3009 )],
3010 relative_name=None,
3011 reasons=frozenset([
3012 x509.ReasonFlags.key_compromise,
3013 x509.ReasonFlags.ca_compromise,
3014 x509.ReasonFlags.affiliation_changed,
3015 x509.ReasonFlags.superseded,
3016 x509.ReasonFlags.privilege_withdrawn,
3017 x509.ReasonFlags.cessation_of_operation,
3018 x509.ReasonFlags.aa_compromise,
3019 x509.ReasonFlags.certificate_hold,
3020 ]),
3021 crl_issuer=None
3022 )
3023 ])
3024
3025 def test_single_reason(self, backend):
3026 cert = _load_cert(
3027 os.path.join(
3028 "x509", "custom", "cdp_reason_aa_compromise.pem"
3029 ),
3030 x509.load_pem_x509_certificate,
3031 backend
3032 )
3033
3034 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003035 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003036 ).value
3037
3038 assert cdps == x509.CRLDistributionPoints([
3039 x509.DistributionPoint(
3040 full_name=[x509.UniformResourceIdentifier(
3041 u"http://domain.com/some.crl"
3042 )],
3043 relative_name=None,
3044 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3045 crl_issuer=None
3046 )
3047 ])
3048
Paul Kehrer9a10d592015-05-10 14:55:51 -05003049 def test_crl_issuer_only(self, backend):
3050 cert = _load_cert(
3051 os.path.join(
3052 "x509", "custom", "cdp_crl_issuer.pem"
3053 ),
3054 x509.load_pem_x509_certificate,
3055 backend
3056 )
3057
3058 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003059 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003060 ).value
3061
3062 assert cdps == x509.CRLDistributionPoints([
3063 x509.DistributionPoint(
3064 full_name=None,
3065 relative_name=None,
3066 reasons=None,
3067 crl_issuer=[x509.DirectoryName(
3068 x509.Name([
3069 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003070 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003071 ),
3072 ])
3073 )],
3074 )
3075 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003076
Dominic Chen87bb9572015-10-09 00:23:07 -04003077 def test_crl_empty_hostname(self, backend):
3078 cert = _load_cert(
3079 os.path.join(
3080 "x509", "custom", "cdp_empty_hostname.pem"
3081 ),
3082 x509.load_pem_x509_certificate,
3083 backend
3084 )
3085
3086 cdps = cert.extensions.get_extension_for_oid(
3087 ExtensionOID.CRL_DISTRIBUTION_POINTS
3088 ).value
3089
3090 assert cdps == x509.CRLDistributionPoints([
3091 x509.DistributionPoint(
3092 full_name=[x509.UniformResourceIdentifier(
3093 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3094 )],
3095 relative_name=None,
3096 reasons=None,
3097 crl_issuer=None
3098 )
3099 ])
3100
Paul Kehrer16fae762015-05-01 23:14:20 -05003101
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003102@pytest.mark.requires_backend_interface(interface=RSABackend)
3103@pytest.mark.requires_backend_interface(interface=X509Backend)
3104class TestOCSPNoCheckExtension(object):
3105 def test_nocheck(self, backend):
3106 cert = _load_cert(
3107 os.path.join(
3108 "x509", "custom", "ocsp_nocheck.pem"
3109 ),
3110 x509.load_pem_x509_certificate,
3111 backend
3112 )
3113 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003114 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003115 )
3116 assert isinstance(ext.value, x509.OCSPNoCheck)
3117
3118
Paul Kehrer16fae762015-05-01 23:14:20 -05003119class TestInhibitAnyPolicy(object):
3120 def test_not_int(self):
3121 with pytest.raises(TypeError):
3122 x509.InhibitAnyPolicy("notint")
3123
3124 def test_negative_int(self):
3125 with pytest.raises(ValueError):
3126 x509.InhibitAnyPolicy(-1)
3127
3128 def test_repr(self):
3129 iap = x509.InhibitAnyPolicy(0)
3130 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3131
3132 def test_eq(self):
3133 iap = x509.InhibitAnyPolicy(1)
3134 iap2 = x509.InhibitAnyPolicy(1)
3135 assert iap == iap2
3136
3137 def test_ne(self):
3138 iap = x509.InhibitAnyPolicy(1)
3139 iap2 = x509.InhibitAnyPolicy(4)
3140 assert iap != iap2
3141 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003142
3143
3144@pytest.mark.requires_backend_interface(interface=RSABackend)
3145@pytest.mark.requires_backend_interface(interface=X509Backend)
3146class TestInhibitAnyPolicyExtension(object):
3147 def test_nocheck(self, backend):
3148 cert = _load_cert(
3149 os.path.join(
3150 "x509", "custom", "inhibit_any_policy_5.pem"
3151 ),
3152 x509.load_pem_x509_certificate,
3153 backend
3154 )
3155 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003156 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003157 ).value
3158 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003159
3160
3161@pytest.mark.requires_backend_interface(interface=RSABackend)
3162@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003163class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003164 def test_invalid_certificate_policies_data(self, backend):
3165 cert = _load_cert(
3166 os.path.join(
3167 "x509", "custom", "cp_invalid.pem"
3168 ),
3169 x509.load_pem_x509_certificate,
3170 backend
3171 )
3172 with pytest.raises(ValueError):
3173 cert.extensions