blob: 0f5d782379b3b4192d2036ea0a6bab7f143bc392 [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
Alex Gaynor410fe352015-12-26 15:01:25 -0500659 def test_hash(self):
660 ski1 = x509.SubjectKeyIdentifier(
661 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
662 )
663 ski2 = x509.SubjectKeyIdentifier(
664 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
665 )
666 ski3 = x509.SubjectKeyIdentifier(
667 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
668 )
669
670 assert hash(ski1) == hash(ski2)
671 assert hash(ski1) != hash(ski3)
672
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500673
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400674class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500675 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400676 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500677 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400678
679 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500680 dirname = x509.DirectoryName(
681 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800682 x509.NameAttribute(
683 x509.ObjectIdentifier('2.999.1'),
684 u'value1'
685 ),
686 x509.NameAttribute(
687 x509.ObjectIdentifier('2.999.2'),
688 u'value2'
689 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500690 ])
691 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400692 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500693 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400694
695 def test_authority_issuer_none_serial_not_none(self):
696 with pytest.raises(ValueError):
697 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
698
699 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500700 dirname = x509.DirectoryName(
701 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800702 x509.NameAttribute(
703 x509.ObjectIdentifier('2.999.1'),
704 u'value1'
705 ),
706 x509.NameAttribute(
707 x509.ObjectIdentifier('2.999.2'),
708 u'value2'
709 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500710 ])
711 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400712 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500713 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400714
715 def test_authority_cert_serial_and_issuer_none(self):
716 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
717 assert aki.key_identifier == b"id"
718 assert aki.authority_cert_issuer is None
719 assert aki.authority_cert_serial_number is None
720
721 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500722 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500723 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500724 )
725 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400726
727 if six.PY3:
728 assert repr(aki) == (
729 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500730 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500731 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500732 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400733 )
734 else:
735 assert repr(aki) == (
736 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500737 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500738 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
739 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400740 )
741
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500742 def test_eq(self):
743 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500744 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500745 )
746 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
747 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500748 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500749 )
750 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
751 assert aki == aki2
752
753 def test_ne(self):
754 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500755 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500756 )
757 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500758 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500759 )
760 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
761 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
762 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
763 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
764 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
765 assert aki != aki2
766 assert aki != aki3
767 assert aki != aki4
768 assert aki != aki5
769 assert aki != object()
770
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400771
Paul Kehrer8cf26422015-03-21 09:50:24 -0500772class TestBasicConstraints(object):
773 def test_ca_not_boolean(self):
774 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500775 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500776
777 def test_path_length_not_ca(self):
778 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500779 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500780
781 def test_path_length_not_int(self):
782 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500783 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500784
785 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500786 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500787
788 def test_path_length_negative(self):
789 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500790 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500791
792 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500793 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500794 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500795 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500796 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500797
Paul Kehrer3a69b132015-05-13 10:03:46 -0500798 def test_eq(self):
799 na = x509.BasicConstraints(ca=True, path_length=None)
800 na2 = x509.BasicConstraints(ca=True, path_length=None)
801 assert na == na2
802
803 def test_ne(self):
804 na = x509.BasicConstraints(ca=True, path_length=None)
805 na2 = x509.BasicConstraints(ca=True, path_length=1)
806 na3 = x509.BasicConstraints(ca=False, path_length=None)
807 assert na != na2
808 assert na != na3
809 assert na != object()
810
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500811
Paul Kehrerffa2a152015-03-31 08:18:25 -0500812class TestExtendedKeyUsage(object):
813 def test_not_all_oids(self):
814 with pytest.raises(TypeError):
815 x509.ExtendedKeyUsage(["notoid"])
816
817 def test_iter_len(self):
818 eku = x509.ExtendedKeyUsage([
819 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
820 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
821 ])
822 assert len(eku) == 2
823 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500824 ExtendedKeyUsageOID.SERVER_AUTH,
825 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500826 ]
827
Paul Kehrer23d10c32015-04-02 23:12:32 -0500828 def test_repr(self):
829 eku = x509.ExtendedKeyUsage([
830 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
831 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
832 ])
833 assert repr(eku) == (
834 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
835 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
836 "tAuth)>])>"
837 )
838
Paul Kehrerb0476172015-05-02 19:34:51 -0500839 def test_eq(self):
840 eku = x509.ExtendedKeyUsage([
841 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
842 ])
843 eku2 = x509.ExtendedKeyUsage([
844 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
845 ])
846 assert eku == eku2
847
848 def test_ne(self):
849 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
850 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
851 assert eku != eku2
852 assert eku != object()
853
Paul Kehrerffa2a152015-03-31 08:18:25 -0500854
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500855@pytest.mark.requires_backend_interface(interface=RSABackend)
856@pytest.mark.requires_backend_interface(interface=X509Backend)
857class TestExtensions(object):
858 def test_no_extensions(self, backend):
859 cert = _load_cert(
860 os.path.join("x509", "verisign_md2_root.pem"),
861 x509.load_pem_x509_certificate,
862 backend
863 )
864 ext = cert.extensions
865 assert len(ext) == 0
866 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500867 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500868 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500869
Paul Kehrerd44e4132015-08-10 19:13:13 -0500870 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500871
872 def test_one_extension(self, backend):
873 cert = _load_cert(
874 os.path.join(
875 "x509", "custom", "basic_constraints_not_critical.pem"
876 ),
877 x509.load_pem_x509_certificate,
878 backend
879 )
880 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500881 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500882 assert ext is not None
883 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500884
885 def test_duplicate_extension(self, backend):
886 cert = _load_cert(
887 os.path.join(
888 "x509", "custom", "two_basic_constraints.pem"
889 ),
890 x509.load_pem_x509_certificate,
891 backend
892 )
893 with pytest.raises(x509.DuplicateExtension) as exc:
894 cert.extensions
895
Paul Kehrerd44e4132015-08-10 19:13:13 -0500896 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500897
898 def test_unsupported_critical_extension(self, backend):
899 cert = _load_cert(
900 os.path.join(
901 "x509", "custom", "unsupported_extension_critical.pem"
902 ),
903 x509.load_pem_x509_certificate,
904 backend
905 )
906 with pytest.raises(x509.UnsupportedExtension) as exc:
907 cert.extensions
908
909 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
910
911 def test_unsupported_extension(self, backend):
912 # TODO: this will raise an exception when all extensions are complete
913 cert = _load_cert(
914 os.path.join(
915 "x509", "custom", "unsupported_extension.pem"
916 ),
917 x509.load_pem_x509_certificate,
918 backend
919 )
920 extensions = cert.extensions
921 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500922
Phoebe Queenecae9812015-08-12 05:00:32 +0100923 def test_no_extensions_get_for_class(self, backend):
924 cert = _load_cert(
925 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100926 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100927 ),
928 x509.load_pem_x509_certificate,
929 backend
930 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100931 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100932 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100933 exts.get_extension_for_class(x509.IssuerAlternativeName)
934 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100935
Paul Kehrer5b90c972015-12-26 00:52:58 -0600936 def test_indexing(self, backend):
937 cert = _load_cert(
938 os.path.join("x509", "cryptography.io.pem"),
939 x509.load_pem_x509_certificate,
940 backend
941 )
942 exts = cert.extensions
943 assert exts[-1] == exts[7]
944 assert len(exts[3:5]) == 2
945 assert exts[2:4][0] == exts[2]
946 assert exts[2:4][1] == exts[3]
947
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100948 def test_one_extension_get_for_class(self, backend):
949 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100950 os.path.join(
951 "x509", "custom", "basic_constraints_not_critical.pem"
952 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100953 x509.load_pem_x509_certificate,
954 backend
955 )
956 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
957 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100958 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500959
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500960 def test_repr(self, backend):
961 cert = _load_cert(
962 os.path.join(
963 "x509", "custom", "basic_constraints_not_critical.pem"
964 ),
965 x509.load_pem_x509_certificate,
966 backend
967 )
968 assert repr(cert.extensions) == (
969 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
970 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
971 "alse, path_length=None)>)>])>"
972 )
973
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100974
Paul Kehrerfa56a232015-03-17 13:14:03 -0500975@pytest.mark.requires_backend_interface(interface=RSABackend)
976@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500977class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500978 def test_ca_true_pathlen_6(self, backend):
979 cert = _load_cert(
980 os.path.join(
981 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
982 ),
983 x509.load_der_x509_certificate,
984 backend
985 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100986 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 == 6
993
994 def test_path_length_zero(self, backend):
995 cert = _load_cert(
996 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
997 x509.load_pem_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 == 0
1007
1008 def test_ca_true_no_pathlen(self, backend):
1009 cert = _load_cert(
1010 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1011 x509.load_der_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 True
1020 assert ext.value.path_length is None
1021
1022 def test_ca_false(self, backend):
1023 cert = _load_cert(
1024 os.path.join("x509", "cryptography.io.pem"),
1025 x509.load_pem_x509_certificate,
1026 backend
1027 )
1028 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001029 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001030 )
1031 assert ext is not None
1032 assert ext.critical is True
1033 assert ext.value.ca is False
1034 assert ext.value.path_length is None
1035
1036 def test_no_basic_constraints(self, backend):
1037 cert = _load_cert(
1038 os.path.join(
1039 "x509",
1040 "PKITS_data",
1041 "certs",
1042 "ValidCertificatePathTest1EE.crt"
1043 ),
1044 x509.load_der_x509_certificate,
1045 backend
1046 )
1047 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001048 cert.extensions.get_extension_for_oid(
1049 ExtensionOID.BASIC_CONSTRAINTS
1050 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001051
1052 def test_basic_constraint_not_critical(self, backend):
1053 cert = _load_cert(
1054 os.path.join(
1055 "x509", "custom", "basic_constraints_not_critical.pem"
1056 ),
1057 x509.load_pem_x509_certificate,
1058 backend
1059 )
1060 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001061 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001062 )
1063 assert ext is not None
1064 assert ext.critical is False
1065 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001066
1067
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001068class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001069 @pytest.mark.requires_backend_interface(interface=RSABackend)
1070 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001071 def test_subject_key_identifier(self, backend):
1072 cert = _load_cert(
1073 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1074 x509.load_der_x509_certificate,
1075 backend
1076 )
1077 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001078 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001079 )
1080 ski = ext.value
1081 assert ext is not None
1082 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001083 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001084 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001085 )
1086
Paul Kehrerf22f6122015-08-05 12:57:13 +01001087 @pytest.mark.requires_backend_interface(interface=RSABackend)
1088 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001089 def test_no_subject_key_identifier(self, backend):
1090 cert = _load_cert(
1091 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1092 x509.load_pem_x509_certificate,
1093 backend
1094 )
1095 with pytest.raises(x509.ExtensionNotFound):
1096 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001097 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001098 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001099
Paul Kehrerf22f6122015-08-05 12:57:13 +01001100 @pytest.mark.requires_backend_interface(interface=RSABackend)
1101 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001102 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001103 cert = _load_cert(
1104 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1105 x509.load_der_x509_certificate,
1106 backend
1107 )
1108 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001109 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001110 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001111 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001112 cert.public_key()
1113 )
1114 assert ext.value == ski
1115
1116 @pytest.mark.requires_backend_interface(interface=DSABackend)
1117 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001118 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001119 cert = _load_cert(
1120 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1121 x509.load_pem_x509_certificate,
1122 backend
1123 )
1124
1125 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001126 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001127 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001128 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001129 cert.public_key()
1130 )
1131 assert ext.value == ski
1132
1133 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1134 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001135 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001136 _skip_curve_unsupported(backend, ec.SECP384R1())
1137 cert = _load_cert(
1138 os.path.join("x509", "ecdsa_root.pem"),
1139 x509.load_pem_x509_certificate,
1140 backend
1141 )
1142
1143 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001144 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001145 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001146 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001147 cert.public_key()
1148 )
1149 assert ext.value == ski
1150
Paul Kehrer5508ee22015-04-02 19:31:03 -05001151
1152@pytest.mark.requires_backend_interface(interface=RSABackend)
1153@pytest.mark.requires_backend_interface(interface=X509Backend)
1154class TestKeyUsageExtension(object):
1155 def test_no_key_usage(self, backend):
1156 cert = _load_cert(
1157 os.path.join("x509", "verisign_md2_root.pem"),
1158 x509.load_pem_x509_certificate,
1159 backend
1160 )
1161 ext = cert.extensions
1162 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001163 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001164
Paul Kehrerd44e4132015-08-10 19:13:13 -05001165 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001166
1167 def test_all_purposes(self, backend):
1168 cert = _load_cert(
1169 os.path.join(
1170 "x509", "custom", "all_key_usages.pem"
1171 ),
1172 x509.load_pem_x509_certificate,
1173 backend
1174 )
1175 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001176 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001177 assert ext is not None
1178
1179 ku = ext.value
1180 assert ku.digital_signature is True
1181 assert ku.content_commitment is True
1182 assert ku.key_encipherment is True
1183 assert ku.data_encipherment is True
1184 assert ku.key_agreement is True
1185 assert ku.key_cert_sign is True
1186 assert ku.crl_sign is True
1187 assert ku.encipher_only is True
1188 assert ku.decipher_only is True
1189
1190 def test_key_cert_sign_crl_sign(self, backend):
1191 cert = _load_cert(
1192 os.path.join(
1193 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1194 ),
1195 x509.load_der_x509_certificate,
1196 backend
1197 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001198 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001199 assert ext is not None
1200 assert ext.critical is True
1201
1202 ku = ext.value
1203 assert ku.digital_signature is False
1204 assert ku.content_commitment is False
1205 assert ku.key_encipherment is False
1206 assert ku.data_encipherment is False
1207 assert ku.key_agreement is False
1208 assert ku.key_cert_sign is True
1209 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001210
1211
1212@pytest.mark.parametrize(
1213 "name", [
1214 x509.RFC822Name,
1215 x509.DNSName,
1216 x509.UniformResourceIdentifier
1217 ]
1218)
1219class TestTextGeneralNames(object):
1220 def test_not_text(self, name):
1221 with pytest.raises(TypeError):
1222 name(b"notaunicodestring")
1223
1224 with pytest.raises(TypeError):
1225 name(1.3)
1226
1227 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301228 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001229 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1230
1231 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301232 gn = name(u"string")
1233 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001234 assert gn == gn2
1235
1236 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301237 gn = name(u"string")
1238 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001239 assert gn != gn2
1240 assert gn != object()
1241
1242
1243class TestDirectoryName(object):
1244 def test_not_name(self):
1245 with pytest.raises(TypeError):
1246 x509.DirectoryName(b"notaname")
1247
1248 with pytest.raises(TypeError):
1249 x509.DirectoryName(1.3)
1250
1251 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001252 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001253 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001254 if six.PY3:
1255 assert repr(gn) == (
1256 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1257 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1258 ">])>)>"
1259 )
1260 else:
1261 assert repr(gn) == (
1262 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1263 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1264 ")>])>)>"
1265 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001266
1267 def test_eq(self):
1268 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001269 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001270 ])
1271 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001272 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001273 ])
1274 gn = x509.DirectoryName(x509.Name([name]))
1275 gn2 = x509.DirectoryName(x509.Name([name2]))
1276 assert gn == gn2
1277
1278 def test_ne(self):
1279 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001280 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001281 ])
1282 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001283 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001284 ])
1285 gn = x509.DirectoryName(x509.Name([name]))
1286 gn2 = x509.DirectoryName(x509.Name([name2]))
1287 assert gn != gn2
1288 assert gn != object()
1289
1290
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001291class TestRFC822Name(object):
1292 def test_invalid_email(self):
1293 with pytest.raises(ValueError):
1294 x509.RFC822Name(u"Name <email>")
1295
1296 with pytest.raises(ValueError):
1297 x509.RFC822Name(u"")
1298
1299 def test_single_label(self):
1300 gn = x509.RFC822Name(u"administrator")
1301 assert gn.value == u"administrator"
1302
1303 def test_idna(self):
1304 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1305 assert gn.value == u"email@em\xe5\xefl.com"
1306 assert gn._encoded == b"email@xn--eml-vla4c.com"
1307
1308
Paul Kehrere28d6c42015-07-12 14:59:37 -05001309class TestUniformResourceIdentifier(object):
1310 def test_no_parsed_hostname(self):
1311 gn = x509.UniformResourceIdentifier(u"singlelabel")
1312 assert gn.value == u"singlelabel"
1313
1314 def test_with_port(self):
1315 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1316 assert gn.value == u"singlelabel:443/test"
1317
1318 def test_idna_no_port(self):
1319 gn = x509.UniformResourceIdentifier(
1320 u"http://\u043f\u044b\u043a\u0430.cryptography"
1321 )
1322 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1323 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1324
1325 def test_idna_with_port(self):
1326 gn = x509.UniformResourceIdentifier(
1327 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1328 )
1329 assert gn.value == (
1330 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1331 )
1332 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1333
1334 def test_query_and_fragment(self):
1335 gn = x509.UniformResourceIdentifier(
1336 u"ldap://cryptography:90/path?query=true#somedata"
1337 )
1338 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1339
1340
Paul Kehrer31bdf792015-03-25 14:11:00 -05001341class TestRegisteredID(object):
1342 def test_not_oid(self):
1343 with pytest.raises(TypeError):
1344 x509.RegisteredID(b"notanoid")
1345
1346 with pytest.raises(TypeError):
1347 x509.RegisteredID(1.3)
1348
1349 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001350 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001351 assert repr(gn) == (
1352 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1353 "e)>)>"
1354 )
1355
1356 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001357 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1358 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001359 assert gn == gn2
1360
1361 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001362 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001363 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001364 assert gn != gn2
1365 assert gn != object()
1366
1367
1368class TestIPAddress(object):
1369 def test_not_ipaddress(self):
1370 with pytest.raises(TypeError):
1371 x509.IPAddress(b"notanipaddress")
1372
1373 with pytest.raises(TypeError):
1374 x509.IPAddress(1.3)
1375
1376 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301377 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001378 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1379
Eeshan Gargf1234152015-04-29 18:41:00 +05301380 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001381 assert repr(gn2) == "<IPAddress(value=ff::)>"
1382
Paul Kehrereb177932015-05-17 18:33:33 -07001383 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1384 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1385
1386 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1387 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1388
Paul Kehrer31bdf792015-03-25 14:11:00 -05001389 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301390 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1391 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001392 assert gn == gn2
1393
1394 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301395 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1396 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001397 assert gn != gn2
1398 assert gn != object()
1399
1400
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001401class TestOtherName(object):
1402 def test_invalid_args(self):
1403 with pytest.raises(TypeError):
1404 x509.OtherName(b"notanobjectidentifier", b"derdata")
1405
1406 with pytest.raises(TypeError):
1407 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1408
1409 def test_repr(self):
1410 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1411 if six.PY3:
1412 assert repr(gn) == (
1413 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1414 "name=Unknown OID)>, value=b'derdata')>"
1415 )
1416 else:
1417 assert repr(gn) == (
1418 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1419 "name=Unknown OID)>, value='derdata')>"
1420 )
1421
1422 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1423 if six.PY3:
1424 assert repr(gn) == (
1425 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1426 "name=pseudonym)>, value=b'derdata')>"
1427 )
1428 else:
1429 assert repr(gn) == (
1430 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1431 "name=pseudonym)>, value='derdata')>"
1432 )
1433
1434 def test_eq(self):
1435 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1436 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1437 assert gn == gn2
1438
1439 def test_ne(self):
1440 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1441 assert gn != object()
1442
1443 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1444 assert gn != gn2
1445
1446 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1447 assert gn != gn2
1448
1449
Erik Trauschke2dcce902015-05-14 16:12:24 -07001450class TestGeneralNames(object):
1451 def test_get_values_for_type(self):
1452 gns = x509.GeneralNames(
1453 [x509.DNSName(u"cryptography.io")]
1454 )
1455 names = gns.get_values_for_type(x509.DNSName)
1456 assert names == [u"cryptography.io"]
1457
1458 def test_iter_names(self):
1459 gns = x509.GeneralNames([
1460 x509.DNSName(u"cryptography.io"),
1461 x509.DNSName(u"crypto.local"),
1462 ])
1463 assert len(gns) == 2
1464 assert list(gns) == [
1465 x509.DNSName(u"cryptography.io"),
1466 x509.DNSName(u"crypto.local"),
1467 ]
1468
1469 def test_invalid_general_names(self):
1470 with pytest.raises(TypeError):
1471 x509.GeneralNames(
1472 [x509.DNSName(u"cryptography.io"), "invalid"]
1473 )
1474
1475 def test_repr(self):
1476 gns = x509.GeneralNames(
1477 [
1478 x509.DNSName(u"cryptography.io")
1479 ]
1480 )
1481 assert repr(gns) == (
1482 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1483 )
1484
1485 def test_eq(self):
1486 gns = x509.GeneralNames(
1487 [x509.DNSName(u"cryptography.io")]
1488 )
1489 gns2 = x509.GeneralNames(
1490 [x509.DNSName(u"cryptography.io")]
1491 )
1492 assert gns == gns2
1493
1494 def test_ne(self):
1495 gns = x509.GeneralNames(
1496 [x509.DNSName(u"cryptography.io")]
1497 )
1498 gns2 = x509.GeneralNames(
1499 [x509.RFC822Name(u"admin@cryptography.io")]
1500 )
1501 assert gns != gns2
1502 assert gns != object()
1503
1504
Paul Kehrer99125c92015-06-07 18:37:10 -05001505class TestIssuerAlternativeName(object):
1506 def test_get_values_for_type(self):
1507 san = x509.IssuerAlternativeName(
1508 [x509.DNSName(u"cryptography.io")]
1509 )
1510 names = san.get_values_for_type(x509.DNSName)
1511 assert names == [u"cryptography.io"]
1512
1513 def test_iter_names(self):
1514 san = x509.IssuerAlternativeName([
1515 x509.DNSName(u"cryptography.io"),
1516 x509.DNSName(u"crypto.local"),
1517 ])
1518 assert len(san) == 2
1519 assert list(san) == [
1520 x509.DNSName(u"cryptography.io"),
1521 x509.DNSName(u"crypto.local"),
1522 ]
1523
1524 def test_invalid_general_names(self):
1525 with pytest.raises(TypeError):
1526 x509.IssuerAlternativeName(
1527 [x509.DNSName(u"cryptography.io"), "invalid"]
1528 )
1529
1530 def test_repr(self):
1531 san = x509.IssuerAlternativeName(
1532 [
1533 x509.DNSName(u"cryptography.io")
1534 ]
1535 )
1536 assert repr(san) == (
1537 "<IssuerAlternativeName("
1538 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1539 )
1540
1541 def test_eq(self):
1542 san = x509.IssuerAlternativeName(
1543 [x509.DNSName(u"cryptography.io")]
1544 )
1545 san2 = x509.IssuerAlternativeName(
1546 [x509.DNSName(u"cryptography.io")]
1547 )
1548 assert san == san2
1549
1550 def test_ne(self):
1551 san = x509.IssuerAlternativeName(
1552 [x509.DNSName(u"cryptography.io")]
1553 )
1554 san2 = x509.IssuerAlternativeName(
1555 [x509.RFC822Name(u"admin@cryptography.io")]
1556 )
1557 assert san != san2
1558 assert san != object()
1559
1560
Alex Gaynorf1c17672015-06-20 14:20:20 -04001561@pytest.mark.requires_backend_interface(interface=RSABackend)
1562@pytest.mark.requires_backend_interface(interface=X509Backend)
1563class TestRSAIssuerAlternativeNameExtension(object):
1564 def test_uri(self, backend):
1565 cert = _load_cert(
1566 os.path.join("x509", "custom", "ian_uri.pem"),
1567 x509.load_pem_x509_certificate,
1568 backend,
1569 )
1570 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001571 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001572 )
1573 assert list(ext.value) == [
1574 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1575 ]
1576
1577
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001578class TestCRLNumber(object):
1579 def test_eq(self):
1580 crl_number = x509.CRLNumber(15)
1581 assert crl_number == x509.CRLNumber(15)
1582
1583 def test_ne(self):
1584 crl_number = x509.CRLNumber(15)
1585 assert crl_number != x509.CRLNumber(14)
1586 assert crl_number != object()
1587
1588 def test_repr(self):
1589 crl_number = x509.CRLNumber(15)
1590 assert repr(crl_number) == "<CRLNumber(15)>"
1591
Paul Kehrera9718fc2015-12-22 22:55:35 -06001592 def test_invalid_number(self):
1593 with pytest.raises(TypeError):
1594 x509.CRLNumber("notanumber")
1595
Alex Gaynorf9a77b62015-12-26 12:14:25 -05001596 def test_hash(self):
1597 c1 = x509.CRLNumber(1)
1598 c2 = x509.CRLNumber(1)
1599 c3 = x509.CRLNumber(2)
1600 assert hash(c1) == hash(c2)
1601 assert hash(c1) != hash(c3)
1602
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001603
Paul Kehrer31bdf792015-03-25 14:11:00 -05001604class TestSubjectAlternativeName(object):
1605 def test_get_values_for_type(self):
1606 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301607 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001608 )
1609 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301610 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001611
1612 def test_iter_names(self):
1613 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301614 x509.DNSName(u"cryptography.io"),
1615 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001616 ])
1617 assert len(san) == 2
1618 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301619 x509.DNSName(u"cryptography.io"),
1620 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001621 ]
1622
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001623 def test_invalid_general_names(self):
1624 with pytest.raises(TypeError):
1625 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301626 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001627 )
1628
Paul Kehrer31bdf792015-03-25 14:11:00 -05001629 def test_repr(self):
1630 san = x509.SubjectAlternativeName(
1631 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301632 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001633 ]
1634 )
1635 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001636 "<SubjectAlternativeName("
1637 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001638 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001639
Paul Kehrer58cc3972015-05-13 10:00:41 -05001640 def test_eq(self):
1641 san = x509.SubjectAlternativeName(
1642 [x509.DNSName(u"cryptography.io")]
1643 )
1644 san2 = x509.SubjectAlternativeName(
1645 [x509.DNSName(u"cryptography.io")]
1646 )
1647 assert san == san2
1648
1649 def test_ne(self):
1650 san = x509.SubjectAlternativeName(
1651 [x509.DNSName(u"cryptography.io")]
1652 )
1653 san2 = x509.SubjectAlternativeName(
1654 [x509.RFC822Name(u"admin@cryptography.io")]
1655 )
1656 assert san != san2
1657 assert san != object()
1658
Paul Kehrer40f83382015-04-20 15:00:16 -05001659
1660@pytest.mark.requires_backend_interface(interface=RSABackend)
1661@pytest.mark.requires_backend_interface(interface=X509Backend)
1662class TestRSASubjectAlternativeNameExtension(object):
1663 def test_dns_name(self, backend):
1664 cert = _load_cert(
1665 os.path.join("x509", "cryptography.io.pem"),
1666 x509.load_pem_x509_certificate,
1667 backend
1668 )
1669 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001670 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001671 )
1672 assert ext is not None
1673 assert ext.critical is False
1674
1675 san = ext.value
1676
1677 dns = san.get_values_for_type(x509.DNSName)
1678 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001679
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001680 def test_wildcard_dns_name(self, backend):
1681 cert = _load_cert(
1682 os.path.join("x509", "wildcard_san.pem"),
1683 x509.load_pem_x509_certificate,
1684 backend
1685 )
1686 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001687 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001688 )
1689
1690 dns = ext.value.get_values_for_type(x509.DNSName)
1691 assert dns == [
1692 u'*.langui.sh',
1693 u'langui.sh',
1694 u'*.saseliminator.com',
1695 u'saseliminator.com'
1696 ]
1697
Dominic Chen87bb9572015-10-09 00:23:07 -04001698 def test_san_empty_hostname(self, backend):
1699 cert = _load_cert(
1700 os.path.join(
1701 "x509", "custom", "san_empty_hostname.pem"
1702 ),
1703 x509.load_pem_x509_certificate,
1704 backend
1705 )
1706 san = cert.extensions.get_extension_for_oid(
1707 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1708 )
1709
1710 dns = san.value.get_values_for_type(x509.DNSName)
1711 assert dns == [u'']
1712
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001713 def test_san_wildcard_idna_dns_name(self, backend):
1714 cert = _load_cert(
1715 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1716 x509.load_pem_x509_certificate,
1717 backend
1718 )
1719 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001720 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001721 )
1722
1723 dns = ext.value.get_values_for_type(x509.DNSName)
1724 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1725
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001726 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001727 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001728 os.path.join("x509", "san_x400address.der"),
1729 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001730 backend
1731 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001732 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001733 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001734
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001735 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001736
1737 def test_registered_id(self, backend):
1738 cert = _load_cert(
1739 os.path.join(
1740 "x509", "custom", "san_registered_id.pem"
1741 ),
1742 x509.load_pem_x509_certificate,
1743 backend
1744 )
1745 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001746 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001747 )
1748 assert ext is not None
1749 assert ext.critical is False
1750
1751 san = ext.value
1752 rid = san.get_values_for_type(x509.RegisteredID)
1753 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001754
1755 def test_uri(self, backend):
1756 cert = _load_cert(
1757 os.path.join(
1758 "x509", "custom", "san_uri_with_port.pem"
1759 ),
1760 x509.load_pem_x509_certificate,
1761 backend
1762 )
1763 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001764 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001765 )
1766 assert ext is not None
1767 uri = ext.value.get_values_for_type(
1768 x509.UniformResourceIdentifier
1769 )
1770 assert uri == [
1771 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1772 u"lo",
1773 u"http://someregulardomain.com",
1774 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001775
1776 def test_ipaddress(self, backend):
1777 cert = _load_cert(
1778 os.path.join(
1779 "x509", "custom", "san_ipaddr.pem"
1780 ),
1781 x509.load_pem_x509_certificate,
1782 backend
1783 )
1784 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001785 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001786 )
1787 assert ext is not None
1788 assert ext.critical is False
1789
1790 san = ext.value
1791
1792 ip = san.get_values_for_type(x509.IPAddress)
1793 assert [
1794 ipaddress.ip_address(u"127.0.0.1"),
1795 ipaddress.ip_address(u"ff::")
1796 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001797
1798 def test_dirname(self, backend):
1799 cert = _load_cert(
1800 os.path.join(
1801 "x509", "custom", "san_dirname.pem"
1802 ),
1803 x509.load_pem_x509_certificate,
1804 backend
1805 )
1806 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001807 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001808 )
1809 assert ext is not None
1810 assert ext.critical is False
1811
1812 san = ext.value
1813
1814 dirname = san.get_values_for_type(x509.DirectoryName)
1815 assert [
1816 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001817 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1818 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1819 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001820 ])
1821 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001822
1823 def test_rfc822name(self, backend):
1824 cert = _load_cert(
1825 os.path.join(
1826 "x509", "custom", "san_rfc822_idna.pem"
1827 ),
1828 x509.load_pem_x509_certificate,
1829 backend
1830 )
1831 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001832 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001833 )
1834 assert ext is not None
1835 assert ext.critical is False
1836
1837 san = ext.value
1838
1839 rfc822name = san.get_values_for_type(x509.RFC822Name)
1840 assert [u"email@em\xe5\xefl.com"] == rfc822name
1841
Paul Kehrerb8968812015-05-15 09:01:34 -07001842 def test_idna2003_invalid(self, backend):
1843 cert = _load_cert(
1844 os.path.join(
1845 "x509", "custom", "san_idna2003_dnsname.pem"
1846 ),
1847 x509.load_pem_x509_certificate,
1848 backend
1849 )
1850 with pytest.raises(UnicodeError):
1851 cert.extensions
1852
Paul Kehrere06cab42015-04-30 10:23:33 -05001853 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1854 cert = _load_cert(
1855 os.path.join(
1856 "x509", "custom", "san_idna_names.pem"
1857 ),
1858 x509.load_pem_x509_certificate,
1859 backend
1860 )
1861 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001862 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001863 )
1864 assert ext is not None
1865 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1866 dns_name = ext.value.get_values_for_type(x509.DNSName)
1867 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1868 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1869 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1870 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1871
1872 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1873 cert = _load_cert(
1874 os.path.join(
1875 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1876 ),
1877 x509.load_pem_x509_certificate,
1878 backend
1879 )
1880 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001881 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001882 )
1883 assert ext is not None
1884 assert ext.critical is False
1885
1886 san = ext.value
1887
1888 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1889 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1890 dns = san.get_values_for_type(x509.DNSName)
1891 ip = san.get_values_for_type(x509.IPAddress)
1892 dirname = san.get_values_for_type(x509.DirectoryName)
1893 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001894 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001895 assert [u"cryptography.io"] == dns
1896 assert [
1897 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001898 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001899 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001900 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001901 ),
1902 ])
1903 ] == dirname
1904 assert [
1905 ipaddress.ip_address(u"127.0.0.1"),
1906 ipaddress.ip_address(u"ff::")
1907 ] == ip
1908
1909 def test_invalid_rfc822name(self, backend):
1910 cert = _load_cert(
1911 os.path.join(
1912 "x509", "custom", "san_rfc822_names.pem"
1913 ),
1914 x509.load_pem_x509_certificate,
1915 backend
1916 )
1917 with pytest.raises(ValueError) as exc:
1918 cert.extensions
1919
1920 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001921
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001922 def test_other_name(self, backend):
1923 cert = _load_cert(
1924 os.path.join(
1925 "x509", "custom", "san_other_name.pem"
1926 ),
1927 x509.load_pem_x509_certificate,
1928 backend
1929 )
1930
1931 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001932 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001933 )
1934 assert ext is not None
1935 assert ext.critical is False
1936
Joshua Taubererd2afad32015-07-06 22:37:53 +00001937 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1938 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001939 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001940 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001941
1942 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001943 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001944
Paul Kehrer94c69602015-05-02 19:29:40 -05001945
1946@pytest.mark.requires_backend_interface(interface=RSABackend)
1947@pytest.mark.requires_backend_interface(interface=X509Backend)
1948class TestExtendedKeyUsageExtension(object):
1949 def test_eku(self, backend):
1950 cert = _load_cert(
1951 os.path.join(
1952 "x509", "custom", "extended_key_usage.pem"
1953 ),
1954 x509.load_pem_x509_certificate,
1955 backend
1956 )
1957 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001958 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001959 )
1960 assert ext is not None
1961 assert ext.critical is False
1962
1963 assert [
1964 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1965 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1966 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1967 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1968 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1969 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1970 x509.ObjectIdentifier("2.5.29.37.0"),
1971 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1972 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001973
1974
1975class TestAccessDescription(object):
1976 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001977 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001978 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1979
1980 def test_invalid_access_location(self):
1981 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001982 x509.AccessDescription(
1983 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1984 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001985
Nick Bastind2ecf862015-12-13 05:44:46 -08001986 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001987 ad = x509.AccessDescription(
1988 ObjectIdentifier("2.999.1"),
1989 x509.UniformResourceIdentifier(u"http://example.com")
1990 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08001991 assert ad is not None
1992
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001993 def test_repr(self):
1994 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001995 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001996 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
1997 )
1998 assert repr(ad) == (
1999 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2000 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2001 "(value=http://ocsp.domain.com)>)>"
2002 )
2003
2004 def test_eq(self):
2005 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002006 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002007 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2008 )
2009 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002010 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002011 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2012 )
2013 assert ad == ad2
2014
2015 def test_ne(self):
2016 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002017 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002018 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2019 )
2020 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002021 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002022 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2023 )
2024 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002025 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002026 x509.UniformResourceIdentifier(u"http://notthesame")
2027 )
2028 assert ad != ad2
2029 assert ad != ad3
2030 assert ad != object()
2031
2032
2033class TestAuthorityInformationAccess(object):
2034 def test_invalid_descriptions(self):
2035 with pytest.raises(TypeError):
2036 x509.AuthorityInformationAccess(["notanAccessDescription"])
2037
2038 def test_iter_len(self):
2039 aia = x509.AuthorityInformationAccess([
2040 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002041 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002042 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2043 ),
2044 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002045 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002046 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2047 )
2048 ])
2049 assert len(aia) == 2
2050 assert list(aia) == [
2051 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002052 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002053 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2054 ),
2055 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002056 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002057 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2058 )
2059 ]
2060
2061 def test_repr(self):
2062 aia = x509.AuthorityInformationAccess([
2063 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002064 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002065 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2066 ),
2067 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002068 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002069 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2070 )
2071 ])
2072 assert repr(aia) == (
2073 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2074 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2075 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2076 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2077 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2078 "fier(value=http://domain.com/ca.crt)>)>])>"
2079 )
2080
2081 def test_eq(self):
2082 aia = x509.AuthorityInformationAccess([
2083 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002084 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002085 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2086 ),
2087 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002088 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002089 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2090 )
2091 ])
2092 aia2 = x509.AuthorityInformationAccess([
2093 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002094 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002095 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2096 ),
2097 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002098 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002099 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2100 )
2101 ])
2102 assert aia == aia2
2103
2104 def test_ne(self):
2105 aia = x509.AuthorityInformationAccess([
2106 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002107 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002108 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2109 ),
2110 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002111 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002112 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2113 )
2114 ])
2115 aia2 = x509.AuthorityInformationAccess([
2116 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002117 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002118 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2119 ),
2120 ])
2121
2122 assert aia != aia2
2123 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002124
2125
2126@pytest.mark.requires_backend_interface(interface=RSABackend)
2127@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002128class TestAuthorityInformationAccessExtension(object):
2129 def test_aia_ocsp_ca_issuers(self, backend):
2130 cert = _load_cert(
2131 os.path.join("x509", "cryptography.io.pem"),
2132 x509.load_pem_x509_certificate,
2133 backend
2134 )
2135 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002136 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002137 )
2138 assert ext is not None
2139 assert ext.critical is False
2140
2141 assert ext.value == x509.AuthorityInformationAccess([
2142 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002143 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002144 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2145 ),
2146 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002147 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002148 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2149 ),
2150 ])
2151
2152 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2153 cert = _load_cert(
2154 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2155 x509.load_pem_x509_certificate,
2156 backend
2157 )
2158 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002159 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002160 )
2161 assert ext is not None
2162 assert ext.critical is False
2163
2164 assert ext.value == x509.AuthorityInformationAccess([
2165 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002166 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002167 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2168 ),
2169 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002170 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002171 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2172 ),
2173 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002174 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002175 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002176 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2177 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002178 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002179 ]))
2180 ),
2181 ])
2182
2183 def test_aia_ocsp_only(self, backend):
2184 cert = _load_cert(
2185 os.path.join("x509", "custom", "aia_ocsp.pem"),
2186 x509.load_pem_x509_certificate,
2187 backend
2188 )
2189 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002190 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002191 )
2192 assert ext is not None
2193 assert ext.critical is False
2194
2195 assert ext.value == x509.AuthorityInformationAccess([
2196 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002197 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002198 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2199 ),
2200 ])
2201
2202 def test_aia_ca_issuers_only(self, backend):
2203 cert = _load_cert(
2204 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2205 x509.load_pem_x509_certificate,
2206 backend
2207 )
2208 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002209 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002210 )
2211 assert ext is not None
2212 assert ext.critical is False
2213
2214 assert ext.value == x509.AuthorityInformationAccess([
2215 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002216 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002217 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002218 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2219 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002220 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002221 ]))
2222 ),
2223 ])
2224
2225
2226@pytest.mark.requires_backend_interface(interface=RSABackend)
2227@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002228class TestAuthorityKeyIdentifierExtension(object):
2229 def test_aki_keyid(self, backend):
2230 cert = _load_cert(
2231 os.path.join(
2232 "x509", "cryptography.io.pem"
2233 ),
2234 x509.load_pem_x509_certificate,
2235 backend
2236 )
2237 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002238 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002239 )
2240 assert ext is not None
2241 assert ext.critical is False
2242
2243 assert ext.value.key_identifier == (
2244 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2245 )
2246 assert ext.value.authority_cert_issuer is None
2247 assert ext.value.authority_cert_serial_number is None
2248
2249 def test_aki_all_fields(self, backend):
2250 cert = _load_cert(
2251 os.path.join(
2252 "x509", "custom", "authority_key_identifier.pem"
2253 ),
2254 x509.load_pem_x509_certificate,
2255 backend
2256 )
2257 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002258 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002259 )
2260 assert ext is not None
2261 assert ext.critical is False
2262
2263 assert ext.value.key_identifier == (
2264 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2265 )
2266 assert ext.value.authority_cert_issuer == [
2267 x509.DirectoryName(
2268 x509.Name([
2269 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002270 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002271 ),
2272 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002273 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002274 )
2275 ])
2276 )
2277 ]
2278 assert ext.value.authority_cert_serial_number == 3
2279
2280 def test_aki_no_keyid(self, backend):
2281 cert = _load_cert(
2282 os.path.join(
2283 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2284 ),
2285 x509.load_pem_x509_certificate,
2286 backend
2287 )
2288 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002289 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002290 )
2291 assert ext is not None
2292 assert ext.critical is False
2293
2294 assert ext.value.key_identifier is None
2295 assert ext.value.authority_cert_issuer == [
2296 x509.DirectoryName(
2297 x509.Name([
2298 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002299 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002300 ),
2301 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002302 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002303 )
2304 ])
2305 )
2306 ]
2307 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002308
Paul Kehrer253929a2015-08-05 17:30:39 +01002309 def test_from_certificate(self, backend):
2310 issuer_cert = _load_cert(
2311 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2312 x509.load_pem_x509_certificate,
2313 backend
2314 )
2315 cert = _load_cert(
2316 os.path.join("x509", "cryptography.io.pem"),
2317 x509.load_pem_x509_certificate,
2318 backend
2319 )
2320 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002321 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002322 )
2323 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2324 issuer_cert.public_key()
2325 )
2326 assert ext.value == aki
2327
Paul Kehrer5a485522015-05-06 00:29:12 -05002328
Paul Kehrere0017be2015-05-17 20:39:40 -06002329class TestNameConstraints(object):
2330 def test_ipaddress_wrong_type(self):
2331 with pytest.raises(TypeError):
2332 x509.NameConstraints(
2333 permitted_subtrees=[
2334 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2335 ],
2336 excluded_subtrees=None
2337 )
2338
2339 with pytest.raises(TypeError):
2340 x509.NameConstraints(
2341 permitted_subtrees=None,
2342 excluded_subtrees=[
2343 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2344 ]
2345 )
2346
2347 def test_ipaddress_allowed_type(self):
2348 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2349 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2350 nc = x509.NameConstraints(
2351 permitted_subtrees=permitted,
2352 excluded_subtrees=excluded
2353 )
2354 assert nc.permitted_subtrees == permitted
2355 assert nc.excluded_subtrees == excluded
2356
2357 def test_invalid_permitted_subtrees(self):
2358 with pytest.raises(TypeError):
2359 x509.NameConstraints("badpermitted", None)
2360
2361 def test_invalid_excluded_subtrees(self):
2362 with pytest.raises(TypeError):
2363 x509.NameConstraints(None, "badexcluded")
2364
2365 def test_no_subtrees(self):
2366 with pytest.raises(ValueError):
2367 x509.NameConstraints(None, None)
2368
2369 def test_permitted_none(self):
2370 excluded = [x509.DNSName(u"name.local")]
2371 nc = x509.NameConstraints(
2372 permitted_subtrees=None, excluded_subtrees=excluded
2373 )
2374 assert nc.permitted_subtrees is None
2375 assert nc.excluded_subtrees is not None
2376
2377 def test_excluded_none(self):
2378 permitted = [x509.DNSName(u"name.local")]
2379 nc = x509.NameConstraints(
2380 permitted_subtrees=permitted, excluded_subtrees=None
2381 )
2382 assert nc.permitted_subtrees is not None
2383 assert nc.excluded_subtrees is None
2384
2385 def test_repr(self):
2386 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2387 nc = x509.NameConstraints(
2388 permitted_subtrees=permitted,
2389 excluded_subtrees=None
2390 )
2391 assert repr(nc) == (
2392 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2393 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2394 )
2395
Paul Kehrer31894282015-06-21 21:46:41 -05002396 def test_eq(self):
2397 nc = x509.NameConstraints(
2398 permitted_subtrees=[x509.DNSName(u"name.local")],
2399 excluded_subtrees=[x509.DNSName(u"name2.local")]
2400 )
2401 nc2 = x509.NameConstraints(
2402 permitted_subtrees=[x509.DNSName(u"name.local")],
2403 excluded_subtrees=[x509.DNSName(u"name2.local")]
2404 )
2405 assert nc == nc2
2406
2407 def test_ne(self):
2408 nc = x509.NameConstraints(
2409 permitted_subtrees=[x509.DNSName(u"name.local")],
2410 excluded_subtrees=[x509.DNSName(u"name2.local")]
2411 )
2412 nc2 = x509.NameConstraints(
2413 permitted_subtrees=[x509.DNSName(u"name.local")],
2414 excluded_subtrees=None
2415 )
2416 nc3 = x509.NameConstraints(
2417 permitted_subtrees=None,
2418 excluded_subtrees=[x509.DNSName(u"name2.local")]
2419 )
2420
2421 assert nc != nc2
2422 assert nc != nc3
2423 assert nc != object()
2424
Paul Kehrere0017be2015-05-17 20:39:40 -06002425
Paul Kehrer870d7e82015-06-21 22:20:44 -05002426@pytest.mark.requires_backend_interface(interface=RSABackend)
2427@pytest.mark.requires_backend_interface(interface=X509Backend)
2428class TestNameConstraintsExtension(object):
2429 def test_permitted_excluded(self, backend):
2430 cert = _load_cert(
2431 os.path.join(
2432 "x509", "custom", "nc_permitted_excluded_2.pem"
2433 ),
2434 x509.load_pem_x509_certificate,
2435 backend
2436 )
2437 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002438 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002439 ).value
2440 assert nc == x509.NameConstraints(
2441 permitted_subtrees=[
2442 x509.DNSName(u"zombo.local"),
2443 ],
2444 excluded_subtrees=[
2445 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002446 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002447 ]))
2448 ]
2449 )
2450
2451 def test_permitted(self, backend):
2452 cert = _load_cert(
2453 os.path.join(
2454 "x509", "custom", "nc_permitted_2.pem"
2455 ),
2456 x509.load_pem_x509_certificate,
2457 backend
2458 )
2459 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002460 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002461 ).value
2462 assert nc == x509.NameConstraints(
2463 permitted_subtrees=[
2464 x509.DNSName(u"zombo.local"),
2465 ],
2466 excluded_subtrees=None
2467 )
2468
Paul Kehrer42376832015-07-01 18:10:32 -05002469 def test_permitted_with_leading_period(self, backend):
2470 cert = _load_cert(
2471 os.path.join(
2472 "x509", "custom", "nc_permitted.pem"
2473 ),
2474 x509.load_pem_x509_certificate,
2475 backend
2476 )
2477 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002478 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002479 ).value
2480 assert nc == x509.NameConstraints(
2481 permitted_subtrees=[
2482 x509.DNSName(u".cryptography.io"),
2483 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2484 ],
2485 excluded_subtrees=None
2486 )
2487
2488 def test_excluded_with_leading_period(self, backend):
2489 cert = _load_cert(
2490 os.path.join(
2491 "x509", "custom", "nc_excluded.pem"
2492 ),
2493 x509.load_pem_x509_certificate,
2494 backend
2495 )
2496 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002497 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002498 ).value
2499 assert nc == x509.NameConstraints(
2500 permitted_subtrees=None,
2501 excluded_subtrees=[
2502 x509.DNSName(u".cryptography.io"),
2503 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2504 ]
2505 )
2506
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002507 def test_permitted_excluded_with_ips(self, backend):
2508 cert = _load_cert(
2509 os.path.join(
2510 "x509", "custom", "nc_permitted_excluded.pem"
2511 ),
2512 x509.load_pem_x509_certificate,
2513 backend
2514 )
2515 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002516 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002517 ).value
2518 assert nc == x509.NameConstraints(
2519 permitted_subtrees=[
2520 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2521 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2522 ],
2523 excluded_subtrees=[
2524 x509.DNSName(u".domain.com"),
2525 x509.UniformResourceIdentifier(u"http://test.local"),
2526 ]
2527 )
2528
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002529 def test_single_ip_netmask(self, backend):
2530 cert = _load_cert(
2531 os.path.join(
2532 "x509", "custom", "nc_single_ip_netmask.pem"
2533 ),
2534 x509.load_pem_x509_certificate,
2535 backend
2536 )
2537 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002538 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002539 ).value
2540 assert nc == x509.NameConstraints(
2541 permitted_subtrees=[
2542 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2543 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2544 ],
2545 excluded_subtrees=None
2546 )
2547
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002548 def test_invalid_netmask(self, backend):
2549 cert = _load_cert(
2550 os.path.join(
2551 "x509", "custom", "nc_invalid_ip_netmask.pem"
2552 ),
2553 x509.load_pem_x509_certificate,
2554 backend
2555 )
2556 with pytest.raises(ValueError):
2557 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002558 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002559 )
2560
Paul Kehrer870d7e82015-06-21 22:20:44 -05002561
Paul Kehrer5a485522015-05-06 00:29:12 -05002562class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002563 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002564 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002565 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002566
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002567 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002568 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002569 x509.DistributionPoint(None, "notname", None, None)
2570
2571 def test_distribution_point_full_and_relative_not_none(self):
2572 with pytest.raises(ValueError):
2573 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002574
2575 def test_crl_issuer_not_general_names(self):
2576 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002577 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002578
2579 def test_reason_not_reasonflags(self):
2580 with pytest.raises(TypeError):
2581 x509.DistributionPoint(
2582 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002583 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002584 frozenset(["notreasonflags"]),
2585 None
2586 )
2587
2588 def test_reason_not_frozenset(self):
2589 with pytest.raises(TypeError):
2590 x509.DistributionPoint(
2591 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2592 None,
2593 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002594 None
2595 )
2596
2597 def test_disallowed_reasons(self):
2598 with pytest.raises(ValueError):
2599 x509.DistributionPoint(
2600 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2601 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002602 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002603 None
2604 )
2605
2606 with pytest.raises(ValueError):
2607 x509.DistributionPoint(
2608 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2609 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002610 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002611 None
2612 )
2613
2614 def test_reason_only(self):
2615 with pytest.raises(ValueError):
2616 x509.DistributionPoint(
2617 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002618 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002619 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002620 None
2621 )
2622
2623 def test_eq(self):
2624 dp = 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 dp2 = x509.DistributionPoint(
2639 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002640 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002641 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002642 [
2643 x509.DirectoryName(
2644 x509.Name([
2645 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002646 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002647 )
2648 ])
2649 )
2650 ],
2651 )
2652 assert dp == dp2
2653
2654 def test_ne(self):
2655 dp = x509.DistributionPoint(
2656 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002657 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002658 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002659 [
2660 x509.DirectoryName(
2661 x509.Name([
2662 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002663 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002664 )
2665 ])
2666 )
2667 ],
2668 )
2669 dp2 = x509.DistributionPoint(
2670 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2671 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002672 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002673 None
2674 )
2675 assert dp != dp2
2676 assert dp != object()
2677
2678 def test_repr(self):
2679 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002680 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002681 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002682 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002683 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002684 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002685 [
2686 x509.DirectoryName(
2687 x509.Name([
2688 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002689 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002690 )
2691 ])
2692 )
2693 ],
2694 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002695 if six.PY3:
2696 assert repr(dp) == (
2697 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2698 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002699 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2700 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2701 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2702 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002703 )
2704 else:
2705 assert repr(dp) == (
2706 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2707 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002708 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2709 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2710 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2711 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002712 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002713
2714
2715class TestCRLDistributionPoints(object):
2716 def test_invalid_distribution_points(self):
2717 with pytest.raises(TypeError):
2718 x509.CRLDistributionPoints(["notadistributionpoint"])
2719
2720 def test_iter_len(self):
2721 cdp = x509.CRLDistributionPoints([
2722 x509.DistributionPoint(
2723 [x509.UniformResourceIdentifier(u"http://domain")],
2724 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002725 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002726 None
2727 ),
2728 x509.DistributionPoint(
2729 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002730 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002731 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002732 x509.ReasonFlags.key_compromise,
2733 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002734 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002735 None
2736 ),
2737 ])
2738 assert len(cdp) == 2
2739 assert list(cdp) == [
2740 x509.DistributionPoint(
2741 [x509.UniformResourceIdentifier(u"http://domain")],
2742 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002743 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002744 None
2745 ),
2746 x509.DistributionPoint(
2747 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002748 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002749 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002750 x509.ReasonFlags.key_compromise,
2751 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002752 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002753 None
2754 ),
2755 ]
2756
2757 def test_repr(self):
2758 cdp = x509.CRLDistributionPoints([
2759 x509.DistributionPoint(
2760 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002761 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002762 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002763 None
2764 ),
2765 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002766 if six.PY3:
2767 assert repr(cdp) == (
2768 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2769 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2770 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2771 "romise'>}), crl_issuer=None)>])>"
2772 )
2773 else:
2774 assert repr(cdp) == (
2775 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2776 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2777 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2778 "romise'>]), crl_issuer=None)>])>"
2779 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002780
2781 def test_eq(self):
2782 cdp = x509.CRLDistributionPoints([
2783 x509.DistributionPoint(
2784 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002785 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002786 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002787 x509.ReasonFlags.key_compromise,
2788 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002789 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002790 [x509.UniformResourceIdentifier(u"uri://thing")],
2791 ),
2792 ])
2793 cdp2 = 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 assert cdp == cdp2
2805
2806 def test_ne(self):
2807 cdp = x509.CRLDistributionPoints([
2808 x509.DistributionPoint(
2809 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002810 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002811 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002812 x509.ReasonFlags.key_compromise,
2813 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002814 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002815 [x509.UniformResourceIdentifier(u"uri://thing")],
2816 ),
2817 ])
2818 cdp2 = x509.CRLDistributionPoints([
2819 x509.DistributionPoint(
2820 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002821 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002822 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002823 x509.ReasonFlags.key_compromise,
2824 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002825 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002826 [x509.UniformResourceIdentifier(u"uri://thing")],
2827 ),
2828 ])
2829 cdp3 = x509.CRLDistributionPoints([
2830 x509.DistributionPoint(
2831 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002832 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002833 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002834 [x509.UniformResourceIdentifier(u"uri://thing")],
2835 ),
2836 ])
2837 cdp4 = x509.CRLDistributionPoints([
2838 x509.DistributionPoint(
2839 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002840 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002841 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002842 x509.ReasonFlags.key_compromise,
2843 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002844 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002845 [x509.UniformResourceIdentifier(u"uri://thing2")],
2846 ),
2847 ])
2848 assert cdp != cdp2
2849 assert cdp != cdp3
2850 assert cdp != cdp4
2851 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002852
2853
2854@pytest.mark.requires_backend_interface(interface=RSABackend)
2855@pytest.mark.requires_backend_interface(interface=X509Backend)
2856class TestCRLDistributionPointsExtension(object):
2857 def test_fullname_and_crl_issuer(self, backend):
2858 cert = _load_cert(
2859 os.path.join(
2860 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2861 ),
2862 x509.load_der_x509_certificate,
2863 backend
2864 )
2865
2866 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002867 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002868 ).value
2869
2870 assert cdps == x509.CRLDistributionPoints([
2871 x509.DistributionPoint(
2872 full_name=[x509.DirectoryName(
2873 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002874 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002875 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002876 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002877 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002878 ),
2879 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002880 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002881 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002882 ),
2883 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002884 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002885 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002886 ),
2887 ])
2888 )],
2889 relative_name=None,
2890 reasons=None,
2891 crl_issuer=[x509.DirectoryName(
2892 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002893 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002894 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002895 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002896 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002897 ),
2898 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002899 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002900 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002901 ),
2902 ])
2903 )],
2904 )
2905 ])
2906
2907 def test_relativename_and_crl_issuer(self, backend):
2908 cert = _load_cert(
2909 os.path.join(
2910 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2911 ),
2912 x509.load_der_x509_certificate,
2913 backend
2914 )
2915
2916 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002917 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002918 ).value
2919
2920 assert cdps == x509.CRLDistributionPoints([
2921 x509.DistributionPoint(
2922 full_name=None,
2923 relative_name=x509.Name([
2924 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002925 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002926 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002927 ),
2928 ]),
2929 reasons=None,
2930 crl_issuer=[x509.DirectoryName(
2931 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002932 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002933 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002934 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002935 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002936 ),
2937 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002938 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002939 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002940 ),
2941 ])
2942 )],
2943 )
2944 ])
2945
2946 def test_fullname_crl_issuer_reasons(self, backend):
2947 cert = _load_cert(
2948 os.path.join(
2949 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2950 ),
2951 x509.load_pem_x509_certificate,
2952 backend
2953 )
2954
2955 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002956 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002957 ).value
2958
2959 assert cdps == x509.CRLDistributionPoints([
2960 x509.DistributionPoint(
2961 full_name=[x509.UniformResourceIdentifier(
2962 u"http://myhost.com/myca.crl"
2963 )],
2964 relative_name=None,
2965 reasons=frozenset([
2966 x509.ReasonFlags.key_compromise,
2967 x509.ReasonFlags.ca_compromise
2968 ]),
2969 crl_issuer=[x509.DirectoryName(
2970 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002971 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002972 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002973 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002974 ),
2975 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002976 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002977 ),
2978 ])
2979 )],
2980 )
2981 ])
2982
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002983 def test_all_reasons(self, backend):
2984 cert = _load_cert(
2985 os.path.join(
2986 "x509", "custom", "cdp_all_reasons.pem"
2987 ),
2988 x509.load_pem_x509_certificate,
2989 backend
2990 )
2991
2992 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002993 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002994 ).value
2995
2996 assert cdps == x509.CRLDistributionPoints([
2997 x509.DistributionPoint(
2998 full_name=[x509.UniformResourceIdentifier(
2999 u"http://domain.com/some.crl"
3000 )],
3001 relative_name=None,
3002 reasons=frozenset([
3003 x509.ReasonFlags.key_compromise,
3004 x509.ReasonFlags.ca_compromise,
3005 x509.ReasonFlags.affiliation_changed,
3006 x509.ReasonFlags.superseded,
3007 x509.ReasonFlags.privilege_withdrawn,
3008 x509.ReasonFlags.cessation_of_operation,
3009 x509.ReasonFlags.aa_compromise,
3010 x509.ReasonFlags.certificate_hold,
3011 ]),
3012 crl_issuer=None
3013 )
3014 ])
3015
3016 def test_single_reason(self, backend):
3017 cert = _load_cert(
3018 os.path.join(
3019 "x509", "custom", "cdp_reason_aa_compromise.pem"
3020 ),
3021 x509.load_pem_x509_certificate,
3022 backend
3023 )
3024
3025 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003026 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003027 ).value
3028
3029 assert cdps == x509.CRLDistributionPoints([
3030 x509.DistributionPoint(
3031 full_name=[x509.UniformResourceIdentifier(
3032 u"http://domain.com/some.crl"
3033 )],
3034 relative_name=None,
3035 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3036 crl_issuer=None
3037 )
3038 ])
3039
Paul Kehrer9a10d592015-05-10 14:55:51 -05003040 def test_crl_issuer_only(self, backend):
3041 cert = _load_cert(
3042 os.path.join(
3043 "x509", "custom", "cdp_crl_issuer.pem"
3044 ),
3045 x509.load_pem_x509_certificate,
3046 backend
3047 )
3048
3049 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003050 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003051 ).value
3052
3053 assert cdps == x509.CRLDistributionPoints([
3054 x509.DistributionPoint(
3055 full_name=None,
3056 relative_name=None,
3057 reasons=None,
3058 crl_issuer=[x509.DirectoryName(
3059 x509.Name([
3060 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003061 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003062 ),
3063 ])
3064 )],
3065 )
3066 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003067
Dominic Chen87bb9572015-10-09 00:23:07 -04003068 def test_crl_empty_hostname(self, backend):
3069 cert = _load_cert(
3070 os.path.join(
3071 "x509", "custom", "cdp_empty_hostname.pem"
3072 ),
3073 x509.load_pem_x509_certificate,
3074 backend
3075 )
3076
3077 cdps = cert.extensions.get_extension_for_oid(
3078 ExtensionOID.CRL_DISTRIBUTION_POINTS
3079 ).value
3080
3081 assert cdps == x509.CRLDistributionPoints([
3082 x509.DistributionPoint(
3083 full_name=[x509.UniformResourceIdentifier(
3084 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3085 )],
3086 relative_name=None,
3087 reasons=None,
3088 crl_issuer=None
3089 )
3090 ])
3091
Paul Kehrer16fae762015-05-01 23:14:20 -05003092
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003093@pytest.mark.requires_backend_interface(interface=RSABackend)
3094@pytest.mark.requires_backend_interface(interface=X509Backend)
3095class TestOCSPNoCheckExtension(object):
3096 def test_nocheck(self, backend):
3097 cert = _load_cert(
3098 os.path.join(
3099 "x509", "custom", "ocsp_nocheck.pem"
3100 ),
3101 x509.load_pem_x509_certificate,
3102 backend
3103 )
3104 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003105 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003106 )
3107 assert isinstance(ext.value, x509.OCSPNoCheck)
3108
3109
Paul Kehrer16fae762015-05-01 23:14:20 -05003110class TestInhibitAnyPolicy(object):
3111 def test_not_int(self):
3112 with pytest.raises(TypeError):
3113 x509.InhibitAnyPolicy("notint")
3114
3115 def test_negative_int(self):
3116 with pytest.raises(ValueError):
3117 x509.InhibitAnyPolicy(-1)
3118
3119 def test_repr(self):
3120 iap = x509.InhibitAnyPolicy(0)
3121 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3122
3123 def test_eq(self):
3124 iap = x509.InhibitAnyPolicy(1)
3125 iap2 = x509.InhibitAnyPolicy(1)
3126 assert iap == iap2
3127
3128 def test_ne(self):
3129 iap = x509.InhibitAnyPolicy(1)
3130 iap2 = x509.InhibitAnyPolicy(4)
3131 assert iap != iap2
3132 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003133
3134
3135@pytest.mark.requires_backend_interface(interface=RSABackend)
3136@pytest.mark.requires_backend_interface(interface=X509Backend)
3137class TestInhibitAnyPolicyExtension(object):
3138 def test_nocheck(self, backend):
3139 cert = _load_cert(
3140 os.path.join(
3141 "x509", "custom", "inhibit_any_policy_5.pem"
3142 ),
3143 x509.load_pem_x509_certificate,
3144 backend
3145 )
3146 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003147 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003148 ).value
3149 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003150
3151
3152@pytest.mark.requires_backend_interface(interface=RSABackend)
3153@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003154class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003155 def test_invalid_certificate_policies_data(self, backend):
3156 cert = _load_cert(
3157 os.path.join(
3158 "x509", "custom", "cp_invalid.pem"
3159 ),
3160 x509.load_pem_x509_certificate,
3161 backend
3162 )
3163 with pytest.raises(ValueError):
3164 cert.extensions