blob: 49a3433cce9c5dc0116bfb49dbef37a92fb0629a [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 Kehrer31bdf792015-03-25 14:11:00 -05008import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -05009import os
10
Paul Kehrer8cf26422015-03-21 09:50:24 -050011import pytest
12
Paul Kehrercbfb1012015-04-10 20:57:20 -040013import six
14
Paul Kehrer8cf26422015-03-21 09:50:24 -050015from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010016from cryptography.hazmat.backends.interfaces import (
17 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
18)
19from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050020from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080021 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
22 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050023)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050024
Paul Kehrerf22f6122015-08-05 12:57:13 +010025from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050026from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050027
28
Paul Kehrer85894662015-03-22 13:19:31 -050029class TestExtension(object):
30 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050031 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050032 with pytest.raises(TypeError):
33 x509.Extension("notanoid", True, bc)
34
35 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050036 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050037 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050038 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050039
40 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050041 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050042 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050043 assert repr(ext) == (
44 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
45 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
46 "_length=None)>)>"
47 )
48
Paul Kehrer58e870c2015-05-17 09:15:30 -070049 def test_eq(self):
50 ext1 = x509.Extension(
51 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
52 )
53 ext2 = x509.Extension(
54 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
55 )
56 assert ext1 == ext2
57
58 def test_ne(self):
59 ext1 = x509.Extension(
60 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
61 )
62 ext2 = x509.Extension(
63 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
64 )
65 ext3 = x509.Extension(
66 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
67 )
68 ext4 = x509.Extension(
69 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
70 )
71 assert ext1 != ext2
72 assert ext1 != ext3
73 assert ext1 != ext4
74 assert ext1 != object()
75
Paul Kehrer85894662015-03-22 13:19:31 -050076
Paul Kehrer49bb7562015-12-25 16:17:40 -060077class TestCertificateIssuer(object):
78 def test_iter_names(self):
79 ci = x509.CertificateIssuer([
80 x509.DNSName(u"cryptography.io"),
81 x509.DNSName(u"crypto.local"),
82 ])
83 assert len(ci) == 2
84 assert list(ci) == [
85 x509.DNSName(u"cryptography.io"),
86 x509.DNSName(u"crypto.local"),
87 ]
88
89 def test_eq(self):
90 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
91 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
92 assert ci1 == ci2
93
94 def test_ne(self):
95 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
96 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
97 assert ci1 != ci2
98 assert ci1 != object()
99
100 def test_repr(self):
101 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
102 assert repr(ci) == (
103 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
104 ")>])>)>"
105 )
106
107 def test_get_values_for_type(self):
108 ci = x509.CertificateIssuer(
109 [x509.DNSName(u"cryptography.io")]
110 )
111 names = ci.get_values_for_type(x509.DNSName)
112 assert names == [u"cryptography.io"]
113
114
Paul Kehrer7058ece2015-12-25 22:28:29 -0600115class TestCRLReason(object):
116 def test_invalid_reason_flags(self):
117 with pytest.raises(TypeError):
118 x509.CRLReason("notareason")
119
120 def test_eq(self):
121 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
122 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
123 assert reason1 == reason2
124
125 def test_ne(self):
126 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
127 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
128 assert reason1 != reason2
129 assert reason1 != object()
130
131 def test_repr(self):
132 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
133 assert repr(reason1) == (
134 "<CRLReason(reason=ReasonFlags.unspecified)>"
135 )
136
137
Paul Kehrer2b622582015-04-15 11:04:29 -0400138class TestNoticeReference(object):
139 def test_notice_numbers_not_all_int(self):
140 with pytest.raises(TypeError):
141 x509.NoticeReference("org", [1, 2, "three"])
142
143 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500144 with pytest.raises(TypeError):
145 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400146
147 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500148 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400149
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500150 if six.PY3:
151 assert repr(nr) == (
152 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
153 "])>"
154 )
155 else:
156 assert repr(nr) == (
157 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
158 "4])>"
159 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400160
Paul Kehrerc56ab622015-05-03 09:56:31 -0500161 def test_eq(self):
162 nr = x509.NoticeReference("org", [1, 2])
163 nr2 = x509.NoticeReference("org", [1, 2])
164 assert nr == nr2
165
166 def test_ne(self):
167 nr = x509.NoticeReference("org", [1, 2])
168 nr2 = x509.NoticeReference("org", [1])
169 nr3 = x509.NoticeReference(None, [1, 2])
170 assert nr != nr2
171 assert nr != nr3
172 assert nr != object()
173
Paul Kehrer2b622582015-04-15 11:04:29 -0400174
175class TestUserNotice(object):
176 def test_notice_reference_invalid(self):
177 with pytest.raises(TypeError):
178 x509.UserNotice("invalid", None)
179
180 def test_notice_reference_none(self):
181 un = x509.UserNotice(None, "text")
182 assert un.notice_reference is None
183 assert un.explicit_text == "text"
184
185 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500186 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500187 if six.PY3:
188 assert repr(un) == (
189 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500190 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500191 )
192 else:
193 assert repr(un) == (
194 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500195 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500196 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400197
Paul Kehrerc56ab622015-05-03 09:56:31 -0500198 def test_eq(self):
199 nr = x509.NoticeReference("org", [1, 2])
200 nr2 = x509.NoticeReference("org", [1, 2])
201 un = x509.UserNotice(nr, "text")
202 un2 = x509.UserNotice(nr2, "text")
203 assert un == un2
204
205 def test_ne(self):
206 nr = x509.NoticeReference("org", [1, 2])
207 nr2 = x509.NoticeReference("org", [1])
208 un = x509.UserNotice(nr, "text")
209 un2 = x509.UserNotice(nr2, "text")
210 un3 = x509.UserNotice(nr, "text3")
211 assert un != un2
212 assert un != un3
213 assert un != object()
214
Paul Kehrer2b622582015-04-15 11:04:29 -0400215
Paul Kehrer2b622582015-04-15 11:04:29 -0400216class TestPolicyInformation(object):
217 def test_invalid_policy_identifier(self):
218 with pytest.raises(TypeError):
219 x509.PolicyInformation("notanoid", None)
220
221 def test_none_policy_qualifiers(self):
222 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
223 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
224 assert pi.policy_qualifiers is None
225
226 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500227 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400228 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
229 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
230 assert pi.policy_qualifiers == pq
231
232 def test_invalid_policy_identifiers(self):
233 with pytest.raises(TypeError):
234 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
235
236 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500237 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400238 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500239 if six.PY3:
240 assert repr(pi) == (
241 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
242 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500243 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500244 )
245 else:
246 assert repr(pi) == (
247 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
248 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500249 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500250 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400251
Paul Kehrerc56ab622015-05-03 09:56:31 -0500252 def test_eq(self):
253 pi = x509.PolicyInformation(
254 x509.ObjectIdentifier("1.2.3"),
255 [u"string", x509.UserNotice(None, u"hi")]
256 )
257 pi2 = x509.PolicyInformation(
258 x509.ObjectIdentifier("1.2.3"),
259 [u"string", x509.UserNotice(None, u"hi")]
260 )
261 assert pi == pi2
262
263 def test_ne(self):
264 pi = x509.PolicyInformation(
265 x509.ObjectIdentifier("1.2.3"), [u"string"]
266 )
267 pi2 = x509.PolicyInformation(
268 x509.ObjectIdentifier("1.2.3"), [u"string2"]
269 )
270 pi3 = x509.PolicyInformation(
271 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
272 )
273 assert pi != pi2
274 assert pi != pi3
275 assert pi != object()
276
Paul Kehrer2b622582015-04-15 11:04:29 -0400277
278class TestCertificatePolicies(object):
279 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500280 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400281 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
282 with pytest.raises(TypeError):
283 x509.CertificatePolicies([1, pi])
284
285 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500286 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400287 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
288 cp = x509.CertificatePolicies([pi])
289 assert len(cp) == 1
290 for policyinfo in cp:
291 assert policyinfo == pi
292
293 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500294 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400295 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
296 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500297 if six.PY3:
298 assert repr(cp) == (
299 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
300 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
301 "ers=['string'])>])>"
302 )
303 else:
304 assert repr(cp) == (
305 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
306 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
307 "ers=[u'string'])>])>"
308 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400309
Paul Kehrerc56ab622015-05-03 09:56:31 -0500310 def test_eq(self):
311 pi = x509.PolicyInformation(
312 x509.ObjectIdentifier("1.2.3"), [u"string"]
313 )
314 cp = x509.CertificatePolicies([pi])
315 pi2 = x509.PolicyInformation(
316 x509.ObjectIdentifier("1.2.3"), [u"string"]
317 )
318 cp2 = x509.CertificatePolicies([pi2])
319 assert cp == cp2
320
321 def test_ne(self):
322 pi = x509.PolicyInformation(
323 x509.ObjectIdentifier("1.2.3"), [u"string"]
324 )
325 cp = x509.CertificatePolicies([pi])
326 pi2 = x509.PolicyInformation(
327 x509.ObjectIdentifier("1.2.3"), [u"string2"]
328 )
329 cp2 = x509.CertificatePolicies([pi2])
330 assert cp != cp2
331 assert cp != object()
332
Paul Kehrer2b622582015-04-15 11:04:29 -0400333
Paul Kehrer11026fe2015-05-12 11:23:56 -0500334@pytest.mark.requires_backend_interface(interface=RSABackend)
335@pytest.mark.requires_backend_interface(interface=X509Backend)
336class TestCertificatePoliciesExtension(object):
337 def test_cps_uri_policy_qualifier(self, backend):
338 cert = _load_cert(
339 os.path.join("x509", "custom", "cp_cps_uri.pem"),
340 x509.load_pem_x509_certificate,
341 backend
342 )
343
344 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500345 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500346 ).value
347
348 assert cp == x509.CertificatePolicies([
349 x509.PolicyInformation(
350 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
351 [u"http://other.com/cps"]
352 )
353 ])
354
355 def test_user_notice_with_notice_reference(self, backend):
356 cert = _load_cert(
357 os.path.join(
358 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
359 ),
360 x509.load_pem_x509_certificate,
361 backend
362 )
363
364 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500365 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500366 ).value
367
368 assert cp == x509.CertificatePolicies([
369 x509.PolicyInformation(
370 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
371 [
372 u"http://example.com/cps",
373 u"http://other.com/cps",
374 x509.UserNotice(
375 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
376 u"thing"
377 )
378 ]
379 )
380 ])
381
382 def test_user_notice_with_explicit_text(self, backend):
383 cert = _load_cert(
384 os.path.join(
385 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
386 ),
387 x509.load_pem_x509_certificate,
388 backend
389 )
390
391 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500392 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500393 ).value
394
395 assert cp == x509.CertificatePolicies([
396 x509.PolicyInformation(
397 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
398 [x509.UserNotice(None, u"thing")]
399 )
400 ])
401
402 def test_user_notice_no_explicit_text(self, backend):
403 cert = _load_cert(
404 os.path.join(
405 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
406 ),
407 x509.load_pem_x509_certificate,
408 backend
409 )
410
411 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500412 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500413 ).value
414
415 assert cp == x509.CertificatePolicies([
416 x509.PolicyInformation(
417 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
418 [
419 x509.UserNotice(
420 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
421 None
422 )
423 ]
424 )
425 ])
426
427
Paul Kehrercecbbba2015-03-30 14:58:38 -0500428class TestKeyUsage(object):
429 def test_key_agreement_false_encipher_decipher_true(self):
430 with pytest.raises(ValueError):
431 x509.KeyUsage(
432 digital_signature=False,
433 content_commitment=False,
434 key_encipherment=False,
435 data_encipherment=False,
436 key_agreement=False,
437 key_cert_sign=False,
438 crl_sign=False,
439 encipher_only=True,
440 decipher_only=False
441 )
442
443 with pytest.raises(ValueError):
444 x509.KeyUsage(
445 digital_signature=False,
446 content_commitment=False,
447 key_encipherment=False,
448 data_encipherment=False,
449 key_agreement=False,
450 key_cert_sign=False,
451 crl_sign=False,
452 encipher_only=True,
453 decipher_only=True
454 )
455
456 with pytest.raises(ValueError):
457 x509.KeyUsage(
458 digital_signature=False,
459 content_commitment=False,
460 key_encipherment=False,
461 data_encipherment=False,
462 key_agreement=False,
463 key_cert_sign=False,
464 crl_sign=False,
465 encipher_only=False,
466 decipher_only=True
467 )
468
469 def test_properties_key_agreement_true(self):
470 ku = x509.KeyUsage(
471 digital_signature=True,
472 content_commitment=True,
473 key_encipherment=False,
474 data_encipherment=False,
475 key_agreement=False,
476 key_cert_sign=True,
477 crl_sign=False,
478 encipher_only=False,
479 decipher_only=False
480 )
481 assert ku.digital_signature is True
482 assert ku.content_commitment is True
483 assert ku.key_encipherment is False
484 assert ku.data_encipherment is False
485 assert ku.key_agreement is False
486 assert ku.key_cert_sign is True
487 assert ku.crl_sign is False
488
489 def test_key_agreement_true_properties(self):
490 ku = x509.KeyUsage(
491 digital_signature=False,
492 content_commitment=False,
493 key_encipherment=False,
494 data_encipherment=False,
495 key_agreement=True,
496 key_cert_sign=False,
497 crl_sign=False,
498 encipher_only=False,
499 decipher_only=True
500 )
501 assert ku.key_agreement is True
502 assert ku.encipher_only is False
503 assert ku.decipher_only is True
504
505 def test_key_agreement_false_properties(self):
506 ku = x509.KeyUsage(
507 digital_signature=False,
508 content_commitment=False,
509 key_encipherment=False,
510 data_encipherment=False,
511 key_agreement=False,
512 key_cert_sign=False,
513 crl_sign=False,
514 encipher_only=False,
515 decipher_only=False
516 )
517 assert ku.key_agreement is False
518 with pytest.raises(ValueError):
519 ku.encipher_only
520
521 with pytest.raises(ValueError):
522 ku.decipher_only
523
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500524 def test_repr_key_agreement_false(self):
525 ku = x509.KeyUsage(
526 digital_signature=True,
527 content_commitment=True,
528 key_encipherment=False,
529 data_encipherment=False,
530 key_agreement=False,
531 key_cert_sign=True,
532 crl_sign=False,
533 encipher_only=False,
534 decipher_only=False
535 )
536 assert repr(ku) == (
537 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
538 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400539 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
540 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500541 )
542
543 def test_repr_key_agreement_true(self):
544 ku = x509.KeyUsage(
545 digital_signature=True,
546 content_commitment=True,
547 key_encipherment=False,
548 data_encipherment=False,
549 key_agreement=True,
550 key_cert_sign=True,
551 crl_sign=False,
552 encipher_only=False,
553 decipher_only=False
554 )
555 assert repr(ku) == (
556 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
557 "cipherment=False, data_encipherment=False, key_agreement=True, k"
558 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
559 "only=False)>"
560 )
561
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500562 def test_eq(self):
563 ku = x509.KeyUsage(
564 digital_signature=False,
565 content_commitment=False,
566 key_encipherment=False,
567 data_encipherment=False,
568 key_agreement=True,
569 key_cert_sign=False,
570 crl_sign=False,
571 encipher_only=False,
572 decipher_only=True
573 )
574 ku2 = x509.KeyUsage(
575 digital_signature=False,
576 content_commitment=False,
577 key_encipherment=False,
578 data_encipherment=False,
579 key_agreement=True,
580 key_cert_sign=False,
581 crl_sign=False,
582 encipher_only=False,
583 decipher_only=True
584 )
585 assert ku == ku2
586
587 def test_ne(self):
588 ku = x509.KeyUsage(
589 digital_signature=False,
590 content_commitment=False,
591 key_encipherment=False,
592 data_encipherment=False,
593 key_agreement=True,
594 key_cert_sign=False,
595 crl_sign=False,
596 encipher_only=False,
597 decipher_only=True
598 )
599 ku2 = x509.KeyUsage(
600 digital_signature=False,
601 content_commitment=False,
602 key_encipherment=False,
603 data_encipherment=False,
604 key_agreement=False,
605 key_cert_sign=False,
606 crl_sign=False,
607 encipher_only=False,
608 decipher_only=False
609 )
610 assert ku != ku2
611 assert ku != object()
612
Paul Kehrercecbbba2015-03-30 14:58:38 -0500613
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500614class TestSubjectKeyIdentifier(object):
615 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400616 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500617 ski = x509.SubjectKeyIdentifier(value)
618 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500619
620 def test_repr(self):
621 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500622 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500623 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500624 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400625 if six.PY3:
626 assert repr(ext) == (
627 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
628 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
629 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
630 "\\xf7\\xff:\\xc9\')>)>"
631 )
632 else:
633 assert repr(ext) == (
634 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
635 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
636 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
637 "\\xf7\\xff:\\xc9\')>)>"
638 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500639
640 def test_eq(self):
641 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500642 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500643 )
644 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500645 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500646 )
647 assert ski == ski2
648
649 def test_ne(self):
650 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500651 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500652 )
653 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500654 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500655 )
656 assert ski != ski2
657 assert ski != object()
658
659
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400660class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500661 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400662 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500663 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400664
665 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500666 dirname = x509.DirectoryName(
667 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800668 x509.NameAttribute(
669 x509.ObjectIdentifier('2.999.1'),
670 u'value1'
671 ),
672 x509.NameAttribute(
673 x509.ObjectIdentifier('2.999.2'),
674 u'value2'
675 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500676 ])
677 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400678 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500679 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400680
681 def test_authority_issuer_none_serial_not_none(self):
682 with pytest.raises(ValueError):
683 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
684
685 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500686 dirname = x509.DirectoryName(
687 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800688 x509.NameAttribute(
689 x509.ObjectIdentifier('2.999.1'),
690 u'value1'
691 ),
692 x509.NameAttribute(
693 x509.ObjectIdentifier('2.999.2'),
694 u'value2'
695 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500696 ])
697 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400698 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500699 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400700
701 def test_authority_cert_serial_and_issuer_none(self):
702 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
703 assert aki.key_identifier == b"id"
704 assert aki.authority_cert_issuer is None
705 assert aki.authority_cert_serial_number is None
706
707 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500708 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500709 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500710 )
711 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400712
713 if six.PY3:
714 assert repr(aki) == (
715 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500716 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500717 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500718 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400719 )
720 else:
721 assert repr(aki) == (
722 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500723 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500724 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
725 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400726 )
727
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500728 def test_eq(self):
729 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500730 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500731 )
732 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
733 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500734 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500735 )
736 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
737 assert aki == aki2
738
739 def test_ne(self):
740 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500741 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500742 )
743 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500744 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500745 )
746 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
747 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
748 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
749 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
750 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
751 assert aki != aki2
752 assert aki != aki3
753 assert aki != aki4
754 assert aki != aki5
755 assert aki != object()
756
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400757
Paul Kehrer8cf26422015-03-21 09:50:24 -0500758class TestBasicConstraints(object):
759 def test_ca_not_boolean(self):
760 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500761 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500762
763 def test_path_length_not_ca(self):
764 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500765 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500766
767 def test_path_length_not_int(self):
768 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500769 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500770
771 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500772 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500773
774 def test_path_length_negative(self):
775 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500776 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500777
778 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500779 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500780 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500781 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500782 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500783
Paul Kehrer3a69b132015-05-13 10:03:46 -0500784 def test_eq(self):
785 na = x509.BasicConstraints(ca=True, path_length=None)
786 na2 = x509.BasicConstraints(ca=True, path_length=None)
787 assert na == na2
788
789 def test_ne(self):
790 na = x509.BasicConstraints(ca=True, path_length=None)
791 na2 = x509.BasicConstraints(ca=True, path_length=1)
792 na3 = x509.BasicConstraints(ca=False, path_length=None)
793 assert na != na2
794 assert na != na3
795 assert na != object()
796
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500797
Paul Kehrerffa2a152015-03-31 08:18:25 -0500798class TestExtendedKeyUsage(object):
799 def test_not_all_oids(self):
800 with pytest.raises(TypeError):
801 x509.ExtendedKeyUsage(["notoid"])
802
803 def test_iter_len(self):
804 eku = x509.ExtendedKeyUsage([
805 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
806 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
807 ])
808 assert len(eku) == 2
809 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500810 ExtendedKeyUsageOID.SERVER_AUTH,
811 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500812 ]
813
Paul Kehrer23d10c32015-04-02 23:12:32 -0500814 def test_repr(self):
815 eku = x509.ExtendedKeyUsage([
816 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
817 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
818 ])
819 assert repr(eku) == (
820 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
821 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
822 "tAuth)>])>"
823 )
824
Paul Kehrerb0476172015-05-02 19:34:51 -0500825 def test_eq(self):
826 eku = x509.ExtendedKeyUsage([
827 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
828 ])
829 eku2 = x509.ExtendedKeyUsage([
830 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
831 ])
832 assert eku == eku2
833
834 def test_ne(self):
835 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
836 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
837 assert eku != eku2
838 assert eku != object()
839
Paul Kehrerffa2a152015-03-31 08:18:25 -0500840
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500841@pytest.mark.requires_backend_interface(interface=RSABackend)
842@pytest.mark.requires_backend_interface(interface=X509Backend)
843class TestExtensions(object):
844 def test_no_extensions(self, backend):
845 cert = _load_cert(
846 os.path.join("x509", "verisign_md2_root.pem"),
847 x509.load_pem_x509_certificate,
848 backend
849 )
850 ext = cert.extensions
851 assert len(ext) == 0
852 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500853 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500854 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500855
Paul Kehrerd44e4132015-08-10 19:13:13 -0500856 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500857
858 def test_one_extension(self, backend):
859 cert = _load_cert(
860 os.path.join(
861 "x509", "custom", "basic_constraints_not_critical.pem"
862 ),
863 x509.load_pem_x509_certificate,
864 backend
865 )
866 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500867 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500868 assert ext is not None
869 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500870
871 def test_duplicate_extension(self, backend):
872 cert = _load_cert(
873 os.path.join(
874 "x509", "custom", "two_basic_constraints.pem"
875 ),
876 x509.load_pem_x509_certificate,
877 backend
878 )
879 with pytest.raises(x509.DuplicateExtension) as exc:
880 cert.extensions
881
Paul Kehrerd44e4132015-08-10 19:13:13 -0500882 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500883
884 def test_unsupported_critical_extension(self, backend):
885 cert = _load_cert(
886 os.path.join(
887 "x509", "custom", "unsupported_extension_critical.pem"
888 ),
889 x509.load_pem_x509_certificate,
890 backend
891 )
892 with pytest.raises(x509.UnsupportedExtension) as exc:
893 cert.extensions
894
895 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
896
897 def test_unsupported_extension(self, backend):
898 # TODO: this will raise an exception when all extensions are complete
899 cert = _load_cert(
900 os.path.join(
901 "x509", "custom", "unsupported_extension.pem"
902 ),
903 x509.load_pem_x509_certificate,
904 backend
905 )
906 extensions = cert.extensions
907 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500908
Phoebe Queenecae9812015-08-12 05:00:32 +0100909 def test_no_extensions_get_for_class(self, backend):
910 cert = _load_cert(
911 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100912 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100913 ),
914 x509.load_pem_x509_certificate,
915 backend
916 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100917 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100918 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100919 exts.get_extension_for_class(x509.IssuerAlternativeName)
920 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100921
Paul Kehrer5b90c972015-12-26 00:52:58 -0600922 def test_indexing(self, backend):
923 cert = _load_cert(
924 os.path.join("x509", "cryptography.io.pem"),
925 x509.load_pem_x509_certificate,
926 backend
927 )
928 exts = cert.extensions
929 assert exts[-1] == exts[7]
930 assert len(exts[3:5]) == 2
931 assert exts[2:4][0] == exts[2]
932 assert exts[2:4][1] == exts[3]
933
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100934 def test_one_extension_get_for_class(self, backend):
935 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100936 os.path.join(
937 "x509", "custom", "basic_constraints_not_critical.pem"
938 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100939 x509.load_pem_x509_certificate,
940 backend
941 )
942 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
943 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100944 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500945
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500946 def test_repr(self, backend):
947 cert = _load_cert(
948 os.path.join(
949 "x509", "custom", "basic_constraints_not_critical.pem"
950 ),
951 x509.load_pem_x509_certificate,
952 backend
953 )
954 assert repr(cert.extensions) == (
955 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
956 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
957 "alse, path_length=None)>)>])>"
958 )
959
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100960
Paul Kehrerfa56a232015-03-17 13:14:03 -0500961@pytest.mark.requires_backend_interface(interface=RSABackend)
962@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500963class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500964 def test_ca_true_pathlen_6(self, backend):
965 cert = _load_cert(
966 os.path.join(
967 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
968 ),
969 x509.load_der_x509_certificate,
970 backend
971 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100972 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500973 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500974 )
975 assert ext is not None
976 assert ext.critical is True
977 assert ext.value.ca is True
978 assert ext.value.path_length == 6
979
980 def test_path_length_zero(self, backend):
981 cert = _load_cert(
982 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
983 x509.load_pem_x509_certificate,
984 backend
985 )
986 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500987 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500988 )
989 assert ext is not None
990 assert ext.critical is True
991 assert ext.value.ca is True
992 assert ext.value.path_length == 0
993
994 def test_ca_true_no_pathlen(self, backend):
995 cert = _load_cert(
996 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
997 x509.load_der_x509_certificate,
998 backend
999 )
1000 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001001 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001002 )
1003 assert ext is not None
1004 assert ext.critical is True
1005 assert ext.value.ca is True
1006 assert ext.value.path_length is None
1007
1008 def test_ca_false(self, backend):
1009 cert = _load_cert(
1010 os.path.join("x509", "cryptography.io.pem"),
1011 x509.load_pem_x509_certificate,
1012 backend
1013 )
1014 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001015 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001016 )
1017 assert ext is not None
1018 assert ext.critical is True
1019 assert ext.value.ca is False
1020 assert ext.value.path_length is None
1021
1022 def test_no_basic_constraints(self, backend):
1023 cert = _load_cert(
1024 os.path.join(
1025 "x509",
1026 "PKITS_data",
1027 "certs",
1028 "ValidCertificatePathTest1EE.crt"
1029 ),
1030 x509.load_der_x509_certificate,
1031 backend
1032 )
1033 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001034 cert.extensions.get_extension_for_oid(
1035 ExtensionOID.BASIC_CONSTRAINTS
1036 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001037
1038 def test_basic_constraint_not_critical(self, backend):
1039 cert = _load_cert(
1040 os.path.join(
1041 "x509", "custom", "basic_constraints_not_critical.pem"
1042 ),
1043 x509.load_pem_x509_certificate,
1044 backend
1045 )
1046 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001047 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001048 )
1049 assert ext is not None
1050 assert ext.critical is False
1051 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001052
1053
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001054class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001055 @pytest.mark.requires_backend_interface(interface=RSABackend)
1056 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001057 def test_subject_key_identifier(self, backend):
1058 cert = _load_cert(
1059 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1060 x509.load_der_x509_certificate,
1061 backend
1062 )
1063 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001064 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001065 )
1066 ski = ext.value
1067 assert ext is not None
1068 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001069 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001070 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001071 )
1072
Paul Kehrerf22f6122015-08-05 12:57:13 +01001073 @pytest.mark.requires_backend_interface(interface=RSABackend)
1074 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001075 def test_no_subject_key_identifier(self, backend):
1076 cert = _load_cert(
1077 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1078 x509.load_pem_x509_certificate,
1079 backend
1080 )
1081 with pytest.raises(x509.ExtensionNotFound):
1082 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001083 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001084 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001085
Paul Kehrerf22f6122015-08-05 12:57:13 +01001086 @pytest.mark.requires_backend_interface(interface=RSABackend)
1087 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001088 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001089 cert = _load_cert(
1090 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1091 x509.load_der_x509_certificate,
1092 backend
1093 )
1094 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001095 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001096 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001097 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001098 cert.public_key()
1099 )
1100 assert ext.value == ski
1101
1102 @pytest.mark.requires_backend_interface(interface=DSABackend)
1103 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001104 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001105 cert = _load_cert(
1106 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1107 x509.load_pem_x509_certificate,
1108 backend
1109 )
1110
1111 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001112 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001113 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001114 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001115 cert.public_key()
1116 )
1117 assert ext.value == ski
1118
1119 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1120 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001121 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001122 _skip_curve_unsupported(backend, ec.SECP384R1())
1123 cert = _load_cert(
1124 os.path.join("x509", "ecdsa_root.pem"),
1125 x509.load_pem_x509_certificate,
1126 backend
1127 )
1128
1129 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001130 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001131 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001132 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001133 cert.public_key()
1134 )
1135 assert ext.value == ski
1136
Paul Kehrer5508ee22015-04-02 19:31:03 -05001137
1138@pytest.mark.requires_backend_interface(interface=RSABackend)
1139@pytest.mark.requires_backend_interface(interface=X509Backend)
1140class TestKeyUsageExtension(object):
1141 def test_no_key_usage(self, backend):
1142 cert = _load_cert(
1143 os.path.join("x509", "verisign_md2_root.pem"),
1144 x509.load_pem_x509_certificate,
1145 backend
1146 )
1147 ext = cert.extensions
1148 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001149 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001150
Paul Kehrerd44e4132015-08-10 19:13:13 -05001151 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001152
1153 def test_all_purposes(self, backend):
1154 cert = _load_cert(
1155 os.path.join(
1156 "x509", "custom", "all_key_usages.pem"
1157 ),
1158 x509.load_pem_x509_certificate,
1159 backend
1160 )
1161 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001162 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001163 assert ext is not None
1164
1165 ku = ext.value
1166 assert ku.digital_signature is True
1167 assert ku.content_commitment is True
1168 assert ku.key_encipherment is True
1169 assert ku.data_encipherment is True
1170 assert ku.key_agreement is True
1171 assert ku.key_cert_sign is True
1172 assert ku.crl_sign is True
1173 assert ku.encipher_only is True
1174 assert ku.decipher_only is True
1175
1176 def test_key_cert_sign_crl_sign(self, backend):
1177 cert = _load_cert(
1178 os.path.join(
1179 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1180 ),
1181 x509.load_der_x509_certificate,
1182 backend
1183 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001184 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001185 assert ext is not None
1186 assert ext.critical is True
1187
1188 ku = ext.value
1189 assert ku.digital_signature is False
1190 assert ku.content_commitment is False
1191 assert ku.key_encipherment is False
1192 assert ku.data_encipherment is False
1193 assert ku.key_agreement is False
1194 assert ku.key_cert_sign is True
1195 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001196
1197
1198@pytest.mark.parametrize(
1199 "name", [
1200 x509.RFC822Name,
1201 x509.DNSName,
1202 x509.UniformResourceIdentifier
1203 ]
1204)
1205class TestTextGeneralNames(object):
1206 def test_not_text(self, name):
1207 with pytest.raises(TypeError):
1208 name(b"notaunicodestring")
1209
1210 with pytest.raises(TypeError):
1211 name(1.3)
1212
1213 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301214 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001215 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1216
1217 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301218 gn = name(u"string")
1219 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001220 assert gn == gn2
1221
1222 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301223 gn = name(u"string")
1224 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001225 assert gn != gn2
1226 assert gn != object()
1227
1228
1229class TestDirectoryName(object):
1230 def test_not_name(self):
1231 with pytest.raises(TypeError):
1232 x509.DirectoryName(b"notaname")
1233
1234 with pytest.raises(TypeError):
1235 x509.DirectoryName(1.3)
1236
1237 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001238 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001239 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001240 if six.PY3:
1241 assert repr(gn) == (
1242 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1243 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1244 ">])>)>"
1245 )
1246 else:
1247 assert repr(gn) == (
1248 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1249 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1250 ")>])>)>"
1251 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001252
1253 def test_eq(self):
1254 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001255 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001256 ])
1257 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001258 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001259 ])
1260 gn = x509.DirectoryName(x509.Name([name]))
1261 gn2 = x509.DirectoryName(x509.Name([name2]))
1262 assert gn == gn2
1263
1264 def test_ne(self):
1265 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001266 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001267 ])
1268 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001269 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001270 ])
1271 gn = x509.DirectoryName(x509.Name([name]))
1272 gn2 = x509.DirectoryName(x509.Name([name2]))
1273 assert gn != gn2
1274 assert gn != object()
1275
1276
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001277class TestRFC822Name(object):
1278 def test_invalid_email(self):
1279 with pytest.raises(ValueError):
1280 x509.RFC822Name(u"Name <email>")
1281
1282 with pytest.raises(ValueError):
1283 x509.RFC822Name(u"")
1284
1285 def test_single_label(self):
1286 gn = x509.RFC822Name(u"administrator")
1287 assert gn.value == u"administrator"
1288
1289 def test_idna(self):
1290 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1291 assert gn.value == u"email@em\xe5\xefl.com"
1292 assert gn._encoded == b"email@xn--eml-vla4c.com"
1293
1294
Paul Kehrere28d6c42015-07-12 14:59:37 -05001295class TestUniformResourceIdentifier(object):
1296 def test_no_parsed_hostname(self):
1297 gn = x509.UniformResourceIdentifier(u"singlelabel")
1298 assert gn.value == u"singlelabel"
1299
1300 def test_with_port(self):
1301 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1302 assert gn.value == u"singlelabel:443/test"
1303
1304 def test_idna_no_port(self):
1305 gn = x509.UniformResourceIdentifier(
1306 u"http://\u043f\u044b\u043a\u0430.cryptography"
1307 )
1308 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1309 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1310
1311 def test_idna_with_port(self):
1312 gn = x509.UniformResourceIdentifier(
1313 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1314 )
1315 assert gn.value == (
1316 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1317 )
1318 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1319
1320 def test_query_and_fragment(self):
1321 gn = x509.UniformResourceIdentifier(
1322 u"ldap://cryptography:90/path?query=true#somedata"
1323 )
1324 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1325
1326
Paul Kehrer31bdf792015-03-25 14:11:00 -05001327class TestRegisteredID(object):
1328 def test_not_oid(self):
1329 with pytest.raises(TypeError):
1330 x509.RegisteredID(b"notanoid")
1331
1332 with pytest.raises(TypeError):
1333 x509.RegisteredID(1.3)
1334
1335 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001336 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001337 assert repr(gn) == (
1338 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1339 "e)>)>"
1340 )
1341
1342 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001343 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1344 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001345 assert gn == gn2
1346
1347 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001348 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001349 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001350 assert gn != gn2
1351 assert gn != object()
1352
1353
1354class TestIPAddress(object):
1355 def test_not_ipaddress(self):
1356 with pytest.raises(TypeError):
1357 x509.IPAddress(b"notanipaddress")
1358
1359 with pytest.raises(TypeError):
1360 x509.IPAddress(1.3)
1361
1362 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301363 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001364 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1365
Eeshan Gargf1234152015-04-29 18:41:00 +05301366 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001367 assert repr(gn2) == "<IPAddress(value=ff::)>"
1368
Paul Kehrereb177932015-05-17 18:33:33 -07001369 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1370 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1371
1372 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1373 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1374
Paul Kehrer31bdf792015-03-25 14:11:00 -05001375 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301376 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1377 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001378 assert gn == gn2
1379
1380 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301381 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1382 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001383 assert gn != gn2
1384 assert gn != object()
1385
1386
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001387class TestOtherName(object):
1388 def test_invalid_args(self):
1389 with pytest.raises(TypeError):
1390 x509.OtherName(b"notanobjectidentifier", b"derdata")
1391
1392 with pytest.raises(TypeError):
1393 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1394
1395 def test_repr(self):
1396 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1397 if six.PY3:
1398 assert repr(gn) == (
1399 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1400 "name=Unknown OID)>, value=b'derdata')>"
1401 )
1402 else:
1403 assert repr(gn) == (
1404 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1405 "name=Unknown OID)>, value='derdata')>"
1406 )
1407
1408 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1409 if six.PY3:
1410 assert repr(gn) == (
1411 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1412 "name=pseudonym)>, value=b'derdata')>"
1413 )
1414 else:
1415 assert repr(gn) == (
1416 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1417 "name=pseudonym)>, value='derdata')>"
1418 )
1419
1420 def test_eq(self):
1421 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1422 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1423 assert gn == gn2
1424
1425 def test_ne(self):
1426 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1427 assert gn != object()
1428
1429 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1430 assert gn != gn2
1431
1432 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1433 assert gn != gn2
1434
1435
Erik Trauschke2dcce902015-05-14 16:12:24 -07001436class TestGeneralNames(object):
1437 def test_get_values_for_type(self):
1438 gns = x509.GeneralNames(
1439 [x509.DNSName(u"cryptography.io")]
1440 )
1441 names = gns.get_values_for_type(x509.DNSName)
1442 assert names == [u"cryptography.io"]
1443
1444 def test_iter_names(self):
1445 gns = x509.GeneralNames([
1446 x509.DNSName(u"cryptography.io"),
1447 x509.DNSName(u"crypto.local"),
1448 ])
1449 assert len(gns) == 2
1450 assert list(gns) == [
1451 x509.DNSName(u"cryptography.io"),
1452 x509.DNSName(u"crypto.local"),
1453 ]
1454
1455 def test_invalid_general_names(self):
1456 with pytest.raises(TypeError):
1457 x509.GeneralNames(
1458 [x509.DNSName(u"cryptography.io"), "invalid"]
1459 )
1460
1461 def test_repr(self):
1462 gns = x509.GeneralNames(
1463 [
1464 x509.DNSName(u"cryptography.io")
1465 ]
1466 )
1467 assert repr(gns) == (
1468 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1469 )
1470
1471 def test_eq(self):
1472 gns = x509.GeneralNames(
1473 [x509.DNSName(u"cryptography.io")]
1474 )
1475 gns2 = x509.GeneralNames(
1476 [x509.DNSName(u"cryptography.io")]
1477 )
1478 assert gns == gns2
1479
1480 def test_ne(self):
1481 gns = x509.GeneralNames(
1482 [x509.DNSName(u"cryptography.io")]
1483 )
1484 gns2 = x509.GeneralNames(
1485 [x509.RFC822Name(u"admin@cryptography.io")]
1486 )
1487 assert gns != gns2
1488 assert gns != object()
1489
1490
Paul Kehrer99125c92015-06-07 18:37:10 -05001491class TestIssuerAlternativeName(object):
1492 def test_get_values_for_type(self):
1493 san = x509.IssuerAlternativeName(
1494 [x509.DNSName(u"cryptography.io")]
1495 )
1496 names = san.get_values_for_type(x509.DNSName)
1497 assert names == [u"cryptography.io"]
1498
1499 def test_iter_names(self):
1500 san = x509.IssuerAlternativeName([
1501 x509.DNSName(u"cryptography.io"),
1502 x509.DNSName(u"crypto.local"),
1503 ])
1504 assert len(san) == 2
1505 assert list(san) == [
1506 x509.DNSName(u"cryptography.io"),
1507 x509.DNSName(u"crypto.local"),
1508 ]
1509
1510 def test_invalid_general_names(self):
1511 with pytest.raises(TypeError):
1512 x509.IssuerAlternativeName(
1513 [x509.DNSName(u"cryptography.io"), "invalid"]
1514 )
1515
1516 def test_repr(self):
1517 san = x509.IssuerAlternativeName(
1518 [
1519 x509.DNSName(u"cryptography.io")
1520 ]
1521 )
1522 assert repr(san) == (
1523 "<IssuerAlternativeName("
1524 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1525 )
1526
1527 def test_eq(self):
1528 san = x509.IssuerAlternativeName(
1529 [x509.DNSName(u"cryptography.io")]
1530 )
1531 san2 = x509.IssuerAlternativeName(
1532 [x509.DNSName(u"cryptography.io")]
1533 )
1534 assert san == san2
1535
1536 def test_ne(self):
1537 san = x509.IssuerAlternativeName(
1538 [x509.DNSName(u"cryptography.io")]
1539 )
1540 san2 = x509.IssuerAlternativeName(
1541 [x509.RFC822Name(u"admin@cryptography.io")]
1542 )
1543 assert san != san2
1544 assert san != object()
1545
1546
Alex Gaynorf1c17672015-06-20 14:20:20 -04001547@pytest.mark.requires_backend_interface(interface=RSABackend)
1548@pytest.mark.requires_backend_interface(interface=X509Backend)
1549class TestRSAIssuerAlternativeNameExtension(object):
1550 def test_uri(self, backend):
1551 cert = _load_cert(
1552 os.path.join("x509", "custom", "ian_uri.pem"),
1553 x509.load_pem_x509_certificate,
1554 backend,
1555 )
1556 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001557 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001558 )
1559 assert list(ext.value) == [
1560 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1561 ]
1562
1563
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001564class TestCRLNumber(object):
1565 def test_eq(self):
1566 crl_number = x509.CRLNumber(15)
1567 assert crl_number == x509.CRLNumber(15)
1568
1569 def test_ne(self):
1570 crl_number = x509.CRLNumber(15)
1571 assert crl_number != x509.CRLNumber(14)
1572 assert crl_number != object()
1573
1574 def test_repr(self):
1575 crl_number = x509.CRLNumber(15)
1576 assert repr(crl_number) == "<CRLNumber(15)>"
1577
Paul Kehrera9718fc2015-12-22 22:55:35 -06001578 def test_invalid_number(self):
1579 with pytest.raises(TypeError):
1580 x509.CRLNumber("notanumber")
1581
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001582 def test_hash(self):
1583 c1 = x509.CRLNumber(1)
1584 c2 = x509.CRLNumber(1)
1585 c3 = x509.CRLNumber(2)
1586 assert hash(c1) == hash(c2)
1587 assert hash(c1) != hash(c3)
1588
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001589
Paul Kehrer31bdf792015-03-25 14:11:00 -05001590class TestSubjectAlternativeName(object):
1591 def test_get_values_for_type(self):
1592 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301593 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001594 )
1595 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301596 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001597
1598 def test_iter_names(self):
1599 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301600 x509.DNSName(u"cryptography.io"),
1601 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001602 ])
1603 assert len(san) == 2
1604 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301605 x509.DNSName(u"cryptography.io"),
1606 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001607 ]
1608
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001609 def test_invalid_general_names(self):
1610 with pytest.raises(TypeError):
1611 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301612 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001613 )
1614
Paul Kehrer31bdf792015-03-25 14:11:00 -05001615 def test_repr(self):
1616 san = x509.SubjectAlternativeName(
1617 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301618 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001619 ]
1620 )
1621 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001622 "<SubjectAlternativeName("
1623 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001624 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001625
Paul Kehrer58cc3972015-05-13 10:00:41 -05001626 def test_eq(self):
1627 san = x509.SubjectAlternativeName(
1628 [x509.DNSName(u"cryptography.io")]
1629 )
1630 san2 = x509.SubjectAlternativeName(
1631 [x509.DNSName(u"cryptography.io")]
1632 )
1633 assert san == san2
1634
1635 def test_ne(self):
1636 san = x509.SubjectAlternativeName(
1637 [x509.DNSName(u"cryptography.io")]
1638 )
1639 san2 = x509.SubjectAlternativeName(
1640 [x509.RFC822Name(u"admin@cryptography.io")]
1641 )
1642 assert san != san2
1643 assert san != object()
1644
Paul Kehrer40f83382015-04-20 15:00:16 -05001645
1646@pytest.mark.requires_backend_interface(interface=RSABackend)
1647@pytest.mark.requires_backend_interface(interface=X509Backend)
1648class TestRSASubjectAlternativeNameExtension(object):
1649 def test_dns_name(self, backend):
1650 cert = _load_cert(
1651 os.path.join("x509", "cryptography.io.pem"),
1652 x509.load_pem_x509_certificate,
1653 backend
1654 )
1655 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001656 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001657 )
1658 assert ext is not None
1659 assert ext.critical is False
1660
1661 san = ext.value
1662
1663 dns = san.get_values_for_type(x509.DNSName)
1664 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001665
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001666 def test_wildcard_dns_name(self, backend):
1667 cert = _load_cert(
1668 os.path.join("x509", "wildcard_san.pem"),
1669 x509.load_pem_x509_certificate,
1670 backend
1671 )
1672 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001673 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001674 )
1675
1676 dns = ext.value.get_values_for_type(x509.DNSName)
1677 assert dns == [
1678 u'*.langui.sh',
1679 u'langui.sh',
1680 u'*.saseliminator.com',
1681 u'saseliminator.com'
1682 ]
1683
Dominic Chen87bb9572015-10-09 00:23:07 -04001684 def test_san_empty_hostname(self, backend):
1685 cert = _load_cert(
1686 os.path.join(
1687 "x509", "custom", "san_empty_hostname.pem"
1688 ),
1689 x509.load_pem_x509_certificate,
1690 backend
1691 )
1692 san = cert.extensions.get_extension_for_oid(
1693 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1694 )
1695
1696 dns = san.value.get_values_for_type(x509.DNSName)
1697 assert dns == [u'']
1698
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001699 def test_san_wildcard_idna_dns_name(self, backend):
1700 cert = _load_cert(
1701 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1702 x509.load_pem_x509_certificate,
1703 backend
1704 )
1705 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001706 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001707 )
1708
1709 dns = ext.value.get_values_for_type(x509.DNSName)
1710 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1711
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001712 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001713 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001714 os.path.join("x509", "san_x400address.der"),
1715 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001716 backend
1717 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001718 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001719 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001720
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001721 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001722
1723 def test_registered_id(self, backend):
1724 cert = _load_cert(
1725 os.path.join(
1726 "x509", "custom", "san_registered_id.pem"
1727 ),
1728 x509.load_pem_x509_certificate,
1729 backend
1730 )
1731 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001732 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001733 )
1734 assert ext is not None
1735 assert ext.critical is False
1736
1737 san = ext.value
1738 rid = san.get_values_for_type(x509.RegisteredID)
1739 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001740
1741 def test_uri(self, backend):
1742 cert = _load_cert(
1743 os.path.join(
1744 "x509", "custom", "san_uri_with_port.pem"
1745 ),
1746 x509.load_pem_x509_certificate,
1747 backend
1748 )
1749 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001750 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001751 )
1752 assert ext is not None
1753 uri = ext.value.get_values_for_type(
1754 x509.UniformResourceIdentifier
1755 )
1756 assert uri == [
1757 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1758 u"lo",
1759 u"http://someregulardomain.com",
1760 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001761
1762 def test_ipaddress(self, backend):
1763 cert = _load_cert(
1764 os.path.join(
1765 "x509", "custom", "san_ipaddr.pem"
1766 ),
1767 x509.load_pem_x509_certificate,
1768 backend
1769 )
1770 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001771 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001772 )
1773 assert ext is not None
1774 assert ext.critical is False
1775
1776 san = ext.value
1777
1778 ip = san.get_values_for_type(x509.IPAddress)
1779 assert [
1780 ipaddress.ip_address(u"127.0.0.1"),
1781 ipaddress.ip_address(u"ff::")
1782 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001783
1784 def test_dirname(self, backend):
1785 cert = _load_cert(
1786 os.path.join(
1787 "x509", "custom", "san_dirname.pem"
1788 ),
1789 x509.load_pem_x509_certificate,
1790 backend
1791 )
1792 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001793 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001794 )
1795 assert ext is not None
1796 assert ext.critical is False
1797
1798 san = ext.value
1799
1800 dirname = san.get_values_for_type(x509.DirectoryName)
1801 assert [
1802 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001803 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1804 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1805 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001806 ])
1807 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001808
1809 def test_rfc822name(self, backend):
1810 cert = _load_cert(
1811 os.path.join(
1812 "x509", "custom", "san_rfc822_idna.pem"
1813 ),
1814 x509.load_pem_x509_certificate,
1815 backend
1816 )
1817 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001818 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001819 )
1820 assert ext is not None
1821 assert ext.critical is False
1822
1823 san = ext.value
1824
1825 rfc822name = san.get_values_for_type(x509.RFC822Name)
1826 assert [u"email@em\xe5\xefl.com"] == rfc822name
1827
Paul Kehrerb8968812015-05-15 09:01:34 -07001828 def test_idna2003_invalid(self, backend):
1829 cert = _load_cert(
1830 os.path.join(
1831 "x509", "custom", "san_idna2003_dnsname.pem"
1832 ),
1833 x509.load_pem_x509_certificate,
1834 backend
1835 )
1836 with pytest.raises(UnicodeError):
1837 cert.extensions
1838
Paul Kehrere06cab42015-04-30 10:23:33 -05001839 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1840 cert = _load_cert(
1841 os.path.join(
1842 "x509", "custom", "san_idna_names.pem"
1843 ),
1844 x509.load_pem_x509_certificate,
1845 backend
1846 )
1847 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001848 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001849 )
1850 assert ext is not None
1851 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1852 dns_name = ext.value.get_values_for_type(x509.DNSName)
1853 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1854 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1855 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1856 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1857
1858 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1859 cert = _load_cert(
1860 os.path.join(
1861 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1862 ),
1863 x509.load_pem_x509_certificate,
1864 backend
1865 )
1866 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001867 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001868 )
1869 assert ext is not None
1870 assert ext.critical is False
1871
1872 san = ext.value
1873
1874 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1875 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1876 dns = san.get_values_for_type(x509.DNSName)
1877 ip = san.get_values_for_type(x509.IPAddress)
1878 dirname = san.get_values_for_type(x509.DirectoryName)
1879 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001880 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001881 assert [u"cryptography.io"] == dns
1882 assert [
1883 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001884 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001885 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001886 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001887 ),
1888 ])
1889 ] == dirname
1890 assert [
1891 ipaddress.ip_address(u"127.0.0.1"),
1892 ipaddress.ip_address(u"ff::")
1893 ] == ip
1894
1895 def test_invalid_rfc822name(self, backend):
1896 cert = _load_cert(
1897 os.path.join(
1898 "x509", "custom", "san_rfc822_names.pem"
1899 ),
1900 x509.load_pem_x509_certificate,
1901 backend
1902 )
1903 with pytest.raises(ValueError) as exc:
1904 cert.extensions
1905
1906 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001907
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001908 def test_other_name(self, backend):
1909 cert = _load_cert(
1910 os.path.join(
1911 "x509", "custom", "san_other_name.pem"
1912 ),
1913 x509.load_pem_x509_certificate,
1914 backend
1915 )
1916
1917 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001918 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001919 )
1920 assert ext is not None
1921 assert ext.critical is False
1922
Joshua Taubererd2afad32015-07-06 22:37:53 +00001923 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1924 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001925 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001926 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001927
1928 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001929 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001930
Paul Kehrer94c69602015-05-02 19:29:40 -05001931
1932@pytest.mark.requires_backend_interface(interface=RSABackend)
1933@pytest.mark.requires_backend_interface(interface=X509Backend)
1934class TestExtendedKeyUsageExtension(object):
1935 def test_eku(self, backend):
1936 cert = _load_cert(
1937 os.path.join(
1938 "x509", "custom", "extended_key_usage.pem"
1939 ),
1940 x509.load_pem_x509_certificate,
1941 backend
1942 )
1943 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001944 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001945 )
1946 assert ext is not None
1947 assert ext.critical is False
1948
1949 assert [
1950 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1951 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1952 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1953 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1954 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1955 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1956 x509.ObjectIdentifier("2.5.29.37.0"),
1957 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1958 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001959
1960
1961class TestAccessDescription(object):
1962 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001963 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001964 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1965
1966 def test_invalid_access_location(self):
1967 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001968 x509.AccessDescription(
1969 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1970 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001971
Nick Bastind2ecf862015-12-13 05:44:46 -08001972 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001973 ad = x509.AccessDescription(
1974 ObjectIdentifier("2.999.1"),
1975 x509.UniformResourceIdentifier(u"http://example.com")
1976 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08001977 assert ad is not None
1978
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001979 def test_repr(self):
1980 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001981 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001982 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1983 )
1984 assert repr(ad) == (
1985 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
1986 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
1987 "(value=http://ocsp.domain.com)>)>"
1988 )
1989
1990 def test_eq(self):
1991 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001992 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001993 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1994 )
1995 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001996 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001997 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1998 )
1999 assert ad == ad2
2000
2001 def test_ne(self):
2002 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002003 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002004 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2005 )
2006 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002007 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002008 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2009 )
2010 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002011 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002012 x509.UniformResourceIdentifier(u"http://notthesame")
2013 )
2014 assert ad != ad2
2015 assert ad != ad3
2016 assert ad != object()
2017
2018
2019class TestAuthorityInformationAccess(object):
2020 def test_invalid_descriptions(self):
2021 with pytest.raises(TypeError):
2022 x509.AuthorityInformationAccess(["notanAccessDescription"])
2023
2024 def test_iter_len(self):
2025 aia = x509.AuthorityInformationAccess([
2026 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002027 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002028 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2029 ),
2030 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002031 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002032 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2033 )
2034 ])
2035 assert len(aia) == 2
2036 assert list(aia) == [
2037 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002038 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002039 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2040 ),
2041 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002042 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002043 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2044 )
2045 ]
2046
2047 def test_repr(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 repr(aia) == (
2059 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2060 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2061 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2062 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2063 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2064 "fier(value=http://domain.com/ca.crt)>)>])>"
2065 )
2066
2067 def test_eq(self):
2068 aia = x509.AuthorityInformationAccess([
2069 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002070 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002071 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2072 ),
2073 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002074 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002075 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2076 )
2077 ])
2078 aia2 = x509.AuthorityInformationAccess([
2079 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002080 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002081 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2082 ),
2083 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002084 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002085 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2086 )
2087 ])
2088 assert aia == aia2
2089
2090 def test_ne(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 ])
2107
2108 assert aia != aia2
2109 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002110
2111
2112@pytest.mark.requires_backend_interface(interface=RSABackend)
2113@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002114class TestAuthorityInformationAccessExtension(object):
2115 def test_aia_ocsp_ca_issuers(self, backend):
2116 cert = _load_cert(
2117 os.path.join("x509", "cryptography.io.pem"),
2118 x509.load_pem_x509_certificate,
2119 backend
2120 )
2121 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002122 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002123 )
2124 assert ext is not None
2125 assert ext.critical is False
2126
2127 assert ext.value == x509.AuthorityInformationAccess([
2128 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002129 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002130 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2131 ),
2132 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002133 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002134 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2135 ),
2136 ])
2137
2138 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2139 cert = _load_cert(
2140 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.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://ocsp.domain.com")
2154 ),
2155 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002156 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002157 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2158 ),
2159 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002160 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002161 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002162 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2163 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002164 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002165 ]))
2166 ),
2167 ])
2168
2169 def test_aia_ocsp_only(self, backend):
2170 cert = _load_cert(
2171 os.path.join("x509", "custom", "aia_ocsp.pem"),
2172 x509.load_pem_x509_certificate,
2173 backend
2174 )
2175 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002176 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002177 )
2178 assert ext is not None
2179 assert ext.critical is False
2180
2181 assert ext.value == x509.AuthorityInformationAccess([
2182 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002183 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002184 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2185 ),
2186 ])
2187
2188 def test_aia_ca_issuers_only(self, backend):
2189 cert = _load_cert(
2190 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2191 x509.load_pem_x509_certificate,
2192 backend
2193 )
2194 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002195 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002196 )
2197 assert ext is not None
2198 assert ext.critical is False
2199
2200 assert ext.value == x509.AuthorityInformationAccess([
2201 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002202 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002203 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002204 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2205 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002206 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002207 ]))
2208 ),
2209 ])
2210
2211
2212@pytest.mark.requires_backend_interface(interface=RSABackend)
2213@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002214class TestAuthorityKeyIdentifierExtension(object):
2215 def test_aki_keyid(self, backend):
2216 cert = _load_cert(
2217 os.path.join(
2218 "x509", "cryptography.io.pem"
2219 ),
2220 x509.load_pem_x509_certificate,
2221 backend
2222 )
2223 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002224 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002225 )
2226 assert ext is not None
2227 assert ext.critical is False
2228
2229 assert ext.value.key_identifier == (
2230 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2231 )
2232 assert ext.value.authority_cert_issuer is None
2233 assert ext.value.authority_cert_serial_number is None
2234
2235 def test_aki_all_fields(self, backend):
2236 cert = _load_cert(
2237 os.path.join(
2238 "x509", "custom", "authority_key_identifier.pem"
2239 ),
2240 x509.load_pem_x509_certificate,
2241 backend
2242 )
2243 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002244 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002245 )
2246 assert ext is not None
2247 assert ext.critical is False
2248
2249 assert ext.value.key_identifier == (
2250 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2251 )
2252 assert ext.value.authority_cert_issuer == [
2253 x509.DirectoryName(
2254 x509.Name([
2255 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002256 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002257 ),
2258 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002259 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002260 )
2261 ])
2262 )
2263 ]
2264 assert ext.value.authority_cert_serial_number == 3
2265
2266 def test_aki_no_keyid(self, backend):
2267 cert = _load_cert(
2268 os.path.join(
2269 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2270 ),
2271 x509.load_pem_x509_certificate,
2272 backend
2273 )
2274 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002275 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002276 )
2277 assert ext is not None
2278 assert ext.critical is False
2279
2280 assert ext.value.key_identifier is None
2281 assert ext.value.authority_cert_issuer == [
2282 x509.DirectoryName(
2283 x509.Name([
2284 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002285 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002286 ),
2287 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002288 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002289 )
2290 ])
2291 )
2292 ]
2293 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002294
Paul Kehrer253929a2015-08-05 17:30:39 +01002295 def test_from_certificate(self, backend):
2296 issuer_cert = _load_cert(
2297 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2298 x509.load_pem_x509_certificate,
2299 backend
2300 )
2301 cert = _load_cert(
2302 os.path.join("x509", "cryptography.io.pem"),
2303 x509.load_pem_x509_certificate,
2304 backend
2305 )
2306 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002307 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002308 )
2309 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2310 issuer_cert.public_key()
2311 )
2312 assert ext.value == aki
2313
Paul Kehrer5a485522015-05-06 00:29:12 -05002314
Paul Kehrere0017be2015-05-17 20:39:40 -06002315class TestNameConstraints(object):
2316 def test_ipaddress_wrong_type(self):
2317 with pytest.raises(TypeError):
2318 x509.NameConstraints(
2319 permitted_subtrees=[
2320 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2321 ],
2322 excluded_subtrees=None
2323 )
2324
2325 with pytest.raises(TypeError):
2326 x509.NameConstraints(
2327 permitted_subtrees=None,
2328 excluded_subtrees=[
2329 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2330 ]
2331 )
2332
2333 def test_ipaddress_allowed_type(self):
2334 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2335 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2336 nc = x509.NameConstraints(
2337 permitted_subtrees=permitted,
2338 excluded_subtrees=excluded
2339 )
2340 assert nc.permitted_subtrees == permitted
2341 assert nc.excluded_subtrees == excluded
2342
2343 def test_invalid_permitted_subtrees(self):
2344 with pytest.raises(TypeError):
2345 x509.NameConstraints("badpermitted", None)
2346
2347 def test_invalid_excluded_subtrees(self):
2348 with pytest.raises(TypeError):
2349 x509.NameConstraints(None, "badexcluded")
2350
2351 def test_no_subtrees(self):
2352 with pytest.raises(ValueError):
2353 x509.NameConstraints(None, None)
2354
2355 def test_permitted_none(self):
2356 excluded = [x509.DNSName(u"name.local")]
2357 nc = x509.NameConstraints(
2358 permitted_subtrees=None, excluded_subtrees=excluded
2359 )
2360 assert nc.permitted_subtrees is None
2361 assert nc.excluded_subtrees is not None
2362
2363 def test_excluded_none(self):
2364 permitted = [x509.DNSName(u"name.local")]
2365 nc = x509.NameConstraints(
2366 permitted_subtrees=permitted, excluded_subtrees=None
2367 )
2368 assert nc.permitted_subtrees is not None
2369 assert nc.excluded_subtrees is None
2370
2371 def test_repr(self):
2372 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2373 nc = x509.NameConstraints(
2374 permitted_subtrees=permitted,
2375 excluded_subtrees=None
2376 )
2377 assert repr(nc) == (
2378 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2379 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2380 )
2381
Paul Kehrer31894282015-06-21 21:46:41 -05002382 def test_eq(self):
2383 nc = x509.NameConstraints(
2384 permitted_subtrees=[x509.DNSName(u"name.local")],
2385 excluded_subtrees=[x509.DNSName(u"name2.local")]
2386 )
2387 nc2 = x509.NameConstraints(
2388 permitted_subtrees=[x509.DNSName(u"name.local")],
2389 excluded_subtrees=[x509.DNSName(u"name2.local")]
2390 )
2391 assert nc == nc2
2392
2393 def test_ne(self):
2394 nc = x509.NameConstraints(
2395 permitted_subtrees=[x509.DNSName(u"name.local")],
2396 excluded_subtrees=[x509.DNSName(u"name2.local")]
2397 )
2398 nc2 = x509.NameConstraints(
2399 permitted_subtrees=[x509.DNSName(u"name.local")],
2400 excluded_subtrees=None
2401 )
2402 nc3 = x509.NameConstraints(
2403 permitted_subtrees=None,
2404 excluded_subtrees=[x509.DNSName(u"name2.local")]
2405 )
2406
2407 assert nc != nc2
2408 assert nc != nc3
2409 assert nc != object()
2410
Paul Kehrere0017be2015-05-17 20:39:40 -06002411
Paul Kehrer870d7e82015-06-21 22:20:44 -05002412@pytest.mark.requires_backend_interface(interface=RSABackend)
2413@pytest.mark.requires_backend_interface(interface=X509Backend)
2414class TestNameConstraintsExtension(object):
2415 def test_permitted_excluded(self, backend):
2416 cert = _load_cert(
2417 os.path.join(
2418 "x509", "custom", "nc_permitted_excluded_2.pem"
2419 ),
2420 x509.load_pem_x509_certificate,
2421 backend
2422 )
2423 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002424 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002425 ).value
2426 assert nc == x509.NameConstraints(
2427 permitted_subtrees=[
2428 x509.DNSName(u"zombo.local"),
2429 ],
2430 excluded_subtrees=[
2431 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002432 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002433 ]))
2434 ]
2435 )
2436
2437 def test_permitted(self, backend):
2438 cert = _load_cert(
2439 os.path.join(
2440 "x509", "custom", "nc_permitted_2.pem"
2441 ),
2442 x509.load_pem_x509_certificate,
2443 backend
2444 )
2445 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002446 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002447 ).value
2448 assert nc == x509.NameConstraints(
2449 permitted_subtrees=[
2450 x509.DNSName(u"zombo.local"),
2451 ],
2452 excluded_subtrees=None
2453 )
2454
Paul Kehrer42376832015-07-01 18:10:32 -05002455 def test_permitted_with_leading_period(self, backend):
2456 cert = _load_cert(
2457 os.path.join(
2458 "x509", "custom", "nc_permitted.pem"
2459 ),
2460 x509.load_pem_x509_certificate,
2461 backend
2462 )
2463 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002464 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002465 ).value
2466 assert nc == x509.NameConstraints(
2467 permitted_subtrees=[
2468 x509.DNSName(u".cryptography.io"),
2469 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2470 ],
2471 excluded_subtrees=None
2472 )
2473
2474 def test_excluded_with_leading_period(self, backend):
2475 cert = _load_cert(
2476 os.path.join(
2477 "x509", "custom", "nc_excluded.pem"
2478 ),
2479 x509.load_pem_x509_certificate,
2480 backend
2481 )
2482 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002483 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002484 ).value
2485 assert nc == x509.NameConstraints(
2486 permitted_subtrees=None,
2487 excluded_subtrees=[
2488 x509.DNSName(u".cryptography.io"),
2489 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2490 ]
2491 )
2492
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002493 def test_permitted_excluded_with_ips(self, backend):
2494 cert = _load_cert(
2495 os.path.join(
2496 "x509", "custom", "nc_permitted_excluded.pem"
2497 ),
2498 x509.load_pem_x509_certificate,
2499 backend
2500 )
2501 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002502 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002503 ).value
2504 assert nc == x509.NameConstraints(
2505 permitted_subtrees=[
2506 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2507 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2508 ],
2509 excluded_subtrees=[
2510 x509.DNSName(u".domain.com"),
2511 x509.UniformResourceIdentifier(u"http://test.local"),
2512 ]
2513 )
2514
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002515 def test_single_ip_netmask(self, backend):
2516 cert = _load_cert(
2517 os.path.join(
2518 "x509", "custom", "nc_single_ip_netmask.pem"
2519 ),
2520 x509.load_pem_x509_certificate,
2521 backend
2522 )
2523 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002524 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002525 ).value
2526 assert nc == x509.NameConstraints(
2527 permitted_subtrees=[
2528 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2529 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2530 ],
2531 excluded_subtrees=None
2532 )
2533
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002534 def test_invalid_netmask(self, backend):
2535 cert = _load_cert(
2536 os.path.join(
2537 "x509", "custom", "nc_invalid_ip_netmask.pem"
2538 ),
2539 x509.load_pem_x509_certificate,
2540 backend
2541 )
2542 with pytest.raises(ValueError):
2543 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002544 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002545 )
2546
Paul Kehrer870d7e82015-06-21 22:20:44 -05002547
Paul Kehrer5a485522015-05-06 00:29:12 -05002548class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002549 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002550 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002551 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002552
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002553 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002554 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002555 x509.DistributionPoint(None, "notname", None, None)
2556
2557 def test_distribution_point_full_and_relative_not_none(self):
2558 with pytest.raises(ValueError):
2559 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002560
2561 def test_crl_issuer_not_general_names(self):
2562 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002563 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002564
2565 def test_reason_not_reasonflags(self):
2566 with pytest.raises(TypeError):
2567 x509.DistributionPoint(
2568 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002569 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002570 frozenset(["notreasonflags"]),
2571 None
2572 )
2573
2574 def test_reason_not_frozenset(self):
2575 with pytest.raises(TypeError):
2576 x509.DistributionPoint(
2577 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2578 None,
2579 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002580 None
2581 )
2582
2583 def test_disallowed_reasons(self):
2584 with pytest.raises(ValueError):
2585 x509.DistributionPoint(
2586 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2587 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002588 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002589 None
2590 )
2591
2592 with pytest.raises(ValueError):
2593 x509.DistributionPoint(
2594 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2595 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002596 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002597 None
2598 )
2599
2600 def test_reason_only(self):
2601 with pytest.raises(ValueError):
2602 x509.DistributionPoint(
2603 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002604 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002605 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002606 None
2607 )
2608
2609 def test_eq(self):
2610 dp = x509.DistributionPoint(
2611 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002612 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002613 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002614 [
2615 x509.DirectoryName(
2616 x509.Name([
2617 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002618 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002619 )
2620 ])
2621 )
2622 ],
2623 )
2624 dp2 = x509.DistributionPoint(
2625 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002626 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002627 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002628 [
2629 x509.DirectoryName(
2630 x509.Name([
2631 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002632 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002633 )
2634 ])
2635 )
2636 ],
2637 )
2638 assert dp == dp2
2639
2640 def test_ne(self):
2641 dp = x509.DistributionPoint(
2642 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002643 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002644 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002645 [
2646 x509.DirectoryName(
2647 x509.Name([
2648 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002649 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002650 )
2651 ])
2652 )
2653 ],
2654 )
2655 dp2 = x509.DistributionPoint(
2656 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2657 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002658 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002659 None
2660 )
2661 assert dp != dp2
2662 assert dp != object()
2663
2664 def test_repr(self):
2665 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002666 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002667 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002668 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002669 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002670 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002671 [
2672 x509.DirectoryName(
2673 x509.Name([
2674 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002675 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002676 )
2677 ])
2678 )
2679 ],
2680 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002681 if six.PY3:
2682 assert repr(dp) == (
2683 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2684 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002685 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2686 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2687 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2688 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002689 )
2690 else:
2691 assert repr(dp) == (
2692 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2693 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002694 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2695 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2696 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2697 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002698 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002699
2700
2701class TestCRLDistributionPoints(object):
2702 def test_invalid_distribution_points(self):
2703 with pytest.raises(TypeError):
2704 x509.CRLDistributionPoints(["notadistributionpoint"])
2705
2706 def test_iter_len(self):
2707 cdp = x509.CRLDistributionPoints([
2708 x509.DistributionPoint(
2709 [x509.UniformResourceIdentifier(u"http://domain")],
2710 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002711 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002712 None
2713 ),
2714 x509.DistributionPoint(
2715 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002716 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002717 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002718 x509.ReasonFlags.key_compromise,
2719 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002720 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002721 None
2722 ),
2723 ])
2724 assert len(cdp) == 2
2725 assert list(cdp) == [
2726 x509.DistributionPoint(
2727 [x509.UniformResourceIdentifier(u"http://domain")],
2728 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002729 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002730 None
2731 ),
2732 x509.DistributionPoint(
2733 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002734 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002735 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002736 x509.ReasonFlags.key_compromise,
2737 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002738 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002739 None
2740 ),
2741 ]
2742
2743 def test_repr(self):
2744 cdp = x509.CRLDistributionPoints([
2745 x509.DistributionPoint(
2746 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002747 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002748 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002749 None
2750 ),
2751 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002752 if six.PY3:
2753 assert repr(cdp) == (
2754 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2755 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2756 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2757 "romise'>}), crl_issuer=None)>])>"
2758 )
2759 else:
2760 assert repr(cdp) == (
2761 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2762 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2763 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2764 "romise'>]), crl_issuer=None)>])>"
2765 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002766
2767 def test_eq(self):
2768 cdp = x509.CRLDistributionPoints([
2769 x509.DistributionPoint(
2770 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002771 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002772 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002773 x509.ReasonFlags.key_compromise,
2774 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002775 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002776 [x509.UniformResourceIdentifier(u"uri://thing")],
2777 ),
2778 ])
2779 cdp2 = x509.CRLDistributionPoints([
2780 x509.DistributionPoint(
2781 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002782 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002783 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002784 x509.ReasonFlags.key_compromise,
2785 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002786 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002787 [x509.UniformResourceIdentifier(u"uri://thing")],
2788 ),
2789 ])
2790 assert cdp == cdp2
2791
2792 def test_ne(self):
2793 cdp = x509.CRLDistributionPoints([
2794 x509.DistributionPoint(
2795 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002796 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002797 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002798 x509.ReasonFlags.key_compromise,
2799 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002800 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002801 [x509.UniformResourceIdentifier(u"uri://thing")],
2802 ),
2803 ])
2804 cdp2 = x509.CRLDistributionPoints([
2805 x509.DistributionPoint(
2806 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002807 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002808 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002809 x509.ReasonFlags.key_compromise,
2810 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002811 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002812 [x509.UniformResourceIdentifier(u"uri://thing")],
2813 ),
2814 ])
2815 cdp3 = x509.CRLDistributionPoints([
2816 x509.DistributionPoint(
2817 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002818 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002819 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002820 [x509.UniformResourceIdentifier(u"uri://thing")],
2821 ),
2822 ])
2823 cdp4 = x509.CRLDistributionPoints([
2824 x509.DistributionPoint(
2825 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002826 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002827 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002828 x509.ReasonFlags.key_compromise,
2829 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002830 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002831 [x509.UniformResourceIdentifier(u"uri://thing2")],
2832 ),
2833 ])
2834 assert cdp != cdp2
2835 assert cdp != cdp3
2836 assert cdp != cdp4
2837 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002838
2839
2840@pytest.mark.requires_backend_interface(interface=RSABackend)
2841@pytest.mark.requires_backend_interface(interface=X509Backend)
2842class TestCRLDistributionPointsExtension(object):
2843 def test_fullname_and_crl_issuer(self, backend):
2844 cert = _load_cert(
2845 os.path.join(
2846 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2847 ),
2848 x509.load_der_x509_certificate,
2849 backend
2850 )
2851
2852 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002853 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002854 ).value
2855
2856 assert cdps == x509.CRLDistributionPoints([
2857 x509.DistributionPoint(
2858 full_name=[x509.DirectoryName(
2859 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002860 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002861 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002862 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002863 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002864 ),
2865 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002866 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002867 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002868 ),
2869 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002870 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002871 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002872 ),
2873 ])
2874 )],
2875 relative_name=None,
2876 reasons=None,
2877 crl_issuer=[x509.DirectoryName(
2878 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002879 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002880 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002881 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002882 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002883 ),
2884 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002885 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002886 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002887 ),
2888 ])
2889 )],
2890 )
2891 ])
2892
2893 def test_relativename_and_crl_issuer(self, backend):
2894 cert = _load_cert(
2895 os.path.join(
2896 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2897 ),
2898 x509.load_der_x509_certificate,
2899 backend
2900 )
2901
2902 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002903 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002904 ).value
2905
2906 assert cdps == x509.CRLDistributionPoints([
2907 x509.DistributionPoint(
2908 full_name=None,
2909 relative_name=x509.Name([
2910 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002911 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002912 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002913 ),
2914 ]),
2915 reasons=None,
2916 crl_issuer=[x509.DirectoryName(
2917 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002918 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002919 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002920 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002921 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002922 ),
2923 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002924 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002925 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002926 ),
2927 ])
2928 )],
2929 )
2930 ])
2931
2932 def test_fullname_crl_issuer_reasons(self, backend):
2933 cert = _load_cert(
2934 os.path.join(
2935 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2936 ),
2937 x509.load_pem_x509_certificate,
2938 backend
2939 )
2940
2941 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002942 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002943 ).value
2944
2945 assert cdps == x509.CRLDistributionPoints([
2946 x509.DistributionPoint(
2947 full_name=[x509.UniformResourceIdentifier(
2948 u"http://myhost.com/myca.crl"
2949 )],
2950 relative_name=None,
2951 reasons=frozenset([
2952 x509.ReasonFlags.key_compromise,
2953 x509.ReasonFlags.ca_compromise
2954 ]),
2955 crl_issuer=[x509.DirectoryName(
2956 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002957 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002958 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002959 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002960 ),
2961 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002962 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002963 ),
2964 ])
2965 )],
2966 )
2967 ])
2968
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002969 def test_all_reasons(self, backend):
2970 cert = _load_cert(
2971 os.path.join(
2972 "x509", "custom", "cdp_all_reasons.pem"
2973 ),
2974 x509.load_pem_x509_certificate,
2975 backend
2976 )
2977
2978 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002979 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002980 ).value
2981
2982 assert cdps == x509.CRLDistributionPoints([
2983 x509.DistributionPoint(
2984 full_name=[x509.UniformResourceIdentifier(
2985 u"http://domain.com/some.crl"
2986 )],
2987 relative_name=None,
2988 reasons=frozenset([
2989 x509.ReasonFlags.key_compromise,
2990 x509.ReasonFlags.ca_compromise,
2991 x509.ReasonFlags.affiliation_changed,
2992 x509.ReasonFlags.superseded,
2993 x509.ReasonFlags.privilege_withdrawn,
2994 x509.ReasonFlags.cessation_of_operation,
2995 x509.ReasonFlags.aa_compromise,
2996 x509.ReasonFlags.certificate_hold,
2997 ]),
2998 crl_issuer=None
2999 )
3000 ])
3001
3002 def test_single_reason(self, backend):
3003 cert = _load_cert(
3004 os.path.join(
3005 "x509", "custom", "cdp_reason_aa_compromise.pem"
3006 ),
3007 x509.load_pem_x509_certificate,
3008 backend
3009 )
3010
3011 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003012 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003013 ).value
3014
3015 assert cdps == x509.CRLDistributionPoints([
3016 x509.DistributionPoint(
3017 full_name=[x509.UniformResourceIdentifier(
3018 u"http://domain.com/some.crl"
3019 )],
3020 relative_name=None,
3021 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3022 crl_issuer=None
3023 )
3024 ])
3025
Paul Kehrer9a10d592015-05-10 14:55:51 -05003026 def test_crl_issuer_only(self, backend):
3027 cert = _load_cert(
3028 os.path.join(
3029 "x509", "custom", "cdp_crl_issuer.pem"
3030 ),
3031 x509.load_pem_x509_certificate,
3032 backend
3033 )
3034
3035 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003036 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003037 ).value
3038
3039 assert cdps == x509.CRLDistributionPoints([
3040 x509.DistributionPoint(
3041 full_name=None,
3042 relative_name=None,
3043 reasons=None,
3044 crl_issuer=[x509.DirectoryName(
3045 x509.Name([
3046 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003047 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003048 ),
3049 ])
3050 )],
3051 )
3052 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003053
Dominic Chen87bb9572015-10-09 00:23:07 -04003054 def test_crl_empty_hostname(self, backend):
3055 cert = _load_cert(
3056 os.path.join(
3057 "x509", "custom", "cdp_empty_hostname.pem"
3058 ),
3059 x509.load_pem_x509_certificate,
3060 backend
3061 )
3062
3063 cdps = cert.extensions.get_extension_for_oid(
3064 ExtensionOID.CRL_DISTRIBUTION_POINTS
3065 ).value
3066
3067 assert cdps == x509.CRLDistributionPoints([
3068 x509.DistributionPoint(
3069 full_name=[x509.UniformResourceIdentifier(
3070 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3071 )],
3072 relative_name=None,
3073 reasons=None,
3074 crl_issuer=None
3075 )
3076 ])
3077
Paul Kehrer16fae762015-05-01 23:14:20 -05003078
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003079@pytest.mark.requires_backend_interface(interface=RSABackend)
3080@pytest.mark.requires_backend_interface(interface=X509Backend)
3081class TestOCSPNoCheckExtension(object):
3082 def test_nocheck(self, backend):
3083 cert = _load_cert(
3084 os.path.join(
3085 "x509", "custom", "ocsp_nocheck.pem"
3086 ),
3087 x509.load_pem_x509_certificate,
3088 backend
3089 )
3090 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003091 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003092 )
3093 assert isinstance(ext.value, x509.OCSPNoCheck)
3094
3095
Paul Kehrer16fae762015-05-01 23:14:20 -05003096class TestInhibitAnyPolicy(object):
3097 def test_not_int(self):
3098 with pytest.raises(TypeError):
3099 x509.InhibitAnyPolicy("notint")
3100
3101 def test_negative_int(self):
3102 with pytest.raises(ValueError):
3103 x509.InhibitAnyPolicy(-1)
3104
3105 def test_repr(self):
3106 iap = x509.InhibitAnyPolicy(0)
3107 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3108
3109 def test_eq(self):
3110 iap = x509.InhibitAnyPolicy(1)
3111 iap2 = x509.InhibitAnyPolicy(1)
3112 assert iap == iap2
3113
3114 def test_ne(self):
3115 iap = x509.InhibitAnyPolicy(1)
3116 iap2 = x509.InhibitAnyPolicy(4)
3117 assert iap != iap2
3118 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003119
3120
3121@pytest.mark.requires_backend_interface(interface=RSABackend)
3122@pytest.mark.requires_backend_interface(interface=X509Backend)
3123class TestInhibitAnyPolicyExtension(object):
3124 def test_nocheck(self, backend):
3125 cert = _load_cert(
3126 os.path.join(
3127 "x509", "custom", "inhibit_any_policy_5.pem"
3128 ),
3129 x509.load_pem_x509_certificate,
3130 backend
3131 )
3132 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003133 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003134 ).value
3135 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003136
3137
3138@pytest.mark.requires_backend_interface(interface=RSABackend)
3139@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003140class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003141 def test_invalid_certificate_policies_data(self, backend):
3142 cert = _load_cert(
3143 os.path.join(
3144 "x509", "custom", "cp_invalid.pem"
3145 ),
3146 x509.load_pem_x509_certificate,
3147 backend
3148 )
3149 with pytest.raises(ValueError):
3150 cert.extensions