blob: 872fa4f0fb8a7880e465dcf180846ce1ee864e20 [file] [log] [blame]
wbonde91513e2015-06-03 14:52:18 -04001# coding: utf-8
2from __future__ import unicode_literals
3
4import unittest
5import sys
6import os
7from collections import OrderedDict
8from datetime import datetime
9
wbondaf1f5a82015-07-17 12:13:15 -040010from asn1crypto import x509, core, pem
11
12from .unittest_data import DataDecorator, data
wbonde91513e2015-06-03 14:52:18 -040013
14if sys.version_info < (3,):
15 byte_cls = str
16else:
17 byte_cls = bytes
18
19
20tests_root = os.path.dirname(__file__)
21fixtures_dir = os.path.join(tests_root, 'fixtures')
22
23
wbondaf1f5a82015-07-17 12:13:15 -040024@DataDecorator
wbonde91513e2015-06-03 14:52:18 -040025class X509Tests(unittest.TestCase):
26
wbondaf1f5a82015-07-17 12:13:15 -040027 def _load_cert(self, relative_path):
28 with open(os.path.join(fixtures_dir, relative_path), 'rb') as f:
29 cert_bytes = f.read()
30 if pem.detect(cert_bytes):
31 _, _, cert_bytes = pem.unarmor(cert_bytes)
32 return x509.Certificate.load(cert_bytes)
wbond8bb77d02015-07-13 17:44:29 -040033
wbondaf1f5a82015-07-17 12:13:15 -040034 #pylint: disable=C0326
35 @staticmethod
wbondf4645722015-07-22 12:36:37 -040036 def ip_address_info():
37 return (
38 ('127.0.0.1', b'\x04\x04\x7F\x00\x00\x01'),
39 ('255.255.255.255', b'\x04\x04\xFF\xFF\xFF\xFF'),
40 ('127.0.0.1/28', b'\x04\x08\x7F\x00\x00\x01\xFF\xFF\xFF\xF0'),
41 ('255.255.255.255/0', b'\x04\x08\xFF\xFF\xFF\xFF\x00\x00\x00\x00'),
42 ('af::ed', b'\x04\x10\x00\xAF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xED'),
43 ('af::ed/128', b'\x04\x20\x00\xAF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xED\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'),
44 ('af::ed/0', b'\x04\x20\x00\xAF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'),
45 )
46
47 @data('ip_address_info')
48 def ip_address(self, unicode_string, der_bytes):
49 self.assertEqual(der_bytes, x509.IPAddress(unicode_string).dump())
50 self.assertEqual(unicode_string, x509.IPAddress.load(der_bytes).native)
51
52 #pylint: disable=C0326
53 @staticmethod
wbondfd65d602015-07-23 07:16:44 -040054 def compare_name_info():
55 return (
56 (
57 True,
58 x509.Name.build({
59 'common_name': 'Will Bond'
60 }),
61 x509.Name.build({
62 'common_name': 'will bond'
63 })
64 ),
65 (
66 True,
67 x509.Name.build({
68 'common_name': 'Will Bond'
69 }),
70 x509.Name.build({
71 'common_name': 'will\tbond'
72 })
73 ),
74 (
wbond3ce3aec2015-07-27 10:23:19 -040075 True,
76 x509.Name.build({
77 'common_name': 'Will Bond'
78 }),
79 x509.Name.build({
80 'common_name': 'Will Bond \U0001D173\U000E007F'
81 })
82 ),
83 (
wbondfd65d602015-07-23 07:16:44 -040084 False,
85 x509.Name.build({
86 'country_name': 'US',
87 'common_name': 'Will Bond'
88 }),
89 x509.Name.build({
90 'country_name': 'US',
91 'state_or_province_name': 'Massachusetts',
92 'common_name': 'Will Bond'
93 })
94 ),
95 )
96
97 @data('compare_name_info')
98 def compare_name(self, are_equal, general_name_1, general_name_2):
99 if are_equal:
100 self.assertEqual(general_name_1, general_name_2)
101 else:
102 self.assertNotEqual(general_name_1, general_name_2)
103
104 #pylint: disable=C0326
105 @staticmethod
wbond1cfca232015-07-20 08:51:58 -0400106 def signature_algo_info():
107 return (
108 ('keys/test-der.crt', 'rsassa_pkcs1v15', 'sha256'),
109 ('keys/test-inter-der.crt', 'rsassa_pkcs1v15', 'sha256'),
110 ('keys/test-dsa-der.crt', 'dsa', 'sha256'),
111 ('keys/test-third-der.crt', 'rsassa_pkcs1v15', 'sha256'),
112 ('keys/test-ec-der.crt', 'ecdsa', 'sha256'),
113 )
114
115 @data('signature_algo_info')
116 def signature_algo(self, relative_path, signature_algo, hash_algo):
117 cert = self._load_cert(relative_path)
118 self.assertEqual(signature_algo, cert['signature_algorithm'].signature_algo)
119 self.assertEqual(hash_algo, cert['signature_algorithm'].hash_algo)
120
121 #pylint: disable=C0326
122 @staticmethod
wbondaf1f5a82015-07-17 12:13:15 -0400123 def critical_extensions_info():
124 return (
wbond2fde6452015-07-23 10:54:13 -0400125 ('keys/test-der.crt', set()),
126 ('keys/test-inter-der.crt', set()),
127 ('keys/test-third-der.crt', set()),
128 ('geotrust_certs/GeoTrust_Universal_CA.crt', {'basic_constraints', 'key_usage'}),
129 ('geotrust_certs/GeoTrust_Primary_CA.crt', {'basic_constraints', 'key_usage'}),
130 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', {'basic_constraints', 'key_usage'}),
131 ('geotrust_certs/codex.crt', {'key_usage'}),
132 ('lets_encrypt/isrgrootx1.pem', {'key_usage', 'basic_constraints'}),
133 ('lets_encrypt/letsencryptauthorityx1.pem', {'key_usage', 'basic_constraints'}),
134 ('lets_encrypt/letsencryptauthorityx2.pem', {'key_usage', 'basic_constraints'}),
135 ('globalsign_example_keys/IssuingCA-der.cer', {'basic_constraints', 'key_usage'}),
136 ('globalsign_example_keys/rootCA.cer', {'basic_constraints', 'key_usage'}),
137 ('globalsign_example_keys/SSL1.cer', {'key_usage', 'extended_key_usage', 'basic_constraints'}),
138 ('globalsign_example_keys/SSL2.cer', {'key_usage', 'extended_key_usage', 'basic_constraints'}),
139 ('globalsign_example_keys/SSL3.cer', {'key_usage', 'extended_key_usage', 'basic_constraints'}),
wbond8bb77d02015-07-13 17:44:29 -0400140 )
wbondaf1f5a82015-07-17 12:13:15 -0400141
142 @data('critical_extensions_info')
143 def critical_extensions(self, relative_path, critical_extensions):
144 cert = self._load_cert(relative_path)
145 self.assertEqual(critical_extensions, cert.critical_extensions)
146
147 #pylint: disable=C0326
148 @staticmethod
149 def key_identifier_value_info():
150 return (
151 ('keys/test-der.crt', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
152 ('keys/test-inter-der.crt', b'\xd2\n\xfd.%\xd1\xb7!\xd7P~\xbb\xa4}\xbf4\xefR^\x02'),
153 ('keys/test-third-der.crt', b'D8\xe0\xe0&\x85\xbf\x98\x86\xdc\x1b\xe1\x1d\xf520\xbe\xab\xac\r'),
154 ('geotrust_certs/GeoTrust_Universal_CA.crt', b'\xda\xbb.\xaa\xb0\x0c\xb8\x88&Qt\\m\x03\xd3\xc0\xd8\x8fz\xd6'),
155 ('geotrust_certs/GeoTrust_Primary_CA.crt', b',\xd5PA\x97\x15\x8b\xf0\x8f6a[J\xfbk\xd9\x99\xc93\x92'),
156 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', b'\xde\xcf\\P\xb7\xae\x02\x1f\x15\x17\xaa\x16\xe8\r\xb5(\x9djZ\xf3'),
157 ('geotrust_certs/codex.crt', None),
158 ('lets_encrypt/isrgrootx1.pem', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
159 ('lets_encrypt/letsencryptauthorityx1.pem', b'\xa8Jjc\x04}\xdd\xba\xe6\xd19\xb7\xa6Ee\xef\xf3\xa8\xec\xa1'),
160 ('lets_encrypt/letsencryptauthorityx2.pem', b'\xc5\xb1\xabNL\xb1\xcdd0\x93~\xc1\x84\x99\x05\xab\xe6\x03\xe2%'),
161 ('globalsign_example_keys/IssuingCA-der.cer', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
162 ('globalsign_example_keys/rootCA.cer', b'd|\\\xe1\xe0`8NH\x9f\x05\xbcUc~?\xaeM\xf7\x1e'),
163 ('globalsign_example_keys/SSL1.cer', b'\x94a\x04\x92\x04L\xe6\xffh\xa8\x96\xafy\xd2\xf32\x84\xae[\xcf'),
164 ('globalsign_example_keys/SSL2.cer', b'\xd2\xb7\x15\x7fd0\x07(p\x83\xca(\xfa\x88\x96\xde\x9e\xfc\x8a='),
165 ('globalsign_example_keys/SSL3.cer', b'G\xde\xa4\xe7\xea`\xe7\xee6\xc8\xf1\xd5\xb0F\x07\x07\x9eBh\xce'),
wbond8bb77d02015-07-13 17:44:29 -0400166 )
wbond8bb77d02015-07-13 17:44:29 -0400167
wbondaf1f5a82015-07-17 12:13:15 -0400168 @data('key_identifier_value_info')
169 def key_identifier_value(self, relative_path, key_identifier_value):
170 cert = self._load_cert(relative_path)
171 value = cert.key_identifier_value
172 self.assertEqual(key_identifier_value, value.native if value else None)
wbond8bb77d02015-07-13 17:44:29 -0400173
wbondaf1f5a82015-07-17 12:13:15 -0400174 #pylint: disable=C0326
175 @staticmethod
176 def key_usage_value_info():
177 return (
178 ('keys/test-der.crt', None),
179 ('keys/test-inter-der.crt', None),
180 ('keys/test-third-der.crt', None),
181 (
182 'geotrust_certs/GeoTrust_Universal_CA.crt',
wbond7d7cccb2015-07-24 14:33:53 -0400183 {'digital_signature', 'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400184 ),
185 (
186 'geotrust_certs/GeoTrust_Primary_CA.crt',
wbond7d7cccb2015-07-24 14:33:53 -0400187 {'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400188 ),
189 (
190 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
wbond7d7cccb2015-07-24 14:33:53 -0400191 {'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400192 ),
193 (
194 'geotrust_certs/codex.crt',
wbond7d7cccb2015-07-24 14:33:53 -0400195 {'digital_signature', 'key_encipherment'}
wbondaf1f5a82015-07-17 12:13:15 -0400196 ),
197 (
198 'lets_encrypt/isrgrootx1.pem',
wbond7d7cccb2015-07-24 14:33:53 -0400199 {'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400200 ),
201 (
202 'lets_encrypt/letsencryptauthorityx1.pem',
wbond7d7cccb2015-07-24 14:33:53 -0400203 {'digital_signature', 'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400204 ),
205 (
206 'lets_encrypt/letsencryptauthorityx2.pem',
wbond7d7cccb2015-07-24 14:33:53 -0400207 {'digital_signature', 'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400208 ),
209 (
210 'globalsign_example_keys/IssuingCA-der.cer',
wbond7d7cccb2015-07-24 14:33:53 -0400211 {'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400212 ),
213 (
214 'globalsign_example_keys/rootCA.cer',
wbond7d7cccb2015-07-24 14:33:53 -0400215 {'key_cert_sign', 'crl_sign'}
wbondaf1f5a82015-07-17 12:13:15 -0400216 ),
217 (
218 'globalsign_example_keys/SSL1.cer',
wbond7d7cccb2015-07-24 14:33:53 -0400219 {'digital_signature', 'key_encipherment'}
wbondaf1f5a82015-07-17 12:13:15 -0400220 ),
221 (
222 'globalsign_example_keys/SSL2.cer',
wbond7d7cccb2015-07-24 14:33:53 -0400223 {'digital_signature', 'key_encipherment'}
wbondaf1f5a82015-07-17 12:13:15 -0400224 ),
225 (
226 'globalsign_example_keys/SSL3.cer',
wbond7d7cccb2015-07-24 14:33:53 -0400227 {'digital_signature', 'key_encipherment'}
wbondaf1f5a82015-07-17 12:13:15 -0400228 ),
229 )
230
231 @data('key_usage_value_info')
232 def key_usage_value(self, relative_path, key_usage_value):
233 cert = self._load_cert(relative_path)
234 value = cert.key_usage_value
235 self.assertEqual(key_usage_value, value.native if value else None)
236
237 #pylint: disable=C0326
238 @staticmethod
239 def subject_alt_name_value_info():
240 return (
241 ('keys/test-der.crt', None),
242 ('keys/test-inter-der.crt', None),
243 ('keys/test-third-der.crt', None),
244 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
245 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
246 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', [OrderedDict([('common_name', 'SymantecPKI-1-538')])]),
247 ('geotrust_certs/codex.crt', ['dev.codexns.io', 'rc.codexns.io', 'packagecontrol.io', 'wbond.net', 'codexns.io']),
248 ('lets_encrypt/isrgrootx1.pem', None),
249 ('lets_encrypt/letsencryptauthorityx1.pem', None),
250 ('lets_encrypt/letsencryptauthorityx2.pem', None),
251 ('globalsign_example_keys/IssuingCA-der.cer', None),
252 ('globalsign_example_keys/rootCA.cer', None),
253 ('globalsign_example_keys/SSL1.cer', ['anything.example.com']),
254 ('globalsign_example_keys/SSL2.cer', ['anything.example.com']),
255 ('globalsign_example_keys/SSL3.cer', None),
256 )
257
258 @data('subject_alt_name_value_info')
259 def subject_alt_name_value(self, relative_path, subject_alt_name_value):
260 cert = self._load_cert(relative_path)
261 value = cert.subject_alt_name_value
262 self.assertEqual(subject_alt_name_value, value.native if value else None)
263
264 #pylint: disable=C0326
265 @staticmethod
266 def basic_constraints_value_info():
267 return (
268 ('keys/test-der.crt', {'ca': True, 'path_len_constraint': None}),
269 ('keys/test-inter-der.crt', {'ca': True, 'path_len_constraint': None}),
270 ('keys/test-third-der.crt', None),
271 ('geotrust_certs/GeoTrust_Universal_CA.crt', {'ca': True, 'path_len_constraint': None}),
272 ('geotrust_certs/GeoTrust_Primary_CA.crt', {'ca': True, 'path_len_constraint': None}),
273 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', {'ca': True, 'path_len_constraint': 0}),
274 ('geotrust_certs/codex.crt', {'ca': False, 'path_len_constraint': None}),
275 ('lets_encrypt/isrgrootx1.pem', {'ca': True, 'path_len_constraint': None}),
276 ('lets_encrypt/letsencryptauthorityx1.pem', {'ca': True, 'path_len_constraint': 0}),
277 ('lets_encrypt/letsencryptauthorityx2.pem', {'ca': True, 'path_len_constraint': 0}),
278 ('globalsign_example_keys/IssuingCA-der.cer', {'ca': True, 'path_len_constraint': None}),
279 ('globalsign_example_keys/rootCA.cer', {'ca': True, 'path_len_constraint': None}),
280 ('globalsign_example_keys/SSL1.cer', {'ca': False, 'path_len_constraint': None}),
281 ('globalsign_example_keys/SSL2.cer', {'ca': False, 'path_len_constraint': None}),
282 ('globalsign_example_keys/SSL3.cer', {'ca': False, 'path_len_constraint': None}),
283 )
284
285 @data('basic_constraints_value_info')
286 def basic_constraints_value(self, relative_path, basic_constraints_value):
287 cert = self._load_cert(relative_path)
288 value = cert.basic_constraints_value
289 self.assertEqual(basic_constraints_value, value.native if value else None)
290
291 #pylint: disable=C0326
292 @staticmethod
293 def name_constraints_value_info():
294 return (
295 ('keys/test-der.crt', None),
296 ('keys/test-inter-der.crt', None),
297 ('keys/test-third-der.crt', None),
298 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
299 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
300 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
301 ('geotrust_certs/codex.crt', None),
302 ('lets_encrypt/isrgrootx1.pem', None),
303 ('lets_encrypt/letsencryptauthorityx1.pem', None),
304 ('lets_encrypt/letsencryptauthorityx2.pem', None),
305 (
306 'globalsign_example_keys/IssuingCA-der.cer',
307 OrderedDict([
wbond8bb77d02015-07-13 17:44:29 -0400308 (
wbondaf1f5a82015-07-17 12:13:15 -0400309 'permitted_subtrees',
wbond8bb77d02015-07-13 17:44:29 -0400310 [
311 OrderedDict([
wbondaf1f5a82015-07-17 12:13:15 -0400312 ('base', 'onlythis.com'),
313 ('minimum', 0),
314 ('maximum', None)
315 ]),
316 OrderedDict([
317 (
318 'base',
319 OrderedDict([
320 ('country_name', 'US'),
321 ('state_or_province_name', 'MA'),
322 ('locality_name', 'Boston'),
323 ('organization_name', 'Example LLC')
324 ])
325 ),
326 ('minimum', 0),
327 ('maximum', None)
wbond8bb77d02015-07-13 17:44:29 -0400328 ])
329 ]
wbondaf1f5a82015-07-17 12:13:15 -0400330 ),
331 (
332 'excluded_subtrees',
333 [
334 OrderedDict([
wbondf4645722015-07-22 12:36:37 -0400335 ('base', '0.0.0.0/0'),
wbondaf1f5a82015-07-17 12:13:15 -0400336 ('minimum', 0),
337 ('maximum', None)
338 ]),
339 OrderedDict([
wbondf4645722015-07-22 12:36:37 -0400340 ('base', '::/0'),
wbondaf1f5a82015-07-17 12:13:15 -0400341 ('minimum', 0),
342 ('maximum', None)
343 ])
344 ]
345 ),
wbond8bb77d02015-07-13 17:44:29 -0400346 ])
wbondaf1f5a82015-07-17 12:13:15 -0400347 ),
348 ('globalsign_example_keys/rootCA.cer', None),
349 ('globalsign_example_keys/SSL1.cer', None),
350 ('globalsign_example_keys/SSL2.cer', None),
351 ('globalsign_example_keys/SSL3.cer', None),
wbond8bb77d02015-07-13 17:44:29 -0400352 )
wbondaf1f5a82015-07-17 12:13:15 -0400353
354 @data('name_constraints_value_info')
355 def name_constraints_value(self, relative_path, name_constraints_value):
356 cert = self._load_cert(relative_path)
357 value = cert.name_constraints_value
358 self.assertEqual(name_constraints_value, value.native if value else None)
359
360 #pylint: disable=C0326
361 @staticmethod
362 def crl_distribution_points_value_info():
363 return (
364 ('keys/test-der.crt', None),
365 ('keys/test-inter-der.crt', None),
366 ('keys/test-third-der.crt', None),
367 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
368 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
369 (
370 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
371 [
372 OrderedDict([
373 ('distribution_point', ['http://g1.symcb.com/GeoTrustPCA.crl']),
374 ('reasons', None),
375 ('crl_issuer', None)
376 ])
377 ]
378 ),
379 (
380 'geotrust_certs/codex.crt',
381 [
382 OrderedDict([
383 ('distribution_point', ['http://gm.symcb.com/gm.crl']),
384 ('reasons', None),
385 ('crl_issuer', None)
386 ])
387 ]
388 ),
389 ('lets_encrypt/isrgrootx1.pem', None),
390 (
391 'lets_encrypt/letsencryptauthorityx1.pem',
392 [
393 OrderedDict([
394 ('distribution_point', ['http://crl.root-x1.letsencrypt.org']),
395 ('reasons', None),
396 ('crl_issuer', None)
397 ])
398 ]
399 ),
400 (
401 'lets_encrypt/letsencryptauthorityx2.pem',
402 [
403 OrderedDict([
404 ('distribution_point', ['http://crl.root-x1.letsencrypt.org']),
405 ('reasons', None),
406 ('crl_issuer', None)
407 ])
408 ]
409 ),
410 (
411 'globalsign_example_keys/IssuingCA-der.cer',
412 [
413 OrderedDict([
414 ('distribution_point', ['http://crl.globalsign.com/gs/trustrootcatg2.crl']),
415 ('reasons', None),
416 ('crl_issuer', None)
417 ])
418 ]),
419 (
420 'globalsign_example_keys/rootCA.cer',
421 [
422 OrderedDict([
423 ('distribution_point', ['http://crl.globalsign.com/gs/trustrootcatg2.crl']),
424 ('reasons', None),
425 ('crl_issuer', None)
426 ])
427 ]),
428 ('globalsign_example_keys/SSL1.cer', None),
429 ('globalsign_example_keys/SSL2.cer', None),
430 ('globalsign_example_keys/SSL3.cer', None),
431 )
432
433 @data('crl_distribution_points_value_info')
434 def crl_distribution_points_value(self, relative_path, crl_distribution_points_value):
435 cert = self._load_cert(relative_path)
436 value = cert.crl_distribution_points_value
437 self.assertEqual(crl_distribution_points_value, value.native if value else None)
438
439 #pylint: disable=C0326
440 @staticmethod
441 def certificate_policies_value_info():
442 return (
443 ('keys/test-der.crt', None),
444 ('keys/test-inter-der.crt', None),
445 ('keys/test-third-der.crt', None),
446 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
447 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
448 (
449 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
450 [
451 OrderedDict([
452 ('policy_identifier', 'any_policy'),
453 (
454 'policy_qualifiers',
455 [
456 OrderedDict([
457 ('policy_qualifier_id', 'certification_practice_statement'),
458 ('qualifier', 'https://www.geotrust.com/resources/cps')
459 ])
460 ]
461 )
462 ])
463 ]
464 ),
465 (
466 'geotrust_certs/codex.crt',
467 [
468 OrderedDict([
469 ('policy_identifier', '1.3.6.1.4.1.14370.1.6'),
470 (
471 'policy_qualifiers',
472 [
473 OrderedDict([
474 ('policy_qualifier_id', 'certification_practice_statement'),
475 ('qualifier', 'https://www.geotrust.com/resources/repository/legal')
476 ]),
477 OrderedDict([
478 ('policy_qualifier_id', 'user_notice'),
479 (
480 'qualifier',
481 OrderedDict([
482 ('notice_ref', None),
483 ('explicit_text', 'https://www.geotrust.com/resources/repository/legal')
484 ])
485 )
486 ])
487 ]
488 )
489 ])
490 ]
491 ),
492 ('lets_encrypt/isrgrootx1.pem', None),
493 (
494 'lets_encrypt/letsencryptauthorityx1.pem',
495 [
496 OrderedDict([
497 ('policy_identifier', '2.23.140.1.2.1'),
498 ('policy_qualifiers', None)
499 ]),
500 OrderedDict([
501 ('policy_identifier', '1.3.6.1.4.1.44947.1.1.1'),
502 (
503 'policy_qualifiers',
504 [
505 OrderedDict([
506 ('policy_qualifier_id', 'certification_practice_statement'),
507 ('qualifier', 'http://cps.root-x1.letsencrypt.org')
508 ])
509 ]
510 )
511 ])
512 ]
513 ),
514 (
515 'lets_encrypt/letsencryptauthorityx2.pem',
516 [
517 OrderedDict([
518 ('policy_identifier', '2.23.140.1.2.1'),
519 ('policy_qualifiers', None)
520 ]),
521 OrderedDict([
522 ('policy_identifier', '1.3.6.1.4.1.44947.1.1.1'),
523 (
524 'policy_qualifiers',
525 [
526 OrderedDict([
527 ('policy_qualifier_id', 'certification_practice_statement'),
528 ('qualifier', 'http://cps.root-x1.letsencrypt.org')
529 ])
530 ]
531 )
532 ])
533 ]
534 ),
535 (
536 'globalsign_example_keys/IssuingCA-der.cer',
537 [
538 OrderedDict([
539 ('policy_identifier', '1.3.6.1.4.1.4146.1.60'),
540 (
541 'policy_qualifiers',
542 [
543 OrderedDict([
544 ('policy_qualifier_id', 'certification_practice_statement'),
545 ('qualifier', 'https://www.globalsign.com/repository/')
546 ])
547 ]
548 )
549 ])
550 ]
551 ),
552 ('globalsign_example_keys/rootCA.cer', None),
553 (
554 'globalsign_example_keys/SSL1.cer',
555 [
556 OrderedDict([
557 ('policy_identifier', '1.3.6.1.4.1.4146.1.60'),
558 (
559 'policy_qualifiers',
560 [
561 OrderedDict([
562 ('policy_qualifier_id', 'certification_practice_statement'),
563 ('qualifier', 'https://www.globalsign.com/repository/')
564 ])
565 ]
566 )
567 ])
568 ]
569 ),
570 (
571 'globalsign_example_keys/SSL2.cer',
572 [
573 OrderedDict([
574 ('policy_identifier', '1.3.6.1.4.1.4146.1.60'),
575 (
576 'policy_qualifiers',
577 [
578 OrderedDict([
579 ('policy_qualifier_id', 'certification_practice_statement'),
580 ('qualifier', 'https://www.globalsign.com/repository/')
581 ])
582 ]
583 )
584 ])
585 ]
586 ),
587 (
588 'globalsign_example_keys/SSL3.cer',
589 [
590 OrderedDict([
591 ('policy_identifier', '1.3.6.1.4.1.4146.1.60'),
592 (
593 'policy_qualifiers',
594 [
595 OrderedDict([
596 ('policy_qualifier_id', 'certification_practice_statement'),
597 ('qualifier', 'https://www.globalsign.com/repository/')
598 ])
599 ]
600 )
601 ])
602 ]
603 ),
604 )
605
606 @data('certificate_policies_value_info')
607 def certificate_policies_value(self, relative_path, certificate_policies_value):
608 cert = self._load_cert(relative_path)
609 value = cert.certificate_policies_value
610 self.assertEqual(certificate_policies_value, value.native if value else None)
611
612 #pylint: disable=C0326
613 @staticmethod
614 def policy_mappings_value_info():
615 return (
616 ('keys/test-der.crt', None),
617 ('keys/test-inter-der.crt', None),
618 ('keys/test-third-der.crt', None),
619 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
620 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
621 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
622 ('geotrust_certs/codex.crt', None),
623 ('lets_encrypt/isrgrootx1.pem', None),
624 ('lets_encrypt/letsencryptauthorityx1.pem', None),
625 ('lets_encrypt/letsencryptauthorityx2.pem', None),
626 ('globalsign_example_keys/IssuingCA-der.cer', None),
627 ('globalsign_example_keys/rootCA.cer', None),
628 ('globalsign_example_keys/SSL1.cer', None),
629 ('globalsign_example_keys/SSL2.cer', None),
630 ('globalsign_example_keys/SSL3.cer', None),
631 )
632
633 @data('policy_mappings_value_info')
634 def policy_mappings_value(self, relative_path, policy_mappings_value):
635 cert = self._load_cert(relative_path)
636 value = cert.policy_mappings_value
637 self.assertEqual(policy_mappings_value, value.native if value else None)
638
639 #pylint: disable=C0326
640 @staticmethod
641 def authority_key_identifier_value_info():
642 return (
643 (
644 'keys/test-der.crt',
wbond08c60fa2015-07-13 23:02:13 -0400645 OrderedDict([
wbondaf1f5a82015-07-17 12:13:15 -0400646 ('key_identifier', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
647 (
648 'authority_cert_issuer',
649 [
650 OrderedDict([
651 ('country_name', 'US'),
652 ('state_or_province_name', 'Massachusetts'),
653 ('locality_name', 'Newbury'),
654 ('organization_name', 'Codex Non Sufficit LC'),
655 ('organizational_unit_name', 'Testing'),
656 ('common_name', 'Will Bond'),
657 ('email_address', 'will@codexns.io')
658 ])
659 ]
660 ),
661 ('authority_cert_serial_number', 13683582341504654466)
wbond08c60fa2015-07-13 23:02:13 -0400662 ])
wbondaf1f5a82015-07-17 12:13:15 -0400663 ),
664 (
665 'keys/test-inter-der.crt',
666 OrderedDict([
667 ('key_identifier', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
668 ('authority_cert_issuer', None),
669 ('authority_cert_serial_number', None)
670 ])
671 ),
672 (
673 'keys/test-third-der.crt',
674 OrderedDict([
675 ('key_identifier', b'\xd2\n\xfd.%\xd1\xb7!\xd7P~\xbb\xa4}\xbf4\xefR^\x02'),
676 ('authority_cert_issuer', None),
677 ('authority_cert_serial_number', None)
678 ])
679 ),
680 (
681 'geotrust_certs/GeoTrust_Universal_CA.crt',
682 OrderedDict([
683 ('key_identifier', b'\xda\xbb.\xaa\xb0\x0c\xb8\x88&Qt\\m\x03\xd3\xc0\xd8\x8fz\xd6'),
684 ('authority_cert_issuer', None),
685 ('authority_cert_serial_number', None)
686 ])
687 ),
688 (
689 'geotrust_certs/GeoTrust_Primary_CA.crt',
690 None
691 ),
692 (
693 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
694 OrderedDict([
695 ('key_identifier', b',\xd5PA\x97\x15\x8b\xf0\x8f6a[J\xfbk\xd9\x99\xc93\x92'),
696 ('authority_cert_issuer', None),
697 ('authority_cert_serial_number', None)
698 ])
699 ),
700 (
701 'geotrust_certs/codex.crt',
702 OrderedDict([
703 ('key_identifier', b'\xde\xcf\\P\xb7\xae\x02\x1f\x15\x17\xaa\x16\xe8\r\xb5(\x9djZ\xf3'),
704 ('authority_cert_issuer', None),
705 ('authority_cert_serial_number', None)
706 ])
707 ),
708 (
709 'lets_encrypt/isrgrootx1.pem',
710 None
711 ),
712 (
713 'lets_encrypt/letsencryptauthorityx1.pem',
714 OrderedDict([
715 ('key_identifier', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
716 ('authority_cert_issuer', None),
717 ('authority_cert_serial_number', None)
718 ])
719 ),
720 (
721 'lets_encrypt/letsencryptauthorityx2.pem',
722 OrderedDict([
723 ('key_identifier', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
724 ('authority_cert_issuer', None),
725 ('authority_cert_serial_number', None)
726 ])
727 ),
728 (
729 'globalsign_example_keys/IssuingCA-der.cer',
730 OrderedDict([
731 ('key_identifier', b'd|\\\xe1\xe0`8NH\x9f\x05\xbcUc~?\xaeM\xf7\x1e'),
732 ('authority_cert_issuer', None),
733 ('authority_cert_serial_number', None)
734 ])
735 ),
736 (
737 'globalsign_example_keys/rootCA.cer',
738 None
739 ),
740 (
741 'globalsign_example_keys/SSL1.cer',
742 OrderedDict([
743 ('key_identifier', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
744 ('authority_cert_issuer', None),
745 ('authority_cert_serial_number', None)
746 ])
747 ),
748 (
749 'globalsign_example_keys/SSL2.cer',
750 OrderedDict([
751 ('key_identifier', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
752 ('authority_cert_issuer', None),
753 ('authority_cert_serial_number', None)
754 ])
755 ),
756 (
757 'globalsign_example_keys/SSL3.cer',
758 OrderedDict([
759 ('key_identifier', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
760 ('authority_cert_issuer', None),
761 ('authority_cert_serial_number', None)
762 ])
763 ),
wbond08c60fa2015-07-13 23:02:13 -0400764 )
wbondaf1f5a82015-07-17 12:13:15 -0400765
766 @data('authority_key_identifier_value_info')
767 def authority_key_identifier_value(self, relative_path, authority_key_identifier_value):
768 cert = self._load_cert(relative_path)
769 value = cert.authority_key_identifier_value
770 self.assertEqual(authority_key_identifier_value, value.native if value else None)
771
772 #pylint: disable=C0326
773 @staticmethod
774 def policy_constraints_value_info():
775 return (
776 ('keys/test-der.crt', None),
777 ('keys/test-inter-der.crt', None),
778 ('keys/test-third-der.crt', None),
779 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
780 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
781 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
782 ('geotrust_certs/codex.crt', None),
783 ('lets_encrypt/isrgrootx1.pem', None),
784 ('lets_encrypt/letsencryptauthorityx1.pem', None),
785 ('lets_encrypt/letsencryptauthorityx2.pem', None),
786 ('globalsign_example_keys/IssuingCA-der.cer', None),
787 ('globalsign_example_keys/rootCA.cer', None),
788 ('globalsign_example_keys/SSL1.cer', None),
789 ('globalsign_example_keys/SSL2.cer', None),
790 ('globalsign_example_keys/SSL3.cer', None),
791 )
792
793 @data('policy_constraints_value_info')
794 def policy_constraints_value(self, relative_path, policy_constraints_value):
795 cert = self._load_cert(relative_path)
796 value = cert.policy_constraints_value
797 self.assertEqual(policy_constraints_value, value.native if value else None)
798
799 #pylint: disable=C0326
800 @staticmethod
801 def extended_key_usage_value_info():
802 return (
803 ('keys/test-der.crt', None),
804 ('keys/test-inter-der.crt', None),
805 ('keys/test-third-der.crt', None),
806 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
807 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
808 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
809 ('geotrust_certs/codex.crt', ['server_auth', 'client_auth']),
810 ('lets_encrypt/isrgrootx1.pem', None),
811 ('lets_encrypt/letsencryptauthorityx1.pem', None),
812 ('lets_encrypt/letsencryptauthorityx2.pem', None),
813 ('globalsign_example_keys/IssuingCA-der.cer', None),
814 ('globalsign_example_keys/rootCA.cer', None),
815 ('globalsign_example_keys/SSL1.cer', ['server_auth', 'client_auth']),
816 ('globalsign_example_keys/SSL2.cer', ['server_auth', 'client_auth']),
817 ('globalsign_example_keys/SSL3.cer', ['server_auth', 'client_auth']),
818 )
819
820 @data('extended_key_usage_value_info')
821 def extended_key_usage_value(self, relative_path, extended_key_usage_value):
822 cert = self._load_cert(relative_path)
823 value = cert.extended_key_usage_value
824 self.assertEqual(extended_key_usage_value, value.native if value else None)
825
826 #pylint: disable=C0326
827 @staticmethod
828 def authority_information_access_value_info():
829 return (
830 ('keys/test-der.crt', None),
831 ('keys/test-inter-der.crt', None),
832 ('keys/test-third-der.crt', None),
833 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
834 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
835 (
836 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
837 [
838 OrderedDict([
839 ('access_method', 'ocsp'),
840 ('access_location', 'http://g2.symcb.com')
841 ])
842 ]
843 ),
844 (
845 'geotrust_certs/codex.crt',
846 [
847 OrderedDict([
848 ('access_method', 'ocsp'),
849 ('access_location', 'http://gm.symcd.com')
850 ]),
851 OrderedDict([
852 ('access_method', 'ca_issuers'),
853 ('access_location', 'http://gm.symcb.com/gm.crt')
854 ]),
855 ]
856 ),
857 ('lets_encrypt/isrgrootx1.pem', None),
858 (
859 'lets_encrypt/letsencryptauthorityx1.pem',
860 [
861 OrderedDict([
862 ('access_method', 'ocsp'),
863 ('access_location', 'http://ocsp.root-x1.letsencrypt.org/')
864 ]),
865 OrderedDict([
866 ('access_method', 'ca_issuers'),
867 ('access_location', 'http://cert.root-x1.letsencrypt.org/')
868 ])
869 ]
870 ),
871 (
872 'lets_encrypt/letsencryptauthorityx2.pem',
873 [
874 OrderedDict([
875 ('access_method', 'ocsp'),
876 ('access_location', 'http://ocsp.root-x1.letsencrypt.org/')
877 ]),
878 OrderedDict([
879 ('access_method', 'ca_issuers'),
880 ('access_location', 'http://cert.root-x1.letsencrypt.org/')
881 ])
882 ]
883 ),
884 ('globalsign_example_keys/IssuingCA-der.cer', None),
885 ('globalsign_example_keys/rootCA.cer', None),
886 (
887 'globalsign_example_keys/SSL1.cer',
888 [
889 OrderedDict([
890 ('access_method', 'ocsp'),
891 ('access_location', 'http://ocsp.exampleovca.com/')
892 ]),
893 OrderedDict([
894 ('access_method', 'ca_issuers'),
895 ('access_location', 'http://secure.globalsign.com/cacert/trustrootcatg2.crt')
896 ])
897 ]
898 ),
899 (
900 'globalsign_example_keys/SSL2.cer',
901 [
902 OrderedDict([
903 ('access_method', 'ocsp'),
904 ('access_location', 'http://ocsp.exampleovca.com/')
905 ]),
906 OrderedDict([
907 ('access_method', 'ca_issuers'),
908 ('access_location', 'http://secure.globalsign.com/cacert/trustrootcatg2.crt')
909 ])
910 ]
911 ),
912 (
913 'globalsign_example_keys/SSL3.cer',
914 [
915 OrderedDict([
916 ('access_method', 'ocsp'),
917 ('access_location', 'http://ocsp.exampleovca.com/')
918 ]),
919 OrderedDict([
920 ('access_method', 'ca_issuers'),
921 ('access_location', 'http://secure.globalsign.com/cacert/trustrootcatg2.crt')
922 ])
923 ]
924 ),
925 )
926
927 @data('authority_information_access_value_info')
928 def authority_information_access_value(self, relative_path, authority_information_access_value):
929 cert = self._load_cert(relative_path)
930 value = cert.authority_information_access_value
931 self.assertEqual(authority_information_access_value, value.native if value else None)
932
933 #pylint: disable=C0326
934 @staticmethod
935 def ocsp_no_check_value_info():
936 return (
937 ('keys/test-der.crt', None),
938 ('keys/test-inter-der.crt', None),
939 ('keys/test-third-der.crt', None),
940 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
941 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
942 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
943 ('geotrust_certs/codex.crt', None),
944 ('lets_encrypt/isrgrootx1.pem', None),
945 ('lets_encrypt/letsencryptauthorityx1.pem', None),
946 ('lets_encrypt/letsencryptauthorityx2.pem', None),
947 ('globalsign_example_keys/IssuingCA-der.cer', None),
948 ('globalsign_example_keys/rootCA.cer', None),
949 ('globalsign_example_keys/SSL1.cer', None),
950 ('globalsign_example_keys/SSL2.cer', None),
951 ('globalsign_example_keys/SSL3.cer', None),
952 )
953
954 @data('ocsp_no_check_value_info')
955 def ocsp_no_check_value(self, relative_path, ocsp_no_check_value):
956 cert = self._load_cert(relative_path)
957 value = cert.ocsp_no_check_value
958 self.assertEqual(ocsp_no_check_value, value.native if value else None)
959
960 #pylint: disable=C0326
961 @staticmethod
962 def serial_number_info():
963 return (
964 ('keys/test-der.crt', 13683582341504654466),
965 ('keys/test-inter-der.crt', 1590137),
966 ('keys/test-third-der.crt', 2474902313),
967 ('geotrust_certs/GeoTrust_Universal_CA.crt', 1),
968 ('geotrust_certs/GeoTrust_Primary_CA.crt', 32798226551256963324313806436981982369),
969 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', 146934555852773531829332059263122711876),
970 ('geotrust_certs/codex.crt', 130338219198307073574879940486642352162),
971 ('lets_encrypt/isrgrootx1.pem', 172886928669790476064670243504169061120),
972 ('lets_encrypt/letsencryptauthorityx1.pem', 307817870430047279283060309415759825539),
973 ('lets_encrypt/letsencryptauthorityx2.pem', 199666138109676817050168330923544141416),
974 ('globalsign_example_keys/IssuingCA-der.cer', 43543335419752),
975 ('globalsign_example_keys/rootCA.cer', 342514332211132),
976 ('globalsign_example_keys/SSL1.cer', 425155524522),
977 ('globalsign_example_keys/SSL2.cer', 425155524522),
978 ('globalsign_example_keys/SSL3.cer', 425155524522),
979 )
980
981 @data('serial_number_info')
982 def serial_number(self, relative_path, serial_number):
983 cert = self._load_cert(relative_path)
984 self.assertEqual(serial_number, cert.serial_number)
985
986 #pylint: disable=C0326
987 @staticmethod
988 def key_identifier_info():
989 return (
990 ('keys/test-der.crt', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
991 ('keys/test-inter-der.crt', b'\xd2\n\xfd.%\xd1\xb7!\xd7P~\xbb\xa4}\xbf4\xefR^\x02'),
992 ('keys/test-third-der.crt', b'D8\xe0\xe0&\x85\xbf\x98\x86\xdc\x1b\xe1\x1d\xf520\xbe\xab\xac\r'),
993 ('geotrust_certs/GeoTrust_Universal_CA.crt', b'\xda\xbb.\xaa\xb0\x0c\xb8\x88&Qt\\m\x03\xd3\xc0\xd8\x8fz\xd6'),
994 ('geotrust_certs/GeoTrust_Primary_CA.crt', b',\xd5PA\x97\x15\x8b\xf0\x8f6a[J\xfbk\xd9\x99\xc93\x92'),
995 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', b'\xde\xcf\\P\xb7\xae\x02\x1f\x15\x17\xaa\x16\xe8\r\xb5(\x9djZ\xf3'),
996 ('geotrust_certs/codex.crt', None),
997 ('lets_encrypt/isrgrootx1.pem', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
998 ('lets_encrypt/letsencryptauthorityx1.pem', b'\xa8Jjc\x04}\xdd\xba\xe6\xd19\xb7\xa6Ee\xef\xf3\xa8\xec\xa1'),
999 ('lets_encrypt/letsencryptauthorityx2.pem', b'\xc5\xb1\xabNL\xb1\xcdd0\x93~\xc1\x84\x99\x05\xab\xe6\x03\xe2%'),
1000 ('globalsign_example_keys/IssuingCA-der.cer', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
1001 ('globalsign_example_keys/rootCA.cer', b'd|\\\xe1\xe0`8NH\x9f\x05\xbcUc~?\xaeM\xf7\x1e'),
1002 ('globalsign_example_keys/SSL1.cer', b'\x94a\x04\x92\x04L\xe6\xffh\xa8\x96\xafy\xd2\xf32\x84\xae[\xcf'),
1003 ('globalsign_example_keys/SSL2.cer', b'\xd2\xb7\x15\x7fd0\x07(p\x83\xca(\xfa\x88\x96\xde\x9e\xfc\x8a='),
1004 ('globalsign_example_keys/SSL3.cer', b'G\xde\xa4\xe7\xea`\xe7\xee6\xc8\xf1\xd5\xb0F\x07\x07\x9eBh\xce'),
1005 )
1006
1007 @data('key_identifier_info')
1008 def key_identifier(self, relative_path, key_identifier):
1009 cert = self._load_cert(relative_path)
1010 self.assertEqual(key_identifier, cert.key_identifier)
1011
1012 #pylint: disable=C0326
1013 @staticmethod
1014 def issuer_serial_info():
1015 return (
1016 ('keys/test-der.crt', b'\xdd\x8a\x19x\xae`\x19=\xa7\xf8\x00\xb9\xfbx\xf8\xedu\xb8!\xf8\x8c\xdb\x1f\x99\'7w\x93\xb4\xa4\'\xa0:13683582341504654466'),
1017 ('keys/test-inter-der.crt', b'\xdd\x8a\x19x\xae`\x19=\xa7\xf8\x00\xb9\xfbx\xf8\xedu\xb8!\xf8\x8c\xdb\x1f\x99\'7w\x93\xb4\xa4\'\xa0:1590137'),
1018 ('keys/test-third-der.crt', b'\xed{\x9b\xbf\x9b\xdbd\xa4\xea\xf2#+H\x96\xcd\x80\x99\xf6\xecCM\x94\x07\x02\xe2\x18\xf3\x83\x8c8%\x01:2474902313'),
1019 ('geotrust_certs/GeoTrust_Universal_CA.crt', b'\xa1\x848\xf2\xe5w\xee\xec\xce\xfefJC+\xdf\x97\x7f\xd2Y\xe3\xdc\xa0D7~\x07\xd9\x9dzL@g:1'),
1020 ('geotrust_certs/GeoTrust_Primary_CA.crt', b'\xdcg\x0c\x80\x03\xb3D\xa0v\xe2\xee\xec\x8b\xd6\x82\x01\xf0\x13\x0cwT\xb4\x8f\x80\x0eT\x9d\xbf\xbf\xa4\x11\x80:32798226551256963324313806436981982369'),
1021 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', b'\xdcg\x0c\x80\x03\xb3D\xa0v\xe2\xee\xec\x8b\xd6\x82\x01\xf0\x13\x0cwT\xb4\x8f\x80\x0eT\x9d\xbf\xbf\xa4\x11\x80:146934555852773531829332059263122711876'),
1022 ('geotrust_certs/codex.crt', b'x\x12\xe0\x15\x00d;\xc3\xb9/\xf6\x13\n\xd8\xe2\xddY\xf7\xaf*=C\x01<\x86\xf5\x9f_\xab;e\xd1:130338219198307073574879940486642352162'),
1023 ('lets_encrypt/isrgrootx1.pem', b'\xf6\xdb/\xbd\x9d\xd8]\x92Y\xdd\xb3\xc6\xde}{/\xec?>\x0c\xef\x17a\xbc\xbf3 W\x1e-0\xf8:172886928669790476064670243504169061120'),
1024 ('lets_encrypt/letsencryptauthorityx1.pem', b'\xf6\xdb/\xbd\x9d\xd8]\x92Y\xdd\xb3\xc6\xde}{/\xec?>\x0c\xef\x17a\xbc\xbf3 W\x1e-0\xf8:307817870430047279283060309415759825539'),
1025 ('lets_encrypt/letsencryptauthorityx2.pem', b'\xf6\xdb/\xbd\x9d\xd8]\x92Y\xdd\xb3\xc6\xde}{/\xec?>\x0c\xef\x17a\xbc\xbf3 W\x1e-0\xf8:199666138109676817050168330923544141416'),
1026 ('globalsign_example_keys/IssuingCA-der.cer', b'\xd2\xe7\xca\x10\xc1\x91\x92Y^A\x11\xd3Rz\xd5\x93\x19wk\x11\xef\xaa\x9c\xad\x10\x8ak\x8a\x08-\x0c\xff:43543335419752'),
1027 ('globalsign_example_keys/rootCA.cer', b'\xd2\xe7\xca\x10\xc1\x91\x92Y^A\x11\xd3Rz\xd5\x93\x19wk\x11\xef\xaa\x9c\xad\x10\x8ak\x8a\x08-\x0c\xff:342514332211132'),
1028 ('globalsign_example_keys/SSL1.cer', b'_\xc0S\xb1\xeb}\xe3\x8e\xe4{\xdb\xd7\xe2\xd9}=3\x97|\x0c\x1e\xecz\xcc\x92u\x1f\xf0\x1d\xbc\x9f\xe4:425155524522'),
1029 ('globalsign_example_keys/SSL2.cer', b'_\xc0S\xb1\xeb}\xe3\x8e\xe4{\xdb\xd7\xe2\xd9}=3\x97|\x0c\x1e\xecz\xcc\x92u\x1f\xf0\x1d\xbc\x9f\xe4:425155524522'),
1030 ('globalsign_example_keys/SSL3.cer', b'_\xc0S\xb1\xeb}\xe3\x8e\xe4{\xdb\xd7\xe2\xd9}=3\x97|\x0c\x1e\xecz\xcc\x92u\x1f\xf0\x1d\xbc\x9f\xe4:425155524522'),
1031 )
1032
1033 @data('issuer_serial_info')
1034 def issuer_serial(self, relative_path, issuer_serial):
1035 cert = self._load_cert(relative_path)
1036 self.assertEqual(issuer_serial, cert.issuer_serial)
1037
1038 #pylint: disable=C0326
1039 @staticmethod
1040 def authority_key_identifier_info():
1041 return (
1042 ('keys/test-der.crt', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
1043 ('keys/test-inter-der.crt', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'),
1044 ('keys/test-third-der.crt', b'\xd2\n\xfd.%\xd1\xb7!\xd7P~\xbb\xa4}\xbf4\xefR^\x02'),
1045 ('geotrust_certs/GeoTrust_Universal_CA.crt', b'\xda\xbb.\xaa\xb0\x0c\xb8\x88&Qt\\m\x03\xd3\xc0\xd8\x8fz\xd6'),
1046 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
1047 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', b',\xd5PA\x97\x15\x8b\xf0\x8f6a[J\xfbk\xd9\x99\xc93\x92'),
1048 ('geotrust_certs/codex.crt', b'\xde\xcf\\P\xb7\xae\x02\x1f\x15\x17\xaa\x16\xe8\r\xb5(\x9djZ\xf3'),
1049 ('lets_encrypt/isrgrootx1.pem', None),
1050 ('lets_encrypt/letsencryptauthorityx1.pem', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
1051 ('lets_encrypt/letsencryptauthorityx2.pem', b'y\xb4Y\xe6{\xb6\xe5\xe4\x01s\x80\x08\x88\xc8\x1aX\xf6\xe9\x9bn'),
1052 ('globalsign_example_keys/IssuingCA-der.cer', b'd|\\\xe1\xe0`8NH\x9f\x05\xbcUc~?\xaeM\xf7\x1e'),
1053 ('globalsign_example_keys/rootCA.cer', None),
1054 ('globalsign_example_keys/SSL1.cer', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
1055 ('globalsign_example_keys/SSL2.cer', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
1056 ('globalsign_example_keys/SSL3.cer', b"'\xf8/\xe9]\xd7\r\xf4\xa8\xea\x87\x99=\xfd\x8e\xb3\x9e@\xd0\x91"),
1057 )
1058
1059 @data('authority_key_identifier_info')
1060 def authority_key_identifier(self, relative_path, authority_key_identifier):
1061 cert = self._load_cert(relative_path)
1062 self.assertEqual(authority_key_identifier, cert.authority_key_identifier)
1063
1064 #pylint: disable=C0326
1065 @staticmethod
1066 def authority_issuer_serial_info():
1067 return (
1068 ('keys/test-der.crt', b'\xdd\x8a\x19x\xae`\x19=\xa7\xf8\x00\xb9\xfbx\xf8\xedu\xb8!\xf8\x8c\xdb\x1f\x99\'7w\x93\xb4\xa4\'\xa0:13683582341504654466'),
1069 ('keys/test-inter-der.crt', None),
1070 ('keys/test-third-der.crt', None),
1071 ('geotrust_certs/GeoTrust_Universal_CA.crt', None),
1072 ('geotrust_certs/GeoTrust_Primary_CA.crt', None),
1073 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', None),
1074 ('geotrust_certs/codex.crt', None),
1075 ('lets_encrypt/isrgrootx1.pem', None),
1076 ('lets_encrypt/letsencryptauthorityx1.pem', None),
1077 ('lets_encrypt/letsencryptauthorityx2.pem', None),
1078 ('globalsign_example_keys/IssuingCA-der.cer', None),
1079 ('globalsign_example_keys/rootCA.cer', None),
1080 ('globalsign_example_keys/SSL1.cer', None),
1081 ('globalsign_example_keys/SSL2.cer', None),
1082 ('globalsign_example_keys/SSL3.cer', None),
1083 )
1084
1085 @data('authority_issuer_serial_info')
1086 def authority_issuer_serial(self, relative_path, authority_issuer_serial):
1087 cert = self._load_cert(relative_path)
1088 self.assertEqual(authority_issuer_serial, cert.authority_issuer_serial)
1089
1090 #pylint: disable=C0326
1091 @staticmethod
1092 def ocsp_urls_info():
1093 return (
1094 ('keys/test-der.crt', []),
1095 ('keys/test-inter-der.crt', []),
1096 ('keys/test-third-der.crt', []),
1097 ('geotrust_certs/GeoTrust_Universal_CA.crt', []),
1098 ('geotrust_certs/GeoTrust_Primary_CA.crt', []),
1099 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', ['http://g2.symcb.com']),
1100 ('geotrust_certs/codex.crt', ['http://gm.symcd.com']),
1101 ('lets_encrypt/isrgrootx1.pem', []),
1102 ('lets_encrypt/letsencryptauthorityx1.pem', ['http://ocsp.root-x1.letsencrypt.org/']),
1103 ('lets_encrypt/letsencryptauthorityx2.pem', ['http://ocsp.root-x1.letsencrypt.org/']),
1104 ('globalsign_example_keys/IssuingCA-der.cer', []),
1105 ('globalsign_example_keys/rootCA.cer', []),
1106 ('globalsign_example_keys/SSL1.cer', ['http://ocsp.exampleovca.com/']),
1107 ('globalsign_example_keys/SSL2.cer', ['http://ocsp.exampleovca.com/']),
1108 ('globalsign_example_keys/SSL3.cer', ['http://ocsp.exampleovca.com/']),
1109 )
1110
1111 @data('ocsp_urls_info')
1112 def ocsp_urls(self, relative_path, ocsp_url):
1113 cert = self._load_cert(relative_path)
1114 self.assertEqual(ocsp_url, cert.ocsp_urls)
1115
1116 #pylint: disable=C0326
1117 @staticmethod
wbond6888bc62015-07-21 15:05:59 -04001118 def crl_distribution_points_info():
wbondaf1f5a82015-07-17 12:13:15 -04001119 return (
1120 ('keys/test-der.crt', []),
1121 ('keys/test-inter-der.crt', []),
1122 ('keys/test-third-der.crt', []),
1123 ('geotrust_certs/GeoTrust_Universal_CA.crt', []),
1124 ('geotrust_certs/GeoTrust_Primary_CA.crt', []),
wbond6888bc62015-07-21 15:05:59 -04001125 (
1126 'geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt',
1127 [
1128 OrderedDict([
1129 ('distribution_point', ['http://g1.symcb.com/GeoTrustPCA.crl']),
1130 ('reasons', None),
1131 ('crl_issuer', None)
1132 ])
1133 ]
1134 ),
1135 (
1136 'geotrust_certs/codex.crt',
1137 [
1138 OrderedDict([
1139 ('distribution_point', ['http://gm.symcb.com/gm.crl']),
1140 ('reasons', None),
1141 ('crl_issuer', None)
1142 ])
1143 ]
1144 ),
wbondaf1f5a82015-07-17 12:13:15 -04001145 ('lets_encrypt/isrgrootx1.pem', []),
wbond6888bc62015-07-21 15:05:59 -04001146 (
1147 'lets_encrypt/letsencryptauthorityx1.pem',
1148 [
1149 OrderedDict([
1150 ('distribution_point', ['http://crl.root-x1.letsencrypt.org']),
1151 ('reasons', None),
1152 ('crl_issuer', None)
1153 ])
1154 ]
1155 ),
1156 (
1157 'lets_encrypt/letsencryptauthorityx2.pem',
1158 [
1159 OrderedDict([
1160 ('distribution_point', ['http://crl.root-x1.letsencrypt.org']),
1161 ('reasons', None),
1162 ('crl_issuer', None)
1163 ])
1164 ]
1165 ),
1166 (
1167 'globalsign_example_keys/IssuingCA-der.cer',
1168 [
1169 OrderedDict([
1170 ('distribution_point', ['http://crl.globalsign.com/gs/trustrootcatg2.crl']),
1171 ('reasons', None),
1172 ('crl_issuer', None)
1173 ])
1174 ]
1175 ),
1176 (
1177 'globalsign_example_keys/rootCA.cer',
1178 [
1179 OrderedDict([
1180 ('distribution_point', ['http://crl.globalsign.com/gs/trustrootcatg2.crl']),
1181 ('reasons', None),
1182 ('crl_issuer', None)
1183 ])
1184 ]
1185 ),
wbondaf1f5a82015-07-17 12:13:15 -04001186 ('globalsign_example_keys/SSL1.cer', []),
1187 ('globalsign_example_keys/SSL2.cer', []),
1188 ('globalsign_example_keys/SSL3.cer', []),
1189 )
1190
wbond6888bc62015-07-21 15:05:59 -04001191 @data('crl_distribution_points_info')
1192 def crl_distribution_points(self, relative_path, crl_distribution_point):
wbondaf1f5a82015-07-17 12:13:15 -04001193 cert = self._load_cert(relative_path)
wbond6888bc62015-07-21 15:05:59 -04001194 points = [point.native for point in cert.crl_distribution_points]
1195 self.assertEqual(crl_distribution_point, points)
wbondaf1f5a82015-07-17 12:13:15 -04001196
1197 #pylint: disable=C0326
1198 @staticmethod
1199 def valid_domains_info():
1200 return (
1201 ('keys/test-der.crt', []),
1202 ('keys/test-inter-der.crt', []),
1203 ('keys/test-third-der.crt', []),
1204 ('geotrust_certs/GeoTrust_Universal_CA.crt', []),
1205 ('geotrust_certs/GeoTrust_Primary_CA.crt', []),
1206 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', []),
1207 ('geotrust_certs/codex.crt', ['codexns.io', 'dev.codexns.io', 'rc.codexns.io', 'packagecontrol.io', 'wbond.net']),
1208 ('lets_encrypt/isrgrootx1.pem', []),
1209 ('lets_encrypt/letsencryptauthorityx1.pem', []),
1210 ('lets_encrypt/letsencryptauthorityx2.pem', []),
1211 ('globalsign_example_keys/IssuingCA-der.cer', []),
1212 ('globalsign_example_keys/rootCA.cer', []),
1213 ('globalsign_example_keys/SSL1.cer', ['anything.example.com']),
1214 ('globalsign_example_keys/SSL2.cer', ['*.google.com', 'anything.example.com']),
1215 ('globalsign_example_keys/SSL3.cer', ['*.google.com']),
1216 )
1217
1218 @data('valid_domains_info')
1219 def valid_domains(self, relative_path, valid_domains):
1220 cert = self._load_cert(relative_path)
1221 self.assertEqual(valid_domains, cert.valid_domains)
1222
1223 #pylint: disable=C0326
1224 @staticmethod
1225 def valid_ips_info():
1226 return (
1227 ('keys/test-der.crt', []),
1228 ('keys/test-inter-der.crt', []),
1229 ('keys/test-third-der.crt', []),
1230 ('geotrust_certs/GeoTrust_Universal_CA.crt', []),
1231 ('geotrust_certs/GeoTrust_Primary_CA.crt', []),
1232 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', []),
1233 ('geotrust_certs/codex.crt', []),
1234 ('lets_encrypt/isrgrootx1.pem', []),
1235 ('lets_encrypt/letsencryptauthorityx1.pem', []),
1236 ('lets_encrypt/letsencryptauthorityx2.pem', []),
1237 ('globalsign_example_keys/IssuingCA-der.cer', []),
1238 ('globalsign_example_keys/rootCA.cer', []),
1239 ('globalsign_example_keys/SSL1.cer', []),
1240 ('globalsign_example_keys/SSL2.cer', []),
1241 ('globalsign_example_keys/SSL3.cer', []),
1242 )
1243
1244 @data('valid_ips_info')
1245 def valid_ips(self, relative_path, crl_url):
1246 cert = self._load_cert(relative_path)
1247 self.assertEqual(crl_url, cert.valid_ips)
wbond8bb77d02015-07-13 17:44:29 -04001248
wbond9a7a0992015-07-23 09:59:06 -04001249 #pylint: disable=C0326
1250 @staticmethod
1251 def self_issued_info():
1252 return (
1253 ('keys/test-der.crt', True),
1254 ('keys/test-inter-der.crt', False),
1255 ('keys/test-third-der.crt', False),
1256 ('geotrust_certs/GeoTrust_Universal_CA.crt', True),
1257 ('geotrust_certs/GeoTrust_Primary_CA.crt', True),
1258 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', False),
1259 ('geotrust_certs/codex.crt', False),
1260 ('lets_encrypt/isrgrootx1.pem', True),
1261 ('lets_encrypt/letsencryptauthorityx1.pem', False),
1262 ('lets_encrypt/letsencryptauthorityx2.pem', False),
1263 ('globalsign_example_keys/IssuingCA-der.cer', False),
1264 ('globalsign_example_keys/rootCA.cer', True),
1265 ('globalsign_example_keys/SSL1.cer', False),
1266 ('globalsign_example_keys/SSL2.cer', False),
1267 ('globalsign_example_keys/SSL3.cer', False),
1268 )
1269
1270 @data('self_issued_info')
1271 def self_issued(self, relative_path, self_issued):
1272 cert = self._load_cert(relative_path)
1273 self.assertEqual(self_issued, cert.self_issued)
1274
1275 #pylint: disable=C0326
1276 @staticmethod
1277 def self_signed_info():
1278 return (
1279 ('keys/test-der.crt', 'yes'),
1280 ('keys/test-inter-der.crt', 'no'),
1281 ('keys/test-third-der.crt', 'no'),
1282 ('geotrust_certs/GeoTrust_Universal_CA.crt', 'yes'),
1283 ('geotrust_certs/GeoTrust_Primary_CA.crt', 'yes'),
1284 ('geotrust_certs/GeoTrust_EV_SSL_CA_-_G4.crt', 'no'),
1285 ('geotrust_certs/codex.crt', 'no'),
1286 ('lets_encrypt/isrgrootx1.pem', 'yes'),
1287 ('lets_encrypt/letsencryptauthorityx1.pem', 'no'),
1288 ('lets_encrypt/letsencryptauthorityx2.pem', 'no'),
1289 ('globalsign_example_keys/IssuingCA-der.cer', 'no'),
1290 ('globalsign_example_keys/rootCA.cer', 'yes'),
1291 ('globalsign_example_keys/SSL1.cer', 'no'),
1292 ('globalsign_example_keys/SSL2.cer', 'no'),
1293 ('globalsign_example_keys/SSL3.cer', 'no'),
1294 )
1295
1296 @data('self_signed_info')
1297 def self_signed(self, relative_path, self_signed):
1298 cert = self._load_cert(relative_path)
1299 self.assertEqual(self_signed, cert.self_signed)
1300
wbonde91513e2015-06-03 14:52:18 -04001301 def test_parse_certificate(self):
wbondaf1f5a82015-07-17 12:13:15 -04001302 cert = self._load_cert('keys/test-der.crt')
wbonde91513e2015-06-03 14:52:18 -04001303
1304 tbs_certificate = cert['tbs_certificate']
1305 signature = tbs_certificate['signature']
1306 issuer = tbs_certificate['issuer']
1307 validity = tbs_certificate['validity']
1308 subject = tbs_certificate['subject']
1309 subject_public_key_info = tbs_certificate['subject_public_key_info']
1310 subject_public_key_algorithm = subject_public_key_info['algorithm']
1311 subject_public_key = subject_public_key_info['public_key'].parsed
1312 extensions = tbs_certificate['extensions']
1313
1314 self.assertEqual(
1315 'v3',
1316 tbs_certificate['version'].native
1317 )
1318 self.assertEqual(
1319 13683582341504654466,
1320 tbs_certificate['serial_number'].native
1321 )
1322 self.assertEqual(
1323 'sha256_rsa',
1324 signature['algorithm'].native
1325 )
1326 self.assertEqual(
1327 None,
1328 signature['parameters'].native
1329 )
1330 self.assertEqual(
1331 OrderedDict([
1332 ('country_name', 'US'),
1333 ('state_or_province_name', 'Massachusetts'),
1334 ('locality_name', 'Newbury'),
1335 ('organization_name', 'Codex Non Sufficit LC'),
1336 ('organizational_unit_name', 'Testing'),
1337 ('common_name', 'Will Bond'),
1338 ('email_address', 'will@codexns.io'),
1339 ]),
1340 issuer.native
1341 )
1342 self.assertEqual(
1343 datetime(2015, 5, 6, 14, 37, 16, tzinfo=core.timezone.utc),
1344 validity['not_before'].native
1345 )
1346 self.assertEqual(
1347 datetime(2025, 5, 3, 14, 37, 16, tzinfo=core.timezone.utc),
1348 validity['not_after'].native
1349 )
1350 self.assertEqual(
1351 OrderedDict([
1352 ('country_name', 'US'),
1353 ('state_or_province_name', 'Massachusetts'),
1354 ('locality_name', 'Newbury'),
1355 ('organization_name', 'Codex Non Sufficit LC'),
1356 ('organizational_unit_name', 'Testing'),
1357 ('common_name', 'Will Bond'),
1358 ('email_address', 'will@codexns.io'),
1359 ]),
1360 subject.native
1361 )
1362 self.assertEqual(
1363 'rsa',
1364 subject_public_key_algorithm['algorithm'].native
1365 )
1366 self.assertEqual(
1367 None,
1368 subject_public_key_algorithm['parameters'].native
1369 )
1370 self.assertEqual(
1371 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007,
1372 subject_public_key['modulus'].native
1373 )
1374 self.assertEqual(
1375 65537,
1376 subject_public_key['public_exponent'].native
1377 )
1378 self.assertEqual(
1379 None,
1380 tbs_certificate['issuer_unique_id'].native
1381 )
1382 self.assertIsInstance(
1383 tbs_certificate['issuer_unique_id'],
1384 core.NoValue
1385 )
1386 self.assertEqual(
1387 None,
1388 tbs_certificate['subject_unique_id'].native
1389 )
1390 self.assertIsInstance(
1391 tbs_certificate['subject_unique_id'],
1392 core.NoValue
1393 )
1394
1395 self.maxDiff = None
1396 for extension in extensions:
1397 self.assertIsInstance(
1398 extension,
1399 x509.Extension
1400 )
1401 self.assertEqual(
1402 [
1403 OrderedDict([
1404 ('extn_id', 'key_identifier'),
1405 ('critical', False),
1406 ('extn_value', b'\xBE\x42\x85\x3D\xCC\xFF\xE3\xF9\x28\x02\x8F\x7E\x58\x56\xB4\xFD\x03\x5C\xEA\x4B'),
1407 ]),
1408 OrderedDict([
1409 ('extn_id', 'authority_key_identifier'),
1410 ('critical', False),
1411 (
1412 'extn_value',
1413 OrderedDict([
1414 ('key_identifier', b'\xBE\x42\x85\x3D\xCC\xFF\xE3\xF9\x28\x02\x8F\x7E\x58\x56\xB4\xFD\x03\x5C\xEA\x4B'),
1415 (
1416 'authority_cert_issuer',
1417 [
1418 OrderedDict([
1419 ('country_name', 'US'),
1420 ('state_or_province_name', 'Massachusetts'),
1421 ('locality_name', 'Newbury'),
1422 ('organization_name', 'Codex Non Sufficit LC'),
1423 ('organizational_unit_name', 'Testing'),
1424 ('common_name', 'Will Bond'),
1425 ('email_address', 'will@codexns.io'),
1426 ])
1427 ]
1428 ),
1429 ('authority_cert_serial_number', 13683582341504654466),
1430 ])
1431 ),
1432 ]),
1433 OrderedDict([
1434 ('extn_id', 'basic_constraints'),
1435 ('critical', False),
1436 (
1437 'extn_value',
1438 OrderedDict([
1439 ('ca', True),
1440 ('path_len_constraint', None)
1441 ])
1442 ),
1443 ]),
1444 ],
1445 extensions.native
1446 )
1447
1448 def test_parse_dsa_certificate(self):
wbondaf1f5a82015-07-17 12:13:15 -04001449 cert = self._load_cert('keys/test-dsa-der.crt')
wbonde91513e2015-06-03 14:52:18 -04001450
1451 tbs_certificate = cert['tbs_certificate']
1452 signature = tbs_certificate['signature']
1453 issuer = tbs_certificate['issuer']
1454 validity = tbs_certificate['validity']
1455 subject = tbs_certificate['subject']
1456 subject_public_key_info = tbs_certificate['subject_public_key_info']
1457 subject_public_key_algorithm = subject_public_key_info['algorithm']
1458 subject_public_key = subject_public_key_info['public_key'].parsed
1459 extensions = tbs_certificate['extensions']
1460
1461 self.assertEqual(
1462 'v3',
1463 tbs_certificate['version'].native
1464 )
1465 self.assertEqual(
1466 14308214745771946523,
1467 tbs_certificate['serial_number'].native
1468 )
1469 self.assertEqual(
1470 'sha256_dsa',
1471 signature['algorithm'].native
1472 )
1473 self.assertEqual(
1474 None,
1475 signature['parameters'].native
1476 )
1477 self.assertEqual(
1478 OrderedDict([
1479 ('country_name', 'US'),
1480 ('state_or_province_name', 'Massachusetts'),
1481 ('locality_name', 'Newbury'),
1482 ('organization_name', 'Codex Non Sufficit LC'),
1483 ('organizational_unit_name', 'Testing'),
1484 ('common_name', 'Will Bond'),
1485 ('email_address', 'will@codexns.io'),
1486 ]),
1487 issuer.native
1488 )
1489 self.assertEqual(
1490 datetime(2015, 5, 20, 13, 9, 2, tzinfo=core.timezone.utc),
1491 validity['not_before'].native
1492 )
1493 self.assertEqual(
1494 datetime(2025, 5, 17, 13, 9, 2, tzinfo=core.timezone.utc),
1495 validity['not_after'].native
1496 )
1497 self.assertEqual(
1498 OrderedDict([
1499 ('country_name', 'US'),
1500 ('state_or_province_name', 'Massachusetts'),
1501 ('locality_name', 'Newbury'),
1502 ('organization_name', 'Codex Non Sufficit LC'),
1503 ('organizational_unit_name', 'Testing'),
1504 ('common_name', 'Will Bond'),
1505 ('email_address', 'will@codexns.io'),
1506 ]),
1507 subject.native
1508 )
1509 self.assertEqual(
1510 'dsa',
1511 subject_public_key_algorithm['algorithm'].native
1512 )
1513 self.assertEqual(
1514 OrderedDict([
1515 ('p', 4511743893397705393934377497936985478231822206263141826261443300639402520800626925517264115785551703273809312112372693877437137848393530691841757974971843334497076835630893064661599193178307024379015589119302113551197423138934242435710226975119594589912289060014025377813473273600967729027125618396732574594753039493158066887433778053086408525146692226448554390096911703556213619406958876388642882534250747780313634767409586007581976273681005928967585750017105562145167146445061803488570714706090280814293902464230717946651489964409785146803791743658888866280873858000476717727810363942159874283767926511678640730707887895260274767195555813448140889391762755466967436731106514029224490921857229134393798015954890071206959203407845438863870686180087606429828973298318856683615900474921310376145478859687052812749087809700610549251964102790514588562086548577933609968589710807989944739877028770343142449461177732058649962678857),
1516 ('q', 71587850165936478337655415373676526523562874562337607790945426056266440596923),
1517 ('g', 761437146067908309288345767887973163494473925243194806582679580640442238588269326525839153095505341738937595419375068472941615006110237832663093084973431440436421580371384720052414080562019831325744042316268714195397974084616335082272743706567701546951285088540646372701485690904535540223121118329044403681933304838754517522024738251994717369464179515923093116622352823578284891812676662979104509631349201801577889230316128523885862472086364717411346341249139971907827526291913249445756671582283459372536334490171231311487207683108274785825764378203622999309355578169139646003751751448501475767709869676880946562283552431757983801739671783678927397420797147373441051876558068212062253171347849380506793433921881336652424898488378657239798694995315456959568806256079056461448199493507273882763491729787817044805150879660784158902456811649964987582162907020243296662602990514615480712948126671999033658064244112238138589732202),
1518 ]),
1519 subject_public_key_algorithm['parameters'].native
1520 )
1521 self.assertEqual(
1522 934231235067929794039535952071098031636053793876274937162425423023735221571983693370780054696865229184537343792766496068557051933738826401423094028670222490622041397241325320965905259541032379046252395145258594355589801644789631904099105867133976990593761395721476198083091062806327384261369876465927159169400428623265291958463077792777155465482611741502621885386691681062128487785344975981628995609792181581218570320181053055516069553767918513262908069925035292416868414952256645902605335068760774106734518308281769128146479819566784704033671969858507248124850451414380441279385481154336362988505436125981975735568289420374790767927084033441728922597082155884801013899630856890463962357814273014111039522903328923758417820349377075487103441305806369234738881875734407495707878637895190993370257589211331043479113328811265005530361001980539377903738453549980082795009589559114091215518866106998956304437954236070776810740036,
1523 subject_public_key.native
1524 )
1525 self.assertEqual(
1526 None,
1527 tbs_certificate['issuer_unique_id'].native
1528 )
1529 self.assertIsInstance(
1530 tbs_certificate['issuer_unique_id'],
1531 core.NoValue
1532 )
1533 self.assertEqual(
1534 None,
1535 tbs_certificate['subject_unique_id'].native
1536 )
1537 self.assertIsInstance(
1538 tbs_certificate['subject_unique_id'],
1539 core.NoValue
1540 )
1541
1542 self.maxDiff = None
1543 for extension in extensions:
1544 self.assertIsInstance(
1545 extension,
1546 x509.Extension
1547 )
1548 self.assertEqual(
1549 [
1550 OrderedDict([
1551 ('extn_id', 'key_identifier'),
1552 ('critical', False),
1553 ('extn_value', b'\x81\xA3\x37\x86\xF9\x99\x28\xF2\x74\x70\x60\x87\xF2\xD3\x7E\x8D\x19\x61\xA8\xBE'),
1554 ]),
1555 OrderedDict([
1556 ('extn_id', 'authority_key_identifier'),
1557 ('critical', False),
1558 (
1559 'extn_value',
1560 OrderedDict([
1561 ('key_identifier', b'\x81\xA3\x37\x86\xF9\x99\x28\xF2\x74\x70\x60\x87\xF2\xD3\x7E\x8D\x19\x61\xA8\xBE'),
1562 ('authority_cert_issuer', None),
1563 ('authority_cert_serial_number', None),
1564 ])
1565 ),
1566 ]),
1567 OrderedDict([
1568 ('extn_id', 'basic_constraints'),
1569 ('critical', False),
1570 (
1571 'extn_value',
1572 OrderedDict([
1573 ('ca', True),
1574 ('path_len_constraint', None)
1575 ])
1576 ),
1577 ]),
1578 ],
1579 extensions.native
1580 )
1581
1582 def test_parse_ec_certificate(self):
wbondaf1f5a82015-07-17 12:13:15 -04001583 cert = self._load_cert('keys/test-ec-der.crt')
wbonde91513e2015-06-03 14:52:18 -04001584
1585 tbs_certificate = cert['tbs_certificate']
1586 signature = tbs_certificate['signature']
1587 issuer = tbs_certificate['issuer']
1588 validity = tbs_certificate['validity']
1589 subject = tbs_certificate['subject']
1590 subject_public_key_info = tbs_certificate['subject_public_key_info']
1591 subject_public_key_algorithm = subject_public_key_info['algorithm']
1592 public_key_params = subject_public_key_info['algorithm']['parameters'].chosen
1593 field_id = public_key_params['field_id']
1594 curve = public_key_params['curve']
1595 subject_public_key = subject_public_key_info['public_key'].parsed
1596 extensions = tbs_certificate['extensions']
1597
1598 self.assertEqual(
1599 'v3',
1600 tbs_certificate['version'].native
1601 )
1602 self.assertEqual(
1603 15854128451240978884,
1604 tbs_certificate['serial_number'].native
1605 )
1606 self.assertEqual(
1607 'sha256_ecdsa',
1608 signature['algorithm'].native
1609 )
1610 self.assertEqual(
1611 None,
1612 signature['parameters'].native
1613 )
1614 self.assertEqual(
1615 OrderedDict([
1616 ('country_name', 'US'),
1617 ('state_or_province_name', 'Massachusetts'),
1618 ('locality_name', 'Newbury'),
1619 ('organization_name', 'Codex Non Sufficit LC'),
1620 ('organizational_unit_name', 'Testing'),
1621 ('common_name', 'Will Bond'),
1622 ('email_address', 'will@codexns.io'),
1623 ]),
1624 issuer.native
1625 )
1626 self.assertEqual(
1627 datetime(2015, 5, 20, 12, 56, 46, tzinfo=core.timezone.utc),
1628 validity['not_before'].native
1629 )
1630 self.assertEqual(
1631 datetime(2025, 5, 17, 12, 56, 46, tzinfo=core.timezone.utc),
1632 validity['not_after'].native
1633 )
1634 self.assertEqual(
1635 OrderedDict([
1636 ('country_name', 'US'),
1637 ('state_or_province_name', 'Massachusetts'),
1638 ('locality_name', 'Newbury'),
1639 ('organization_name', 'Codex Non Sufficit LC'),
1640 ('organizational_unit_name', 'Testing'),
1641 ('common_name', 'Will Bond'),
1642 ('email_address', 'will@codexns.io'),
1643 ]),
1644 subject.native
1645 )
1646 self.assertEqual(
wbond680cba12015-07-01 23:53:54 -04001647 'ec',
wbonde91513e2015-06-03 14:52:18 -04001648 subject_public_key_algorithm['algorithm'].native
1649 )
1650 self.assertEqual(
1651 'ecdpVer1',
1652 public_key_params['version'].native
1653 )
1654 self.assertEqual(
1655 'prime_field',
1656 field_id['field_type'].native
1657 )
1658 self.assertEqual(
1659 115792089210356248762697446949407573530086143415290314195533631308867097853951,
1660 field_id['parameters'].native
1661 )
1662 self.assertEqual(
1663 b'\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC',
1664 curve['a'].native
1665 )
1666 self.assertEqual(
1667 b'\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B',
1668 curve['b'].native
1669 )
1670 self.assertEqual(
1671 b'\xC4\x9D\x36\x08\x86\xE7\x04\x93\x6A\x66\x78\xE1\x13\x9D\x26\xB7\x81\x9F\x7E\x90',
1672 curve['seed'].native
1673 )
1674 self.assertEqual(
1675 b'\x04\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2\x77\x03\x7D\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96\x4F\xE3\x42\xE2\xFE\x1A\x7F\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16\x2B\xCE\x33\x57\x6B\x31\x5E\xCE\xCB\xB6\x40\x68\x37\xBF\x51\xF5',
1676 public_key_params['base'].native
1677 )
1678 self.assertEqual(
1679 115792089210356248762697446949407573529996955224135760342422259061068512044369,
1680 public_key_params['order'].native
1681 )
1682 self.assertEqual(
1683 1,
1684 public_key_params['cofactor'].native
1685 )
1686 self.assertEqual(
1687 None,
1688 public_key_params['hash'].native
1689 )
1690 self.assertEqual(
1691 b'G\x9f\xcbs$\x1d\xc9\xdd\xd1-\xf1:\x9f\xb7\x04\xde \xd0X\x00\x93T\xf6\x89\xc7/\x87+\xf7\xf9=;4\xed\x9e{\x0e=WB\xdfx\x03\x0b\xcc1\xc6\x03\xd7\x9f`\x01',
1692 subject_public_key.native
1693 )
1694 self.assertEqual(
1695 None,
1696 tbs_certificate['issuer_unique_id'].native
1697 )
1698 self.assertIsInstance(
1699 tbs_certificate['issuer_unique_id'],
1700 core.NoValue
1701 )
1702 self.assertEqual(
1703 None,
1704 tbs_certificate['subject_unique_id'].native
1705 )
1706 self.assertIsInstance(
1707 tbs_certificate['subject_unique_id'],
1708 core.NoValue
1709 )
1710
1711 self.maxDiff = None
1712 for extension in extensions:
1713 self.assertIsInstance(
1714 extension,
1715 x509.Extension
1716 )
1717 self.assertEqual(
1718 [
1719 OrderedDict([
1720 ('extn_id', 'key_identifier'),
1721 ('critical', False),
1722 ('extn_value', b'\x54\xAA\x54\x70\x6C\x34\x1A\x6D\xEB\x5D\x97\xD7\x1E\xFC\xD5\x24\x3C\x8A\x0E\xD7'),
1723 ]),
1724 OrderedDict([
1725 ('extn_id', 'authority_key_identifier'),
1726 ('critical', False),
1727 (
1728 'extn_value',
1729 OrderedDict([
1730 ('key_identifier', b'\x54\xAA\x54\x70\x6C\x34\x1A\x6D\xEB\x5D\x97\xD7\x1E\xFC\xD5\x24\x3C\x8A\x0E\xD7'),
1731 ('authority_cert_issuer', None),
1732 ('authority_cert_serial_number', None),
1733 ])
1734 ),
1735 ]),
1736 OrderedDict([
1737 ('extn_id', 'basic_constraints'),
1738 ('critical', False),
1739 (
1740 'extn_value',
1741 OrderedDict([
1742 ('ca', True),
1743 ('path_len_constraint', None)
1744 ])
1745 ),
1746 ]),
1747 ],
1748 extensions.native
1749 )