blob: 69f9abf6fb0031117775a4a1d62618f23d9be90a [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 DigestAlgorithm, SignedDigestAlgorithm
6from .core import (
7 Boolean,
8 Choice,
9 Enumerated,
10 GeneralizedTime,
11 IA5String,
12 Integer,
13 Null,
14 ObjectIdentifier,
15 OctetBitString,
16 OctetString,
17 Sequence,
18 SequenceOf,
19)
20from .crl import AuthorityInfoAccessSyntax, CRLReason
21from .keys import PublicKeyAlgorithm
22from .x509 import Certificate, GeneralName, GeneralNames, Name
23
24
25
26# The structures in this file are taken from https://tools.ietf.org/html/rfc6960
27
28
29class ResponseType(ObjectIdentifier):
30 _map = {
31 '1.3.6.1.5.5.7.48.1.1': 'basic_ocsp_response',
32 }
33
34
35class AcceptableResponses(SequenceOf):
36 _child_spec = ResponseType
37
38
39class ServiceLocator(Sequence):
40 _fields = [
41 ('issuer', Name),
42 ('locator', AuthorityInfoAccessSyntax),
43 ]
44
45
46class PreferredSignatureAlgorithm(Sequence):
47 _fields = [
48 ('sig_identifier', SignedDigestAlgorithm),
49 ('cert_identifier', PublicKeyAlgorithm, {'optional': True}),
50 ]
51
52
53class PreferredSignatureAlgorithms(SequenceOf):
54 _child_spec = PreferredSignatureAlgorithm
55
56
57class RequestExtensionId(ObjectIdentifier):
58 _map = {
59 '1.3.6.1.5.5.7.48.1.7': 'ocsp_service_locator',
60 }
61
62
63class RequestExtension(Sequence):
64 _fields = [
65 ('extn_id', RequestExtensionId),
66 ('critical', Boolean, {'default': False}),
67 ('extn_value', OctetString),
68 ]
69
70 _oid_pair = ('extn_id', 'extn_value')
71 _oid_specs = {
72 'ocsp_service_locator': ServiceLocator,
73 }
74
75
76class RequestExtensions(SequenceOf):
77 _child_spec = RequestExtension
78
79
80class TBSRequestExtensionId(ObjectIdentifier):
81 _map = {
82 '1.3.6.1.5.5.7.48.1.2': 'ocsp_noonce',
83 '1.3.6.1.5.5.7.48.1.4': 'ocsp_response',
84 '1.3.6.1.5.5.7.48.1.8': 'ocsp_preferred_signature_algorithms',
85 }
86
87
88class TBSRequestExtension(Sequence):
89 _fields = [
90 ('extn_id', TBSRequestExtensionId),
91 ('critical', Boolean, {'default': False}),
92 ('extn_value', OctetString),
93 ]
94
95 _oid_pair = ('extn_id', 'extn_value')
96 _oid_specs = {
97 'ocsp_noonce': OctetString,
98 'ocsp_response': AcceptableResponses,
99 'ocsp_preferred_signature_algorithms': PreferredSignatureAlgorithms,
100 }
101
102
103class TBSRequestExtensions(SequenceOf):
104 _child_spec = TBSRequestExtension
105
106
107class ResponseDataExtensionId(ObjectIdentifier):
108 _map = {
109 '1.3.6.1.5.5.7.48.1.2': 'ocsp_noonce',
110 '1.3.6.1.5.5.7.48.1.9': 'ocsp_extended_revoke',
111 }
112
113
114class ResponseDataExtension(Sequence):
115 _fields = [
116 ('extn_id', ResponseDataExtensionId),
117 ('critical', Boolean, {'default': False}),
118 ('extn_value', OctetString),
119 ]
120
121 _oid_pair = ('extn_id', 'extn_value')
122 _oid_specs = {
123 'ocsp_noonce': OctetString,
124 'ocsp_extended_revoke': Null,
125 }
126
127
128class ResponseDataExtensions(SequenceOf):
129 _child_spec = ResponseDataExtension
130
131
132class CrlId(Sequence):
133 _fields = [
134 ('crl_url', IA5String, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
135 ('crl_num', Integer, {'tag_type': 'explicit', 'tag': 1, 'optional': True}),
136 ('crl_time', GeneralizedTime, {'tag_type': 'explicit', 'tag': 2, 'optional': True}),
137 ]
138
139
140class SingleResponseExtensionId(ObjectIdentifier):
141 _map = {
142 '1.3.6.1.5.5.7.48.1.3': 'ocsp_crl',
143 '1.3.6.1.5.5.7.48.1.6': 'ocsp_archive_cutoff',
144 # These are CRLEntryExtension values from https://tools.ietf.org/html/rfc5280
145 '2.5.29.21': 'crl_reason',
146 '2.5.29.24': 'invalidity_date',
147 '2.5.29.29': 'certificate_issuer',
148 }
149
150
151class SingleResponseExtension(Sequence):
152 _fields = [
153 ('extn_id', SingleResponseExtensionId),
154 ('critical', Boolean, {'default': False}),
155 ('extn_value', OctetString),
156 ]
157
158 _oid_pair = ('extn_id', 'extn_value')
159 _oid_specs = {
160 'ocsp_crl': CrlId,
161 'ocsp_archive_cutoff': GeneralizedTime,
162 'crl_reason': CRLReason,
163 'invalidity_date': GeneralizedTime,
164 'certificate_issuer': GeneralNames,
165 }
166
167
168class SingleResponseExtensions(SequenceOf):
169 _child_spec = SingleResponseExtension
170
171
172class Version(Integer):
173 _map = {
174 0: 'v1'
175 }
176
177class CertId(Sequence):
178 _fields = [
179 ('hash_algorithm', DigestAlgorithm),
180 ('issuer_name_hash', OctetString),
181 ('issuer_key_hash', OctetString),
182 ('serial_number', Integer),
183 ]
184
185
186class Request(Sequence):
187 _fields = [
188 ('req_cert', CertId),
189 ('single_request_extensions', RequestExtensions, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
190 ]
191
192
193class Requests(SequenceOf):
194 _child_spec = Request
195
196
197class TBSRequest(Sequence):
198 _fields = [
199 ('version', Version, {'tag_type': 'explicit', 'tag': 0, 'default': 'v1'}),
200 ('requestor_name', GeneralName, {'tag_type': 'explicit', 'tag': 1, 'optional': True}),
201 ('request_list', Requests),
202 ('request_extensions', TBSRequestExtensions, {'tag_type': 'explicit', 'tag': 2, 'optional': True}),
203 ]
204
205
206class Certificates(SequenceOf):
207 _child_spec = Certificate
208
209
210class Signature(Sequence):
211 _fields = [
212 ('signature_algorithm', SignedDigestAlgorithm),
213 ('signature', OctetBitString),
214 ('certs', Certificates, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
215 ]
216
217
218class OCSPRequest(Sequence):
219 _fields = [
220 ('tbs_request', TBSRequest),
221 ('optional_signature', Signature, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
222 ]
223
224
225class OCSPResponseStatus(Enumerated):
226 _map = {
227 0: 'successful',
228 1: 'malformed_request',
229 2: 'internal_error',
230 3: 'try_later',
231 5: 'sign_required',
232 6: 'unauthoried',
233 }
234
235
236class ResponderId(Choice):
237 _alternatives = [
238 ('by_name', Name, {'tag_type': 'explicit', 'tag': 1}),
239 ('by_key', OctetString, {'tag_type': 'explicit', 'tag': 2}),
240 ]
241
242
243class RevokedInfo(Sequence):
244 _fields = [
245 ('revocation_time', GeneralizedTime),
246 ('revocation_reason', CRLReason, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
247 ]
248
249
250class CertStatus(Choice):
251 _alternatives = [
252 ('good', Null, {'tag_type': 'implicit', 'tag': 0}),
253 ('revoked', RevokedInfo, {'tag_type': 'implicit', 'tag': 1}),
254 ('unknown', Null, {'tag_type': 'implicit', 'tag': 2}),
255 ]
256
257
258class SingleResponse(Sequence):
259 _fields = [
260 ('cert_id', CertId),
261 ('cert_status', CertStatus),
262 ('this_update', GeneralizedTime),
263 ('next_update', GeneralizedTime, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
264 ('single_extensions', SingleResponseExtensions, {'tag_type': 'explicit', 'tag': 1, 'optional': True}),
265 ]
266
267
268class Responses(SequenceOf):
269 _child_spec = SingleResponse
270
271
272class ResponseData(Sequence):
273 _fields = [
274 ('version', Version, {'tag_type': 'explicit', 'tag': 0, 'default': 'v1'}),
275 ('responder_id', ResponderId),
276 ('produced_at', GeneralizedTime),
277 ('responses', Responses),
278 ('response_extensions', ResponseDataExtensions, {'tag_type': 'explicit', 'tag': 1, 'optional': True}),
279 ]
280
281
282class BasicOCSPResponse(Sequence):
283 _fields = [
284 ('tbs_response_data', ResponseData),
285 ('signature_algorithm', SignedDigestAlgorithm),
286 ('signature', OctetBitString),
287 ('certs', Certificates, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
288 ]
289
290
291class ResponseBytes(Sequence):
292 _fields = [
293 ('response_type', ResponseType),
294 ('response', OctetString),
295 ]
296
297 _oid_pair = ('response_type', 'response')
298 _oid_specs = {
299 'basic_ocsp_response': BasicOCSPResponse,
300 }
301
302
303class OCSPResponse(Sequence):
304 _fields = [
305 ('response_status', OCSPResponseStatus),
306 ('response_bytes', ResponseBytes, {'tag_type': 'explicit', 'tag': 0, 'optional': True}),
307 ]