OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
ocsp.c
Go to the documentation of this file.
1 /* ocsp.c */
2 /* Written by Dr Stephen N Henson ([email protected]) for the OpenSSL
3  * project 2000.
4  */
5 /* ====================================================================
6  * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in
17  * the documentation and/or other materials provided with the
18  * distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  * software must display the following acknowledgment:
22  * "This product includes software developed by the OpenSSL Project
23  * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  * endorse or promote products derived from this software without
27  * prior written permission. For written permission, please contact
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  * nor may "OpenSSL" appear in their names without prior written
32  * permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  * acknowledgment:
36  * "This product includes software developed by the OpenSSL Project
37  * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  *
53  * This product includes cryptographic software written by Eric Young
54  * ([email protected]). This product includes software written by Tim
55  * Hudson ([email protected]).
56  *
57  */
58 #include <openssl/asn1.h>
59 #include <openssl/asn1t.h>
60 #include <openssl/x509v3.h>
61 
62 
63 
64 
65 /* Example of new ASN1 code, OCSP request
66 
67  OCSPRequest ::= SEQUENCE {
68  tbsRequest TBSRequest,
69  optionalSignature [0] EXPLICIT Signature OPTIONAL }
70 
71  TBSRequest ::= SEQUENCE {
72  version [0] EXPLICIT Version DEFAULT v1,
73  requestorName [1] EXPLICIT GeneralName OPTIONAL,
74  requestList SEQUENCE OF Request,
75  requestExtensions [2] EXPLICIT Extensions OPTIONAL }
76 
77  Signature ::= SEQUENCE {
78  signatureAlgorithm AlgorithmIdentifier,
79  signature BIT STRING,
80  certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
81 
82  Version ::= INTEGER { v1(0) }
83 
84  Request ::= SEQUENCE {
85  reqCert CertID,
86  singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
87 
88  CertID ::= SEQUENCE {
89  hashAlgorithm AlgorithmIdentifier,
90  issuerNameHash OCTET STRING, -- Hash of Issuer's DN
91  issuerKeyHash OCTET STRING, -- Hash of Issuers public key
92  serialNumber CertificateSerialNumber }
93 
94  OCSPResponse ::= SEQUENCE {
95  responseStatus OCSPResponseStatus,
96  responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }
97 
98  OCSPResponseStatus ::= ENUMERATED {
99  successful (0), --Response has valid confirmations
100  malformedRequest (1), --Illegal confirmation request
101  internalError (2), --Internal error in issuer
102  tryLater (3), --Try again later
103  --(4) is not used
104  sigRequired (5), --Must sign the request
105  unauthorized (6) --Request unauthorized
106  }
107 
108  ResponseBytes ::= SEQUENCE {
109  responseType OBJECT IDENTIFIER,
110  response OCTET STRING }
111 
112  BasicOCSPResponse ::= SEQUENCE {
113  tbsResponseData ResponseData,
114  signatureAlgorithm AlgorithmIdentifier,
115  signature BIT STRING,
116  certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
117 
118  ResponseData ::= SEQUENCE {
119  version [0] EXPLICIT Version DEFAULT v1,
120  responderID ResponderID,
121  producedAt GeneralizedTime,
122  responses SEQUENCE OF SingleResponse,
123  responseExtensions [1] EXPLICIT Extensions OPTIONAL }
124 
125  ResponderID ::= CHOICE {
126  byName [1] Name, --EXPLICIT
127  byKey [2] KeyHash }
128 
129  KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key
130  --(excluding the tag and length fields)
131 
132  SingleResponse ::= SEQUENCE {
133  certID CertID,
134  certStatus CertStatus,
135  thisUpdate GeneralizedTime,
136  nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
137  singleExtensions [1] EXPLICIT Extensions OPTIONAL }
138 
139  CertStatus ::= CHOICE {
140  good [0] IMPLICIT NULL,
141  revoked [1] IMPLICIT RevokedInfo,
142  unknown [2] IMPLICIT UnknownInfo }
143 
144  RevokedInfo ::= SEQUENCE {
145  revocationTime GeneralizedTime,
146  revocationReason [0] EXPLICIT CRLReason OPTIONAL }
147 
148  UnknownInfo ::= NULL -- this can be replaced with an enumeration
149 
150  ArchiveCutoff ::= GeneralizedTime
151 
152  AcceptableResponses ::= SEQUENCE OF OBJECT IDENTIFIER
153 
154  ServiceLocator ::= SEQUENCE {
155  issuer Name,
156  locator AuthorityInfoAccessSyntax }
157 
158  -- Object Identifiers
159 
160  id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 }
161  id-pkix-ocsp OBJECT IDENTIFIER ::= { id-ad-ocsp }
162  id-pkix-ocsp-basic OBJECT IDENTIFIER ::= { id-pkix-ocsp 1 }
163  id-pkix-ocsp-nonce OBJECT IDENTIFIER ::= { id-pkix-ocsp 2 }
164  id-pkix-ocsp-crl OBJECT IDENTIFIER ::= { id-pkix-ocsp 3 }
165  id-pkix-ocsp-response OBJECT IDENTIFIER ::= { id-pkix-ocsp 4 }
166  id-pkix-ocsp-nocheck OBJECT IDENTIFIER ::= { id-pkix-ocsp 5 }
167  id-pkix-ocsp-archive-cutoff OBJECT IDENTIFIER ::= { id-pkix-ocsp 6 }
168  id-pkix-ocsp-service-locator OBJECT IDENTIFIER ::= { id-pkix-ocsp 7 }
169 
170 */
171 
172 /* Request Structures */
173 
175 
176 typedef struct {
179  STACK_OF(Request) *requestList;
180  STACK_OF(X509_EXTENSION) *requestExtensions;
181 } TBSRequest;
182 
183 typedef struct {
186  STACK_OF(X509) *certs;
187 } Signature;
188 
189 typedef struct {
192 } OCSPRequest;
193 
194 typedef struct {
199 } CertID;
200 
201 typedef struct {
203  STACK_OF(X509_EXTENSION) *singleRequestExtensions;
204 } Request;
205 
206 /* Response structures */
207 
208 typedef struct {
211 } ResponseBytes;
212 
213 typedef struct {
216 } OCSPResponse;
217 
218 typedef struct {
219  int type;
220  union {
223  }d;
224 } ResponderID;
225 
226 typedef struct {
230  STACK_OF(SingleResponse) *responses;
231  STACK_OF(X509_EXTENSION) *responseExtensions;
232 } ResponseData;
233 
234 typedef struct {
238  STACK_OF(X509) *certs;
240 
241 typedef struct {
244 } RevokedInfo;
245 
246 typedef struct {
247  int type;
248  union {
252  } d;
253 } CertStatus;
254 
255 typedef struct {
260  STACK_OF(X509_EXTENSION) *singleExtensions;
262 
263 
264 typedef struct {
266  STACK_OF(ACCESS_DESCRIPTION) *locator;
268 
269 
270 /* Now the ASN1 templates */
271 
274 //IMPLEMENT_COMPAT_ASN1(X509_EXTENSION);
277 
283 
284 
286  ASN1_SIMPLE(Signature, signatureAlgorithm, X509_ALGOR),
290 
292  ASN1_SIMPLE(CertID, hashAlgorithm, X509_ALGOR),
293  ASN1_SIMPLE(CertID, issuerNameHash, ASN1_OCTET_STRING),
294  ASN1_SIMPLE(CertID, issuerKeyHash, ASN1_OCTET_STRING),
295  ASN1_SIMPLE(CertID, certificateSerialNumber, ASN1_INTEGER)
297 
299  ASN1_SIMPLE(Request, reqCert, CertID),
300  ASN1_EXP_SEQUENCE_OF_OPT(Request, singleRequestExtensions, X509_EXTENSION, 0)
302 
304  ASN1_EXP_OPT(TBSRequest, version, ASN1_INTEGER, 0),
305  ASN1_EXP_OPT(TBSRequest, requestorName, GENERAL_NAME, 1),
306  ASN1_SEQUENCE_OF(TBSRequest, requestList, Request),
307  ASN1_EXP_SEQUENCE_OF_OPT(TBSRequest, requestExtensions, X509_EXTENSION, 2)
309 
311  ASN1_SIMPLE(OCSPRequest, tbsRequest, TBSRequest),
312  ASN1_EXP_OPT(OCSPRequest, optionalSignature, Signature, 0)
314 
315 
316 /* Response templates */
317 
319  ASN1_SIMPLE(ResponseBytes, responseType, ASN1_OBJECT),
322 
324  ASN1_SIMPLE(OCSPResponse, responseStatus, ASN1_ENUMERATED),
325  ASN1_EXP_OPT(OCSPResponse, responseBytes, ResponseBytes, 0)
327 
332 
334  ASN1_SIMPLE(RevokedInfo, revocationTime, ASN1_GENERALIZEDTIME),
335  ASN1_EXP_OPT(RevokedInfo, revocationReason, ASN1_ENUMERATED, 0)
337 
343 
346  ASN1_SIMPLE(SingleResponse, certStatus, CertStatus),
351 
353  ASN1_EXP_OPT(ResponseData, version, ASN1_INTEGER, 0),
354  ASN1_SIMPLE(ResponseData, responderID, ResponderID),
357  ASN1_EXP_SEQUENCE_OF_OPT(ResponseData, responseExtensions, X509_EXTENSION, 1)
359 
361  ASN1_SIMPLE(BasicOCSPResponse, tbsResponseData, ResponseData),
362  ASN1_SIMPLE(BasicOCSPResponse, signatureAlgorithm, X509_ALGOR),
366