blob: e7d80c721eff10192492c671d20974f6ea491c7d [file] [log] [blame]
wbonde91513e2015-06-03 14:52:18 -04001# coding: utf-8
2from __future__ import unicode_literals
3from __future__ import absolute_import
4
5from .algos import SignedDigestAlgorithm
6from .core import (
7 Boolean,
8 Enumerated,
9 GeneralizedTime,
10 Integer,
11 ObjectIdentifier,
12 OctetBitString,
13 OctetString,
14 Sequence,
15 SequenceOf,
16)
17from .x509 import (
18 AuthorityKeyIdentifier,
19 CRLDistributionPoints,
20 DistributionPointName,
21 GeneralName,
22 GeneralNames,
23 Name,
24 ReasonFlags,
25 Time,
26)
27
28
29
30# The structures in this file are taken from https://tools.ietf.org/html/rfc5280
31
32
33class Version(Integer):
34 _map = {
35 0: 'v1',
36 1: 'v2',
37 2: 'v3',
38 }
39
40
41class IssuingDistributionPoint(Sequence):
42 _fields = [
43 ('distribution_point', DistributionPointName, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
44 ('only_contains_user_certs', Boolean, {'tag_type': 'implicit', 'tag': 1, 'default': False}),
45 ('only_contains_ca_certs', Boolean, {'tag_type': 'implicit', 'tag': 2, 'default': False}),
46 ('only_some_reasons', ReasonFlags, {'tag_type': 'implicit', 'tag': 3, 'optional': True}),
47 ('indirect_crl', Boolean, {'tag_type': 'implicit', 'tag': 4, 'default': False}),
48 ('only_contains_attribute_certs', Boolean, {'tag_type': 'implicit', 'tag': 5, 'default': False}),
49 ]
50
51
52class AccessMethod(ObjectIdentifier):
53 _map = {
54 '1.3.6.1.5.5.7.48.1': 'ocsp',
55 '1.3.6.1.5.5.7.48.2': 'ca_issuers',
56 }
57
58
59class AccessDescription(Sequence):
60 _fields = [
61 ('access_method', AccessMethod),
62 ('access_location', GeneralName),
63 ]
64
65
66class AuthorityInfoAccessSyntax(SequenceOf):
67 _child_spec = AccessDescription
68
69
70class TBSCertListExtensionId(ObjectIdentifier):
71 _map = {
72 '2.5.29.18': 'issuer_alt_name',
73 '2.5.29.20': 'crl_number',
74 '2.5.29.27': 'delta_crl_indicator',
75 '2.5.29.28': 'issuing_distribution_point',
76 '2.5.29.35': 'authority_key_identifier',
77 '2.5.29.46': 'freshest_crl',
78 '1.3.6.1.5.5.7.1.1': 'authority_information_access',
79 }
80
81
82class TBSCertListExtension(Sequence):
83 _fields = [
84 ('extn_id', TBSCertListExtensionId),
85 ('critical', Boolean, {'default': False}),
86 ('extn_value', OctetString),
87 ]
88
89 _oid_pair = ('extn_id', 'extn_value')
90 _oid_specs = {
91 'issuer_alt_name': GeneralNames,
92 'crl_number': Integer,
93 'delta_crl_indicator': Integer,
94 'issuing_distribution_point': IssuingDistributionPoint,
95 'authority_key_identifier': AuthorityKeyIdentifier,
96 'freshest_crl': CRLDistributionPoints,
97 'authority_information_access': AuthorityInfoAccessSyntax,
98 }
99
100
101class TBSCertListExtensions(SequenceOf):
102 _child_spec = TBSCertListExtension
103
104
105class CRLReason(Enumerated):
106 _map = {
107 0: 'unspecified',
108 1: 'key_compromise',
109 2: 'ca_compromise',
110 3: 'affiliation_changed',
111 4: 'superseded',
112 5: 'cessation_of_operation',
113 6: 'certificate_hold',
114 8: 'remove_from_crl',
115 9: 'privilege_withdrawn',
116 10: 'aa_compromise',
117 }
118
119
120class CRLEntryExtensionId(ObjectIdentifier):
121 _map = {
122 '2.5.29.21': 'crl_reason',
123 '2.5.29.24': 'invalidity_date',
124 '2.5.29.29': 'certificate_issuer',
125 }
126
127
128class CRLEntryExtension(Sequence):
129 _fields = [
130 ('extn_id', CRLEntryExtensionId),
131 ('critical', Boolean, {'default': False}),
132 ('extn_value', OctetString),
133 ]
134
135 _oid_pair = ('extn_id', 'extn_value')
136 _oid_specs = {
137 'crl_reason': CRLReason,
138 'invalidity_date': GeneralizedTime,
139 'certificate_issuer': GeneralNames,
140 }
141
142
143class CRLEntryExtensions(SequenceOf):
144 _child_spec = CRLEntryExtension
145
146
147class RevokedCertificate(Sequence):
148 _fields = [
149 ('user_certificate', Integer),
150 ('revocation_date', Time),
151 ('crl_entry_extensions', CRLEntryExtensions, {'optional': True}),
152 ]
153
154
155class RevokedCertificates(SequenceOf):
156 _child_spec = RevokedCertificate
157
158
159class TbsCertList(Sequence):
160 _fields = [
161 ('version', Version, {'optional': True}),
162 ('signature', SignedDigestAlgorithm),
163 ('issuer', Name),
164 ('this_update', Time),
165 ('next_update', Time),
166 ('revoked_certificates', RevokedCertificates, {'optional': True}),
167 ('crl_extensions', TBSCertListExtensions, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
168 ]
169
170
171class CertificateList(Sequence):
172 _fields = [
173 ('tbs_cert_list', TbsCertList),
174 ('signature_algorith', SignedDigestAlgorithm),
175 ('signature', OctetBitString),
176 ]