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