blob: 91a07654487d733cc725290b6e77efcf5cfb2dc7 [file] [log] [blame]
Paul Kehrer8cf26422015-03-21 09:50:24 -05001# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import absolute_import, division, print_function
6
Paul Kehrer1eb82a62015-03-31 20:00:33 -05007import binascii
Paul Kehrer23c0bbc2015-12-25 22:35:19 -06008import datetime
Paul Kehrer31bdf792015-03-25 14:11:00 -05009import ipaddress
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050010import os
11
Paul Kehrer8cf26422015-03-21 09:50:24 -050012import pytest
13
Paul Kehrercbfb1012015-04-10 20:57:20 -040014import six
15
Paul Kehrer8cf26422015-03-21 09:50:24 -050016from cryptography import x509
Paul Kehrerf22f6122015-08-05 12:57:13 +010017from cryptography.hazmat.backends.interfaces import (
18 DSABackend, EllipticCurveBackend, RSABackend, X509Backend
19)
20from cryptography.hazmat.primitives.asymmetric import ec
Paul Kehrer9e102db2015-08-10 21:53:09 -050021from cryptography.x509.oid import (
Nick Bastin326fc8e2015-12-12 19:08:12 -080022 AuthorityInformationAccessOID, ExtendedKeyUsageOID, ExtensionOID,
23 NameOID, ObjectIdentifier
Paul Kehrer9e102db2015-08-10 21:53:09 -050024)
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050025
Paul Kehrerf22f6122015-08-05 12:57:13 +010026from .hazmat.primitives.test_ec import _skip_curve_unsupported
Paul Kehrerfbb7ac82015-03-16 19:26:29 -050027from .test_x509 import _load_cert
Paul Kehrer8cf26422015-03-21 09:50:24 -050028
29
Paul Kehrer85894662015-03-22 13:19:31 -050030class TestExtension(object):
31 def test_not_an_oid(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050032 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050033 with pytest.raises(TypeError):
34 x509.Extension("notanoid", True, bc)
35
36 def test_critical_not_a_bool(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050037 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrer85894662015-03-22 13:19:31 -050038 with pytest.raises(TypeError):
Paul Kehrerd44e4132015-08-10 19:13:13 -050039 x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, "notabool", bc)
Paul Kehrer85894662015-03-22 13:19:31 -050040
41 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -050042 bc = x509.BasicConstraints(ca=False, path_length=None)
Paul Kehrerd44e4132015-08-10 19:13:13 -050043 ext = x509.Extension(ExtensionOID.BASIC_CONSTRAINTS, True, bc)
Paul Kehrer85894662015-03-22 13:19:31 -050044 assert repr(ext) == (
45 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name=basicConst"
46 "raints)>, critical=True, value=<BasicConstraints(ca=False, path"
47 "_length=None)>)>"
48 )
49
Paul Kehrer58e870c2015-05-17 09:15:30 -070050 def test_eq(self):
51 ext1 = x509.Extension(
52 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
53 )
54 ext2 = x509.Extension(
55 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
56 )
57 assert ext1 == ext2
58
59 def test_ne(self):
60 ext1 = x509.Extension(
61 x509.ObjectIdentifier('1.2.3.4'), False, 'value'
62 )
63 ext2 = x509.Extension(
64 x509.ObjectIdentifier('1.2.3.5'), False, 'value'
65 )
66 ext3 = x509.Extension(
67 x509.ObjectIdentifier('1.2.3.4'), True, 'value'
68 )
69 ext4 = x509.Extension(
70 x509.ObjectIdentifier('1.2.3.4'), False, 'value4'
71 )
72 assert ext1 != ext2
73 assert ext1 != ext3
74 assert ext1 != ext4
75 assert ext1 != object()
76
Paul Kehrer85894662015-03-22 13:19:31 -050077
Paul Kehrer49bb7562015-12-25 16:17:40 -060078class TestCertificateIssuer(object):
79 def test_iter_names(self):
80 ci = x509.CertificateIssuer([
81 x509.DNSName(u"cryptography.io"),
82 x509.DNSName(u"crypto.local"),
83 ])
84 assert len(ci) == 2
85 assert list(ci) == [
86 x509.DNSName(u"cryptography.io"),
87 x509.DNSName(u"crypto.local"),
88 ]
89
90 def test_eq(self):
91 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
92 ci2 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
93 assert ci1 == ci2
94
95 def test_ne(self):
96 ci1 = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
97 ci2 = x509.CertificateIssuer([x509.DNSName(u"somethingelse.tld")])
98 assert ci1 != ci2
99 assert ci1 != object()
100
101 def test_repr(self):
102 ci = x509.CertificateIssuer([x509.DNSName(u"cryptography.io")])
103 assert repr(ci) == (
104 "<CertificateIssuer(<GeneralNames([<DNSName(value=cryptography.io"
105 ")>])>)>"
106 )
107
108 def test_get_values_for_type(self):
109 ci = x509.CertificateIssuer(
110 [x509.DNSName(u"cryptography.io")]
111 )
112 names = ci.get_values_for_type(x509.DNSName)
113 assert names == [u"cryptography.io"]
114
115
Paul Kehrer7058ece2015-12-25 22:28:29 -0600116class TestCRLReason(object):
117 def test_invalid_reason_flags(self):
118 with pytest.raises(TypeError):
119 x509.CRLReason("notareason")
120
121 def test_eq(self):
122 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
123 reason2 = x509.CRLReason(x509.ReasonFlags.unspecified)
124 assert reason1 == reason2
125
126 def test_ne(self):
127 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
128 reason2 = x509.CRLReason(x509.ReasonFlags.ca_compromise)
129 assert reason1 != reason2
130 assert reason1 != object()
131
132 def test_repr(self):
133 reason1 = x509.CRLReason(x509.ReasonFlags.unspecified)
134 assert repr(reason1) == (
135 "<CRLReason(reason=ReasonFlags.unspecified)>"
136 )
137
138
Paul Kehrer23c0bbc2015-12-25 22:35:19 -0600139class TestInvalidityDate(object):
140 def test_invalid_invalidity_date(self):
141 with pytest.raises(TypeError):
142 x509.InvalidityDate("notadate")
143
144 def test_eq(self):
145 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
146 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
147 assert invalid1 == invalid2
148
149 def test_ne(self):
150 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
151 invalid2 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 2))
152 assert invalid1 != invalid2
153 assert invalid1 != object()
154
155 def test_repr(self):
156 invalid1 = x509.InvalidityDate(datetime.datetime(2015, 1, 1, 1, 1))
157 assert repr(invalid1) == (
158 "<InvalidityDate(invalidity_date=2015-01-01 01:01:00)>"
159 )
160
161
Paul Kehrer2b622582015-04-15 11:04:29 -0400162class TestNoticeReference(object):
163 def test_notice_numbers_not_all_int(self):
164 with pytest.raises(TypeError):
165 x509.NoticeReference("org", [1, 2, "three"])
166
167 def test_notice_numbers_none(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500168 with pytest.raises(TypeError):
169 x509.NoticeReference("org", None)
Paul Kehrer2b622582015-04-15 11:04:29 -0400170
171 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500172 nr = x509.NoticeReference(u"org", [1, 3, 4])
Paul Kehrer2b622582015-04-15 11:04:29 -0400173
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500174 if six.PY3:
175 assert repr(nr) == (
176 "<NoticeReference(organization='org', notice_numbers=[1, 3, 4"
177 "])>"
178 )
179 else:
180 assert repr(nr) == (
181 "<NoticeReference(organization=u'org', notice_numbers=[1, 3, "
182 "4])>"
183 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400184
Paul Kehrerc56ab622015-05-03 09:56:31 -0500185 def test_eq(self):
186 nr = x509.NoticeReference("org", [1, 2])
187 nr2 = x509.NoticeReference("org", [1, 2])
188 assert nr == nr2
189
190 def test_ne(self):
191 nr = x509.NoticeReference("org", [1, 2])
192 nr2 = x509.NoticeReference("org", [1])
193 nr3 = x509.NoticeReference(None, [1, 2])
194 assert nr != nr2
195 assert nr != nr3
196 assert nr != object()
197
Paul Kehrer2b622582015-04-15 11:04:29 -0400198
199class TestUserNotice(object):
200 def test_notice_reference_invalid(self):
201 with pytest.raises(TypeError):
202 x509.UserNotice("invalid", None)
203
204 def test_notice_reference_none(self):
205 un = x509.UserNotice(None, "text")
206 assert un.notice_reference is None
207 assert un.explicit_text == "text"
208
209 def test_repr(self):
Paul Kehrer6e198b02015-05-12 15:53:38 -0500210 un = x509.UserNotice(x509.NoticeReference(u"org", [1]), u"text")
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500211 if six.PY3:
212 assert repr(un) == (
213 "<UserNotice(notice_reference=<NoticeReference(organization='"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500214 "org', notice_numbers=[1])>, explicit_text='text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500215 )
216 else:
217 assert repr(un) == (
218 "<UserNotice(notice_reference=<NoticeReference(organization=u"
Paul Kehrer6e198b02015-05-12 15:53:38 -0500219 "'org', notice_numbers=[1])>, explicit_text=u'text')>"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500220 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400221
Paul Kehrerc56ab622015-05-03 09:56:31 -0500222 def test_eq(self):
223 nr = x509.NoticeReference("org", [1, 2])
224 nr2 = x509.NoticeReference("org", [1, 2])
225 un = x509.UserNotice(nr, "text")
226 un2 = x509.UserNotice(nr2, "text")
227 assert un == un2
228
229 def test_ne(self):
230 nr = x509.NoticeReference("org", [1, 2])
231 nr2 = x509.NoticeReference("org", [1])
232 un = x509.UserNotice(nr, "text")
233 un2 = x509.UserNotice(nr2, "text")
234 un3 = x509.UserNotice(nr, "text3")
235 assert un != un2
236 assert un != un3
237 assert un != object()
238
Paul Kehrer2b622582015-04-15 11:04:29 -0400239
Paul Kehrer2b622582015-04-15 11:04:29 -0400240class TestPolicyInformation(object):
241 def test_invalid_policy_identifier(self):
242 with pytest.raises(TypeError):
243 x509.PolicyInformation("notanoid", None)
244
245 def test_none_policy_qualifiers(self):
246 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), None)
247 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
248 assert pi.policy_qualifiers is None
249
250 def test_policy_qualifiers(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500251 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400252 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
253 assert pi.policy_identifier == x509.ObjectIdentifier("1.2.3")
254 assert pi.policy_qualifiers == pq
255
256 def test_invalid_policy_identifiers(self):
257 with pytest.raises(TypeError):
258 x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), [1, 2])
259
260 def test_repr(self):
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500261 pq = [u"string", x509.UserNotice(None, u"hi")]
Paul Kehrer2b622582015-04-15 11:04:29 -0400262 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500263 if six.PY3:
264 assert repr(pi) == (
265 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
266 "2.3, name=Unknown OID)>, policy_qualifiers=['string', <UserNo"
Paul Kehrer9aaef9e2015-05-11 10:49:20 -0500267 "tice(notice_reference=None, explicit_text='hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500268 )
269 else:
270 assert repr(pi) == (
271 "<PolicyInformation(policy_identifier=<ObjectIdentifier(oid=1."
272 "2.3, name=Unknown OID)>, policy_qualifiers=[u'string', <UserN"
Paul Kehrer73be2ca2015-05-11 21:22:38 -0500273 "otice(notice_reference=None, explicit_text=u'hi')>])>"
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500274 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400275
Paul Kehrerc56ab622015-05-03 09:56:31 -0500276 def test_eq(self):
277 pi = x509.PolicyInformation(
278 x509.ObjectIdentifier("1.2.3"),
279 [u"string", x509.UserNotice(None, u"hi")]
280 )
281 pi2 = x509.PolicyInformation(
282 x509.ObjectIdentifier("1.2.3"),
283 [u"string", x509.UserNotice(None, u"hi")]
284 )
285 assert pi == pi2
286
287 def test_ne(self):
288 pi = x509.PolicyInformation(
289 x509.ObjectIdentifier("1.2.3"), [u"string"]
290 )
291 pi2 = x509.PolicyInformation(
292 x509.ObjectIdentifier("1.2.3"), [u"string2"]
293 )
294 pi3 = x509.PolicyInformation(
295 x509.ObjectIdentifier("1.2.3.4"), [u"string"]
296 )
297 assert pi != pi2
298 assert pi != pi3
299 assert pi != object()
300
Paul Kehrer2b622582015-04-15 11:04:29 -0400301
302class TestCertificatePolicies(object):
303 def test_invalid_policies(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500304 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400305 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
306 with pytest.raises(TypeError):
307 x509.CertificatePolicies([1, pi])
308
309 def test_iter_len(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500310 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400311 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
312 cp = x509.CertificatePolicies([pi])
313 assert len(cp) == 1
314 for policyinfo in cp:
315 assert policyinfo == pi
316
317 def test_repr(self):
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500318 pq = [u"string"]
Paul Kehrer2b622582015-04-15 11:04:29 -0400319 pi = x509.PolicyInformation(x509.ObjectIdentifier("1.2.3"), pq)
320 cp = x509.CertificatePolicies([pi])
Paul Kehrerba35b3b2015-05-10 13:07:59 -0500321 if six.PY3:
322 assert repr(cp) == (
323 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
324 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
325 "ers=['string'])>])>"
326 )
327 else:
328 assert repr(cp) == (
329 "<CertificatePolicies([<PolicyInformation(policy_identifier=<O"
330 "bjectIdentifier(oid=1.2.3, name=Unknown OID)>, policy_qualifi"
331 "ers=[u'string'])>])>"
332 )
Paul Kehrer2b622582015-04-15 11:04:29 -0400333
Paul Kehrerc56ab622015-05-03 09:56:31 -0500334 def test_eq(self):
335 pi = x509.PolicyInformation(
336 x509.ObjectIdentifier("1.2.3"), [u"string"]
337 )
338 cp = x509.CertificatePolicies([pi])
339 pi2 = x509.PolicyInformation(
340 x509.ObjectIdentifier("1.2.3"), [u"string"]
341 )
342 cp2 = x509.CertificatePolicies([pi2])
343 assert cp == cp2
344
345 def test_ne(self):
346 pi = x509.PolicyInformation(
347 x509.ObjectIdentifier("1.2.3"), [u"string"]
348 )
349 cp = x509.CertificatePolicies([pi])
350 pi2 = x509.PolicyInformation(
351 x509.ObjectIdentifier("1.2.3"), [u"string2"]
352 )
353 cp2 = x509.CertificatePolicies([pi2])
354 assert cp != cp2
355 assert cp != object()
356
Paul Kehrer2b622582015-04-15 11:04:29 -0400357
Paul Kehrer11026fe2015-05-12 11:23:56 -0500358@pytest.mark.requires_backend_interface(interface=RSABackend)
359@pytest.mark.requires_backend_interface(interface=X509Backend)
360class TestCertificatePoliciesExtension(object):
361 def test_cps_uri_policy_qualifier(self, backend):
362 cert = _load_cert(
363 os.path.join("x509", "custom", "cp_cps_uri.pem"),
364 x509.load_pem_x509_certificate,
365 backend
366 )
367
368 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500369 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500370 ).value
371
372 assert cp == x509.CertificatePolicies([
373 x509.PolicyInformation(
374 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
375 [u"http://other.com/cps"]
376 )
377 ])
378
379 def test_user_notice_with_notice_reference(self, backend):
380 cert = _load_cert(
381 os.path.join(
382 "x509", "custom", "cp_user_notice_with_notice_reference.pem"
383 ),
384 x509.load_pem_x509_certificate,
385 backend
386 )
387
388 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500389 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500390 ).value
391
392 assert cp == x509.CertificatePolicies([
393 x509.PolicyInformation(
394 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
395 [
396 u"http://example.com/cps",
397 u"http://other.com/cps",
398 x509.UserNotice(
399 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
400 u"thing"
401 )
402 ]
403 )
404 ])
405
406 def test_user_notice_with_explicit_text(self, backend):
407 cert = _load_cert(
408 os.path.join(
409 "x509", "custom", "cp_user_notice_with_explicit_text.pem"
410 ),
411 x509.load_pem_x509_certificate,
412 backend
413 )
414
415 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500416 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500417 ).value
418
419 assert cp == x509.CertificatePolicies([
420 x509.PolicyInformation(
421 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
422 [x509.UserNotice(None, u"thing")]
423 )
424 ])
425
426 def test_user_notice_no_explicit_text(self, backend):
427 cert = _load_cert(
428 os.path.join(
429 "x509", "custom", "cp_user_notice_no_explicit_text.pem"
430 ),
431 x509.load_pem_x509_certificate,
432 backend
433 )
434
435 cp = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500436 ExtensionOID.CERTIFICATE_POLICIES
Paul Kehrer11026fe2015-05-12 11:23:56 -0500437 ).value
438
439 assert cp == x509.CertificatePolicies([
440 x509.PolicyInformation(
441 x509.ObjectIdentifier("2.16.840.1.12345.1.2.3.4.1"),
442 [
443 x509.UserNotice(
444 x509.NoticeReference(u"my org", [1, 2, 3, 4]),
445 None
446 )
447 ]
448 )
449 ])
450
451
Paul Kehrercecbbba2015-03-30 14:58:38 -0500452class TestKeyUsage(object):
453 def test_key_agreement_false_encipher_decipher_true(self):
454 with pytest.raises(ValueError):
455 x509.KeyUsage(
456 digital_signature=False,
457 content_commitment=False,
458 key_encipherment=False,
459 data_encipherment=False,
460 key_agreement=False,
461 key_cert_sign=False,
462 crl_sign=False,
463 encipher_only=True,
464 decipher_only=False
465 )
466
467 with pytest.raises(ValueError):
468 x509.KeyUsage(
469 digital_signature=False,
470 content_commitment=False,
471 key_encipherment=False,
472 data_encipherment=False,
473 key_agreement=False,
474 key_cert_sign=False,
475 crl_sign=False,
476 encipher_only=True,
477 decipher_only=True
478 )
479
480 with pytest.raises(ValueError):
481 x509.KeyUsage(
482 digital_signature=False,
483 content_commitment=False,
484 key_encipherment=False,
485 data_encipherment=False,
486 key_agreement=False,
487 key_cert_sign=False,
488 crl_sign=False,
489 encipher_only=False,
490 decipher_only=True
491 )
492
493 def test_properties_key_agreement_true(self):
494 ku = x509.KeyUsage(
495 digital_signature=True,
496 content_commitment=True,
497 key_encipherment=False,
498 data_encipherment=False,
499 key_agreement=False,
500 key_cert_sign=True,
501 crl_sign=False,
502 encipher_only=False,
503 decipher_only=False
504 )
505 assert ku.digital_signature is True
506 assert ku.content_commitment is True
507 assert ku.key_encipherment is False
508 assert ku.data_encipherment is False
509 assert ku.key_agreement is False
510 assert ku.key_cert_sign is True
511 assert ku.crl_sign is False
512
513 def test_key_agreement_true_properties(self):
514 ku = x509.KeyUsage(
515 digital_signature=False,
516 content_commitment=False,
517 key_encipherment=False,
518 data_encipherment=False,
519 key_agreement=True,
520 key_cert_sign=False,
521 crl_sign=False,
522 encipher_only=False,
523 decipher_only=True
524 )
525 assert ku.key_agreement is True
526 assert ku.encipher_only is False
527 assert ku.decipher_only is True
528
529 def test_key_agreement_false_properties(self):
530 ku = x509.KeyUsage(
531 digital_signature=False,
532 content_commitment=False,
533 key_encipherment=False,
534 data_encipherment=False,
535 key_agreement=False,
536 key_cert_sign=False,
537 crl_sign=False,
538 encipher_only=False,
539 decipher_only=False
540 )
541 assert ku.key_agreement is False
542 with pytest.raises(ValueError):
543 ku.encipher_only
544
545 with pytest.raises(ValueError):
546 ku.decipher_only
547
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500548 def test_repr_key_agreement_false(self):
549 ku = x509.KeyUsage(
550 digital_signature=True,
551 content_commitment=True,
552 key_encipherment=False,
553 data_encipherment=False,
554 key_agreement=False,
555 key_cert_sign=True,
556 crl_sign=False,
557 encipher_only=False,
558 decipher_only=False
559 )
560 assert repr(ku) == (
561 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
562 "cipherment=False, data_encipherment=False, key_agreement=False, k"
Paul Kehrerb372e672015-04-15 11:05:24 -0400563 "ey_cert_sign=True, crl_sign=False, encipher_only=None, decipher_o"
564 "nly=None)>"
Paul Kehrerac3e5bb2015-04-02 23:07:10 -0500565 )
566
567 def test_repr_key_agreement_true(self):
568 ku = x509.KeyUsage(
569 digital_signature=True,
570 content_commitment=True,
571 key_encipherment=False,
572 data_encipherment=False,
573 key_agreement=True,
574 key_cert_sign=True,
575 crl_sign=False,
576 encipher_only=False,
577 decipher_only=False
578 )
579 assert repr(ku) == (
580 "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
581 "cipherment=False, data_encipherment=False, key_agreement=True, k"
582 "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
583 "only=False)>"
584 )
585
Paul Kehrer8565f5e2015-05-13 09:57:09 -0500586 def test_eq(self):
587 ku = x509.KeyUsage(
588 digital_signature=False,
589 content_commitment=False,
590 key_encipherment=False,
591 data_encipherment=False,
592 key_agreement=True,
593 key_cert_sign=False,
594 crl_sign=False,
595 encipher_only=False,
596 decipher_only=True
597 )
598 ku2 = x509.KeyUsage(
599 digital_signature=False,
600 content_commitment=False,
601 key_encipherment=False,
602 data_encipherment=False,
603 key_agreement=True,
604 key_cert_sign=False,
605 crl_sign=False,
606 encipher_only=False,
607 decipher_only=True
608 )
609 assert ku == ku2
610
611 def test_ne(self):
612 ku = x509.KeyUsage(
613 digital_signature=False,
614 content_commitment=False,
615 key_encipherment=False,
616 data_encipherment=False,
617 key_agreement=True,
618 key_cert_sign=False,
619 crl_sign=False,
620 encipher_only=False,
621 decipher_only=True
622 )
623 ku2 = x509.KeyUsage(
624 digital_signature=False,
625 content_commitment=False,
626 key_encipherment=False,
627 data_encipherment=False,
628 key_agreement=False,
629 key_cert_sign=False,
630 crl_sign=False,
631 encipher_only=False,
632 decipher_only=False
633 )
634 assert ku != ku2
635 assert ku != object()
636
Paul Kehrercecbbba2015-03-30 14:58:38 -0500637
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500638class TestSubjectKeyIdentifier(object):
639 def test_properties(self):
Paul Kehrercbfb1012015-04-10 20:57:20 -0400640 value = binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500641 ski = x509.SubjectKeyIdentifier(value)
642 assert ski.digest == value
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500643
644 def test_repr(self):
645 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500646 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500647 )
Paul Kehrerd44e4132015-08-10 19:13:13 -0500648 ext = x509.Extension(ExtensionOID.SUBJECT_KEY_IDENTIFIER, False, ski)
Paul Kehrercbfb1012015-04-10 20:57:20 -0400649 if six.PY3:
650 assert repr(ext) == (
651 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
652 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
653 "igest=b\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
654 "\\xf7\\xff:\\xc9\')>)>"
655 )
656 else:
657 assert repr(ext) == (
658 "<Extension(oid=<ObjectIdentifier(oid=2.5.29.14, name=subjectK"
659 "eyIdentifier)>, critical=False, value=<SubjectKeyIdentifier(d"
660 "igest=\'\\t#\\x84\\x93\"0I\\x8b\\xc9\\x80\\xaa\\x80\\x98Eoo"
661 "\\xf7\\xff:\\xc9\')>)>"
662 )
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500663
664 def test_eq(self):
665 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500666 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500667 )
668 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500669 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500670 )
671 assert ski == ski2
672
673 def test_ne(self):
674 ski = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500675 binascii.unhexlify(b"092384932230498bc980aa8098456f6ff7ff3ac9")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500676 )
677 ski2 = x509.SubjectKeyIdentifier(
Paul Kehreree997262015-04-04 12:20:28 -0500678 binascii.unhexlify(b"aa8098456f6ff7ff3ac9092384932230498bc980")
Paul Kehrer1eb82a62015-03-31 20:00:33 -0500679 )
680 assert ski != ski2
681 assert ski != object()
682
683
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400684class TestAuthorityKeyIdentifier(object):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500685 def test_authority_cert_issuer_not_generalname(self):
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400686 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500687 x509.AuthorityKeyIdentifier(b"identifier", ["notname"], 3)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400688
689 def test_authority_cert_serial_number_not_integer(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500690 dirname = x509.DirectoryName(
691 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800692 x509.NameAttribute(
693 x509.ObjectIdentifier('2.999.1'),
694 u'value1'
695 ),
696 x509.NameAttribute(
697 x509.ObjectIdentifier('2.999.2'),
698 u'value2'
699 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500700 ])
701 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400702 with pytest.raises(TypeError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500703 x509.AuthorityKeyIdentifier(b"identifier", [dirname], "notanint")
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400704
705 def test_authority_issuer_none_serial_not_none(self):
706 with pytest.raises(ValueError):
707 x509.AuthorityKeyIdentifier(b"identifier", None, 3)
708
709 def test_authority_issuer_not_none_serial_none(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500710 dirname = x509.DirectoryName(
711 x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -0800712 x509.NameAttribute(
713 x509.ObjectIdentifier('2.999.1'),
714 u'value1'
715 ),
716 x509.NameAttribute(
717 x509.ObjectIdentifier('2.999.2'),
718 u'value2'
719 ),
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500720 ])
721 )
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400722 with pytest.raises(ValueError):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500723 x509.AuthorityKeyIdentifier(b"identifier", [dirname], None)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400724
725 def test_authority_cert_serial_and_issuer_none(self):
726 aki = x509.AuthorityKeyIdentifier(b"id", None, None)
727 assert aki.key_identifier == b"id"
728 assert aki.authority_cert_issuer is None
729 assert aki.authority_cert_serial_number is None
730
731 def test_repr(self):
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500732 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500733 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500734 )
735 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400736
737 if six.PY3:
738 assert repr(aki) == (
739 "<AuthorityKeyIdentifier(key_identifier=b'digest', authority_"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500740 "cert_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid="
Ian Cordascoa908d692015-06-16 21:35:24 -0500741 "<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='myC"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500742 "N')>])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400743 )
744 else:
745 assert repr(aki) == (
746 "<AuthorityKeyIdentifier(key_identifier='digest', authority_ce"
Paul Kehrerc6e0f062015-05-03 11:04:34 -0500747 "rt_issuer=[<DirectoryName(value=<Name([<NameAttribute(oid=<Ob"
Ian Cordasco82fc3762015-06-16 20:59:50 -0500748 "jectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'myCN')"
749 ">])>)>], authority_cert_serial_number=1234)>"
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400750 )
751
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500752 def test_eq(self):
753 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500754 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500755 )
756 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
757 dirname2 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500758 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500759 )
760 aki2 = x509.AuthorityKeyIdentifier(b"digest", [dirname2], 1234)
761 assert aki == aki2
762
763 def test_ne(self):
764 dirname = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500765 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'myCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500766 )
767 dirname5 = x509.DirectoryName(
Paul Kehrereba19e62015-08-10 18:44:24 -0500768 x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'aCN')])
Paul Kehrer2ca2eb32015-05-03 10:04:57 -0500769 )
770 aki = x509.AuthorityKeyIdentifier(b"digest", [dirname], 1234)
771 aki2 = x509.AuthorityKeyIdentifier(b"diges", [dirname], 1234)
772 aki3 = x509.AuthorityKeyIdentifier(b"digest", None, None)
773 aki4 = x509.AuthorityKeyIdentifier(b"digest", [dirname], 12345)
774 aki5 = x509.AuthorityKeyIdentifier(b"digest", [dirname5], 12345)
775 assert aki != aki2
776 assert aki != aki3
777 assert aki != aki4
778 assert aki != aki5
779 assert aki != object()
780
Paul Kehrer2eb4ed92015-04-11 15:33:45 -0400781
Paul Kehrer8cf26422015-03-21 09:50:24 -0500782class TestBasicConstraints(object):
783 def test_ca_not_boolean(self):
784 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500785 x509.BasicConstraints(ca="notbool", path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500786
787 def test_path_length_not_ca(self):
788 with pytest.raises(ValueError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500789 x509.BasicConstraints(ca=False, path_length=0)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500790
791 def test_path_length_not_int(self):
792 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500793 x509.BasicConstraints(ca=True, path_length=1.1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500794
795 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500796 x509.BasicConstraints(ca=True, path_length="notint")
Paul Kehrer8cf26422015-03-21 09:50:24 -0500797
798 def test_path_length_negative(self):
799 with pytest.raises(TypeError):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500800 x509.BasicConstraints(ca=True, path_length=-1)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500801
802 def test_repr(self):
Paul Kehrera5c6e9a2015-03-23 19:23:43 -0500803 na = x509.BasicConstraints(ca=True, path_length=None)
Paul Kehrer8cf26422015-03-21 09:50:24 -0500804 assert repr(na) == (
Paul Kehrer85894662015-03-22 13:19:31 -0500805 "<BasicConstraints(ca=True, path_length=None)>"
Paul Kehrer8cf26422015-03-21 09:50:24 -0500806 )
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500807
Paul Kehrer3a69b132015-05-13 10:03:46 -0500808 def test_eq(self):
809 na = x509.BasicConstraints(ca=True, path_length=None)
810 na2 = x509.BasicConstraints(ca=True, path_length=None)
811 assert na == na2
812
813 def test_ne(self):
814 na = x509.BasicConstraints(ca=True, path_length=None)
815 na2 = x509.BasicConstraints(ca=True, path_length=1)
816 na3 = x509.BasicConstraints(ca=False, path_length=None)
817 assert na != na2
818 assert na != na3
819 assert na != object()
820
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500821
Paul Kehrerffa2a152015-03-31 08:18:25 -0500822class TestExtendedKeyUsage(object):
823 def test_not_all_oids(self):
824 with pytest.raises(TypeError):
825 x509.ExtendedKeyUsage(["notoid"])
826
827 def test_iter_len(self):
828 eku = x509.ExtendedKeyUsage([
829 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
830 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
831 ])
832 assert len(eku) == 2
833 assert list(eku) == [
Paul Kehrer9e102db2015-08-10 21:53:09 -0500834 ExtendedKeyUsageOID.SERVER_AUTH,
835 ExtendedKeyUsageOID.CLIENT_AUTH
Paul Kehrerffa2a152015-03-31 08:18:25 -0500836 ]
837
Paul Kehrer23d10c32015-04-02 23:12:32 -0500838 def test_repr(self):
839 eku = x509.ExtendedKeyUsage([
840 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
841 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
842 ])
843 assert repr(eku) == (
844 "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name="
845 "serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clien"
846 "tAuth)>])>"
847 )
848
Paul Kehrerb0476172015-05-02 19:34:51 -0500849 def test_eq(self):
850 eku = x509.ExtendedKeyUsage([
851 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
852 ])
853 eku2 = x509.ExtendedKeyUsage([
854 x509.ObjectIdentifier("1.3.6"), x509.ObjectIdentifier("1.3.7")
855 ])
856 assert eku == eku2
857
858 def test_ne(self):
859 eku = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6")])
860 eku2 = x509.ExtendedKeyUsage([x509.ObjectIdentifier("1.3.6.1")])
861 assert eku != eku2
862 assert eku != object()
863
Paul Kehrerffa2a152015-03-31 08:18:25 -0500864
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500865@pytest.mark.requires_backend_interface(interface=RSABackend)
866@pytest.mark.requires_backend_interface(interface=X509Backend)
867class TestExtensions(object):
868 def test_no_extensions(self, backend):
869 cert = _load_cert(
870 os.path.join("x509", "verisign_md2_root.pem"),
871 x509.load_pem_x509_certificate,
872 backend
873 )
874 ext = cert.extensions
875 assert len(ext) == 0
876 assert list(ext) == []
Paul Kehrerfa56a232015-03-17 13:14:03 -0500877 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -0500878 ext.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500879
Paul Kehrerd44e4132015-08-10 19:13:13 -0500880 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500881
882 def test_one_extension(self, backend):
883 cert = _load_cert(
884 os.path.join(
885 "x509", "custom", "basic_constraints_not_critical.pem"
886 ),
887 x509.load_pem_x509_certificate,
888 backend
889 )
890 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -0500891 ext = extensions.get_extension_for_oid(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500892 assert ext is not None
893 assert ext.value.ca is False
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500894
895 def test_duplicate_extension(self, backend):
896 cert = _load_cert(
897 os.path.join(
898 "x509", "custom", "two_basic_constraints.pem"
899 ),
900 x509.load_pem_x509_certificate,
901 backend
902 )
903 with pytest.raises(x509.DuplicateExtension) as exc:
904 cert.extensions
905
Paul Kehrerd44e4132015-08-10 19:13:13 -0500906 assert exc.value.oid == ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfbb7ac82015-03-16 19:26:29 -0500907
908 def test_unsupported_critical_extension(self, backend):
909 cert = _load_cert(
910 os.path.join(
911 "x509", "custom", "unsupported_extension_critical.pem"
912 ),
913 x509.load_pem_x509_certificate,
914 backend
915 )
916 with pytest.raises(x509.UnsupportedExtension) as exc:
917 cert.extensions
918
919 assert exc.value.oid == x509.ObjectIdentifier("1.2.3.4")
920
921 def test_unsupported_extension(self, backend):
922 # TODO: this will raise an exception when all extensions are complete
923 cert = _load_cert(
924 os.path.join(
925 "x509", "custom", "unsupported_extension.pem"
926 ),
927 x509.load_pem_x509_certificate,
928 backend
929 )
930 extensions = cert.extensions
931 assert len(extensions) == 0
Paul Kehrerfa56a232015-03-17 13:14:03 -0500932
Phoebe Queenecae9812015-08-12 05:00:32 +0100933 def test_no_extensions_get_for_class(self, backend):
934 cert = _load_cert(
935 os.path.join(
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100936 "x509", "cryptography.io.pem"
Phoebe Queenecae9812015-08-12 05:00:32 +0100937 ),
938 x509.load_pem_x509_certificate,
939 backend
940 )
Phoebe Queenc93752b2015-08-12 10:54:46 +0100941 exts = cert.extensions
Phoebe Queenecae9812015-08-12 05:00:32 +0100942 with pytest.raises(x509.ExtensionNotFound) as exc:
Phoebe Queencb5ec4e2015-08-12 15:06:26 +0100943 exts.get_extension_for_class(x509.IssuerAlternativeName)
944 assert exc.value.oid == ExtensionOID.ISSUER_ALTERNATIVE_NAME
Phoebe Queenecae9812015-08-12 05:00:32 +0100945
Paul Kehrer5b90c972015-12-26 00:52:58 -0600946 def test_indexing(self, backend):
947 cert = _load_cert(
948 os.path.join("x509", "cryptography.io.pem"),
949 x509.load_pem_x509_certificate,
950 backend
951 )
952 exts = cert.extensions
953 assert exts[-1] == exts[7]
954 assert len(exts[3:5]) == 2
955 assert exts[2:4][0] == exts[2]
956 assert exts[2:4][1] == exts[3]
957
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100958 def test_one_extension_get_for_class(self, backend):
959 cert = _load_cert(
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100960 os.path.join(
961 "x509", "custom", "basic_constraints_not_critical.pem"
962 ),
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100963 x509.load_pem_x509_certificate,
964 backend
965 )
966 ext = cert.extensions.get_extension_for_class(x509.BasicConstraints)
967 assert ext is not None
Phoebe Queen9fbb8892015-08-12 03:51:33 +0100968 assert isinstance(ext.value, x509.BasicConstraints)
Paul Kehrerfa56a232015-03-17 13:14:03 -0500969
Paul Kehrerafbe75b2015-10-20 08:08:43 -0500970 def test_repr(self, backend):
971 cert = _load_cert(
972 os.path.join(
973 "x509", "custom", "basic_constraints_not_critical.pem"
974 ),
975 x509.load_pem_x509_certificate,
976 backend
977 )
978 assert repr(cert.extensions) == (
979 "<Extensions([<Extension(oid=<ObjectIdentifier(oid=2.5.29.19, name"
980 "=basicConstraints)>, critical=False, value=<BasicConstraints(ca=F"
981 "alse, path_length=None)>)>])>"
982 )
983
Phoebe Queen2cc111a2015-08-12 04:14:22 +0100984
Paul Kehrerfa56a232015-03-17 13:14:03 -0500985@pytest.mark.requires_backend_interface(interface=RSABackend)
986@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerde813ea2015-03-28 12:44:34 -0500987class TestBasicConstraintsExtension(object):
Paul Kehrerfa56a232015-03-17 13:14:03 -0500988 def test_ca_true_pathlen_6(self, backend):
989 cert = _load_cert(
990 os.path.join(
991 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
992 ),
993 x509.load_der_x509_certificate,
994 backend
995 )
Phoebe Queen062dec72015-08-12 11:42:23 +0100996 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -0500997 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -0500998 )
999 assert ext is not None
1000 assert ext.critical is True
1001 assert ext.value.ca is True
1002 assert ext.value.path_length == 6
1003
1004 def test_path_length_zero(self, backend):
1005 cert = _load_cert(
1006 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1007 x509.load_pem_x509_certificate,
1008 backend
1009 )
1010 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001011 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001012 )
1013 assert ext is not None
1014 assert ext.critical is True
1015 assert ext.value.ca is True
1016 assert ext.value.path_length == 0
1017
1018 def test_ca_true_no_pathlen(self, backend):
1019 cert = _load_cert(
1020 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1021 x509.load_der_x509_certificate,
1022 backend
1023 )
1024 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001025 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001026 )
1027 assert ext is not None
1028 assert ext.critical is True
1029 assert ext.value.ca is True
1030 assert ext.value.path_length is None
1031
1032 def test_ca_false(self, backend):
1033 cert = _load_cert(
1034 os.path.join("x509", "cryptography.io.pem"),
1035 x509.load_pem_x509_certificate,
1036 backend
1037 )
1038 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001039 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001040 )
1041 assert ext is not None
1042 assert ext.critical is True
1043 assert ext.value.ca is False
1044 assert ext.value.path_length is None
1045
1046 def test_no_basic_constraints(self, backend):
1047 cert = _load_cert(
1048 os.path.join(
1049 "x509",
1050 "PKITS_data",
1051 "certs",
1052 "ValidCertificatePathTest1EE.crt"
1053 ),
1054 x509.load_der_x509_certificate,
1055 backend
1056 )
1057 with pytest.raises(x509.ExtensionNotFound):
Paul Kehrerd44e4132015-08-10 19:13:13 -05001058 cert.extensions.get_extension_for_oid(
1059 ExtensionOID.BASIC_CONSTRAINTS
1060 )
Paul Kehrerfa56a232015-03-17 13:14:03 -05001061
1062 def test_basic_constraint_not_critical(self, backend):
1063 cert = _load_cert(
1064 os.path.join(
1065 "x509", "custom", "basic_constraints_not_critical.pem"
1066 ),
1067 x509.load_pem_x509_certificate,
1068 backend
1069 )
1070 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001071 ExtensionOID.BASIC_CONSTRAINTS
Paul Kehrerfa56a232015-03-17 13:14:03 -05001072 )
1073 assert ext is not None
1074 assert ext.critical is False
1075 assert ext.value.ca is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001076
1077
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001078class TestSubjectKeyIdentifierExtension(object):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001079 @pytest.mark.requires_backend_interface(interface=RSABackend)
1080 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001081 def test_subject_key_identifier(self, backend):
1082 cert = _load_cert(
1083 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1084 x509.load_der_x509_certificate,
1085 backend
1086 )
1087 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001088 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001089 )
1090 ski = ext.value
1091 assert ext is not None
1092 assert ext.critical is False
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001093 assert ski.digest == binascii.unhexlify(
Paul Kehreree997262015-04-04 12:20:28 -05001094 b"580184241bbc2b52944a3da510721451f5af3ac9"
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001095 )
1096
Paul Kehrerf22f6122015-08-05 12:57:13 +01001097 @pytest.mark.requires_backend_interface(interface=RSABackend)
1098 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001099 def test_no_subject_key_identifier(self, backend):
1100 cert = _load_cert(
1101 os.path.join("x509", "custom", "bc_path_length_zero.pem"),
1102 x509.load_pem_x509_certificate,
1103 backend
1104 )
1105 with pytest.raises(x509.ExtensionNotFound):
1106 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001107 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrer1eb82a62015-03-31 20:00:33 -05001108 )
Paul Kehrer5508ee22015-04-02 19:31:03 -05001109
Paul Kehrerf22f6122015-08-05 12:57:13 +01001110 @pytest.mark.requires_backend_interface(interface=RSABackend)
1111 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001112 def test_from_rsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001113 cert = _load_cert(
1114 os.path.join("x509", "PKITS_data", "certs", "GoodCACert.crt"),
1115 x509.load_der_x509_certificate,
1116 backend
1117 )
1118 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001119 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001120 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001121 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001122 cert.public_key()
1123 )
1124 assert ext.value == ski
1125
1126 @pytest.mark.requires_backend_interface(interface=DSABackend)
1127 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001128 def test_from_dsa_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001129 cert = _load_cert(
1130 os.path.join("x509", "custom", "dsa_selfsigned_ca.pem"),
1131 x509.load_pem_x509_certificate,
1132 backend
1133 )
1134
1135 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001136 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001137 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001138 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001139 cert.public_key()
1140 )
1141 assert ext.value == ski
1142
1143 @pytest.mark.requires_backend_interface(interface=EllipticCurveBackend)
1144 @pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001145 def test_from_ec_public_key(self, backend):
Paul Kehrerf22f6122015-08-05 12:57:13 +01001146 _skip_curve_unsupported(backend, ec.SECP384R1())
1147 cert = _load_cert(
1148 os.path.join("x509", "ecdsa_root.pem"),
1149 x509.load_pem_x509_certificate,
1150 backend
1151 )
1152
1153 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001154 ExtensionOID.SUBJECT_KEY_IDENTIFIER
Paul Kehrerf22f6122015-08-05 12:57:13 +01001155 )
Paul Kehrerd4a7f062015-08-05 18:32:18 +01001156 ski = x509.SubjectKeyIdentifier.from_public_key(
Paul Kehrerf22f6122015-08-05 12:57:13 +01001157 cert.public_key()
1158 )
1159 assert ext.value == ski
1160
Paul Kehrer5508ee22015-04-02 19:31:03 -05001161
1162@pytest.mark.requires_backend_interface(interface=RSABackend)
1163@pytest.mark.requires_backend_interface(interface=X509Backend)
1164class TestKeyUsageExtension(object):
1165 def test_no_key_usage(self, backend):
1166 cert = _load_cert(
1167 os.path.join("x509", "verisign_md2_root.pem"),
1168 x509.load_pem_x509_certificate,
1169 backend
1170 )
1171 ext = cert.extensions
1172 with pytest.raises(x509.ExtensionNotFound) as exc:
Paul Kehrerd44e4132015-08-10 19:13:13 -05001173 ext.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001174
Paul Kehrerd44e4132015-08-10 19:13:13 -05001175 assert exc.value.oid == ExtensionOID.KEY_USAGE
Paul Kehrer5508ee22015-04-02 19:31:03 -05001176
1177 def test_all_purposes(self, backend):
1178 cert = _load_cert(
1179 os.path.join(
1180 "x509", "custom", "all_key_usages.pem"
1181 ),
1182 x509.load_pem_x509_certificate,
1183 backend
1184 )
1185 extensions = cert.extensions
Paul Kehrerd44e4132015-08-10 19:13:13 -05001186 ext = extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001187 assert ext is not None
1188
1189 ku = ext.value
1190 assert ku.digital_signature is True
1191 assert ku.content_commitment is True
1192 assert ku.key_encipherment is True
1193 assert ku.data_encipherment is True
1194 assert ku.key_agreement is True
1195 assert ku.key_cert_sign is True
1196 assert ku.crl_sign is True
1197 assert ku.encipher_only is True
1198 assert ku.decipher_only is True
1199
1200 def test_key_cert_sign_crl_sign(self, backend):
1201 cert = _load_cert(
1202 os.path.join(
1203 "x509", "PKITS_data", "certs", "pathLenConstraint6CACert.crt"
1204 ),
1205 x509.load_der_x509_certificate,
1206 backend
1207 )
Paul Kehrerd44e4132015-08-10 19:13:13 -05001208 ext = cert.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE)
Paul Kehrer5508ee22015-04-02 19:31:03 -05001209 assert ext is not None
1210 assert ext.critical is True
1211
1212 ku = ext.value
1213 assert ku.digital_signature is False
1214 assert ku.content_commitment is False
1215 assert ku.key_encipherment is False
1216 assert ku.data_encipherment is False
1217 assert ku.key_agreement is False
1218 assert ku.key_cert_sign is True
1219 assert ku.crl_sign is True
Paul Kehrer31bdf792015-03-25 14:11:00 -05001220
1221
1222@pytest.mark.parametrize(
1223 "name", [
1224 x509.RFC822Name,
1225 x509.DNSName,
1226 x509.UniformResourceIdentifier
1227 ]
1228)
1229class TestTextGeneralNames(object):
1230 def test_not_text(self, name):
1231 with pytest.raises(TypeError):
1232 name(b"notaunicodestring")
1233
1234 with pytest.raises(TypeError):
1235 name(1.3)
1236
1237 def test_repr(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301238 gn = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001239 assert repr(gn) == "<{0}(value=string)>".format(name.__name__)
1240
1241 def test_eq(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301242 gn = name(u"string")
1243 gn2 = name(u"string")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001244 assert gn == gn2
1245
1246 def test_ne(self, name):
Eeshan Gargf1234152015-04-29 18:41:00 +05301247 gn = name(u"string")
1248 gn2 = name(u"string2")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001249 assert gn != gn2
1250 assert gn != object()
1251
1252
1253class TestDirectoryName(object):
1254 def test_not_name(self):
1255 with pytest.raises(TypeError):
1256 x509.DirectoryName(b"notaname")
1257
1258 with pytest.raises(TypeError):
1259 x509.DirectoryName(1.3)
1260
1261 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001262 name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, u'value1')])
Paul Kehrer31bdf792015-03-25 14:11:00 -05001263 gn = x509.DirectoryName(x509.Name([name]))
Ian Cordascoa908d692015-06-16 21:35:24 -05001264 if six.PY3:
1265 assert repr(gn) == (
1266 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1267 "Identifier(oid=2.5.4.3, name=commonName)>, value='value1')>])"
1268 ">])>)>"
1269 )
1270 else:
1271 assert repr(gn) == (
1272 "<DirectoryName(value=<Name([<Name([<NameAttribute(oid=<Object"
1273 "Identifier(oid=2.5.4.3, name=commonName)>, value=u'value1')>]"
1274 ")>])>)>"
1275 )
Paul Kehrer31bdf792015-03-25 14:11:00 -05001276
1277 def test_eq(self):
1278 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001279 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001280 ])
1281 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001282 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001283 ])
1284 gn = x509.DirectoryName(x509.Name([name]))
1285 gn2 = x509.DirectoryName(x509.Name([name2]))
1286 assert gn == gn2
1287
1288 def test_ne(self):
1289 name = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001290 x509.NameAttribute(x509.ObjectIdentifier('2.999.1'), u'value1')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001291 ])
1292 name2 = x509.Name([
Nick Bastin6721fb82015-12-14 12:26:24 -08001293 x509.NameAttribute(x509.ObjectIdentifier('2.999.2'), u'value2')
Paul Kehrer31bdf792015-03-25 14:11:00 -05001294 ])
1295 gn = x509.DirectoryName(x509.Name([name]))
1296 gn2 = x509.DirectoryName(x509.Name([name2]))
1297 assert gn != gn2
1298 assert gn != object()
1299
1300
Paul Kehrer01d5d0b2015-07-12 09:41:21 -05001301class TestRFC822Name(object):
1302 def test_invalid_email(self):
1303 with pytest.raises(ValueError):
1304 x509.RFC822Name(u"Name <email>")
1305
1306 with pytest.raises(ValueError):
1307 x509.RFC822Name(u"")
1308
1309 def test_single_label(self):
1310 gn = x509.RFC822Name(u"administrator")
1311 assert gn.value == u"administrator"
1312
1313 def test_idna(self):
1314 gn = x509.RFC822Name(u"email@em\xe5\xefl.com")
1315 assert gn.value == u"email@em\xe5\xefl.com"
1316 assert gn._encoded == b"email@xn--eml-vla4c.com"
1317
1318
Paul Kehrere28d6c42015-07-12 14:59:37 -05001319class TestUniformResourceIdentifier(object):
1320 def test_no_parsed_hostname(self):
1321 gn = x509.UniformResourceIdentifier(u"singlelabel")
1322 assert gn.value == u"singlelabel"
1323
1324 def test_with_port(self):
1325 gn = x509.UniformResourceIdentifier(u"singlelabel:443/test")
1326 assert gn.value == u"singlelabel:443/test"
1327
1328 def test_idna_no_port(self):
1329 gn = x509.UniformResourceIdentifier(
1330 u"http://\u043f\u044b\u043a\u0430.cryptography"
1331 )
1332 assert gn.value == u"http://\u043f\u044b\u043a\u0430.cryptography"
1333 assert gn._encoded == b"http://xn--80ato2c.cryptography"
1334
1335 def test_idna_with_port(self):
1336 gn = x509.UniformResourceIdentifier(
1337 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1338 )
1339 assert gn.value == (
1340 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/some/path"
1341 )
1342 assert gn._encoded == b"gopher://xn--80ato2c.cryptography:70/some/path"
1343
1344 def test_query_and_fragment(self):
1345 gn = x509.UniformResourceIdentifier(
1346 u"ldap://cryptography:90/path?query=true#somedata"
1347 )
1348 assert gn.value == u"ldap://cryptography:90/path?query=true#somedata"
1349
1350
Paul Kehrer31bdf792015-03-25 14:11:00 -05001351class TestRegisteredID(object):
1352 def test_not_oid(self):
1353 with pytest.raises(TypeError):
1354 x509.RegisteredID(b"notanoid")
1355
1356 with pytest.raises(TypeError):
1357 x509.RegisteredID(1.3)
1358
1359 def test_repr(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001360 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001361 assert repr(gn) == (
1362 "<RegisteredID(value=<ObjectIdentifier(oid=2.5.4.3, name=commonNam"
1363 "e)>)>"
1364 )
1365
1366 def test_eq(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001367 gn = x509.RegisteredID(NameOID.COMMON_NAME)
1368 gn2 = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001369 assert gn == gn2
1370
1371 def test_ne(self):
Paul Kehrereba19e62015-08-10 18:44:24 -05001372 gn = x509.RegisteredID(NameOID.COMMON_NAME)
Paul Kehrerd44e4132015-08-10 19:13:13 -05001373 gn2 = x509.RegisteredID(ExtensionOID.BASIC_CONSTRAINTS)
Paul Kehrer31bdf792015-03-25 14:11:00 -05001374 assert gn != gn2
1375 assert gn != object()
1376
1377
1378class TestIPAddress(object):
1379 def test_not_ipaddress(self):
1380 with pytest.raises(TypeError):
1381 x509.IPAddress(b"notanipaddress")
1382
1383 with pytest.raises(TypeError):
1384 x509.IPAddress(1.3)
1385
1386 def test_repr(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301387 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001388 assert repr(gn) == "<IPAddress(value=127.0.0.1)>"
1389
Eeshan Gargf1234152015-04-29 18:41:00 +05301390 gn2 = x509.IPAddress(ipaddress.IPv6Address(u"ff::"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001391 assert repr(gn2) == "<IPAddress(value=ff::)>"
1392
Paul Kehrereb177932015-05-17 18:33:33 -07001393 gn3 = x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24"))
1394 assert repr(gn3) == "<IPAddress(value=192.168.0.0/24)>"
1395
1396 gn4 = x509.IPAddress(ipaddress.IPv6Network(u"ff::/96"))
1397 assert repr(gn4) == "<IPAddress(value=ff::/96)>"
1398
Paul Kehrer31bdf792015-03-25 14:11:00 -05001399 def test_eq(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301400 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1401 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001402 assert gn == gn2
1403
1404 def test_ne(self):
Eeshan Gargf1234152015-04-29 18:41:00 +05301405 gn = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
1406 gn2 = x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.2"))
Paul Kehrer31bdf792015-03-25 14:11:00 -05001407 assert gn != gn2
1408 assert gn != object()
1409
1410
Joshua Tauberer18b6fc82015-07-05 21:44:51 +00001411class TestOtherName(object):
1412 def test_invalid_args(self):
1413 with pytest.raises(TypeError):
1414 x509.OtherName(b"notanobjectidentifier", b"derdata")
1415
1416 with pytest.raises(TypeError):
1417 x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), u"notderdata")
1418
1419 def test_repr(self):
1420 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1421 if six.PY3:
1422 assert repr(gn) == (
1423 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1424 "name=Unknown OID)>, value=b'derdata')>"
1425 )
1426 else:
1427 assert repr(gn) == (
1428 "<OtherName(type_id=<ObjectIdentifier(oid=1.2.3.4, "
1429 "name=Unknown OID)>, value='derdata')>"
1430 )
1431
1432 gn = x509.OtherName(x509.ObjectIdentifier("2.5.4.65"), b"derdata")
1433 if six.PY3:
1434 assert repr(gn) == (
1435 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1436 "name=pseudonym)>, value=b'derdata')>"
1437 )
1438 else:
1439 assert repr(gn) == (
1440 "<OtherName(type_id=<ObjectIdentifier(oid=2.5.4.65, "
1441 "name=pseudonym)>, value='derdata')>"
1442 )
1443
1444 def test_eq(self):
1445 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1446 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1447 assert gn == gn2
1448
1449 def test_ne(self):
1450 gn = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata")
1451 assert gn != object()
1452
1453 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"), b"derdata2")
1454 assert gn != gn2
1455
1456 gn2 = x509.OtherName(x509.ObjectIdentifier("1.2.3.5"), b"derdata")
1457 assert gn != gn2
1458
1459
Erik Trauschke2dcce902015-05-14 16:12:24 -07001460class TestGeneralNames(object):
1461 def test_get_values_for_type(self):
1462 gns = x509.GeneralNames(
1463 [x509.DNSName(u"cryptography.io")]
1464 )
1465 names = gns.get_values_for_type(x509.DNSName)
1466 assert names == [u"cryptography.io"]
1467
1468 def test_iter_names(self):
1469 gns = x509.GeneralNames([
1470 x509.DNSName(u"cryptography.io"),
1471 x509.DNSName(u"crypto.local"),
1472 ])
1473 assert len(gns) == 2
1474 assert list(gns) == [
1475 x509.DNSName(u"cryptography.io"),
1476 x509.DNSName(u"crypto.local"),
1477 ]
1478
1479 def test_invalid_general_names(self):
1480 with pytest.raises(TypeError):
1481 x509.GeneralNames(
1482 [x509.DNSName(u"cryptography.io"), "invalid"]
1483 )
1484
1485 def test_repr(self):
1486 gns = x509.GeneralNames(
1487 [
1488 x509.DNSName(u"cryptography.io")
1489 ]
1490 )
1491 assert repr(gns) == (
1492 "<GeneralNames([<DNSName(value=cryptography.io)>])>"
1493 )
1494
1495 def test_eq(self):
1496 gns = x509.GeneralNames(
1497 [x509.DNSName(u"cryptography.io")]
1498 )
1499 gns2 = x509.GeneralNames(
1500 [x509.DNSName(u"cryptography.io")]
1501 )
1502 assert gns == gns2
1503
1504 def test_ne(self):
1505 gns = x509.GeneralNames(
1506 [x509.DNSName(u"cryptography.io")]
1507 )
1508 gns2 = x509.GeneralNames(
1509 [x509.RFC822Name(u"admin@cryptography.io")]
1510 )
1511 assert gns != gns2
1512 assert gns != object()
1513
1514
Paul Kehrer99125c92015-06-07 18:37:10 -05001515class TestIssuerAlternativeName(object):
1516 def test_get_values_for_type(self):
1517 san = x509.IssuerAlternativeName(
1518 [x509.DNSName(u"cryptography.io")]
1519 )
1520 names = san.get_values_for_type(x509.DNSName)
1521 assert names == [u"cryptography.io"]
1522
1523 def test_iter_names(self):
1524 san = x509.IssuerAlternativeName([
1525 x509.DNSName(u"cryptography.io"),
1526 x509.DNSName(u"crypto.local"),
1527 ])
1528 assert len(san) == 2
1529 assert list(san) == [
1530 x509.DNSName(u"cryptography.io"),
1531 x509.DNSName(u"crypto.local"),
1532 ]
1533
1534 def test_invalid_general_names(self):
1535 with pytest.raises(TypeError):
1536 x509.IssuerAlternativeName(
1537 [x509.DNSName(u"cryptography.io"), "invalid"]
1538 )
1539
1540 def test_repr(self):
1541 san = x509.IssuerAlternativeName(
1542 [
1543 x509.DNSName(u"cryptography.io")
1544 ]
1545 )
1546 assert repr(san) == (
1547 "<IssuerAlternativeName("
1548 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
1549 )
1550
1551 def test_eq(self):
1552 san = x509.IssuerAlternativeName(
1553 [x509.DNSName(u"cryptography.io")]
1554 )
1555 san2 = x509.IssuerAlternativeName(
1556 [x509.DNSName(u"cryptography.io")]
1557 )
1558 assert san == san2
1559
1560 def test_ne(self):
1561 san = x509.IssuerAlternativeName(
1562 [x509.DNSName(u"cryptography.io")]
1563 )
1564 san2 = x509.IssuerAlternativeName(
1565 [x509.RFC822Name(u"admin@cryptography.io")]
1566 )
1567 assert san != san2
1568 assert san != object()
1569
1570
Alex Gaynorf1c17672015-06-20 14:20:20 -04001571@pytest.mark.requires_backend_interface(interface=RSABackend)
1572@pytest.mark.requires_backend_interface(interface=X509Backend)
1573class TestRSAIssuerAlternativeNameExtension(object):
1574 def test_uri(self, backend):
1575 cert = _load_cert(
1576 os.path.join("x509", "custom", "ian_uri.pem"),
1577 x509.load_pem_x509_certificate,
1578 backend,
1579 )
1580 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001581 ExtensionOID.ISSUER_ALTERNATIVE_NAME
Alex Gaynorf1c17672015-06-20 14:20:20 -04001582 )
1583 assert list(ext.value) == [
1584 x509.UniformResourceIdentifier(u"http://path.to.root/root.crt"),
1585 ]
1586
1587
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001588class TestCRLNumber(object):
1589 def test_eq(self):
1590 crl_number = x509.CRLNumber(15)
1591 assert crl_number == x509.CRLNumber(15)
1592
1593 def test_ne(self):
1594 crl_number = x509.CRLNumber(15)
1595 assert crl_number != x509.CRLNumber(14)
1596 assert crl_number != object()
1597
1598 def test_repr(self):
1599 crl_number = x509.CRLNumber(15)
1600 assert repr(crl_number) == "<CRLNumber(15)>"
1601
Paul Kehrera9718fc2015-12-22 22:55:35 -06001602 def test_invalid_number(self):
1603 with pytest.raises(TypeError):
1604 x509.CRLNumber("notanumber")
1605
Paul Kehrer3b95cd72015-12-22 21:40:20 -06001606
Paul Kehrer31bdf792015-03-25 14:11:00 -05001607class TestSubjectAlternativeName(object):
1608 def test_get_values_for_type(self):
1609 san = x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301610 [x509.DNSName(u"cryptography.io")]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001611 )
1612 names = san.get_values_for_type(x509.DNSName)
Eeshan Gargf1234152015-04-29 18:41:00 +05301613 assert names == [u"cryptography.io"]
Paul Kehrer31bdf792015-03-25 14:11:00 -05001614
1615 def test_iter_names(self):
1616 san = x509.SubjectAlternativeName([
Eeshan Gargf1234152015-04-29 18:41:00 +05301617 x509.DNSName(u"cryptography.io"),
1618 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001619 ])
1620 assert len(san) == 2
1621 assert list(san) == [
Eeshan Gargf1234152015-04-29 18:41:00 +05301622 x509.DNSName(u"cryptography.io"),
1623 x509.DNSName(u"crypto.local"),
Paul Kehrer31bdf792015-03-25 14:11:00 -05001624 ]
1625
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001626 def test_invalid_general_names(self):
1627 with pytest.raises(TypeError):
1628 x509.SubjectAlternativeName(
Eeshan Gargf1234152015-04-29 18:41:00 +05301629 [x509.DNSName(u"cryptography.io"), "invalid"]
Paul Kehrerd04b39b2015-04-21 08:44:17 -05001630 )
1631
Paul Kehrer31bdf792015-03-25 14:11:00 -05001632 def test_repr(self):
1633 san = x509.SubjectAlternativeName(
1634 [
Eeshan Gargf1234152015-04-29 18:41:00 +05301635 x509.DNSName(u"cryptography.io")
Paul Kehrer31bdf792015-03-25 14:11:00 -05001636 ]
1637 )
1638 assert repr(san) == (
Erik Trauschke2dcce902015-05-14 16:12:24 -07001639 "<SubjectAlternativeName("
1640 "<GeneralNames([<DNSName(value=cryptography.io)>])>)>"
Paul Kehrer31bdf792015-03-25 14:11:00 -05001641 )
Paul Kehrer40f83382015-04-20 15:00:16 -05001642
Paul Kehrer58cc3972015-05-13 10:00:41 -05001643 def test_eq(self):
1644 san = x509.SubjectAlternativeName(
1645 [x509.DNSName(u"cryptography.io")]
1646 )
1647 san2 = x509.SubjectAlternativeName(
1648 [x509.DNSName(u"cryptography.io")]
1649 )
1650 assert san == san2
1651
1652 def test_ne(self):
1653 san = x509.SubjectAlternativeName(
1654 [x509.DNSName(u"cryptography.io")]
1655 )
1656 san2 = x509.SubjectAlternativeName(
1657 [x509.RFC822Name(u"admin@cryptography.io")]
1658 )
1659 assert san != san2
1660 assert san != object()
1661
Paul Kehrer40f83382015-04-20 15:00:16 -05001662
1663@pytest.mark.requires_backend_interface(interface=RSABackend)
1664@pytest.mark.requires_backend_interface(interface=X509Backend)
1665class TestRSASubjectAlternativeNameExtension(object):
1666 def test_dns_name(self, backend):
1667 cert = _load_cert(
1668 os.path.join("x509", "cryptography.io.pem"),
1669 x509.load_pem_x509_certificate,
1670 backend
1671 )
1672 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001673 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer40f83382015-04-20 15:00:16 -05001674 )
1675 assert ext is not None
1676 assert ext.critical is False
1677
1678 san = ext.value
1679
1680 dns = san.get_values_for_type(x509.DNSName)
1681 assert dns == [u"www.cryptography.io", u"cryptography.io"]
Paul Kehrer9089c912015-04-20 22:15:20 -05001682
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001683 def test_wildcard_dns_name(self, backend):
1684 cert = _load_cert(
1685 os.path.join("x509", "wildcard_san.pem"),
1686 x509.load_pem_x509_certificate,
1687 backend
1688 )
1689 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001690 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001691 )
1692
1693 dns = ext.value.get_values_for_type(x509.DNSName)
1694 assert dns == [
1695 u'*.langui.sh',
1696 u'langui.sh',
1697 u'*.saseliminator.com',
1698 u'saseliminator.com'
1699 ]
1700
Dominic Chen87bb9572015-10-09 00:23:07 -04001701 def test_san_empty_hostname(self, backend):
1702 cert = _load_cert(
1703 os.path.join(
1704 "x509", "custom", "san_empty_hostname.pem"
1705 ),
1706 x509.load_pem_x509_certificate,
1707 backend
1708 )
1709 san = cert.extensions.get_extension_for_oid(
1710 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
1711 )
1712
1713 dns = san.value.get_values_for_type(x509.DNSName)
1714 assert dns == [u'']
1715
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001716 def test_san_wildcard_idna_dns_name(self, backend):
1717 cert = _load_cert(
1718 os.path.join("x509", "custom", "san_wildcard_idna.pem"),
1719 x509.load_pem_x509_certificate,
1720 backend
1721 )
1722 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001723 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer3c6bba52015-06-26 18:43:26 -05001724 )
1725
1726 dns = ext.value.get_values_for_type(x509.DNSName)
1727 assert dns == [u'*.\u043f\u044b\u043a\u0430.cryptography']
1728
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001729 def test_unsupported_gn(self, backend):
Paul Kehrer9089c912015-04-20 22:15:20 -05001730 cert = _load_cert(
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001731 os.path.join("x509", "san_x400address.der"),
1732 x509.load_der_x509_certificate,
Paul Kehrer9089c912015-04-20 22:15:20 -05001733 backend
1734 )
Paul Kehrerbed07352015-04-21 08:31:10 -05001735 with pytest.raises(x509.UnsupportedGeneralNameType) as exc:
Paul Kehrer9089c912015-04-20 22:15:20 -05001736 cert.extensions
Paul Kehrerbed07352015-04-21 08:31:10 -05001737
Paul Kehrer7bdf6572015-07-05 08:55:44 -05001738 assert exc.value.type == 3
Paul Kehrer4db96622015-04-20 22:17:39 -05001739
1740 def test_registered_id(self, backend):
1741 cert = _load_cert(
1742 os.path.join(
1743 "x509", "custom", "san_registered_id.pem"
1744 ),
1745 x509.load_pem_x509_certificate,
1746 backend
1747 )
1748 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001749 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer4db96622015-04-20 22:17:39 -05001750 )
1751 assert ext is not None
1752 assert ext.critical is False
1753
1754 san = ext.value
1755 rid = san.get_values_for_type(x509.RegisteredID)
1756 assert rid == [x509.ObjectIdentifier("1.2.3.4")]
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001757
1758 def test_uri(self, backend):
1759 cert = _load_cert(
1760 os.path.join(
1761 "x509", "custom", "san_uri_with_port.pem"
1762 ),
1763 x509.load_pem_x509_certificate,
1764 backend
1765 )
1766 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001767 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrerb8ef82e2015-04-22 16:04:24 -05001768 )
1769 assert ext is not None
1770 uri = ext.value.get_values_for_type(
1771 x509.UniformResourceIdentifier
1772 )
1773 assert uri == [
1774 u"gopher://\u043f\u044b\u043a\u0430.cryptography:70/path?q=s#hel"
1775 u"lo",
1776 u"http://someregulardomain.com",
1777 ]
Paul Kehrera5f030c2015-04-28 08:33:18 -05001778
1779 def test_ipaddress(self, backend):
1780 cert = _load_cert(
1781 os.path.join(
1782 "x509", "custom", "san_ipaddr.pem"
1783 ),
1784 x509.load_pem_x509_certificate,
1785 backend
1786 )
1787 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001788 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrera5f030c2015-04-28 08:33:18 -05001789 )
1790 assert ext is not None
1791 assert ext.critical is False
1792
1793 san = ext.value
1794
1795 ip = san.get_values_for_type(x509.IPAddress)
1796 assert [
1797 ipaddress.ip_address(u"127.0.0.1"),
1798 ipaddress.ip_address(u"ff::")
1799 ] == ip
Paul Kehrer2187a052015-04-30 08:22:07 -05001800
1801 def test_dirname(self, backend):
1802 cert = _load_cert(
1803 os.path.join(
1804 "x509", "custom", "san_dirname.pem"
1805 ),
1806 x509.load_pem_x509_certificate,
1807 backend
1808 )
1809 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001810 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrer2187a052015-04-30 08:22:07 -05001811 )
1812 assert ext is not None
1813 assert ext.critical is False
1814
1815 san = ext.value
1816
1817 dirname = san.get_values_for_type(x509.DirectoryName)
1818 assert [
1819 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001820 x509.NameAttribute(NameOID.COMMON_NAME, u'test'),
1821 x509.NameAttribute(NameOID.ORGANIZATION_NAME, u'Org'),
1822 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u'Texas'),
Paul Kehrer2187a052015-04-30 08:22:07 -05001823 ])
1824 ] == dirname
Paul Kehrere06cab42015-04-30 10:23:33 -05001825
1826 def test_rfc822name(self, backend):
1827 cert = _load_cert(
1828 os.path.join(
1829 "x509", "custom", "san_rfc822_idna.pem"
1830 ),
1831 x509.load_pem_x509_certificate,
1832 backend
1833 )
1834 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001835 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001836 )
1837 assert ext is not None
1838 assert ext.critical is False
1839
1840 san = ext.value
1841
1842 rfc822name = san.get_values_for_type(x509.RFC822Name)
1843 assert [u"email@em\xe5\xefl.com"] == rfc822name
1844
Paul Kehrerb8968812015-05-15 09:01:34 -07001845 def test_idna2003_invalid(self, backend):
1846 cert = _load_cert(
1847 os.path.join(
1848 "x509", "custom", "san_idna2003_dnsname.pem"
1849 ),
1850 x509.load_pem_x509_certificate,
1851 backend
1852 )
1853 with pytest.raises(UnicodeError):
1854 cert.extensions
1855
Paul Kehrere06cab42015-04-30 10:23:33 -05001856 def test_unicode_rfc822_name_dns_name_uri(self, backend):
1857 cert = _load_cert(
1858 os.path.join(
1859 "x509", "custom", "san_idna_names.pem"
1860 ),
1861 x509.load_pem_x509_certificate,
1862 backend
1863 )
1864 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001865 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001866 )
1867 assert ext is not None
1868 rfc822_name = ext.value.get_values_for_type(x509.RFC822Name)
1869 dns_name = ext.value.get_values_for_type(x509.DNSName)
1870 uri = ext.value.get_values_for_type(x509.UniformResourceIdentifier)
1871 assert rfc822_name == [u"email@\u043f\u044b\u043a\u0430.cryptography"]
1872 assert dns_name == [u"\u043f\u044b\u043a\u0430.cryptography"]
1873 assert uri == [u"https://www.\u043f\u044b\u043a\u0430.cryptography"]
1874
1875 def test_rfc822name_dnsname_ipaddress_directoryname_uri(self, backend):
1876 cert = _load_cert(
1877 os.path.join(
1878 "x509", "custom", "san_email_dns_ip_dirname_uri.pem"
1879 ),
1880 x509.load_pem_x509_certificate,
1881 backend
1882 )
1883 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001884 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Paul Kehrere06cab42015-04-30 10:23:33 -05001885 )
1886 assert ext is not None
1887 assert ext.critical is False
1888
1889 san = ext.value
1890
1891 rfc822_name = san.get_values_for_type(x509.RFC822Name)
1892 uri = san.get_values_for_type(x509.UniformResourceIdentifier)
1893 dns = san.get_values_for_type(x509.DNSName)
1894 ip = san.get_values_for_type(x509.IPAddress)
1895 dirname = san.get_values_for_type(x509.DirectoryName)
1896 assert [u"user@cryptography.io"] == rfc822_name
Paul Kehrere3a330c2015-05-02 16:42:52 -05001897 assert [u"https://cryptography.io"] == uri
Paul Kehrere06cab42015-04-30 10:23:33 -05001898 assert [u"cryptography.io"] == dns
1899 assert [
1900 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05001901 x509.NameAttribute(NameOID.COMMON_NAME, u'dirCN'),
Paul Kehrere06cab42015-04-30 10:23:33 -05001902 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05001903 NameOID.ORGANIZATION_NAME, u'Cryptographic Authority'
Paul Kehrere06cab42015-04-30 10:23:33 -05001904 ),
1905 ])
1906 ] == dirname
1907 assert [
1908 ipaddress.ip_address(u"127.0.0.1"),
1909 ipaddress.ip_address(u"ff::")
1910 ] == ip
1911
1912 def test_invalid_rfc822name(self, backend):
1913 cert = _load_cert(
1914 os.path.join(
1915 "x509", "custom", "san_rfc822_names.pem"
1916 ),
1917 x509.load_pem_x509_certificate,
1918 backend
1919 )
1920 with pytest.raises(ValueError) as exc:
1921 cert.extensions
1922
1923 assert 'Invalid rfc822name value' in str(exc.value)
Paul Kehrer94c69602015-05-02 19:29:40 -05001924
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001925 def test_other_name(self, backend):
1926 cert = _load_cert(
1927 os.path.join(
1928 "x509", "custom", "san_other_name.pem"
1929 ),
1930 x509.load_pem_x509_certificate,
1931 backend
1932 )
1933
1934 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001935 ExtensionOID.SUBJECT_ALTERNATIVE_NAME
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001936 )
1937 assert ext is not None
1938 assert ext.critical is False
1939
Joshua Taubererd2afad32015-07-06 22:37:53 +00001940 expected = x509.OtherName(x509.ObjectIdentifier("1.2.3.4"),
1941 b'\x16\x0bHello World')
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001942 assert len(ext.value) == 1
Joshua Taubererd2afad32015-07-06 22:37:53 +00001943 assert list(ext.value)[0] == expected
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001944
1945 othernames = ext.value.get_values_for_type(x509.OtherName)
Joshua Taubererd2afad32015-07-06 22:37:53 +00001946 assert othernames == [expected]
Joshua Tauberer2ee5e3c2015-07-04 20:09:46 +00001947
Paul Kehrer94c69602015-05-02 19:29:40 -05001948
1949@pytest.mark.requires_backend_interface(interface=RSABackend)
1950@pytest.mark.requires_backend_interface(interface=X509Backend)
1951class TestExtendedKeyUsageExtension(object):
1952 def test_eku(self, backend):
1953 cert = _load_cert(
1954 os.path.join(
1955 "x509", "custom", "extended_key_usage.pem"
1956 ),
1957 x509.load_pem_x509_certificate,
1958 backend
1959 )
1960 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05001961 ExtensionOID.EXTENDED_KEY_USAGE
Paul Kehrer94c69602015-05-02 19:29:40 -05001962 )
1963 assert ext is not None
1964 assert ext.critical is False
1965
1966 assert [
1967 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.1"),
1968 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.2"),
1969 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.3"),
1970 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.4"),
1971 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.9"),
1972 x509.ObjectIdentifier("1.3.6.1.5.5.7.3.8"),
1973 x509.ObjectIdentifier("2.5.29.37.0"),
1974 x509.ObjectIdentifier("2.16.840.1.113730.4.1"),
1975 ] == list(ext.value)
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001976
1977
1978class TestAccessDescription(object):
1979 def test_invalid_access_method(self):
Nick Bastind06763d2015-12-12 18:32:59 -08001980 with pytest.raises(TypeError):
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001981 x509.AccessDescription("notanoid", x509.DNSName(u"test"))
1982
1983 def test_invalid_access_location(self):
1984 with pytest.raises(TypeError):
Paul Kehrer9e102db2015-08-10 21:53:09 -05001985 x509.AccessDescription(
1986 AuthorityInformationAccessOID.CA_ISSUERS, "invalid"
1987 )
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001988
Nick Bastind2ecf862015-12-13 05:44:46 -08001989 def test_valid_nonstandard_method(self):
Nick Bastin326fc8e2015-12-12 19:08:12 -08001990 ad = x509.AccessDescription(
1991 ObjectIdentifier("2.999.1"),
1992 x509.UniformResourceIdentifier(u"http://example.com")
1993 )
Nick Bastin11f0f8a2015-12-12 18:54:12 -08001994 assert ad is not None
1995
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001996 def test_repr(self):
1997 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05001998 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05001999 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2000 )
2001 assert repr(ad) == (
2002 "<AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5."
2003 "5.7.48.1, name=OCSP)>, access_location=<UniformResourceIdentifier"
2004 "(value=http://ocsp.domain.com)>)>"
2005 )
2006
2007 def test_eq(self):
2008 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002009 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002010 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2011 )
2012 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002013 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002014 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2015 )
2016 assert ad == ad2
2017
2018 def test_ne(self):
2019 ad = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002020 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002021 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2022 )
2023 ad2 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002024 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002025 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2026 )
2027 ad3 = x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002028 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002029 x509.UniformResourceIdentifier(u"http://notthesame")
2030 )
2031 assert ad != ad2
2032 assert ad != ad3
2033 assert ad != object()
2034
2035
2036class TestAuthorityInformationAccess(object):
2037 def test_invalid_descriptions(self):
2038 with pytest.raises(TypeError):
2039 x509.AuthorityInformationAccess(["notanAccessDescription"])
2040
2041 def test_iter_len(self):
2042 aia = x509.AuthorityInformationAccess([
2043 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002044 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002045 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2046 ),
2047 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002048 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002049 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2050 )
2051 ])
2052 assert len(aia) == 2
2053 assert list(aia) == [
2054 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002055 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002056 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2057 ),
2058 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002059 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002060 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2061 )
2062 ]
2063
2064 def test_repr(self):
2065 aia = x509.AuthorityInformationAccess([
2066 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002067 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002068 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2069 ),
2070 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002071 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002072 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2073 )
2074 ])
2075 assert repr(aia) == (
2076 "<AuthorityInformationAccess([<AccessDescription(access_method=<Ob"
2077 "jectIdentifier(oid=1.3.6.1.5.5.7.48.1, name=OCSP)>, access_locati"
2078 "on=<UniformResourceIdentifier(value=http://ocsp.domain.com)>)>, <"
2079 "AccessDescription(access_method=<ObjectIdentifier(oid=1.3.6.1.5.5"
2080 ".7.48.2, name=caIssuers)>, access_location=<UniformResourceIdenti"
2081 "fier(value=http://domain.com/ca.crt)>)>])>"
2082 )
2083
2084 def test_eq(self):
2085 aia = x509.AuthorityInformationAccess([
2086 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002087 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002088 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2089 ),
2090 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002091 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002092 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2093 )
2094 ])
2095 aia2 = x509.AuthorityInformationAccess([
2096 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002097 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002098 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2099 ),
2100 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002101 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002102 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2103 )
2104 ])
2105 assert aia == aia2
2106
2107 def test_ne(self):
2108 aia = x509.AuthorityInformationAccess([
2109 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002110 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002111 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2112 ),
2113 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002114 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002115 x509.UniformResourceIdentifier(u"http://domain.com/ca.crt")
2116 )
2117 ])
2118 aia2 = x509.AuthorityInformationAccess([
2119 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002120 AuthorityInformationAccessOID.OCSP,
Paul Kehrer3e6d5582015-05-02 21:57:56 -05002121 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2122 ),
2123 ])
2124
2125 assert aia != aia2
2126 assert aia != object()
Paul Kehrerd774de92015-05-03 10:52:25 -05002127
2128
2129@pytest.mark.requires_backend_interface(interface=RSABackend)
2130@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrera1476992015-05-04 17:35:47 -05002131class TestAuthorityInformationAccessExtension(object):
2132 def test_aia_ocsp_ca_issuers(self, backend):
2133 cert = _load_cert(
2134 os.path.join("x509", "cryptography.io.pem"),
2135 x509.load_pem_x509_certificate,
2136 backend
2137 )
2138 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002139 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002140 )
2141 assert ext is not None
2142 assert ext.critical is False
2143
2144 assert ext.value == x509.AuthorityInformationAccess([
2145 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002146 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002147 x509.UniformResourceIdentifier(u"http://gv.symcd.com")
2148 ),
2149 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002150 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002151 x509.UniformResourceIdentifier(u"http://gv.symcb.com/gv.crt")
2152 ),
2153 ])
2154
2155 def test_aia_multiple_ocsp_ca_issuers(self, backend):
2156 cert = _load_cert(
2157 os.path.join("x509", "custom", "aia_ocsp_ca_issuers.pem"),
2158 x509.load_pem_x509_certificate,
2159 backend
2160 )
2161 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002162 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002163 )
2164 assert ext is not None
2165 assert ext.critical is False
2166
2167 assert ext.value == x509.AuthorityInformationAccess([
2168 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002169 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002170 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2171 ),
2172 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002173 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002174 x509.UniformResourceIdentifier(u"http://ocsp2.domain.com")
2175 ),
2176 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002177 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002178 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002179 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2180 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002181 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002182 ]))
2183 ),
2184 ])
2185
2186 def test_aia_ocsp_only(self, backend):
2187 cert = _load_cert(
2188 os.path.join("x509", "custom", "aia_ocsp.pem"),
2189 x509.load_pem_x509_certificate,
2190 backend
2191 )
2192 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002193 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002194 )
2195 assert ext is not None
2196 assert ext.critical is False
2197
2198 assert ext.value == x509.AuthorityInformationAccess([
2199 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002200 AuthorityInformationAccessOID.OCSP,
Paul Kehrera1476992015-05-04 17:35:47 -05002201 x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
2202 ),
2203 ])
2204
2205 def test_aia_ca_issuers_only(self, backend):
2206 cert = _load_cert(
2207 os.path.join("x509", "custom", "aia_ca_issuers.pem"),
2208 x509.load_pem_x509_certificate,
2209 backend
2210 )
2211 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002212 ExtensionOID.AUTHORITY_INFORMATION_ACCESS
Paul Kehrera1476992015-05-04 17:35:47 -05002213 )
2214 assert ext is not None
2215 assert ext.critical is False
2216
2217 assert ext.value == x509.AuthorityInformationAccess([
2218 x509.AccessDescription(
Paul Kehrer9e102db2015-08-10 21:53:09 -05002219 AuthorityInformationAccessOID.CA_ISSUERS,
Paul Kehrera1476992015-05-04 17:35:47 -05002220 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002221 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN"),
2222 x509.NameAttribute(NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002223 u"some Org"),
Paul Kehrera1476992015-05-04 17:35:47 -05002224 ]))
2225 ),
2226 ])
2227
2228
2229@pytest.mark.requires_backend_interface(interface=RSABackend)
2230@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrerd774de92015-05-03 10:52:25 -05002231class TestAuthorityKeyIdentifierExtension(object):
2232 def test_aki_keyid(self, backend):
2233 cert = _load_cert(
2234 os.path.join(
2235 "x509", "cryptography.io.pem"
2236 ),
2237 x509.load_pem_x509_certificate,
2238 backend
2239 )
2240 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002241 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002242 )
2243 assert ext is not None
2244 assert ext.critical is False
2245
2246 assert ext.value.key_identifier == (
2247 b"\xc3\x9c\xf3\xfc\xd3F\x084\xbb\xceF\x7f\xa0|[\xf3\xe2\x08\xcbY"
2248 )
2249 assert ext.value.authority_cert_issuer is None
2250 assert ext.value.authority_cert_serial_number is None
2251
2252 def test_aki_all_fields(self, backend):
2253 cert = _load_cert(
2254 os.path.join(
2255 "x509", "custom", "authority_key_identifier.pem"
2256 ),
2257 x509.load_pem_x509_certificate,
2258 backend
2259 )
2260 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002261 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002262 )
2263 assert ext is not None
2264 assert ext.critical is False
2265
2266 assert ext.value.key_identifier == (
2267 b"9E>\xca=b\x1d\xea\x86I\xf6Z\xab@\xb7\xa4p\x98\xf1\xec"
2268 )
2269 assert ext.value.authority_cert_issuer == [
2270 x509.DirectoryName(
2271 x509.Name([
2272 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002273 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002274 ),
2275 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002276 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002277 )
2278 ])
2279 )
2280 ]
2281 assert ext.value.authority_cert_serial_number == 3
2282
2283 def test_aki_no_keyid(self, backend):
2284 cert = _load_cert(
2285 os.path.join(
2286 "x509", "custom", "authority_key_identifier_no_keyid.pem"
2287 ),
2288 x509.load_pem_x509_certificate,
2289 backend
2290 )
2291 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002292 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrerd774de92015-05-03 10:52:25 -05002293 )
2294 assert ext is not None
2295 assert ext.critical is False
2296
2297 assert ext.value.key_identifier is None
2298 assert ext.value.authority_cert_issuer == [
2299 x509.DirectoryName(
2300 x509.Name([
2301 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002302 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrerd774de92015-05-03 10:52:25 -05002303 ),
2304 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002305 NameOID.COMMON_NAME, u"cryptography.io"
Paul Kehrerd774de92015-05-03 10:52:25 -05002306 )
2307 ])
2308 )
2309 ]
2310 assert ext.value.authority_cert_serial_number == 3
Paul Kehrer5a485522015-05-06 00:29:12 -05002311
Paul Kehrer253929a2015-08-05 17:30:39 +01002312 def test_from_certificate(self, backend):
2313 issuer_cert = _load_cert(
2314 os.path.join("x509", "rapidssl_sha256_ca_g3.pem"),
2315 x509.load_pem_x509_certificate,
2316 backend
2317 )
2318 cert = _load_cert(
2319 os.path.join("x509", "cryptography.io.pem"),
2320 x509.load_pem_x509_certificate,
2321 backend
2322 )
2323 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002324 ExtensionOID.AUTHORITY_KEY_IDENTIFIER
Paul Kehrer253929a2015-08-05 17:30:39 +01002325 )
2326 aki = x509.AuthorityKeyIdentifier.from_issuer_public_key(
2327 issuer_cert.public_key()
2328 )
2329 assert ext.value == aki
2330
Paul Kehrer5a485522015-05-06 00:29:12 -05002331
Paul Kehrere0017be2015-05-17 20:39:40 -06002332class TestNameConstraints(object):
2333 def test_ipaddress_wrong_type(self):
2334 with pytest.raises(TypeError):
2335 x509.NameConstraints(
2336 permitted_subtrees=[
2337 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2338 ],
2339 excluded_subtrees=None
2340 )
2341
2342 with pytest.raises(TypeError):
2343 x509.NameConstraints(
2344 permitted_subtrees=None,
2345 excluded_subtrees=[
2346 x509.IPAddress(ipaddress.IPv4Address(u"127.0.0.1"))
2347 ]
2348 )
2349
2350 def test_ipaddress_allowed_type(self):
2351 permitted = [x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/29"))]
2352 excluded = [x509.IPAddress(ipaddress.IPv4Network(u"10.10.0.0/24"))]
2353 nc = x509.NameConstraints(
2354 permitted_subtrees=permitted,
2355 excluded_subtrees=excluded
2356 )
2357 assert nc.permitted_subtrees == permitted
2358 assert nc.excluded_subtrees == excluded
2359
2360 def test_invalid_permitted_subtrees(self):
2361 with pytest.raises(TypeError):
2362 x509.NameConstraints("badpermitted", None)
2363
2364 def test_invalid_excluded_subtrees(self):
2365 with pytest.raises(TypeError):
2366 x509.NameConstraints(None, "badexcluded")
2367
2368 def test_no_subtrees(self):
2369 with pytest.raises(ValueError):
2370 x509.NameConstraints(None, None)
2371
2372 def test_permitted_none(self):
2373 excluded = [x509.DNSName(u"name.local")]
2374 nc = x509.NameConstraints(
2375 permitted_subtrees=None, excluded_subtrees=excluded
2376 )
2377 assert nc.permitted_subtrees is None
2378 assert nc.excluded_subtrees is not None
2379
2380 def test_excluded_none(self):
2381 permitted = [x509.DNSName(u"name.local")]
2382 nc = x509.NameConstraints(
2383 permitted_subtrees=permitted, excluded_subtrees=None
2384 )
2385 assert nc.permitted_subtrees is not None
2386 assert nc.excluded_subtrees is None
2387
2388 def test_repr(self):
2389 permitted = [x509.DNSName(u"name.local"), x509.DNSName(u"name2.local")]
2390 nc = x509.NameConstraints(
2391 permitted_subtrees=permitted,
2392 excluded_subtrees=None
2393 )
2394 assert repr(nc) == (
2395 "<NameConstraints(permitted_subtrees=[<DNSName(value=name.local)>"
2396 ", <DNSName(value=name2.local)>], excluded_subtrees=None)>"
2397 )
2398
Paul Kehrer31894282015-06-21 21:46:41 -05002399 def test_eq(self):
2400 nc = x509.NameConstraints(
2401 permitted_subtrees=[x509.DNSName(u"name.local")],
2402 excluded_subtrees=[x509.DNSName(u"name2.local")]
2403 )
2404 nc2 = x509.NameConstraints(
2405 permitted_subtrees=[x509.DNSName(u"name.local")],
2406 excluded_subtrees=[x509.DNSName(u"name2.local")]
2407 )
2408 assert nc == nc2
2409
2410 def test_ne(self):
2411 nc = x509.NameConstraints(
2412 permitted_subtrees=[x509.DNSName(u"name.local")],
2413 excluded_subtrees=[x509.DNSName(u"name2.local")]
2414 )
2415 nc2 = x509.NameConstraints(
2416 permitted_subtrees=[x509.DNSName(u"name.local")],
2417 excluded_subtrees=None
2418 )
2419 nc3 = x509.NameConstraints(
2420 permitted_subtrees=None,
2421 excluded_subtrees=[x509.DNSName(u"name2.local")]
2422 )
2423
2424 assert nc != nc2
2425 assert nc != nc3
2426 assert nc != object()
2427
Paul Kehrere0017be2015-05-17 20:39:40 -06002428
Paul Kehrer870d7e82015-06-21 22:20:44 -05002429@pytest.mark.requires_backend_interface(interface=RSABackend)
2430@pytest.mark.requires_backend_interface(interface=X509Backend)
2431class TestNameConstraintsExtension(object):
2432 def test_permitted_excluded(self, backend):
2433 cert = _load_cert(
2434 os.path.join(
2435 "x509", "custom", "nc_permitted_excluded_2.pem"
2436 ),
2437 x509.load_pem_x509_certificate,
2438 backend
2439 )
2440 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002441 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002442 ).value
2443 assert nc == x509.NameConstraints(
2444 permitted_subtrees=[
2445 x509.DNSName(u"zombo.local"),
2446 ],
2447 excluded_subtrees=[
2448 x509.DirectoryName(x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002449 x509.NameAttribute(NameOID.COMMON_NAME, u"zombo")
Paul Kehrer870d7e82015-06-21 22:20:44 -05002450 ]))
2451 ]
2452 )
2453
2454 def test_permitted(self, backend):
2455 cert = _load_cert(
2456 os.path.join(
2457 "x509", "custom", "nc_permitted_2.pem"
2458 ),
2459 x509.load_pem_x509_certificate,
2460 backend
2461 )
2462 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002463 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer870d7e82015-06-21 22:20:44 -05002464 ).value
2465 assert nc == x509.NameConstraints(
2466 permitted_subtrees=[
2467 x509.DNSName(u"zombo.local"),
2468 ],
2469 excluded_subtrees=None
2470 )
2471
Paul Kehrer42376832015-07-01 18:10:32 -05002472 def test_permitted_with_leading_period(self, backend):
2473 cert = _load_cert(
2474 os.path.join(
2475 "x509", "custom", "nc_permitted.pem"
2476 ),
2477 x509.load_pem_x509_certificate,
2478 backend
2479 )
2480 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002481 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002482 ).value
2483 assert nc == x509.NameConstraints(
2484 permitted_subtrees=[
2485 x509.DNSName(u".cryptography.io"),
2486 x509.UniformResourceIdentifier(u"ftp://cryptography.test")
2487 ],
2488 excluded_subtrees=None
2489 )
2490
2491 def test_excluded_with_leading_period(self, backend):
2492 cert = _load_cert(
2493 os.path.join(
2494 "x509", "custom", "nc_excluded.pem"
2495 ),
2496 x509.load_pem_x509_certificate,
2497 backend
2498 )
2499 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002500 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrer42376832015-07-01 18:10:32 -05002501 ).value
2502 assert nc == x509.NameConstraints(
2503 permitted_subtrees=None,
2504 excluded_subtrees=[
2505 x509.DNSName(u".cryptography.io"),
2506 x509.UniformResourceIdentifier(u"gopher://cryptography.test")
2507 ]
2508 )
2509
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002510 def test_permitted_excluded_with_ips(self, backend):
2511 cert = _load_cert(
2512 os.path.join(
2513 "x509", "custom", "nc_permitted_excluded.pem"
2514 ),
2515 x509.load_pem_x509_certificate,
2516 backend
2517 )
2518 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002519 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002520 ).value
2521 assert nc == x509.NameConstraints(
2522 permitted_subtrees=[
2523 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.0/24")),
2524 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/96")),
2525 ],
2526 excluded_subtrees=[
2527 x509.DNSName(u".domain.com"),
2528 x509.UniformResourceIdentifier(u"http://test.local"),
2529 ]
2530 )
2531
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002532 def test_single_ip_netmask(self, backend):
2533 cert = _load_cert(
2534 os.path.join(
2535 "x509", "custom", "nc_single_ip_netmask.pem"
2536 ),
2537 x509.load_pem_x509_certificate,
2538 backend
2539 )
2540 nc = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002541 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrera72ebaf2015-07-01 21:07:37 -05002542 ).value
2543 assert nc == x509.NameConstraints(
2544 permitted_subtrees=[
2545 x509.IPAddress(ipaddress.IPv6Network(u"FF:0:0:0:0:0:0:0/128")),
2546 x509.IPAddress(ipaddress.IPv4Network(u"192.168.0.1/32")),
2547 ],
2548 excluded_subtrees=None
2549 )
2550
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002551 def test_invalid_netmask(self, backend):
2552 cert = _load_cert(
2553 os.path.join(
2554 "x509", "custom", "nc_invalid_ip_netmask.pem"
2555 ),
2556 x509.load_pem_x509_certificate,
2557 backend
2558 )
2559 with pytest.raises(ValueError):
2560 cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002561 ExtensionOID.NAME_CONSTRAINTS
Paul Kehrercfb8aa22015-07-01 19:16:36 -05002562 )
2563
Paul Kehrer870d7e82015-06-21 22:20:44 -05002564
Paul Kehrer5a485522015-05-06 00:29:12 -05002565class TestDistributionPoint(object):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002566 def test_distribution_point_full_name_not_general_names(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002567 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002568 x509.DistributionPoint(["notgn"], None, None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002569
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002570 def test_distribution_point_relative_name_not_name(self):
Paul Kehrer5a485522015-05-06 00:29:12 -05002571 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002572 x509.DistributionPoint(None, "notname", None, None)
2573
2574 def test_distribution_point_full_and_relative_not_none(self):
2575 with pytest.raises(ValueError):
2576 x509.DistributionPoint("data", "notname", None, None)
Paul Kehrer5a485522015-05-06 00:29:12 -05002577
2578 def test_crl_issuer_not_general_names(self):
2579 with pytest.raises(TypeError):
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002580 x509.DistributionPoint(None, None, None, ["notgn"])
Paul Kehrer5a485522015-05-06 00:29:12 -05002581
2582 def test_reason_not_reasonflags(self):
2583 with pytest.raises(TypeError):
2584 x509.DistributionPoint(
2585 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002586 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002587 frozenset(["notreasonflags"]),
2588 None
2589 )
2590
2591 def test_reason_not_frozenset(self):
2592 with pytest.raises(TypeError):
2593 x509.DistributionPoint(
2594 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2595 None,
2596 [x509.ReasonFlags.ca_compromise],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002597 None
2598 )
2599
2600 def test_disallowed_reasons(self):
2601 with pytest.raises(ValueError):
2602 x509.DistributionPoint(
2603 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2604 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002605 frozenset([x509.ReasonFlags.unspecified]),
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002606 None
2607 )
2608
2609 with pytest.raises(ValueError):
2610 x509.DistributionPoint(
2611 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2612 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002613 frozenset([x509.ReasonFlags.remove_from_crl]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002614 None
2615 )
2616
2617 def test_reason_only(self):
2618 with pytest.raises(ValueError):
2619 x509.DistributionPoint(
2620 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002621 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002622 frozenset([x509.ReasonFlags.aa_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002623 None
2624 )
2625
2626 def test_eq(self):
2627 dp = x509.DistributionPoint(
2628 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002629 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002630 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002631 [
2632 x509.DirectoryName(
2633 x509.Name([
2634 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002635 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002636 )
2637 ])
2638 )
2639 ],
2640 )
2641 dp2 = x509.DistributionPoint(
2642 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002643 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002644 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002645 [
2646 x509.DirectoryName(
2647 x509.Name([
2648 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002649 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002650 )
2651 ])
2652 )
2653 ],
2654 )
2655 assert dp == dp2
2656
2657 def test_ne(self):
2658 dp = x509.DistributionPoint(
2659 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002660 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002661 frozenset([x509.ReasonFlags.superseded]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002662 [
2663 x509.DirectoryName(
2664 x509.Name([
2665 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002666 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002667 )
2668 ])
2669 )
2670 ],
2671 )
2672 dp2 = x509.DistributionPoint(
2673 [x509.UniformResourceIdentifier(u"http://crypt.og/crl")],
2674 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002675 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002676 None
2677 )
2678 assert dp != dp2
2679 assert dp != object()
2680
2681 def test_repr(self):
2682 dp = x509.DistributionPoint(
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002683 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002684 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002685 x509.NameAttribute(NameOID.COMMON_NAME, u"myCN")
Paul Kehrer5a485522015-05-06 00:29:12 -05002686 ]),
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002687 frozenset([x509.ReasonFlags.ca_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002688 [
2689 x509.DirectoryName(
2690 x509.Name([
2691 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002692 NameOID.COMMON_NAME, u"Important CA"
Paul Kehrer5a485522015-05-06 00:29:12 -05002693 )
2694 ])
2695 )
2696 ],
2697 )
Paul Kehrer749da3b2015-05-10 09:58:29 -05002698 if six.PY3:
2699 assert repr(dp) == (
2700 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2701 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordascoa908d692015-06-16 21:35:24 -05002702 ">, value='myCN')>])>, reasons=frozenset({<ReasonFlags.ca_comp"
2703 "romise: 'cACompromise'>}), crl_issuer=[<DirectoryName(value=<"
2704 "Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name="
2705 "commonName)>, value='Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002706 )
2707 else:
2708 assert repr(dp) == (
2709 "<DistributionPoint(full_name=None, relative_name=<Name([<Name"
2710 "Attribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)"
Ian Cordasco82fc3762015-06-16 20:59:50 -05002711 ">, value=u'myCN')>])>, reasons=frozenset([<ReasonFlags.ca_com"
2712 "promise: 'cACompromise'>]), crl_issuer=[<DirectoryName(value="
2713 "<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name"
2714 "=commonName)>, value=u'Important CA')>])>)>])>"
Paul Kehrer749da3b2015-05-10 09:58:29 -05002715 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002716
2717
2718class TestCRLDistributionPoints(object):
2719 def test_invalid_distribution_points(self):
2720 with pytest.raises(TypeError):
2721 x509.CRLDistributionPoints(["notadistributionpoint"])
2722
2723 def test_iter_len(self):
2724 cdp = x509.CRLDistributionPoints([
2725 x509.DistributionPoint(
2726 [x509.UniformResourceIdentifier(u"http://domain")],
2727 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002728 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002729 None
2730 ),
2731 x509.DistributionPoint(
2732 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002733 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002734 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002735 x509.ReasonFlags.key_compromise,
2736 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002737 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002738 None
2739 ),
2740 ])
2741 assert len(cdp) == 2
2742 assert list(cdp) == [
2743 x509.DistributionPoint(
2744 [x509.UniformResourceIdentifier(u"http://domain")],
2745 None,
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002746 None,
Paul Kehrer5a485522015-05-06 00:29:12 -05002747 None
2748 ),
2749 x509.DistributionPoint(
2750 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002751 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002752 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002753 x509.ReasonFlags.key_compromise,
2754 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002755 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002756 None
2757 ),
2758 ]
2759
2760 def test_repr(self):
2761 cdp = x509.CRLDistributionPoints([
2762 x509.DistributionPoint(
2763 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002764 None,
Paul Kehrer96ef63c2015-05-09 21:17:04 -05002765 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002766 None
2767 ),
2768 ])
Paul Kehrer749da3b2015-05-10 09:58:29 -05002769 if six.PY3:
2770 assert repr(cdp) == (
2771 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2772 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2773 "ne, reasons=frozenset({<ReasonFlags.key_compromise: 'keyComp"
2774 "romise'>}), crl_issuer=None)>])>"
2775 )
2776 else:
2777 assert repr(cdp) == (
2778 "<CRLDistributionPoints([<DistributionPoint(full_name=[<Unifo"
2779 "rmResourceIdentifier(value=ftp://domain)>], relative_name=No"
2780 "ne, reasons=frozenset([<ReasonFlags.key_compromise: 'keyComp"
2781 "romise'>]), crl_issuer=None)>])>"
2782 )
Paul Kehrer5a485522015-05-06 00:29:12 -05002783
2784 def test_eq(self):
2785 cdp = x509.CRLDistributionPoints([
2786 x509.DistributionPoint(
2787 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002788 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002789 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002790 x509.ReasonFlags.key_compromise,
2791 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002792 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002793 [x509.UniformResourceIdentifier(u"uri://thing")],
2794 ),
2795 ])
2796 cdp2 = x509.CRLDistributionPoints([
2797 x509.DistributionPoint(
2798 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002799 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002800 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002801 x509.ReasonFlags.key_compromise,
2802 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002803 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002804 [x509.UniformResourceIdentifier(u"uri://thing")],
2805 ),
2806 ])
2807 assert cdp == cdp2
2808
2809 def test_ne(self):
2810 cdp = x509.CRLDistributionPoints([
2811 x509.DistributionPoint(
2812 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002813 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002814 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002815 x509.ReasonFlags.key_compromise,
2816 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002817 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002818 [x509.UniformResourceIdentifier(u"uri://thing")],
2819 ),
2820 ])
2821 cdp2 = x509.CRLDistributionPoints([
2822 x509.DistributionPoint(
2823 [x509.UniformResourceIdentifier(u"ftp://domain2")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002824 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002825 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002826 x509.ReasonFlags.key_compromise,
2827 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002828 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002829 [x509.UniformResourceIdentifier(u"uri://thing")],
2830 ),
2831 ])
2832 cdp3 = x509.CRLDistributionPoints([
2833 x509.DistributionPoint(
2834 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002835 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002836 frozenset([x509.ReasonFlags.key_compromise]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002837 [x509.UniformResourceIdentifier(u"uri://thing")],
2838 ),
2839 ])
2840 cdp4 = x509.CRLDistributionPoints([
2841 x509.DistributionPoint(
2842 [x509.UniformResourceIdentifier(u"ftp://domain")],
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002843 None,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002844 frozenset([
Paul Kehrer4e8dacd2015-05-09 10:38:23 -05002845 x509.ReasonFlags.key_compromise,
2846 x509.ReasonFlags.ca_compromise,
Paul Kehrer3fd02602015-05-09 19:46:13 -05002847 ]),
Paul Kehrer5a485522015-05-06 00:29:12 -05002848 [x509.UniformResourceIdentifier(u"uri://thing2")],
2849 ),
2850 ])
2851 assert cdp != cdp2
2852 assert cdp != cdp3
2853 assert cdp != cdp4
2854 assert cdp != object()
Paul Kehrer9a10d592015-05-10 14:55:51 -05002855
2856
2857@pytest.mark.requires_backend_interface(interface=RSABackend)
2858@pytest.mark.requires_backend_interface(interface=X509Backend)
2859class TestCRLDistributionPointsExtension(object):
2860 def test_fullname_and_crl_issuer(self, backend):
2861 cert = _load_cert(
2862 os.path.join(
2863 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest28EE.crt"
2864 ),
2865 x509.load_der_x509_certificate,
2866 backend
2867 )
2868
2869 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002870 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002871 ).value
2872
2873 assert cdps == x509.CRLDistributionPoints([
2874 x509.DistributionPoint(
2875 full_name=[x509.DirectoryName(
2876 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002877 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002878 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002879 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002880 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002881 ),
2882 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002883 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002884 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002885 ),
2886 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002887 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002888 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002889 ),
2890 ])
2891 )],
2892 relative_name=None,
2893 reasons=None,
2894 crl_issuer=[x509.DirectoryName(
2895 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002896 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002897 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002898 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002899 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002900 ),
2901 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002902 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002903 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002904 ),
2905 ])
2906 )],
2907 )
2908 ])
2909
2910 def test_relativename_and_crl_issuer(self, backend):
2911 cert = _load_cert(
2912 os.path.join(
2913 "x509", "PKITS_data", "certs", "ValidcRLIssuerTest29EE.crt"
2914 ),
2915 x509.load_der_x509_certificate,
2916 backend
2917 )
2918
2919 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002920 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002921 ).value
2922
2923 assert cdps == x509.CRLDistributionPoints([
2924 x509.DistributionPoint(
2925 full_name=None,
2926 relative_name=x509.Name([
2927 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002928 NameOID.COMMON_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002929 u"indirect CRL for indirectCRL CA3"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002930 ),
2931 ]),
2932 reasons=None,
2933 crl_issuer=[x509.DirectoryName(
2934 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002935 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002936 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002937 NameOID.ORGANIZATION_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002938 u"Test Certificates 2011"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002939 ),
2940 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002941 NameOID.ORGANIZATIONAL_UNIT_NAME,
Ian Cordasco82fc3762015-06-16 20:59:50 -05002942 u"indirectCRL CA3 cRLIssuer"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002943 ),
2944 ])
2945 )],
2946 )
2947 ])
2948
2949 def test_fullname_crl_issuer_reasons(self, backend):
2950 cert = _load_cert(
2951 os.path.join(
2952 "x509", "custom", "cdp_fullname_reasons_crl_issuer.pem"
2953 ),
2954 x509.load_pem_x509_certificate,
2955 backend
2956 )
2957
2958 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002959 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05002960 ).value
2961
2962 assert cdps == x509.CRLDistributionPoints([
2963 x509.DistributionPoint(
2964 full_name=[x509.UniformResourceIdentifier(
2965 u"http://myhost.com/myca.crl"
2966 )],
2967 relative_name=None,
2968 reasons=frozenset([
2969 x509.ReasonFlags.key_compromise,
2970 x509.ReasonFlags.ca_compromise
2971 ]),
2972 crl_issuer=[x509.DirectoryName(
2973 x509.Name([
Paul Kehrereba19e62015-08-10 18:44:24 -05002974 x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
Paul Kehrer9a10d592015-05-10 14:55:51 -05002975 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002976 NameOID.ORGANIZATION_NAME, u"PyCA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002977 ),
2978 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05002979 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05002980 ),
2981 ])
2982 )],
2983 )
2984 ])
2985
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002986 def test_all_reasons(self, backend):
2987 cert = _load_cert(
2988 os.path.join(
2989 "x509", "custom", "cdp_all_reasons.pem"
2990 ),
2991 x509.load_pem_x509_certificate,
2992 backend
2993 )
2994
2995 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05002996 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05002997 ).value
2998
2999 assert cdps == x509.CRLDistributionPoints([
3000 x509.DistributionPoint(
3001 full_name=[x509.UniformResourceIdentifier(
3002 u"http://domain.com/some.crl"
3003 )],
3004 relative_name=None,
3005 reasons=frozenset([
3006 x509.ReasonFlags.key_compromise,
3007 x509.ReasonFlags.ca_compromise,
3008 x509.ReasonFlags.affiliation_changed,
3009 x509.ReasonFlags.superseded,
3010 x509.ReasonFlags.privilege_withdrawn,
3011 x509.ReasonFlags.cessation_of_operation,
3012 x509.ReasonFlags.aa_compromise,
3013 x509.ReasonFlags.certificate_hold,
3014 ]),
3015 crl_issuer=None
3016 )
3017 ])
3018
3019 def test_single_reason(self, backend):
3020 cert = _load_cert(
3021 os.path.join(
3022 "x509", "custom", "cdp_reason_aa_compromise.pem"
3023 ),
3024 x509.load_pem_x509_certificate,
3025 backend
3026 )
3027
3028 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003029 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer594a2ed2015-05-12 23:27:32 -05003030 ).value
3031
3032 assert cdps == x509.CRLDistributionPoints([
3033 x509.DistributionPoint(
3034 full_name=[x509.UniformResourceIdentifier(
3035 u"http://domain.com/some.crl"
3036 )],
3037 relative_name=None,
3038 reasons=frozenset([x509.ReasonFlags.aa_compromise]),
3039 crl_issuer=None
3040 )
3041 ])
3042
Paul Kehrer9a10d592015-05-10 14:55:51 -05003043 def test_crl_issuer_only(self, backend):
3044 cert = _load_cert(
3045 os.path.join(
3046 "x509", "custom", "cdp_crl_issuer.pem"
3047 ),
3048 x509.load_pem_x509_certificate,
3049 backend
3050 )
3051
3052 cdps = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003053 ExtensionOID.CRL_DISTRIBUTION_POINTS
Paul Kehrer9a10d592015-05-10 14:55:51 -05003054 ).value
3055
3056 assert cdps == x509.CRLDistributionPoints([
3057 x509.DistributionPoint(
3058 full_name=None,
3059 relative_name=None,
3060 reasons=None,
3061 crl_issuer=[x509.DirectoryName(
3062 x509.Name([
3063 x509.NameAttribute(
Paul Kehrereba19e62015-08-10 18:44:24 -05003064 NameOID.COMMON_NAME, u"cryptography CA"
Paul Kehrer9a10d592015-05-10 14:55:51 -05003065 ),
3066 ])
3067 )],
3068 )
3069 ])
Paul Kehrer16fae762015-05-01 23:14:20 -05003070
Dominic Chen87bb9572015-10-09 00:23:07 -04003071 def test_crl_empty_hostname(self, backend):
3072 cert = _load_cert(
3073 os.path.join(
3074 "x509", "custom", "cdp_empty_hostname.pem"
3075 ),
3076 x509.load_pem_x509_certificate,
3077 backend
3078 )
3079
3080 cdps = cert.extensions.get_extension_for_oid(
3081 ExtensionOID.CRL_DISTRIBUTION_POINTS
3082 ).value
3083
3084 assert cdps == x509.CRLDistributionPoints([
3085 x509.DistributionPoint(
3086 full_name=[x509.UniformResourceIdentifier(
3087 u"ldap:/CN=A,OU=B,dc=C,DC=D?E?F?G?H=I"
3088 )],
3089 relative_name=None,
3090 reasons=None,
3091 crl_issuer=None
3092 )
3093 ])
3094
Paul Kehrer16fae762015-05-01 23:14:20 -05003095
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003096@pytest.mark.requires_backend_interface(interface=RSABackend)
3097@pytest.mark.requires_backend_interface(interface=X509Backend)
3098class TestOCSPNoCheckExtension(object):
3099 def test_nocheck(self, backend):
3100 cert = _load_cert(
3101 os.path.join(
3102 "x509", "custom", "ocsp_nocheck.pem"
3103 ),
3104 x509.load_pem_x509_certificate,
3105 backend
3106 )
3107 ext = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003108 ExtensionOID.OCSP_NO_CHECK
Paul Kehrerf54a50b2015-06-17 18:31:26 -06003109 )
3110 assert isinstance(ext.value, x509.OCSPNoCheck)
3111
3112
Paul Kehrer16fae762015-05-01 23:14:20 -05003113class TestInhibitAnyPolicy(object):
3114 def test_not_int(self):
3115 with pytest.raises(TypeError):
3116 x509.InhibitAnyPolicy("notint")
3117
3118 def test_negative_int(self):
3119 with pytest.raises(ValueError):
3120 x509.InhibitAnyPolicy(-1)
3121
3122 def test_repr(self):
3123 iap = x509.InhibitAnyPolicy(0)
3124 assert repr(iap) == "<InhibitAnyPolicy(skip_certs=0)>"
3125
3126 def test_eq(self):
3127 iap = x509.InhibitAnyPolicy(1)
3128 iap2 = x509.InhibitAnyPolicy(1)
3129 assert iap == iap2
3130
3131 def test_ne(self):
3132 iap = x509.InhibitAnyPolicy(1)
3133 iap2 = x509.InhibitAnyPolicy(4)
3134 assert iap != iap2
3135 assert iap != object()
Paul Kehrerca6ce992015-06-17 22:13:15 -06003136
3137
3138@pytest.mark.requires_backend_interface(interface=RSABackend)
3139@pytest.mark.requires_backend_interface(interface=X509Backend)
3140class TestInhibitAnyPolicyExtension(object):
3141 def test_nocheck(self, backend):
3142 cert = _load_cert(
3143 os.path.join(
3144 "x509", "custom", "inhibit_any_policy_5.pem"
3145 ),
3146 x509.load_pem_x509_certificate,
3147 backend
3148 )
3149 iap = cert.extensions.get_extension_for_oid(
Paul Kehrerd44e4132015-08-10 19:13:13 -05003150 ExtensionOID.INHIBIT_ANY_POLICY
Paul Kehrerca6ce992015-06-17 22:13:15 -06003151 ).value
3152 assert iap.skip_certs == 5
Paul Kehrera08693f2015-08-01 20:45:21 +01003153
3154
3155@pytest.mark.requires_backend_interface(interface=RSABackend)
3156@pytest.mark.requires_backend_interface(interface=X509Backend)
Paul Kehrer1b7500f2015-08-01 20:56:27 +01003157class TestInvalidExtension(object):
Paul Kehrera08693f2015-08-01 20:45:21 +01003158 def test_invalid_certificate_policies_data(self, backend):
3159 cert = _load_cert(
3160 os.path.join(
3161 "x509", "custom", "cp_invalid.pem"
3162 ),
3163 x509.load_pem_x509_certificate,
3164 backend
3165 )
3166 with pytest.raises(ValueError):
3167 cert.extensions