diff options
author | miod <> | 2014-05-17 19:56:35 +0000 |
---|---|---|
committer | miod <> | 2014-05-17 19:56:35 +0000 |
commit | 0800c7660118a9e5105bd591666d930d899d0b8c (patch) | |
tree | f2d366a23c3131d80591bf9c5de711d2e70b4b6e | |
parent | e9f9678d1aba19f14521109f545f7847365c2f85 (diff) | |
download | openbsd-0800c7660118a9e5105bd591666d930d899d0b8c.tar.gz openbsd-0800c7660118a9e5105bd591666d930d899d0b8c.tar.bz2 openbsd-0800c7660118a9e5105bd591666d930d899d0b8c.zip |
KNF
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp.h | 357 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_cl.c | 315 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_ext.c | 655 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_ht.c | 275 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_lib.c | 170 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_prn.c | 278 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_srv.c | 199 | ||||
-rw-r--r-- | src/lib/libcrypto/ocsp/ocsp_vfy.c | 357 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp.h | 357 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_cl.c | 315 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_ext.c | 655 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_ht.c | 275 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_lib.c | 170 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_prn.c | 278 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_srv.c | 199 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c | 357 |
16 files changed, 2664 insertions, 2548 deletions
diff --git a/src/lib/libcrypto/ocsp/ocsp.h b/src/lib/libcrypto/ocsp/ocsp.h index 31e45744ba..9401f7db2f 100644 --- a/src/lib/libcrypto/ocsp/ocsp.h +++ b/src/lib/libcrypto/ocsp/ocsp.h | |||
@@ -96,13 +96,12 @@ extern "C" { | |||
96 | * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) | 96 | * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) |
97 | * serialNumber CertificateSerialNumber } | 97 | * serialNumber CertificateSerialNumber } |
98 | */ | 98 | */ |
99 | typedef struct ocsp_cert_id_st | 99 | typedef struct ocsp_cert_id_st { |
100 | { | ||
101 | X509_ALGOR *hashAlgorithm; | 100 | X509_ALGOR *hashAlgorithm; |
102 | ASN1_OCTET_STRING *issuerNameHash; | 101 | ASN1_OCTET_STRING *issuerNameHash; |
103 | ASN1_OCTET_STRING *issuerKeyHash; | 102 | ASN1_OCTET_STRING *issuerKeyHash; |
104 | ASN1_INTEGER *serialNumber; | 103 | ASN1_INTEGER *serialNumber; |
105 | } OCSP_CERTID; | 104 | } OCSP_CERTID; |
106 | 105 | ||
107 | DECLARE_STACK_OF(OCSP_CERTID) | 106 | DECLARE_STACK_OF(OCSP_CERTID) |
108 | 107 | ||
@@ -110,11 +109,10 @@ DECLARE_STACK_OF(OCSP_CERTID) | |||
110 | * reqCert CertID, | 109 | * reqCert CertID, |
111 | * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } | 110 | * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } |
112 | */ | 111 | */ |
113 | typedef struct ocsp_one_request_st | 112 | typedef struct ocsp_one_request_st { |
114 | { | ||
115 | OCSP_CERTID *reqCert; | 113 | OCSP_CERTID *reqCert; |
116 | STACK_OF(X509_EXTENSION) *singleRequestExtensions; | 114 | STACK_OF(X509_EXTENSION) *singleRequestExtensions; |
117 | } OCSP_ONEREQ; | 115 | } OCSP_ONEREQ; |
118 | 116 | ||
119 | DECLARE_STACK_OF(OCSP_ONEREQ) | 117 | DECLARE_STACK_OF(OCSP_ONEREQ) |
120 | DECLARE_ASN1_SET_OF(OCSP_ONEREQ) | 118 | DECLARE_ASN1_SET_OF(OCSP_ONEREQ) |
@@ -126,35 +124,32 @@ DECLARE_ASN1_SET_OF(OCSP_ONEREQ) | |||
126 | * requestList SEQUENCE OF Request, | 124 | * requestList SEQUENCE OF Request, |
127 | * requestExtensions [2] EXPLICIT Extensions OPTIONAL } | 125 | * requestExtensions [2] EXPLICIT Extensions OPTIONAL } |
128 | */ | 126 | */ |
129 | typedef struct ocsp_req_info_st | 127 | typedef struct ocsp_req_info_st { |
130 | { | ||
131 | ASN1_INTEGER *version; | 128 | ASN1_INTEGER *version; |
132 | GENERAL_NAME *requestorName; | 129 | GENERAL_NAME *requestorName; |
133 | STACK_OF(OCSP_ONEREQ) *requestList; | 130 | STACK_OF(OCSP_ONEREQ) *requestList; |
134 | STACK_OF(X509_EXTENSION) *requestExtensions; | 131 | STACK_OF(X509_EXTENSION) *requestExtensions; |
135 | } OCSP_REQINFO; | 132 | } OCSP_REQINFO; |
136 | 133 | ||
137 | /* Signature ::= SEQUENCE { | 134 | /* Signature ::= SEQUENCE { |
138 | * signatureAlgorithm AlgorithmIdentifier, | 135 | * signatureAlgorithm AlgorithmIdentifier, |
139 | * signature BIT STRING, | 136 | * signature BIT STRING, |
140 | * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } | 137 | * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } |
141 | */ | 138 | */ |
142 | typedef struct ocsp_signature_st | 139 | typedef struct ocsp_signature_st { |
143 | { | ||
144 | X509_ALGOR *signatureAlgorithm; | 140 | X509_ALGOR *signatureAlgorithm; |
145 | ASN1_BIT_STRING *signature; | 141 | ASN1_BIT_STRING *signature; |
146 | STACK_OF(X509) *certs; | 142 | STACK_OF(X509) *certs; |
147 | } OCSP_SIGNATURE; | 143 | } OCSP_SIGNATURE; |
148 | 144 | ||
149 | /* OCSPRequest ::= SEQUENCE { | 145 | /* OCSPRequest ::= SEQUENCE { |
150 | * tbsRequest TBSRequest, | 146 | * tbsRequest TBSRequest, |
151 | * optionalSignature [0] EXPLICIT Signature OPTIONAL } | 147 | * optionalSignature [0] EXPLICIT Signature OPTIONAL } |
152 | */ | 148 | */ |
153 | typedef struct ocsp_request_st | 149 | typedef struct ocsp_request_st { |
154 | { | ||
155 | OCSP_REQINFO *tbsRequest; | 150 | OCSP_REQINFO *tbsRequest; |
156 | OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ | 151 | OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ |
157 | } OCSP_REQUEST; | 152 | } OCSP_REQUEST; |
158 | 153 | ||
159 | /* OCSPResponseStatus ::= ENUMERATED { | 154 | /* OCSPResponseStatus ::= ENUMERATED { |
160 | * successful (0), --Response has valid confirmations | 155 | * successful (0), --Response has valid confirmations |
@@ -166,32 +161,30 @@ typedef struct ocsp_request_st | |||
166 | * unauthorized (6) --Request unauthorized | 161 | * unauthorized (6) --Request unauthorized |
167 | * } | 162 | * } |
168 | */ | 163 | */ |
169 | #define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 | 164 | #define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 |
170 | #define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 | 165 | #define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 |
171 | #define OCSP_RESPONSE_STATUS_INTERNALERROR 2 | 166 | #define OCSP_RESPONSE_STATUS_INTERNALERROR 2 |
172 | #define OCSP_RESPONSE_STATUS_TRYLATER 3 | 167 | #define OCSP_RESPONSE_STATUS_TRYLATER 3 |
173 | #define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 | 168 | #define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 |
174 | #define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 | 169 | #define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 |
175 | 170 | ||
176 | /* ResponseBytes ::= SEQUENCE { | 171 | /* ResponseBytes ::= SEQUENCE { |
177 | * responseType OBJECT IDENTIFIER, | 172 | * responseType OBJECT IDENTIFIER, |
178 | * response OCTET STRING } | 173 | * response OCTET STRING } |
179 | */ | 174 | */ |
180 | typedef struct ocsp_resp_bytes_st | 175 | typedef struct ocsp_resp_bytes_st { |
181 | { | ||
182 | ASN1_OBJECT *responseType; | 176 | ASN1_OBJECT *responseType; |
183 | ASN1_OCTET_STRING *response; | 177 | ASN1_OCTET_STRING *response; |
184 | } OCSP_RESPBYTES; | 178 | } OCSP_RESPBYTES; |
185 | 179 | ||
186 | /* OCSPResponse ::= SEQUENCE { | 180 | /* OCSPResponse ::= SEQUENCE { |
187 | * responseStatus OCSPResponseStatus, | 181 | * responseStatus OCSPResponseStatus, |
188 | * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } | 182 | * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } |
189 | */ | 183 | */ |
190 | struct ocsp_response_st | 184 | struct ocsp_response_st { |
191 | { | ||
192 | ASN1_ENUMERATED *responseStatus; | 185 | ASN1_ENUMERATED *responseStatus; |
193 | OCSP_RESPBYTES *responseBytes; | 186 | OCSP_RESPBYTES *responseBytes; |
194 | }; | 187 | }; |
195 | 188 | ||
196 | /* ResponderID ::= CHOICE { | 189 | /* ResponderID ::= CHOICE { |
197 | * byName [1] Name, | 190 | * byName [1] Name, |
@@ -199,14 +192,13 @@ struct ocsp_response_st | |||
199 | */ | 192 | */ |
200 | #define V_OCSP_RESPID_NAME 0 | 193 | #define V_OCSP_RESPID_NAME 0 |
201 | #define V_OCSP_RESPID_KEY 1 | 194 | #define V_OCSP_RESPID_KEY 1 |
202 | struct ocsp_responder_id_st | 195 | struct ocsp_responder_id_st { |
203 | { | ||
204 | int type; | 196 | int type; |
205 | union { | 197 | union { |
206 | X509_NAME* byName; | 198 | X509_NAME* byName; |
207 | ASN1_OCTET_STRING *byKey; | 199 | ASN1_OCTET_STRING *byKey; |
208 | } value; | 200 | } value; |
209 | }; | 201 | }; |
210 | 202 | ||
211 | DECLARE_STACK_OF(OCSP_RESPID) | 203 | DECLARE_STACK_OF(OCSP_RESPID) |
212 | DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) | 204 | DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) |
@@ -219,11 +211,10 @@ DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) | |||
219 | * revocationTime GeneralizedTime, | 211 | * revocationTime GeneralizedTime, |
220 | * revocationReason [0] EXPLICIT CRLReason OPTIONAL } | 212 | * revocationReason [0] EXPLICIT CRLReason OPTIONAL } |
221 | */ | 213 | */ |
222 | typedef struct ocsp_revoked_info_st | 214 | typedef struct ocsp_revoked_info_st { |
223 | { | ||
224 | ASN1_GENERALIZEDTIME *revocationTime; | 215 | ASN1_GENERALIZEDTIME *revocationTime; |
225 | ASN1_ENUMERATED *revocationReason; | 216 | ASN1_ENUMERATED *revocationReason; |
226 | } OCSP_REVOKEDINFO; | 217 | } OCSP_REVOKEDINFO; |
227 | 218 | ||
228 | /* CertStatus ::= CHOICE { | 219 | /* CertStatus ::= CHOICE { |
229 | * good [0] IMPLICIT NULL, | 220 | * good [0] IMPLICIT NULL, |
@@ -233,15 +224,14 @@ typedef struct ocsp_revoked_info_st | |||
233 | #define V_OCSP_CERTSTATUS_GOOD 0 | 224 | #define V_OCSP_CERTSTATUS_GOOD 0 |
234 | #define V_OCSP_CERTSTATUS_REVOKED 1 | 225 | #define V_OCSP_CERTSTATUS_REVOKED 1 |
235 | #define V_OCSP_CERTSTATUS_UNKNOWN 2 | 226 | #define V_OCSP_CERTSTATUS_UNKNOWN 2 |
236 | typedef struct ocsp_cert_status_st | 227 | typedef struct ocsp_cert_status_st { |
237 | { | ||
238 | int type; | 228 | int type; |
239 | union { | 229 | union { |
240 | ASN1_NULL *good; | 230 | ASN1_NULL *good; |
241 | OCSP_REVOKEDINFO *revoked; | 231 | OCSP_REVOKEDINFO *revoked; |
242 | ASN1_NULL *unknown; | 232 | ASN1_NULL *unknown; |
243 | } value; | 233 | } value; |
244 | } OCSP_CERTSTATUS; | 234 | } OCSP_CERTSTATUS; |
245 | 235 | ||
246 | /* SingleResponse ::= SEQUENCE { | 236 | /* SingleResponse ::= SEQUENCE { |
247 | * certID CertID, | 237 | * certID CertID, |
@@ -250,14 +240,13 @@ typedef struct ocsp_cert_status_st | |||
250 | * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, | 240 | * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, |
251 | * singleExtensions [1] EXPLICIT Extensions OPTIONAL } | 241 | * singleExtensions [1] EXPLICIT Extensions OPTIONAL } |
252 | */ | 242 | */ |
253 | typedef struct ocsp_single_response_st | 243 | typedef struct ocsp_single_response_st { |
254 | { | ||
255 | OCSP_CERTID *certId; | 244 | OCSP_CERTID *certId; |
256 | OCSP_CERTSTATUS *certStatus; | 245 | OCSP_CERTSTATUS *certStatus; |
257 | ASN1_GENERALIZEDTIME *thisUpdate; | 246 | ASN1_GENERALIZEDTIME *thisUpdate; |
258 | ASN1_GENERALIZEDTIME *nextUpdate; | 247 | ASN1_GENERALIZEDTIME *nextUpdate; |
259 | STACK_OF(X509_EXTENSION) *singleExtensions; | 248 | STACK_OF(X509_EXTENSION) *singleExtensions; |
260 | } OCSP_SINGLERESP; | 249 | } OCSP_SINGLERESP; |
261 | 250 | ||
262 | DECLARE_STACK_OF(OCSP_SINGLERESP) | 251 | DECLARE_STACK_OF(OCSP_SINGLERESP) |
263 | DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) | 252 | DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) |
@@ -269,14 +258,13 @@ DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) | |||
269 | * responses SEQUENCE OF SingleResponse, | 258 | * responses SEQUENCE OF SingleResponse, |
270 | * responseExtensions [1] EXPLICIT Extensions OPTIONAL } | 259 | * responseExtensions [1] EXPLICIT Extensions OPTIONAL } |
271 | */ | 260 | */ |
272 | typedef struct ocsp_response_data_st | 261 | typedef struct ocsp_response_data_st { |
273 | { | ||
274 | ASN1_INTEGER *version; | 262 | ASN1_INTEGER *version; |
275 | OCSP_RESPID *responderId; | 263 | OCSP_RESPID *responderId; |
276 | ASN1_GENERALIZEDTIME *producedAt; | 264 | ASN1_GENERALIZEDTIME *producedAt; |
277 | STACK_OF(OCSP_SINGLERESP) *responses; | 265 | STACK_OF(OCSP_SINGLERESP) *responses; |
278 | STACK_OF(X509_EXTENSION) *responseExtensions; | 266 | STACK_OF(X509_EXTENSION) *responseExtensions; |
279 | } OCSP_RESPDATA; | 267 | } OCSP_RESPDATA; |
280 | 268 | ||
281 | /* BasicOCSPResponse ::= SEQUENCE { | 269 | /* BasicOCSPResponse ::= SEQUENCE { |
282 | * tbsResponseData ResponseData, | 270 | * tbsResponseData ResponseData, |
@@ -300,13 +288,12 @@ typedef struct ocsp_response_data_st | |||
300 | that it doesn't do the double hashing that the RFC seems to say one | 288 | that it doesn't do the double hashing that the RFC seems to say one |
301 | should. Therefore, all relevant functions take a flag saying which | 289 | should. Therefore, all relevant functions take a flag saying which |
302 | variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ | 290 | variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ |
303 | typedef struct ocsp_basic_response_st | 291 | typedef struct ocsp_basic_response_st { |
304 | { | ||
305 | OCSP_RESPDATA *tbsResponseData; | 292 | OCSP_RESPDATA *tbsResponseData; |
306 | X509_ALGOR *signatureAlgorithm; | 293 | X509_ALGOR *signatureAlgorithm; |
307 | ASN1_BIT_STRING *signature; | 294 | ASN1_BIT_STRING *signature; |
308 | STACK_OF(X509) *certs; | 295 | STACK_OF(X509) *certs; |
309 | } OCSP_BASICRESP; | 296 | } OCSP_BASICRESP; |
310 | 297 | ||
311 | /* | 298 | /* |
312 | * CRLReason ::= ENUMERATED { | 299 | * CRLReason ::= ENUMERATED { |
@@ -319,164 +306,159 @@ typedef struct ocsp_basic_response_st | |||
319 | * certificateHold (6), | 306 | * certificateHold (6), |
320 | * removeFromCRL (8) } | 307 | * removeFromCRL (8) } |
321 | */ | 308 | */ |
322 | #define OCSP_REVOKED_STATUS_NOSTATUS -1 | 309 | #define OCSP_REVOKED_STATUS_NOSTATUS -1 |
323 | #define OCSP_REVOKED_STATUS_UNSPECIFIED 0 | 310 | #define OCSP_REVOKED_STATUS_UNSPECIFIED 0 |
324 | #define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 | 311 | #define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 |
325 | #define OCSP_REVOKED_STATUS_CACOMPROMISE 2 | 312 | #define OCSP_REVOKED_STATUS_CACOMPROMISE 2 |
326 | #define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 | 313 | #define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 |
327 | #define OCSP_REVOKED_STATUS_SUPERSEDED 4 | 314 | #define OCSP_REVOKED_STATUS_SUPERSEDED 4 |
328 | #define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 | 315 | #define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 |
329 | #define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 | 316 | #define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 |
330 | #define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 | 317 | #define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 |
331 | 318 | ||
332 | /* CrlID ::= SEQUENCE { | 319 | /* CrlID ::= SEQUENCE { |
333 | * crlUrl [0] EXPLICIT IA5String OPTIONAL, | 320 | * crlUrl [0] EXPLICIT IA5String OPTIONAL, |
334 | * crlNum [1] EXPLICIT INTEGER OPTIONAL, | 321 | * crlNum [1] EXPLICIT INTEGER OPTIONAL, |
335 | * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } | 322 | * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } |
336 | */ | 323 | */ |
337 | typedef struct ocsp_crl_id_st | 324 | typedef struct ocsp_crl_id_st { |
338 | { | ||
339 | ASN1_IA5STRING *crlUrl; | 325 | ASN1_IA5STRING *crlUrl; |
340 | ASN1_INTEGER *crlNum; | 326 | ASN1_INTEGER *crlNum; |
341 | ASN1_GENERALIZEDTIME *crlTime; | 327 | ASN1_GENERALIZEDTIME *crlTime; |
342 | } OCSP_CRLID; | 328 | } OCSP_CRLID; |
343 | 329 | ||
344 | /* ServiceLocator ::= SEQUENCE { | 330 | /* ServiceLocator ::= SEQUENCE { |
345 | * issuer Name, | 331 | * issuer Name, |
346 | * locator AuthorityInfoAccessSyntax OPTIONAL } | 332 | * locator AuthorityInfoAccessSyntax OPTIONAL } |
347 | */ | 333 | */ |
348 | typedef struct ocsp_service_locator_st | 334 | typedef struct ocsp_service_locator_st { |
349 | { | ||
350 | X509_NAME* issuer; | 335 | X509_NAME* issuer; |
351 | STACK_OF(ACCESS_DESCRIPTION) *locator; | 336 | STACK_OF(ACCESS_DESCRIPTION) *locator; |
352 | } OCSP_SERVICELOC; | 337 | } OCSP_SERVICELOC; |
353 | 338 | ||
354 | #define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" | 339 | #define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" |
355 | #define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" | 340 | #define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" |
356 | 341 | ||
357 | #define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) | 342 | #define d2i_OCSP_REQUEST_bio(bp,p) \ |
343 | ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) | ||
358 | 344 | ||
359 | #define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) | 345 | #define d2i_OCSP_RESPONSE_bio(bp,p) \ |
346 | ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) | ||
360 | 347 | ||
361 | #define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ | 348 | #define PEM_read_bio_OCSP_REQUEST(bp,x,cb) \ |
362 | (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) | 349 | (OCSP_REQUEST *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_REQUEST, \ |
350 | PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) | ||
363 | 351 | ||
364 | #define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ | 352 | #define PEM_read_bio_OCSP_RESPONSE(bp,x,cb) \ |
365 | (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) | 353 | (OCSP_RESPONSE *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_RESPONSE, \ |
354 | PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) | ||
366 | 355 | ||
367 | #define PEM_write_bio_OCSP_REQUEST(bp,o) \ | 356 | #define PEM_write_bio_OCSP_REQUEST(bp,o) \ |
368 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ | 357 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ |
369 | bp,(char *)o, NULL,NULL,0,NULL,NULL) | 358 | bp,(char *)o, NULL,NULL,0,NULL,NULL) |
370 | 359 | ||
371 | #define PEM_write_bio_OCSP_RESPONSE(bp,o) \ | 360 | #define PEM_write_bio_OCSP_RESPONSE(bp,o) \ |
372 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ | 361 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ |
373 | bp,(char *)o, NULL,NULL,0,NULL,NULL) | 362 | bp,(char *)o, NULL,NULL,0,NULL,NULL) |
374 | 363 | ||
375 | #define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) | 364 | #define i2d_OCSP_RESPONSE_bio(bp,o) \ |
365 | ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) | ||
376 | 366 | ||
377 | #define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) | 367 | #define i2d_OCSP_REQUEST_bio(bp,o) \ |
368 | ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) | ||
378 | 369 | ||
379 | #define OCSP_REQUEST_sign(o,pkey,md) \ | 370 | #define OCSP_REQUEST_sign(o,pkey,md) \ |
380 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ | 371 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO), \ |
381 | o->optionalSignature->signatureAlgorithm,NULL,\ | 372 | o->optionalSignature->signatureAlgorithm,NULL, \ |
382 | o->optionalSignature->signature,o->tbsRequest,pkey,md) | 373 | o->optionalSignature->signature,o->tbsRequest,pkey,md) |
383 | 374 | ||
384 | #define OCSP_BASICRESP_sign(o,pkey,md,d) \ | 375 | #define OCSP_BASICRESP_sign(o,pkey,md,d) \ |
385 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ | 376 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL, \ |
386 | o->signature,o->tbsResponseData,pkey,md) | 377 | o->signature,o->tbsResponseData,pkey,md) |
387 | 378 | ||
388 | #define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ | 379 | #define OCSP_REQUEST_verify(a,r) \ |
389 | a->optionalSignature->signatureAlgorithm,\ | 380 | ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO), \ |
381 | a->optionalSignature->signatureAlgorithm, \ | ||
390 | a->optionalSignature->signature,a->tbsRequest,r) | 382 | a->optionalSignature->signature,a->tbsRequest,r) |
391 | 383 | ||
392 | #define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ | 384 | #define OCSP_BASICRESP_verify(a,r,d) \ |
385 | ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA), \ | ||
393 | a->signatureAlgorithm,a->signature,a->tbsResponseData,r) | 386 | a->signatureAlgorithm,a->signature,a->tbsResponseData,r) |
394 | 387 | ||
395 | #define ASN1_BIT_STRING_digest(data,type,md,len) \ | 388 | #define ASN1_BIT_STRING_digest(data,type,md,len) \ |
396 | ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) | 389 | ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) |
397 | 390 | ||
398 | #define OCSP_CERTSTATUS_dup(cs)\ | 391 | #define OCSP_CERTSTATUS_dup(cs)\ |
399 | (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ | 392 | (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ |
400 | (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) | 393 | (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) |
401 | 394 | ||
402 | OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); | 395 | OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); |
403 | 396 | ||
404 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); | 397 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); |
405 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | 398 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, |
406 | int maxline); | 399 | int maxline); |
407 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); | 400 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); |
408 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); | 401 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); |
409 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); | 402 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); |
410 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, | 403 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, const char *name, |
411 | const char *name, const char *value); | 404 | const char *value); |
412 | 405 | ||
413 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); | 406 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); |
414 | 407 | ||
415 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, | 408 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, X509_NAME *issuerName, |
416 | X509_NAME *issuerName, | 409 | ASN1_BIT_STRING* issuerKey, ASN1_INTEGER *serialNumber); |
417 | ASN1_BIT_STRING* issuerKey, | ||
418 | ASN1_INTEGER *serialNumber); | ||
419 | 410 | ||
420 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); | 411 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); |
421 | 412 | ||
422 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); | 413 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); |
423 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); | 414 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); |
424 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); | 415 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); |
425 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); | 416 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); |
426 | 417 | ||
427 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); | 418 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); |
428 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); | 419 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); |
429 | 420 | ||
430 | int OCSP_request_sign(OCSP_REQUEST *req, | 421 | int OCSP_request_sign(OCSP_REQUEST *req, X509 *signer, EVP_PKEY *key, |
431 | X509 *signer, | 422 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); |
432 | EVP_PKEY *key, | ||
433 | const EVP_MD *dgst, | ||
434 | STACK_OF(X509) *certs, | ||
435 | unsigned long flags); | ||
436 | 423 | ||
437 | int OCSP_response_status(OCSP_RESPONSE *resp); | 424 | int OCSP_response_status(OCSP_RESPONSE *resp); |
438 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); | 425 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); |
439 | 426 | ||
440 | int OCSP_resp_count(OCSP_BASICRESP *bs); | 427 | int OCSP_resp_count(OCSP_BASICRESP *bs); |
441 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); | 428 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); |
442 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); | 429 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); |
443 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, | 430 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, |
444 | ASN1_GENERALIZEDTIME **revtime, | 431 | ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
445 | ASN1_GENERALIZEDTIME **thisupd, | 432 | ASN1_GENERALIZEDTIME **nextupd); |
446 | ASN1_GENERALIZEDTIME **nextupd); | 433 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, |
447 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | 434 | int *reason, ASN1_GENERALIZEDTIME **revtime, |
448 | int *reason, | 435 | ASN1_GENERALIZEDTIME **thisupd, ASN1_GENERALIZEDTIME **nextupd); |
449 | ASN1_GENERALIZEDTIME **revtime, | 436 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, |
450 | ASN1_GENERALIZEDTIME **thisupd, | 437 | ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); |
451 | ASN1_GENERALIZEDTIME **nextupd); | 438 | |
452 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, | 439 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, |
453 | ASN1_GENERALIZEDTIME *nextupd, | 440 | X509_STORE *store, unsigned long flags); |
454 | long sec, long maxsec); | 441 | |
455 | 442 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, | |
456 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags); | 443 | int *pssl); |
457 | 444 | ||
458 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl); | 445 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); |
459 | 446 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | |
460 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | 447 | |
461 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | 448 | int OCSP_request_onereq_count(OCSP_REQUEST *req); |
462 | |||
463 | int OCSP_request_onereq_count(OCSP_REQUEST *req); | ||
464 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); | 449 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); |
465 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); | 450 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); |
466 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, | 451 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, |
467 | ASN1_OCTET_STRING **pikeyHash, | 452 | ASN1_OCTET_STRING **pikeyHash, ASN1_INTEGER **pserial, |
468 | ASN1_INTEGER **pserial, OCSP_CERTID *cid); | 453 | OCSP_CERTID *cid); |
469 | int OCSP_request_is_signed(OCSP_REQUEST *req); | 454 | int OCSP_request_is_signed(OCSP_REQUEST *req); |
470 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); | 455 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); |
471 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | 456 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid, |
472 | OCSP_CERTID *cid, | 457 | int status, int reason, ASN1_TIME *revtime, ASN1_TIME *thisupd, |
473 | int status, int reason, | 458 | ASN1_TIME *nextupd); |
474 | ASN1_TIME *revtime, | 459 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); |
475 | ASN1_TIME *thisupd, ASN1_TIME *nextupd); | 460 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, |
476 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); | 461 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); |
477 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, | ||
478 | X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, | ||
479 | STACK_OF(X509) *certs, unsigned long flags); | ||
480 | 462 | ||
481 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); | 463 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); |
482 | 464 | ||
@@ -486,49 +468,60 @@ X509_EXTENSION *OCSP_archive_cutoff_new(char* tim); | |||
486 | 468 | ||
487 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); | 469 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); |
488 | 470 | ||
489 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); | 471 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); |
490 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); | 472 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); |
491 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos); | 473 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, |
492 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); | 474 | int lastpos); |
475 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, | ||
476 | int lastpos); | ||
493 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); | 477 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); |
494 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); | 478 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); |
495 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); | 479 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); |
496 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, | 480 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, |
497 | unsigned long flags); | 481 | int crit, unsigned long flags); |
498 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); | 482 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); |
499 | 483 | ||
500 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); | 484 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); |
501 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); | 485 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); |
502 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); | 486 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, |
503 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); | 487 | int lastpos); |
488 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); | ||
504 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); | 489 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); |
505 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); | 490 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); |
506 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); | 491 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); |
507 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, | 492 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, |
508 | unsigned long flags); | 493 | unsigned long flags); |
509 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); | 494 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); |
510 | 495 | ||
511 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); | 496 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); |
512 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); | 497 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); |
513 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos); | 498 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, |
514 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos); | 499 | int lastpos); |
500 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, | ||
501 | int lastpos); | ||
515 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); | 502 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); |
516 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); | 503 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); |
517 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx); | 504 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, |
518 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | 505 | int *idx); |
519 | unsigned long flags); | 506 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, |
520 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); | 507 | int crit, unsigned long flags); |
521 | 508 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); | |
522 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); | 509 | |
523 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); | 510 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); |
524 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos); | 511 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, |
525 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos); | 512 | int lastpos); |
513 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, | ||
514 | int lastpos); | ||
515 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, | ||
516 | int lastpos); | ||
526 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); | 517 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); |
527 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); | 518 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); |
528 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx); | 519 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, |
529 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, | 520 | int *idx); |
530 | unsigned long flags); | 521 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, |
531 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); | 522 | int crit, unsigned long flags); |
523 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, | ||
524 | int loc); | ||
532 | 525 | ||
533 | DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) | 526 | DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) |
534 | DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) | 527 | DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) |
@@ -550,11 +543,11 @@ const char *OCSP_response_status_str(long s); | |||
550 | const char *OCSP_cert_status_str(long s); | 543 | const char *OCSP_cert_status_str(long s); |
551 | const char *OCSP_crl_reason_str(long s); | 544 | const char *OCSP_crl_reason_str(long s); |
552 | 545 | ||
553 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); | 546 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); |
554 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); | 547 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); |
555 | 548 | ||
556 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 549 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, |
557 | X509_STORE *st, unsigned long flags); | 550 | X509_STORE *st, unsigned long flags); |
558 | 551 | ||
559 | /* BEGIN ERROR CODES */ | 552 | /* BEGIN ERROR CODES */ |
560 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 553 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
diff --git a/src/lib/libcrypto/ocsp/ocsp_cl.c b/src/lib/libcrypto/ocsp/ocsp_cl.c index 9c14d9da27..716513d2f9 100644 --- a/src/lib/libcrypto/ocsp/ocsp_cl.c +++ b/src/lib/libcrypto/ocsp/ocsp_cl.c | |||
@@ -78,229 +78,241 @@ | |||
78 | /* Add an OCSP_CERTID to an OCSP request. Return new OCSP_ONEREQ | 78 | /* Add an OCSP_CERTID to an OCSP request. Return new OCSP_ONEREQ |
79 | * pointer: useful if we want to add extensions. | 79 | * pointer: useful if we want to add extensions. |
80 | */ | 80 | */ |
81 | 81 | OCSP_ONEREQ * | |
82 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid) | 82 | OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid) |
83 | { | 83 | { |
84 | OCSP_ONEREQ *one = NULL; | 84 | OCSP_ONEREQ *one = NULL; |
85 | 85 | ||
86 | if (!(one = OCSP_ONEREQ_new())) goto err; | 86 | if (!(one = OCSP_ONEREQ_new())) |
87 | if (one->reqCert) OCSP_CERTID_free(one->reqCert); | 87 | goto err; |
88 | if (one->reqCert) | ||
89 | OCSP_CERTID_free(one->reqCert); | ||
88 | one->reqCert = cid; | 90 | one->reqCert = cid; |
89 | if (req && | 91 | if (req && !sk_OCSP_ONEREQ_push(req->tbsRequest->requestList, one)) |
90 | !sk_OCSP_ONEREQ_push(req->tbsRequest->requestList, one)) | 92 | goto err; |
91 | goto err; | ||
92 | return one; | 93 | return one; |
93 | err: | 94 | err: |
94 | OCSP_ONEREQ_free(one); | 95 | OCSP_ONEREQ_free(one); |
95 | return NULL; | 96 | return NULL; |
96 | } | 97 | } |
97 | 98 | ||
98 | /* Set requestorName from an X509_NAME structure */ | 99 | /* Set requestorName from an X509_NAME structure */ |
99 | 100 | int | |
100 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm) | 101 | OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm) |
101 | { | 102 | { |
102 | GENERAL_NAME *gen; | 103 | GENERAL_NAME *gen; |
104 | |||
103 | gen = GENERAL_NAME_new(); | 105 | gen = GENERAL_NAME_new(); |
104 | if (gen == NULL) | 106 | if (gen == NULL) |
105 | return 0; | 107 | return 0; |
106 | if (!X509_NAME_set(&gen->d.directoryName, nm)) | 108 | if (!X509_NAME_set(&gen->d.directoryName, nm)) { |
107 | { | ||
108 | GENERAL_NAME_free(gen); | 109 | GENERAL_NAME_free(gen); |
109 | return 0; | 110 | return 0; |
110 | } | 111 | } |
111 | gen->type = GEN_DIRNAME; | 112 | gen->type = GEN_DIRNAME; |
112 | if (req->tbsRequest->requestorName) | 113 | if (req->tbsRequest->requestorName) |
113 | GENERAL_NAME_free(req->tbsRequest->requestorName); | 114 | GENERAL_NAME_free(req->tbsRequest->requestorName); |
114 | req->tbsRequest->requestorName = gen; | 115 | req->tbsRequest->requestorName = gen; |
115 | return 1; | 116 | return 1; |
116 | } | 117 | } |
117 | 118 | ||
118 | |||
119 | /* Add a certificate to an OCSP request */ | 119 | /* Add a certificate to an OCSP request */ |
120 | 120 | int | |
121 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert) | 121 | OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert) |
122 | { | 122 | { |
123 | OCSP_SIGNATURE *sig; | 123 | OCSP_SIGNATURE *sig; |
124 | |||
124 | if (!req->optionalSignature) | 125 | if (!req->optionalSignature) |
125 | req->optionalSignature = OCSP_SIGNATURE_new(); | 126 | req->optionalSignature = OCSP_SIGNATURE_new(); |
126 | sig = req->optionalSignature; | 127 | sig = req->optionalSignature; |
127 | if (!sig) return 0; | 128 | if (!sig) |
128 | if (!cert) return 1; | 129 | return 0; |
130 | if (!cert) | ||
131 | return 1; | ||
129 | if (!sig->certs && !(sig->certs = sk_X509_new_null())) | 132 | if (!sig->certs && !(sig->certs = sk_X509_new_null())) |
130 | return 0; | 133 | return 0; |
131 | 134 | ||
132 | if(!sk_X509_push(sig->certs, cert)) return 0; | 135 | if(!sk_X509_push(sig->certs, cert)) |
136 | return 0; | ||
133 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); | 137 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); |
134 | return 1; | 138 | return 1; |
135 | } | 139 | } |
136 | 140 | ||
137 | /* Sign an OCSP request set the requestorName to the subjec | 141 | /* Sign an OCSP request set the requestorName to the subjec |
138 | * name of an optional signers certificate and include one | 142 | * name of an optional signers certificate and include one |
139 | * or more optional certificates in the request. Behaves | 143 | * or more optional certificates in the request. Behaves |
140 | * like PKCS7_sign(). | 144 | * like PKCS7_sign(). |
141 | */ | 145 | */ |
142 | 146 | int | |
143 | int OCSP_request_sign(OCSP_REQUEST *req, | 147 | OCSP_request_sign(OCSP_REQUEST *req, X509 *signer, EVP_PKEY *key, |
144 | X509 *signer, | 148 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags) |
145 | EVP_PKEY *key, | 149 | { |
146 | const EVP_MD *dgst, | ||
147 | STACK_OF(X509) *certs, | ||
148 | unsigned long flags) | ||
149 | { | ||
150 | int i; | 150 | int i; |
151 | OCSP_SIGNATURE *sig; | 151 | OCSP_SIGNATURE *sig; |
152 | X509 *x; | 152 | X509 *x; |
153 | 153 | ||
154 | if (!OCSP_request_set1_name(req, X509_get_subject_name(signer))) | 154 | if (!OCSP_request_set1_name(req, X509_get_subject_name(signer))) |
155 | goto err; | ||
156 | |||
157 | if (!(req->optionalSignature = sig = OCSP_SIGNATURE_new())) | ||
158 | goto err; | ||
159 | if (key) { | ||
160 | if (!X509_check_private_key(signer, key)) { | ||
161 | OCSPerr(OCSP_F_OCSP_REQUEST_SIGN, | ||
162 | OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | ||
155 | goto err; | 163 | goto err; |
156 | |||
157 | if (!(req->optionalSignature = sig = OCSP_SIGNATURE_new())) goto err; | ||
158 | if (key) | ||
159 | { | ||
160 | if (!X509_check_private_key(signer, key)) | ||
161 | { | ||
162 | OCSPerr(OCSP_F_OCSP_REQUEST_SIGN, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | ||
163 | goto err; | ||
164 | } | ||
165 | if (!OCSP_REQUEST_sign(req, key, dgst)) goto err; | ||
166 | } | 164 | } |
165 | if (!OCSP_REQUEST_sign(req, key, dgst)) | ||
166 | goto err; | ||
167 | } | ||
167 | 168 | ||
168 | if (!(flags & OCSP_NOCERTS)) | 169 | if (!(flags & OCSP_NOCERTS)) { |
169 | { | 170 | if(!OCSP_request_add1_cert(req, signer)) |
170 | if(!OCSP_request_add1_cert(req, signer)) goto err; | 171 | goto err; |
171 | for (i = 0; i < sk_X509_num(certs); i++) | 172 | for (i = 0; i < sk_X509_num(certs); i++) { |
172 | { | ||
173 | x = sk_X509_value(certs, i); | 173 | x = sk_X509_value(certs, i); |
174 | if (!OCSP_request_add1_cert(req, x)) goto err; | 174 | if (!OCSP_request_add1_cert(req, x)) |
175 | } | 175 | goto err; |
176 | } | 176 | } |
177 | } | ||
177 | 178 | ||
178 | return 1; | 179 | return 1; |
179 | err: | 180 | err: |
180 | OCSP_SIGNATURE_free(req->optionalSignature); | 181 | OCSP_SIGNATURE_free(req->optionalSignature); |
181 | req->optionalSignature = NULL; | 182 | req->optionalSignature = NULL; |
182 | return 0; | 183 | return 0; |
183 | } | 184 | } |
184 | 185 | ||
185 | /* Get response status */ | 186 | /* Get response status */ |
186 | 187 | int | |
187 | int OCSP_response_status(OCSP_RESPONSE *resp) | 188 | OCSP_response_status(OCSP_RESPONSE *resp) |
188 | { | 189 | { |
189 | return ASN1_ENUMERATED_get(resp->responseStatus); | 190 | return ASN1_ENUMERATED_get(resp->responseStatus); |
190 | } | 191 | } |
191 | 192 | ||
192 | /* Extract basic response from OCSP_RESPONSE or NULL if | 193 | /* Extract basic response from OCSP_RESPONSE or NULL if |
193 | * no basic response present. | 194 | * no basic response present. |
194 | */ | 195 | */ |
195 | 196 | OCSP_BASICRESP * | |
196 | 197 | OCSP_response_get1_basic(OCSP_RESPONSE *resp) | |
197 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp) | 198 | { |
198 | { | ||
199 | OCSP_RESPBYTES *rb; | 199 | OCSP_RESPBYTES *rb; |
200 | |||
200 | rb = resp->responseBytes; | 201 | rb = resp->responseBytes; |
201 | if (!rb) | 202 | if (!rb) { |
202 | { | 203 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, |
203 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, OCSP_R_NO_RESPONSE_DATA); | 204 | OCSP_R_NO_RESPONSE_DATA); |
204 | return NULL; | 205 | return NULL; |
205 | } | 206 | } |
206 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) | 207 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) { |
207 | { | 208 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, |
208 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, OCSP_R_NOT_BASIC_RESPONSE); | 209 | OCSP_R_NOT_BASIC_RESPONSE); |
209 | return NULL; | 210 | return NULL; |
210 | } | 211 | } |
211 | 212 | ||
212 | return ASN1_item_unpack(rb->response, ASN1_ITEM_rptr(OCSP_BASICRESP)); | 213 | return ASN1_item_unpack(rb->response, ASN1_ITEM_rptr(OCSP_BASICRESP)); |
213 | } | 214 | } |
214 | 215 | ||
215 | /* Return number of OCSP_SINGLERESP reponses present in | 216 | /* Return number of OCSP_SINGLERESP reponses present in |
216 | * a basic response. | 217 | * a basic response. |
217 | */ | 218 | */ |
218 | 219 | int | |
219 | int OCSP_resp_count(OCSP_BASICRESP *bs) | 220 | OCSP_resp_count(OCSP_BASICRESP *bs) |
220 | { | 221 | { |
221 | if (!bs) return -1; | 222 | if (!bs) |
223 | return -1; | ||
222 | return sk_OCSP_SINGLERESP_num(bs->tbsResponseData->responses); | 224 | return sk_OCSP_SINGLERESP_num(bs->tbsResponseData->responses); |
223 | } | 225 | } |
224 | 226 | ||
225 | /* Extract an OCSP_SINGLERESP response with a given index */ | 227 | /* Extract an OCSP_SINGLERESP response with a given index */ |
226 | 228 | OCSP_SINGLERESP * | |
227 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx) | 229 | OCSP_resp_get0(OCSP_BASICRESP *bs, int idx) |
228 | { | 230 | { |
229 | if (!bs) return NULL; | 231 | if (!bs) |
232 | return NULL; | ||
230 | return sk_OCSP_SINGLERESP_value(bs->tbsResponseData->responses, idx); | 233 | return sk_OCSP_SINGLERESP_value(bs->tbsResponseData->responses, idx); |
231 | } | 234 | } |
232 | 235 | ||
233 | /* Look single response matching a given certificate ID */ | 236 | /* Look single response matching a given certificate ID */ |
234 | 237 | int | |
235 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last) | 238 | OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last) |
236 | { | 239 | { |
237 | int i; | 240 | int i; |
238 | STACK_OF(OCSP_SINGLERESP) *sresp; | 241 | STACK_OF(OCSP_SINGLERESP) *sresp; |
239 | OCSP_SINGLERESP *single; | 242 | OCSP_SINGLERESP *single; |
240 | if (!bs) return -1; | 243 | |
241 | if (last < 0) last = 0; | 244 | if (!bs) |
242 | else last++; | 245 | return -1; |
246 | if (last < 0) | ||
247 | last = 0; | ||
248 | else | ||
249 | last++; | ||
243 | sresp = bs->tbsResponseData->responses; | 250 | sresp = bs->tbsResponseData->responses; |
244 | for (i = last; i < sk_OCSP_SINGLERESP_num(sresp); i++) | 251 | for (i = last; i < sk_OCSP_SINGLERESP_num(sresp); i++) { |
245 | { | ||
246 | single = sk_OCSP_SINGLERESP_value(sresp, i); | 252 | single = sk_OCSP_SINGLERESP_value(sresp, i); |
247 | if (!OCSP_id_cmp(id, single->certId)) return i; | 253 | if (!OCSP_id_cmp(id, single->certId)) |
248 | } | 254 | return i; |
249 | return -1; | ||
250 | } | 255 | } |
256 | return -1; | ||
257 | } | ||
251 | 258 | ||
252 | /* Extract status information from an OCSP_SINGLERESP structure. | 259 | /* Extract status information from an OCSP_SINGLERESP structure. |
253 | * Note: the revtime and reason values are only set if the | 260 | * Note: the revtime and reason values are only set if the |
254 | * certificate status is revoked. Returns numerical value of | 261 | * certificate status is revoked. Returns numerical value of |
255 | * status. | 262 | * status. |
256 | */ | 263 | */ |
257 | 264 | int | |
258 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, | 265 | OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, |
259 | ASN1_GENERALIZEDTIME **revtime, | 266 | ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
260 | ASN1_GENERALIZEDTIME **thisupd, | 267 | ASN1_GENERALIZEDTIME **nextupd) |
261 | ASN1_GENERALIZEDTIME **nextupd) | 268 | { |
262 | { | ||
263 | int ret; | 269 | int ret; |
264 | OCSP_CERTSTATUS *cst; | 270 | OCSP_CERTSTATUS *cst; |
265 | if(!single) return -1; | 271 | |
272 | if (!single) | ||
273 | return -1; | ||
266 | cst = single->certStatus; | 274 | cst = single->certStatus; |
267 | ret = cst->type; | 275 | ret = cst->type; |
268 | if (ret == V_OCSP_CERTSTATUS_REVOKED) | 276 | if (ret == V_OCSP_CERTSTATUS_REVOKED) { |
269 | { | ||
270 | OCSP_REVOKEDINFO *rev = cst->value.revoked; | 277 | OCSP_REVOKEDINFO *rev = cst->value.revoked; |
271 | if (revtime) *revtime = rev->revocationTime; | 278 | |
272 | if (reason) | 279 | if (revtime) |
273 | { | 280 | *revtime = rev->revocationTime; |
274 | if(rev->revocationReason) | 281 | if (reason) { |
282 | if (rev->revocationReason) | ||
275 | *reason = ASN1_ENUMERATED_get(rev->revocationReason); | 283 | *reason = ASN1_ENUMERATED_get(rev->revocationReason); |
276 | else *reason = -1; | 284 | else |
277 | } | 285 | *reason = -1; |
278 | } | 286 | } |
279 | if(thisupd) *thisupd = single->thisUpdate; | ||
280 | if(nextupd) *nextupd = single->nextUpdate; | ||
281 | return ret; | ||
282 | } | 287 | } |
288 | if (thisupd) | ||
289 | *thisupd = single->thisUpdate; | ||
290 | if (nextupd) | ||
291 | *nextupd = single->nextUpdate; | ||
292 | return ret; | ||
293 | } | ||
283 | 294 | ||
284 | /* This function combines the previous ones: look up a certificate ID and | 295 | /* This function combines the previous ones: look up a certificate ID and |
285 | * if found extract status information. Return 0 is successful. | 296 | * if found extract status information. Return 0 is successful. |
286 | */ | 297 | */ |
287 | 298 | int | |
288 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | 299 | OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, |
289 | int *reason, | 300 | int *reason, ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
290 | ASN1_GENERALIZEDTIME **revtime, | 301 | ASN1_GENERALIZEDTIME **nextupd) |
291 | ASN1_GENERALIZEDTIME **thisupd, | 302 | { |
292 | ASN1_GENERALIZEDTIME **nextupd) | ||
293 | { | ||
294 | int i; | 303 | int i; |
295 | OCSP_SINGLERESP *single; | 304 | OCSP_SINGLERESP *single; |
305 | |||
296 | i = OCSP_resp_find(bs, id, -1); | 306 | i = OCSP_resp_find(bs, id, -1); |
297 | /* Maybe check for multiple responses and give an error? */ | 307 | /* Maybe check for multiple responses and give an error? */ |
298 | if(i < 0) return 0; | 308 | if (i < 0) |
309 | return 0; | ||
299 | single = OCSP_resp_get0(bs, i); | 310 | single = OCSP_resp_get0(bs, i); |
300 | i = OCSP_single_get0_status(single, reason, revtime, thisupd, nextupd); | 311 | i = OCSP_single_get0_status(single, reason, revtime, thisupd, nextupd); |
301 | if(status) *status = i; | 312 | if (status) |
313 | *status = i; | ||
302 | return 1; | 314 | return 1; |
303 | } | 315 | } |
304 | 316 | ||
305 | /* Check validity of thisUpdate and nextUpdate fields. It is possible that the request will | 317 | /* Check validity of thisUpdate and nextUpdate fields. It is possible that the request will |
306 | * take a few seconds to process and/or the time wont be totally accurate. Therefore to avoid | 318 | * take a few seconds to process and/or the time wont be totally accurate. Therefore to avoid |
@@ -308,64 +320,61 @@ int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | |||
308 | * Also to avoid accepting very old responses without a nextUpdate field an optional maxage | 320 | * Also to avoid accepting very old responses without a nextUpdate field an optional maxage |
309 | * parameter specifies the maximum age the thisUpdate field can be. | 321 | * parameter specifies the maximum age the thisUpdate field can be. |
310 | */ | 322 | */ |
311 | 323 | int | |
312 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec) | 324 | OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, |
313 | { | 325 | ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec) |
326 | { | ||
314 | int ret = 1; | 327 | int ret = 1; |
315 | time_t t_now, t_tmp; | 328 | time_t t_now, t_tmp; |
329 | |||
316 | time(&t_now); | 330 | time(&t_now); |
317 | /* Check thisUpdate is valid and not more than nsec in the future */ | 331 | /* Check thisUpdate is valid and not more than nsec in the future */ |
318 | if (!ASN1_GENERALIZEDTIME_check(thisupd)) | 332 | if (!ASN1_GENERALIZEDTIME_check(thisupd)) { |
319 | { | 333 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
320 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_ERROR_IN_THISUPDATE_FIELD); | 334 | OCSP_R_ERROR_IN_THISUPDATE_FIELD); |
321 | ret = 0; | 335 | ret = 0; |
322 | } | 336 | } else { |
323 | else | 337 | t_tmp = t_now + nsec; |
324 | { | 338 | if (X509_cmp_time(thisupd, &t_tmp) > 0) { |
325 | t_tmp = t_now + nsec; | 339 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
326 | if (X509_cmp_time(thisupd, &t_tmp) > 0) | 340 | OCSP_R_STATUS_NOT_YET_VALID); |
327 | { | ||
328 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_NOT_YET_VALID); | ||
329 | ret = 0; | 341 | ret = 0; |
330 | } | 342 | } |
331 | 343 | ||
332 | /* If maxsec specified check thisUpdate is not more than maxsec in the past */ | 344 | /* If maxsec specified check thisUpdate is not more than maxsec in the past */ |
333 | if (maxsec >= 0) | 345 | if (maxsec >= 0) { |
334 | { | ||
335 | t_tmp = t_now - maxsec; | 346 | t_tmp = t_now - maxsec; |
336 | if (X509_cmp_time(thisupd, &t_tmp) < 0) | 347 | if (X509_cmp_time(thisupd, &t_tmp) < 0) { |
337 | { | 348 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
338 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_TOO_OLD); | 349 | OCSP_R_STATUS_TOO_OLD); |
339 | ret = 0; | 350 | ret = 0; |
340 | } | ||
341 | } | 351 | } |
342 | } | 352 | } |
343 | 353 | } | |
344 | 354 | ||
345 | if (!nextupd) return ret; | 355 | if (!nextupd) |
356 | return ret; | ||
346 | 357 | ||
347 | /* Check nextUpdate is valid and not more than nsec in the past */ | 358 | /* Check nextUpdate is valid and not more than nsec in the past */ |
348 | if (!ASN1_GENERALIZEDTIME_check(nextupd)) | 359 | if (!ASN1_GENERALIZEDTIME_check(nextupd)) { |
349 | { | 360 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
350 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_ERROR_IN_NEXTUPDATE_FIELD); | 361 | OCSP_R_ERROR_IN_NEXTUPDATE_FIELD); |
351 | ret = 0; | 362 | ret = 0; |
352 | } | 363 | } else { |
353 | else | ||
354 | { | ||
355 | t_tmp = t_now - nsec; | 364 | t_tmp = t_now - nsec; |
356 | if (X509_cmp_time(nextupd, &t_tmp) < 0) | 365 | if (X509_cmp_time(nextupd, &t_tmp) < 0) { |
357 | { | 366 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
358 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_EXPIRED); | 367 | OCSP_R_STATUS_EXPIRED); |
359 | ret = 0; | 368 | ret = 0; |
360 | } | ||
361 | } | 369 | } |
370 | } | ||
362 | 371 | ||
363 | /* Also don't allow nextUpdate to precede thisUpdate */ | 372 | /* Also don't allow nextUpdate to precede thisUpdate */ |
364 | if (ASN1_STRING_cmp(nextupd, thisupd) < 0) | 373 | if (ASN1_STRING_cmp(nextupd, thisupd) < 0) { |
365 | { | 374 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
366 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE); | 375 | OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE); |
367 | ret = 0; | 376 | ret = 0; |
368 | } | 377 | } |
369 | 378 | ||
370 | return ret; | 379 | return ret; |
371 | } | 380 | } |
diff --git a/src/lib/libcrypto/ocsp/ocsp_ext.c b/src/lib/libcrypto/ocsp/ocsp_ext.c index 9c7832b301..6ec8ca4adf 100644 --- a/src/lib/libcrypto/ocsp/ocsp_ext.c +++ b/src/lib/libcrypto/ocsp/ocsp_ext.c | |||
@@ -73,238 +73,285 @@ | |||
73 | 73 | ||
74 | /* OCSP request extensions */ | 74 | /* OCSP request extensions */ |
75 | 75 | ||
76 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x) | 76 | int |
77 | { | 77 | OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x) |
78 | return(X509v3_get_ext_count(x->tbsRequest->requestExtensions)); | 78 | { |
79 | } | 79 | return X509v3_get_ext_count(x->tbsRequest->requestExtensions); |
80 | 80 | } | |
81 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos) | 81 | |
82 | { | 82 | int |
83 | return(X509v3_get_ext_by_NID(x->tbsRequest->requestExtensions,nid,lastpos)); | 83 | OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos) |
84 | } | 84 | { |
85 | 85 | return X509v3_get_ext_by_NID(x->tbsRequest->requestExtensions, nid, | |
86 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos) | 86 | lastpos); |
87 | { | 87 | } |
88 | return(X509v3_get_ext_by_OBJ(x->tbsRequest->requestExtensions,obj,lastpos)); | 88 | |
89 | } | 89 | int |
90 | 90 | OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos) | |
91 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos) | 91 | { |
92 | { | 92 | return X509v3_get_ext_by_OBJ(x->tbsRequest->requestExtensions, obj, |
93 | return(X509v3_get_ext_by_critical(x->tbsRequest->requestExtensions,crit,lastpos)); | 93 | lastpos); |
94 | } | 94 | } |
95 | 95 | ||
96 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc) | 96 | int |
97 | { | 97 | OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos) |
98 | return(X509v3_get_ext(x->tbsRequest->requestExtensions,loc)); | 98 | { |
99 | } | 99 | return X509v3_get_ext_by_critical(x->tbsRequest->requestExtensions, |
100 | 100 | crit, lastpos); | |
101 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc) | 101 | } |
102 | { | 102 | |
103 | return(X509v3_delete_ext(x->tbsRequest->requestExtensions,loc)); | 103 | X509_EXTENSION * |
104 | } | 104 | OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc) |
105 | 105 | { | |
106 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx) | 106 | return X509v3_get_ext(x->tbsRequest->requestExtensions, loc); |
107 | { | 107 | } |
108 | |||
109 | X509_EXTENSION * | ||
110 | OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc) | ||
111 | { | ||
112 | return X509v3_delete_ext(x->tbsRequest->requestExtensions, loc); | ||
113 | } | ||
114 | |||
115 | void * | ||
116 | OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx) | ||
117 | { | ||
108 | return X509V3_get_d2i(x->tbsRequest->requestExtensions, nid, crit, idx); | 118 | return X509V3_get_d2i(x->tbsRequest->requestExtensions, nid, crit, idx); |
109 | } | 119 | } |
110 | 120 | ||
111 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, | 121 | int |
112 | unsigned long flags) | 122 | OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, |
113 | { | 123 | unsigned long flags) |
114 | return X509V3_add1_i2d(&x->tbsRequest->requestExtensions, nid, value, crit, flags); | 124 | { |
115 | } | 125 | return X509V3_add1_i2d(&x->tbsRequest->requestExtensions, nid, value, |
116 | 126 | crit, flags); | |
117 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc) | 127 | } |
118 | { | 128 | |
119 | return(X509v3_add_ext(&(x->tbsRequest->requestExtensions),ex,loc) != NULL); | 129 | int |
120 | } | 130 | OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc) |
131 | { | ||
132 | return X509v3_add_ext(&(x->tbsRequest->requestExtensions), ex, loc) != | ||
133 | NULL; | ||
134 | } | ||
121 | 135 | ||
122 | /* Single extensions */ | 136 | /* Single extensions */ |
123 | 137 | ||
124 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x) | 138 | int |
125 | { | 139 | OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x) |
126 | return(X509v3_get_ext_count(x->singleRequestExtensions)); | 140 | { |
127 | } | 141 | return X509v3_get_ext_count(x->singleRequestExtensions); |
128 | 142 | } | |
129 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos) | 143 | |
130 | { | 144 | int |
131 | return(X509v3_get_ext_by_NID(x->singleRequestExtensions,nid,lastpos)); | 145 | OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos) |
132 | } | 146 | { |
133 | 147 | return X509v3_get_ext_by_NID(x->singleRequestExtensions, nid, lastpos); | |
134 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos) | 148 | } |
135 | { | 149 | |
136 | return(X509v3_get_ext_by_OBJ(x->singleRequestExtensions,obj,lastpos)); | 150 | int |
137 | } | 151 | OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos) |
138 | 152 | { | |
139 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos) | 153 | return X509v3_get_ext_by_OBJ(x->singleRequestExtensions, obj, lastpos); |
140 | { | 154 | } |
141 | return(X509v3_get_ext_by_critical(x->singleRequestExtensions,crit,lastpos)); | 155 | |
142 | } | 156 | int |
143 | 157 | OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos) | |
144 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc) | 158 | { |
145 | { | 159 | return X509v3_get_ext_by_critical(x->singleRequestExtensions, crit, |
146 | return(X509v3_get_ext(x->singleRequestExtensions,loc)); | 160 | lastpos); |
147 | } | 161 | } |
148 | 162 | ||
149 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc) | 163 | X509_EXTENSION * |
150 | { | 164 | OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc) |
151 | return(X509v3_delete_ext(x->singleRequestExtensions,loc)); | 165 | { |
152 | } | 166 | return X509v3_get_ext(x->singleRequestExtensions, loc); |
167 | } | ||
168 | |||
169 | X509_EXTENSION * | ||
170 | OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc) | ||
171 | { | ||
172 | return X509v3_delete_ext(x->singleRequestExtensions, loc); | ||
173 | } | ||
153 | 174 | ||
154 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx) | 175 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx) |
155 | { | 176 | { |
156 | return X509V3_get_d2i(x->singleRequestExtensions, nid, crit, idx); | 177 | return X509V3_get_d2i(x->singleRequestExtensions, nid, crit, idx); |
157 | } | 178 | } |
158 | 179 | ||
159 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, | 180 | int |
160 | unsigned long flags) | 181 | OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, |
161 | { | 182 | unsigned long flags) |
162 | return X509V3_add1_i2d(&x->singleRequestExtensions, nid, value, crit, flags); | 183 | { |
163 | } | 184 | return X509V3_add1_i2d(&x->singleRequestExtensions, nid, value, crit, |
164 | 185 | flags); | |
165 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc) | 186 | } |
166 | { | 187 | |
167 | return(X509v3_add_ext(&(x->singleRequestExtensions),ex,loc) != NULL); | 188 | int |
168 | } | 189 | OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc) |
190 | { | ||
191 | return X509v3_add_ext(&(x->singleRequestExtensions), ex, loc) != NULL; | ||
192 | } | ||
169 | 193 | ||
170 | /* OCSP Basic response */ | 194 | /* OCSP Basic response */ |
171 | 195 | ||
172 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x) | 196 | int |
173 | { | 197 | OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x) |
174 | return(X509v3_get_ext_count(x->tbsResponseData->responseExtensions)); | 198 | { |
175 | } | 199 | return X509v3_get_ext_count(x->tbsResponseData->responseExtensions); |
176 | 200 | } | |
177 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos) | 201 | |
178 | { | 202 | int |
179 | return(X509v3_get_ext_by_NID(x->tbsResponseData->responseExtensions,nid,lastpos)); | 203 | OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos) |
180 | } | 204 | { |
181 | 205 | return X509v3_get_ext_by_NID(x->tbsResponseData->responseExtensions, | |
182 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos) | 206 | nid ,lastpos); |
183 | { | 207 | } |
184 | return(X509v3_get_ext_by_OBJ(x->tbsResponseData->responseExtensions,obj,lastpos)); | 208 | |
185 | } | 209 | int |
186 | 210 | OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos) | |
187 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos) | 211 | { |
188 | { | 212 | return X509v3_get_ext_by_OBJ(x->tbsResponseData->responseExtensions, |
189 | return(X509v3_get_ext_by_critical(x->tbsResponseData->responseExtensions,crit,lastpos)); | 213 | obj, lastpos); |
190 | } | 214 | } |
191 | 215 | ||
192 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc) | 216 | int |
193 | { | 217 | OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos) |
194 | return(X509v3_get_ext(x->tbsResponseData->responseExtensions,loc)); | 218 | { |
195 | } | 219 | return X509v3_get_ext_by_critical(x->tbsResponseData->responseExtensions, |
196 | 220 | crit, lastpos); | |
197 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc) | 221 | } |
198 | { | 222 | |
199 | return(X509v3_delete_ext(x->tbsResponseData->responseExtensions,loc)); | 223 | X509_EXTENSION * |
200 | } | 224 | OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc) |
201 | 225 | { | |
202 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx) | 226 | return X509v3_get_ext(x->tbsResponseData->responseExtensions, loc); |
203 | { | 227 | } |
204 | return X509V3_get_d2i(x->tbsResponseData->responseExtensions, nid, crit, idx); | 228 | |
205 | } | 229 | X509_EXTENSION * |
206 | 230 | OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc) | |
207 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | 231 | { |
208 | unsigned long flags) | 232 | return X509v3_delete_ext(x->tbsResponseData->responseExtensions, loc); |
209 | { | 233 | } |
210 | return X509V3_add1_i2d(&x->tbsResponseData->responseExtensions, nid, value, crit, flags); | 234 | |
211 | } | 235 | void * |
212 | 236 | OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx) | |
213 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc) | 237 | { |
214 | { | 238 | return X509V3_get_d2i(x->tbsResponseData->responseExtensions, nid, |
215 | return(X509v3_add_ext(&(x->tbsResponseData->responseExtensions),ex,loc) != NULL); | 239 | crit, idx); |
216 | } | 240 | } |
241 | |||
242 | int | ||
243 | OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | ||
244 | unsigned long flags) | ||
245 | { | ||
246 | return X509V3_add1_i2d(&x->tbsResponseData->responseExtensions, nid, | ||
247 | value, crit, flags); | ||
248 | } | ||
249 | |||
250 | int | ||
251 | OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc) | ||
252 | { | ||
253 | return X509v3_add_ext(&(x->tbsResponseData->responseExtensions), ex, | ||
254 | loc) != NULL; | ||
255 | } | ||
217 | 256 | ||
218 | /* OCSP single response extensions */ | 257 | /* OCSP single response extensions */ |
219 | 258 | ||
220 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x) | 259 | int |
221 | { | 260 | OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x) |
222 | return(X509v3_get_ext_count(x->singleExtensions)); | 261 | { |
223 | } | 262 | return X509v3_get_ext_count(x->singleExtensions); |
224 | 263 | } | |
225 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos) | 264 | |
226 | { | 265 | int |
227 | return(X509v3_get_ext_by_NID(x->singleExtensions,nid,lastpos)); | 266 | OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos) |
228 | } | 267 | { |
229 | 268 | return X509v3_get_ext_by_NID(x->singleExtensions, nid, lastpos); | |
230 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos) | 269 | } |
231 | { | 270 | |
232 | return(X509v3_get_ext_by_OBJ(x->singleExtensions,obj,lastpos)); | 271 | int |
233 | } | 272 | OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, |
234 | 273 | int lastpos) | |
235 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos) | 274 | { |
236 | { | 275 | return X509v3_get_ext_by_OBJ(x->singleExtensions, obj, lastpos); |
237 | return(X509v3_get_ext_by_critical(x->singleExtensions,crit,lastpos)); | 276 | } |
238 | } | 277 | |
239 | 278 | int | |
240 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc) | 279 | OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos) |
241 | { | 280 | { |
242 | return(X509v3_get_ext(x->singleExtensions,loc)); | 281 | return X509v3_get_ext_by_critical(x->singleExtensions, crit, lastpos); |
243 | } | 282 | } |
244 | 283 | ||
245 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc) | 284 | X509_EXTENSION * |
246 | { | 285 | OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc) |
247 | return(X509v3_delete_ext(x->singleExtensions,loc)); | 286 | { |
248 | } | 287 | return X509v3_get_ext(x->singleExtensions, loc); |
249 | 288 | } | |
250 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx) | 289 | |
251 | { | 290 | X509_EXTENSION * |
291 | OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc) | ||
292 | { | ||
293 | return X509v3_delete_ext(x->singleExtensions, loc); | ||
294 | } | ||
295 | |||
296 | void * | ||
297 | OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx) | ||
298 | { | ||
252 | return X509V3_get_d2i(x->singleExtensions, nid, crit, idx); | 299 | return X509V3_get_d2i(x->singleExtensions, nid, crit, idx); |
253 | } | 300 | } |
254 | 301 | ||
255 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, | 302 | int |
256 | unsigned long flags) | 303 | OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, |
257 | { | 304 | unsigned long flags) |
305 | { | ||
258 | return X509V3_add1_i2d(&x->singleExtensions, nid, value, crit, flags); | 306 | return X509V3_add1_i2d(&x->singleExtensions, nid, value, crit, flags); |
259 | } | 307 | } |
260 | 308 | ||
261 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc) | 309 | int |
262 | { | 310 | OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc) |
263 | return(X509v3_add_ext(&(x->singleExtensions),ex,loc) != NULL); | 311 | { |
264 | } | 312 | return X509v3_add_ext(&(x->singleExtensions), ex, loc) != NULL; |
313 | } | ||
265 | 314 | ||
266 | /* also CRL Entry Extensions */ | 315 | /* also CRL Entry Extensions */ |
267 | #if 0 | 316 | #if 0 |
268 | ASN1_STRING *ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d, | 317 | ASN1_STRING * |
269 | void *data, STACK_OF(ASN1_OBJECT) *sk) | 318 | ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d, void *data, |
270 | { | 319 | STACK_OF(ASN1_OBJECT) *sk) |
320 | { | ||
271 | int i; | 321 | int i; |
272 | unsigned char *p, *b = NULL; | 322 | unsigned char *p, *b = NULL; |
273 | 323 | ||
274 | if (data) | 324 | if (data) { |
275 | { | 325 | if ((i = i2d(data, NULL)) <= 0) |
276 | if ((i=i2d(data,NULL)) <= 0) goto err; | ||
277 | if (!(b=p=malloc((unsigned int)i))) | ||
278 | goto err; | 326 | goto err; |
279 | if (i2d(data, &p) <= 0) goto err; | 327 | if (!(b = p = malloc((unsigned int)i))) |
280 | } | 328 | goto err; |
281 | else if (sk) | 329 | if (i2d(data, &p) <= 0) |
282 | { | 330 | goto err; |
283 | if ((i=i2d_ASN1_SET_OF_ASN1_OBJECT(sk,NULL, | 331 | } else if (sk) { |
284 | (I2D_OF(ASN1_OBJECT))i2d, | 332 | if ((i = i2d_ASN1_SET_OF_ASN1_OBJECT(sk,NULL, |
285 | V_ASN1_SEQUENCE, | 333 | (I2D_OF(ASN1_OBJECT))i2d, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, |
286 | V_ASN1_UNIVERSAL, | 334 | IS_SEQUENCE)) <= 0) |
287 | IS_SEQUENCE))<=0) goto err; | 335 | goto err; |
288 | if (!(b=p=malloc((unsigned int)i))) | 336 | if (!(b = p = malloc((unsigned int)i))) |
289 | goto err; | 337 | goto err; |
290 | if (i2d_ASN1_SET_OF_ASN1_OBJECT(sk,&p,(I2D_OF(ASN1_OBJECT))i2d, | 338 | if (i2d_ASN1_SET_OF_ASN1_OBJECT(sk,&p,(I2D_OF(ASN1_OBJECT))i2d, |
291 | V_ASN1_SEQUENCE, | 339 | V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, IS_SEQUENCE) <= 0) |
292 | V_ASN1_UNIVERSAL, | 340 | goto err; |
293 | IS_SEQUENCE)<=0) goto err; | 341 | } else { |
294 | } | 342 | OCSPerr(OCSP_F_ASN1_STRING_ENCODE, OCSP_R_BAD_DATA); |
295 | else | 343 | goto err; |
296 | { | 344 | } |
297 | OCSPerr(OCSP_F_ASN1_STRING_ENCODE,OCSP_R_BAD_DATA); | 345 | if (!s && !(s = ASN1_STRING_new())) |
346 | goto err; | ||
347 | if (!(ASN1_STRING_set(s, b, i))) | ||
298 | goto err; | 348 | goto err; |
299 | } | ||
300 | if (!s && !(s = ASN1_STRING_new())) goto err; | ||
301 | if (!(ASN1_STRING_set(s, b, i))) goto err; | ||
302 | free(b); | 349 | free(b); |
303 | return s; | 350 | return s; |
304 | err: | 351 | err: |
305 | if (b) free(b); | 352 | free(b); |
306 | return NULL; | 353 | return NULL; |
307 | } | 354 | } |
308 | #endif | 355 | #endif |
309 | 356 | ||
310 | /* Nonce handling functions */ | 357 | /* Nonce handling functions */ |
@@ -315,16 +362,19 @@ err: | |||
315 | * nonce, previous versions used the raw nonce. | 362 | * nonce, previous versions used the raw nonce. |
316 | */ | 363 | */ |
317 | 364 | ||
318 | static int ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, int len) | 365 | static int |
319 | { | 366 | ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, int len) |
367 | { | ||
320 | unsigned char *tmpval; | 368 | unsigned char *tmpval; |
321 | ASN1_OCTET_STRING os; | 369 | ASN1_OCTET_STRING os; |
322 | int ret = 0; | 370 | int ret = 0; |
323 | if (len <= 0) len = OCSP_DEFAULT_NONCE_LENGTH; | 371 | |
372 | if (len <= 0) | ||
373 | len = OCSP_DEFAULT_NONCE_LENGTH; | ||
324 | /* Create the OCTET STRING manually by writing out the header and | 374 | /* Create the OCTET STRING manually by writing out the header and |
325 | * appending the content octets. This avoids an extra memory allocation | 375 | * appending the content octets. This avoids an extra memory allocation |
326 | * operation in some cases. Applications should *NOT* do this because | 376 | * operation in some cases. Applications should *NOT* do this because |
327 | * it relies on library internals. | 377 | * it relies on library internals. |
328 | */ | 378 | */ |
329 | os.length = ASN1_object_size(0, len, V_ASN1_OCTET_STRING); | 379 | os.length = ASN1_object_size(0, len, V_ASN1_OCTET_STRING); |
330 | os.data = malloc(os.length); | 380 | os.data = malloc(os.length); |
@@ -336,30 +386,29 @@ static int ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, | |||
336 | memcpy(tmpval, val, len); | 386 | memcpy(tmpval, val, len); |
337 | else | 387 | else |
338 | RAND_pseudo_bytes(tmpval, len); | 388 | RAND_pseudo_bytes(tmpval, len); |
339 | if(!X509V3_add1_i2d(exts, NID_id_pkix_OCSP_Nonce, | 389 | if (!X509V3_add1_i2d(exts, NID_id_pkix_OCSP_Nonce, &os, 0, |
340 | &os, 0, X509V3_ADD_REPLACE)) | 390 | X509V3_ADD_REPLACE)) |
341 | goto err; | 391 | goto err; |
342 | ret = 1; | 392 | ret = 1; |
343 | err: | 393 | err: |
344 | if (os.data) | 394 | free(os.data); |
345 | free(os.data); | ||
346 | return ret; | 395 | return ret; |
347 | } | 396 | } |
348 | |||
349 | 397 | ||
350 | /* Add nonce to an OCSP request */ | 398 | /* Add nonce to an OCSP request */ |
351 | 399 | int | |
352 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len) | 400 | OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len) |
353 | { | 401 | { |
354 | return ocsp_add1_nonce(&req->tbsRequest->requestExtensions, val, len); | 402 | return ocsp_add1_nonce(&req->tbsRequest->requestExtensions, val, len); |
355 | } | 403 | } |
356 | 404 | ||
357 | /* Same as above but for a response */ | 405 | /* Same as above but for a response */ |
358 | 406 | int | |
359 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) | 407 | OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) |
360 | { | 408 | { |
361 | return ocsp_add1_nonce(&resp->tbsResponseData->responseExtensions, val, len); | 409 | return ocsp_add1_nonce(&resp->tbsResponseData->responseExtensions, val, |
362 | } | 410 | len); |
411 | } | ||
363 | 412 | ||
364 | /* Check nonce validity in a request and response. | 413 | /* Check nonce validity in a request and response. |
365 | * Return value reflects result: | 414 | * Return value reflects result: |
@@ -373,9 +422,9 @@ int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) | |||
373 | * If responder doesn't handle nonces return != 0 may be | 422 | * If responder doesn't handle nonces return != 0 may be |
374 | * necessary. return == 0 is always an error. | 423 | * necessary. return == 0 is always an error. |
375 | */ | 424 | */ |
376 | 425 | int | |
377 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) | 426 | OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) |
378 | { | 427 | { |
379 | /* | 428 | /* |
380 | * Since we are only interested in the presence or absence of | 429 | * Since we are only interested in the presence or absence of |
381 | * the nonce and comparing its value there is no need to use | 430 | * the nonce and comparing its value there is no need to use |
@@ -383,136 +432,160 @@ int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) | |||
383 | * ASN1_OCTET_STRING structure for the value which would be | 432 | * ASN1_OCTET_STRING structure for the value which would be |
384 | * freed immediately anyway. | 433 | * freed immediately anyway. |
385 | */ | 434 | */ |
386 | |||
387 | int req_idx, resp_idx; | 435 | int req_idx, resp_idx; |
388 | X509_EXTENSION *req_ext, *resp_ext; | 436 | X509_EXTENSION *req_ext, *resp_ext; |
437 | |||
389 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); | 438 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); |
390 | resp_idx = OCSP_BASICRESP_get_ext_by_NID(bs, NID_id_pkix_OCSP_Nonce, -1); | 439 | resp_idx = OCSP_BASICRESP_get_ext_by_NID(bs, NID_id_pkix_OCSP_Nonce, -1); |
391 | /* Check both absent */ | 440 | /* Check both absent */ |
392 | if((req_idx < 0) && (resp_idx < 0)) | 441 | if (req_idx < 0 && resp_idx < 0) |
393 | return 2; | 442 | return 2; |
394 | /* Check in request only */ | 443 | /* Check in request only */ |
395 | if((req_idx >= 0) && (resp_idx < 0)) | 444 | if (req_idx >= 0 && resp_idx < 0) |
396 | return -1; | 445 | return -1; |
397 | /* Check in response but not request */ | 446 | /* Check in response but not request */ |
398 | if((req_idx < 0) && (resp_idx >= 0)) | 447 | if (req_idx < 0 && resp_idx >= 0) |
399 | return 3; | 448 | return 3; |
400 | /* Otherwise nonce in request and response so retrieve the extensions */ | 449 | /* Otherwise nonce in request and response so retrieve the extensions */ |
401 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); | 450 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); |
402 | resp_ext = OCSP_BASICRESP_get_ext(bs, resp_idx); | 451 | resp_ext = OCSP_BASICRESP_get_ext(bs, resp_idx); |
403 | if(ASN1_OCTET_STRING_cmp(req_ext->value, resp_ext->value)) | 452 | if (ASN1_OCTET_STRING_cmp(req_ext->value, resp_ext->value)) |
404 | return 0; | 453 | return 0; |
405 | return 1; | 454 | return 1; |
406 | } | 455 | } |
407 | 456 | ||
408 | /* Copy the nonce value (if any) from an OCSP request to | 457 | /* Copy the nonce value (if any) from an OCSP request to |
409 | * a response. | 458 | * a response. |
410 | */ | 459 | */ |
411 | 460 | int | |
412 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req) | 461 | OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req) |
413 | { | 462 | { |
414 | X509_EXTENSION *req_ext; | 463 | X509_EXTENSION *req_ext; |
415 | int req_idx; | 464 | int req_idx; |
465 | |||
416 | /* Check for nonce in request */ | 466 | /* Check for nonce in request */ |
417 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); | 467 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); |
418 | /* If no nonce that's OK */ | 468 | /* If no nonce that's OK */ |
419 | if (req_idx < 0) return 2; | 469 | if (req_idx < 0) |
470 | return 2; | ||
420 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); | 471 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); |
421 | return OCSP_BASICRESP_add_ext(resp, req_ext, -1); | 472 | return OCSP_BASICRESP_add_ext(resp, req_ext, -1); |
422 | } | 473 | } |
423 | 474 | ||
424 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim) | 475 | X509_EXTENSION * |
425 | { | 476 | OCSP_crlID_new(char *url, long *n, char *tim) |
477 | { | ||
426 | X509_EXTENSION *x = NULL; | 478 | X509_EXTENSION *x = NULL; |
427 | OCSP_CRLID *cid = NULL; | 479 | OCSP_CRLID *cid = NULL; |
428 | 480 | ||
429 | if (!(cid = OCSP_CRLID_new())) goto err; | 481 | if (!(cid = OCSP_CRLID_new())) |
430 | if (url) | 482 | goto err; |
431 | { | 483 | if (url) { |
432 | if (!(cid->crlUrl = ASN1_IA5STRING_new())) goto err; | 484 | if (!(cid->crlUrl = ASN1_IA5STRING_new())) |
433 | if (!(ASN1_STRING_set(cid->crlUrl, url, -1))) goto err; | 485 | goto err; |
434 | } | 486 | if (!(ASN1_STRING_set(cid->crlUrl, url, -1))) |
435 | if (n) | 487 | goto err; |
436 | { | 488 | } |
437 | if (!(cid->crlNum = ASN1_INTEGER_new())) goto err; | 489 | if (n) { |
438 | if (!(ASN1_INTEGER_set(cid->crlNum, *n))) goto err; | 490 | if (!(cid->crlNum = ASN1_INTEGER_new())) |
439 | } | 491 | goto err; |
440 | if (tim) | 492 | if (!(ASN1_INTEGER_set(cid->crlNum, *n))) |
441 | { | 493 | goto err; |
442 | if (!(cid->crlTime = ASN1_GENERALIZEDTIME_new())) goto err; | 494 | } |
495 | if (tim) { | ||
496 | if (!(cid->crlTime = ASN1_GENERALIZEDTIME_new())) | ||
497 | goto err; | ||
443 | if (!(ASN1_GENERALIZEDTIME_set_string(cid->crlTime, tim))) | 498 | if (!(ASN1_GENERALIZEDTIME_set_string(cid->crlTime, tim))) |
444 | goto err; | 499 | goto err; |
445 | } | 500 | } |
446 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_CrlID, 0, cid); | 501 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_CrlID, 0, cid); |
447 | err: | 502 | err: |
448 | if (cid) OCSP_CRLID_free(cid); | 503 | if (cid) |
504 | OCSP_CRLID_free(cid); | ||
449 | return x; | 505 | return x; |
450 | } | 506 | } |
451 | 507 | ||
452 | /* AcceptableResponses ::= SEQUENCE OF OBJECT IDENTIFIER */ | 508 | /* AcceptableResponses ::= SEQUENCE OF OBJECT IDENTIFIER */ |
453 | X509_EXTENSION *OCSP_accept_responses_new(char **oids) | 509 | X509_EXTENSION * |
454 | { | 510 | OCSP_accept_responses_new(char **oids) |
511 | { | ||
455 | int nid; | 512 | int nid; |
456 | STACK_OF(ASN1_OBJECT) *sk = NULL; | 513 | STACK_OF(ASN1_OBJECT) *sk = NULL; |
457 | ASN1_OBJECT *o = NULL; | 514 | ASN1_OBJECT *o = NULL; |
458 | X509_EXTENSION *x = NULL; | 515 | X509_EXTENSION *x = NULL; |
459 | 516 | ||
460 | if (!(sk = sk_ASN1_OBJECT_new_null())) goto err; | 517 | if (!(sk = sk_ASN1_OBJECT_new_null())) |
461 | while (oids && *oids) | 518 | goto err; |
462 | { | 519 | while (oids && *oids) { |
463 | if ((nid=OBJ_txt2nid(*oids))!=NID_undef&&(o=OBJ_nid2obj(nid))) | 520 | if ((nid = OBJ_txt2nid(*oids)) != NID_undef && |
464 | sk_ASN1_OBJECT_push(sk, o); | 521 | (o = OBJ_nid2obj(nid))) |
522 | sk_ASN1_OBJECT_push(sk, o); | ||
465 | oids++; | 523 | oids++; |
466 | } | 524 | } |
467 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_acceptableResponses, 0, sk); | 525 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_acceptableResponses, 0, sk); |
468 | err: | 526 | err: |
469 | if (sk) sk_ASN1_OBJECT_pop_free(sk, ASN1_OBJECT_free); | 527 | if (sk) |
528 | sk_ASN1_OBJECT_pop_free(sk, ASN1_OBJECT_free); | ||
470 | return x; | 529 | return x; |
471 | } | 530 | } |
472 | 531 | ||
473 | /* ArchiveCutoff ::= GeneralizedTime */ | 532 | /* ArchiveCutoff ::= GeneralizedTime */ |
474 | X509_EXTENSION *OCSP_archive_cutoff_new(char* tim) | 533 | X509_EXTENSION * |
475 | { | 534 | OCSP_archive_cutoff_new(char* tim) |
476 | X509_EXTENSION *x=NULL; | 535 | { |
536 | X509_EXTENSION *x = NULL; | ||
477 | ASN1_GENERALIZEDTIME *gt = NULL; | 537 | ASN1_GENERALIZEDTIME *gt = NULL; |
478 | 538 | ||
479 | if (!(gt = ASN1_GENERALIZEDTIME_new())) goto err; | 539 | if (!(gt = ASN1_GENERALIZEDTIME_new())) |
480 | if (!(ASN1_GENERALIZEDTIME_set_string(gt, tim))) goto err; | 540 | goto err; |
541 | if (!(ASN1_GENERALIZEDTIME_set_string(gt, tim))) | ||
542 | goto err; | ||
481 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_archiveCutoff, 0, gt); | 543 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_archiveCutoff, 0, gt); |
482 | err: | 544 | err: |
483 | if (gt) ASN1_GENERALIZEDTIME_free(gt); | 545 | if (gt) |
546 | ASN1_GENERALIZEDTIME_free(gt); | ||
484 | return x; | 547 | return x; |
485 | } | 548 | } |
486 | 549 | ||
487 | /* per ACCESS_DESCRIPTION parameter are oids, of which there are currently | 550 | /* per ACCESS_DESCRIPTION parameter are oids, of which there are currently |
488 | * two--NID_ad_ocsp, NID_id_ad_caIssuers--and GeneralName value. This | 551 | * two--NID_ad_ocsp, NID_id_ad_caIssuers--and GeneralName value. This |
489 | * method forces NID_ad_ocsp and uniformResourceLocator [6] IA5String. | 552 | * method forces NID_ad_ocsp and uniformResourceLocator [6] IA5String. |
490 | */ | 553 | */ |
491 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls) | 554 | X509_EXTENSION * |
492 | { | 555 | OCSP_url_svcloc_new(X509_NAME* issuer, char **urls) |
556 | { | ||
493 | X509_EXTENSION *x = NULL; | 557 | X509_EXTENSION *x = NULL; |
494 | ASN1_IA5STRING *ia5 = NULL; | 558 | ASN1_IA5STRING *ia5 = NULL; |
495 | OCSP_SERVICELOC *sloc = NULL; | 559 | OCSP_SERVICELOC *sloc = NULL; |
496 | ACCESS_DESCRIPTION *ad = NULL; | 560 | ACCESS_DESCRIPTION *ad = NULL; |
497 | 561 | ||
498 | if (!(sloc = OCSP_SERVICELOC_new())) goto err; | 562 | if (!(sloc = OCSP_SERVICELOC_new())) |
499 | if (!(sloc->issuer = X509_NAME_dup(issuer))) goto err; | 563 | goto err; |
500 | if (urls && *urls && !(sloc->locator = sk_ACCESS_DESCRIPTION_new_null())) goto err; | 564 | if (!(sloc->issuer = X509_NAME_dup(issuer))) |
501 | while (urls && *urls) | 565 | goto err; |
502 | { | 566 | if (urls && *urls && |
503 | if (!(ad = ACCESS_DESCRIPTION_new())) goto err; | 567 | !(sloc->locator = sk_ACCESS_DESCRIPTION_new_null())) |
504 | if (!(ad->method=OBJ_nid2obj(NID_ad_OCSP))) goto err; | 568 | goto err; |
505 | if (!(ad->location = GENERAL_NAME_new())) goto err; | 569 | while (urls && *urls) { |
506 | if (!(ia5 = ASN1_IA5STRING_new())) goto err; | 570 | if (!(ad = ACCESS_DESCRIPTION_new())) |
507 | if (!ASN1_STRING_set((ASN1_STRING*)ia5, *urls, -1)) goto err; | 571 | goto err; |
572 | if (!(ad->method = OBJ_nid2obj(NID_ad_OCSP))) | ||
573 | goto err; | ||
574 | if (!(ad->location = GENERAL_NAME_new())) | ||
575 | goto err; | ||
576 | if (!(ia5 = ASN1_IA5STRING_new())) | ||
577 | goto err; | ||
578 | if (!ASN1_STRING_set((ASN1_STRING*)ia5, *urls, -1)) | ||
579 | goto err; | ||
508 | ad->location->type = GEN_URI; | 580 | ad->location->type = GEN_URI; |
509 | ad->location->d.ia5 = ia5; | 581 | ad->location->d.ia5 = ia5; |
510 | if (!sk_ACCESS_DESCRIPTION_push(sloc->locator, ad)) goto err; | 582 | if (!sk_ACCESS_DESCRIPTION_push(sloc->locator, ad)) |
583 | goto err; | ||
511 | urls++; | 584 | urls++; |
512 | } | 585 | } |
513 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_serviceLocator, 0, sloc); | 586 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_serviceLocator, 0, sloc); |
514 | err: | 587 | err: |
515 | if (sloc) OCSP_SERVICELOC_free(sloc); | 588 | if (sloc) |
589 | OCSP_SERVICELOC_free(sloc); | ||
516 | return x; | 590 | return x; |
517 | } | 591 | } |
518 | |||
diff --git a/src/lib/libcrypto/ocsp/ocsp_ht.c b/src/lib/libcrypto/ocsp/ocsp_ht.c index b45eaf6767..fe4a7a1a72 100644 --- a/src/lib/libcrypto/ocsp/ocsp_ht.c +++ b/src/lib/libcrypto/ocsp/ocsp_ht.c | |||
@@ -79,7 +79,7 @@ struct ocsp_req_ctx_st { | |||
79 | BIO *io; /* BIO to perform I/O with */ | 79 | BIO *io; /* BIO to perform I/O with */ |
80 | BIO *mem; /* Memory BIO response is built into */ | 80 | BIO *mem; /* Memory BIO response is built into */ |
81 | unsigned long asn1_len; /* ASN1 length of response */ | 81 | unsigned long asn1_len; /* ASN1 length of response */ |
82 | }; | 82 | }; |
83 | 83 | ||
84 | #define OCSP_MAX_REQUEST_LENGTH (100 * 1024) | 84 | #define OCSP_MAX_REQUEST_LENGTH (100 * 1024) |
85 | #define OCSP_MAX_LINE_LEN 4096; | 85 | #define OCSP_MAX_LINE_LEN 4096; |
@@ -108,54 +108,57 @@ struct ocsp_req_ctx_st { | |||
108 | 108 | ||
109 | static int parse_http_line1(char *line); | 109 | static int parse_http_line1(char *line); |
110 | 110 | ||
111 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx) | 111 | void |
112 | { | 112 | OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx) |
113 | { | ||
113 | if (rctx->mem) | 114 | if (rctx->mem) |
114 | BIO_free(rctx->mem); | 115 | BIO_free(rctx->mem); |
115 | if (rctx->iobuf) | 116 | if (rctx->iobuf) |
116 | free(rctx->iobuf); | 117 | free(rctx->iobuf); |
117 | free(rctx); | 118 | free(rctx); |
118 | } | 119 | } |
119 | 120 | ||
120 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req) | 121 | int |
121 | { | 122 | OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req) |
123 | { | ||
122 | static const char req_hdr[] = | 124 | static const char req_hdr[] = |
123 | "Content-Type: application/ocsp-request\r\n" | 125 | "Content-Type: application/ocsp-request\r\n" |
124 | "Content-Length: %d\r\n\r\n"; | 126 | "Content-Length: %d\r\n\r\n"; |
125 | if (BIO_printf(rctx->mem, req_hdr, i2d_OCSP_REQUEST(req, NULL)) <= 0) | 127 | |
128 | if (BIO_printf(rctx->mem, req_hdr, i2d_OCSP_REQUEST(req, NULL)) <= 0) | ||
126 | return 0; | 129 | return 0; |
127 | if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) | 130 | if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) |
128 | return 0; | 131 | return 0; |
129 | rctx->state = OHS_ASN1_WRITE; | 132 | rctx->state = OHS_ASN1_WRITE; |
130 | rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); | 133 | rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); |
131 | return 1; | 134 | return 1; |
132 | } | 135 | } |
133 | 136 | ||
134 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, | 137 | int |
135 | const char *name, const char *value) | 138 | OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, const char *name, |
136 | { | 139 | const char *value) |
140 | { | ||
137 | if (!name) | 141 | if (!name) |
138 | return 0; | 142 | return 0; |
139 | if (BIO_puts(rctx->mem, name) <= 0) | 143 | if (BIO_puts(rctx->mem, name) <= 0) |
140 | return 0; | 144 | return 0; |
141 | if (value) | 145 | if (value) { |
142 | { | ||
143 | if (BIO_write(rctx->mem, ": ", 2) != 2) | 146 | if (BIO_write(rctx->mem, ": ", 2) != 2) |
144 | return 0; | 147 | return 0; |
145 | if (BIO_puts(rctx->mem, value) <= 0) | 148 | if (BIO_puts(rctx->mem, value) <= 0) |
146 | return 0; | 149 | return 0; |
147 | } | 150 | } |
148 | if (BIO_write(rctx->mem, "\r\n", 2) != 2) | 151 | if (BIO_write(rctx->mem, "\r\n", 2) != 2) |
149 | return 0; | 152 | return 0; |
150 | return 1; | 153 | return 1; |
151 | } | 154 | } |
152 | 155 | ||
153 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | 156 | OCSP_REQ_CTX * |
154 | int maxline) | 157 | OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, int maxline) |
155 | { | 158 | { |
156 | static const char post_hdr[] = "POST %s HTTP/1.0\r\n"; | 159 | static const char post_hdr[] = "POST %s HTTP/1.0\r\n"; |
157 | |||
158 | OCSP_REQ_CTX *rctx; | 160 | OCSP_REQ_CTX *rctx; |
161 | |||
159 | rctx = malloc(sizeof(OCSP_REQ_CTX)); | 162 | rctx = malloc(sizeof(OCSP_REQ_CTX)); |
160 | rctx->state = OHS_ERROR; | 163 | rctx->state = OHS_ERROR; |
161 | rctx->mem = BIO_new(BIO_s_mem()); | 164 | rctx->mem = BIO_new(BIO_s_mem()); |
@@ -174,7 +177,7 @@ OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | |||
174 | if (!path) | 177 | if (!path) |
175 | path = "/"; | 178 | path = "/"; |
176 | 179 | ||
177 | if (BIO_printf(rctx->mem, post_hdr, path) <= 0) { | 180 | if (BIO_printf(rctx->mem, post_hdr, path) <= 0) { |
178 | free(rctx->iobuf); | 181 | free(rctx->iobuf); |
179 | BIO_free(rctx->mem); | 182 | BIO_free(rctx->mem); |
180 | free(rctx); | 183 | free(rctx); |
@@ -189,49 +192,44 @@ OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | |||
189 | } | 192 | } |
190 | 193 | ||
191 | return rctx; | 194 | return rctx; |
192 | } | 195 | } |
193 | 196 | ||
194 | /* Parse the HTTP response. This will look like this: | 197 | /* Parse the HTTP response. This will look like this: |
195 | * "HTTP/1.0 200 OK". We need to obtain the numeric code and | 198 | * "HTTP/1.0 200 OK". We need to obtain the numeric code and |
196 | * (optional) informational message. | 199 | * (optional) informational message. |
197 | */ | 200 | */ |
198 | 201 | static int | |
199 | static int parse_http_line1(char *line) | 202 | parse_http_line1(char *line) |
200 | { | 203 | { |
201 | int retcode; | 204 | int retcode; |
202 | char *p, *q, *r; | 205 | char *p, *q, *r; |
203 | /* Skip to first white space (passed protocol info) */ | ||
204 | 206 | ||
205 | for(p = line; *p && !isspace((unsigned char)*p); p++) | 207 | /* Skip to first white space (passed protocol info) */ |
208 | for (p = line; *p && !isspace((unsigned char)*p); p++) | ||
206 | continue; | 209 | continue; |
207 | if(!*p) | 210 | if (!*p) { |
208 | { | ||
209 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 211 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
210 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 212 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
211 | return 0; | 213 | return 0; |
212 | } | 214 | } |
213 | 215 | ||
214 | /* Skip past white space to start of response code */ | 216 | /* Skip past white space to start of response code */ |
215 | while(*p && isspace((unsigned char)*p)) | 217 | while (*p && isspace((unsigned char)*p)) |
216 | p++; | 218 | p++; |
217 | 219 | if (!*p) { | |
218 | if(!*p) | ||
219 | { | ||
220 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 220 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
221 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 221 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
222 | return 0; | 222 | return 0; |
223 | } | 223 | } |
224 | 224 | ||
225 | /* Find end of response code: first whitespace after start of code */ | 225 | /* Find end of response code: first whitespace after start of code */ |
226 | for(q = p; *q && !isspace((unsigned char)*q); q++) | 226 | for (q = p; *q && !isspace((unsigned char)*q); q++) |
227 | continue; | 227 | continue; |
228 | 228 | if (!*q) { | |
229 | if(!*q) | ||
230 | { | ||
231 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 229 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
232 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 230 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
233 | return 0; | 231 | return 0; |
234 | } | 232 | } |
235 | 233 | ||
236 | /* Set end of response code and start of message */ | 234 | /* Set end of response code and start of message */ |
237 | *q++ = 0; | 235 | *q++ = 0; |
@@ -239,94 +237,80 @@ static int parse_http_line1(char *line) | |||
239 | /* Attempt to parse numeric code */ | 237 | /* Attempt to parse numeric code */ |
240 | retcode = strtoul(p, &r, 10); | 238 | retcode = strtoul(p, &r, 10); |
241 | 239 | ||
242 | if(*r) | 240 | if (*r) |
243 | return 0; | 241 | return 0; |
244 | 242 | ||
245 | /* Skip over any leading white space in message */ | 243 | /* Skip over any leading white space in message */ |
246 | while(*q && isspace((unsigned char)*q)) | 244 | while (*q && isspace((unsigned char)*q)) |
247 | q++; | 245 | q++; |
248 | 246 | if (*q) { | |
249 | if(*q) | ||
250 | { | ||
251 | /* Finally zap any trailing white space in message (include | 247 | /* Finally zap any trailing white space in message (include |
252 | * CRLF) */ | 248 | * CRLF) */ |
253 | 249 | ||
254 | /* We know q has a non white space character so this is OK */ | 250 | /* We know q has a non white space character so this is OK */ |
255 | for(r = q + strlen(q) - 1; isspace((unsigned char)*r); r--) | 251 | for (r = q + strlen(q) - 1; isspace((unsigned char)*r); r--) |
256 | *r = 0; | 252 | *r = 0; |
257 | } | 253 | } |
258 | if(retcode != 200) | 254 | if (retcode != 200) { |
259 | { | ||
260 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, OCSP_R_SERVER_RESPONSE_ERROR); | 255 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, OCSP_R_SERVER_RESPONSE_ERROR); |
261 | if(!*q) | 256 | if (!*q) |
262 | ERR_asprintf_error_data("Code=%s", p); | 257 | ERR_asprintf_error_data("Code=%s", p); |
263 | else | 258 | else |
264 | ERR_asprintf_error_data("Code=%s,Reason=%s", p, q); | 259 | ERR_asprintf_error_data("Code=%s,Reason=%s", p, q); |
265 | return 0; | 260 | return 0; |
266 | } | 261 | } |
267 | |||
268 | 262 | ||
269 | return 1; | 263 | return 1; |
264 | } | ||
270 | 265 | ||
271 | } | 266 | int |
272 | 267 | OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |
273 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | 268 | { |
274 | { | ||
275 | int i, n; | 269 | int i, n; |
276 | const unsigned char *p; | 270 | const unsigned char *p; |
277 | next_io: | 271 | |
278 | if (!(rctx->state & OHS_NOREAD)) | 272 | next_io: |
279 | { | 273 | if (!(rctx->state & OHS_NOREAD)) { |
280 | n = BIO_read(rctx->io, rctx->iobuf, rctx->iobuflen); | 274 | n = BIO_read(rctx->io, rctx->iobuf, rctx->iobuflen); |
281 | 275 | ||
282 | if (n <= 0) | 276 | if (n <= 0) { |
283 | { | ||
284 | if (BIO_should_retry(rctx->io)) | 277 | if (BIO_should_retry(rctx->io)) |
285 | return -1; | 278 | return -1; |
286 | return 0; | 279 | return 0; |
287 | } | 280 | } |
288 | 281 | ||
289 | /* Write data to memory BIO */ | 282 | /* Write data to memory BIO */ |
290 | |||
291 | if (BIO_write(rctx->mem, rctx->iobuf, n) != n) | 283 | if (BIO_write(rctx->mem, rctx->iobuf, n) != n) |
292 | return 0; | 284 | return 0; |
293 | } | 285 | } |
294 | |||
295 | switch(rctx->state) | ||
296 | { | ||
297 | 286 | ||
298 | case OHS_ASN1_WRITE: | 287 | switch (rctx->state) { |
288 | case OHS_ASN1_WRITE: | ||
299 | n = BIO_get_mem_data(rctx->mem, &p); | 289 | n = BIO_get_mem_data(rctx->mem, &p); |
300 | |||
301 | i = BIO_write(rctx->io, | 290 | i = BIO_write(rctx->io, |
302 | p + (n - rctx->asn1_len), rctx->asn1_len); | 291 | p + (n - rctx->asn1_len), rctx->asn1_len); |
303 | 292 | if (i <= 0) { | |
304 | if (i <= 0) | ||
305 | { | ||
306 | if (BIO_should_retry(rctx->io)) | 293 | if (BIO_should_retry(rctx->io)) |
307 | return -1; | 294 | return -1; |
308 | rctx->state = OHS_ERROR; | 295 | rctx->state = OHS_ERROR; |
309 | return 0; | 296 | return 0; |
310 | } | 297 | } |
311 | 298 | ||
312 | rctx->asn1_len -= i; | 299 | rctx->asn1_len -= i; |
313 | |||
314 | if (rctx->asn1_len > 0) | 300 | if (rctx->asn1_len > 0) |
315 | goto next_io; | 301 | goto next_io; |
316 | 302 | ||
317 | rctx->state = OHS_ASN1_FLUSH; | 303 | rctx->state = OHS_ASN1_FLUSH; |
318 | 304 | ||
319 | (void)BIO_reset(rctx->mem); | 305 | (void)BIO_reset(rctx->mem); |
306 | /* FALLTHROUGH */ | ||
320 | 307 | ||
321 | case OHS_ASN1_FLUSH: | 308 | case OHS_ASN1_FLUSH: |
322 | |||
323 | i = BIO_flush(rctx->io); | 309 | i = BIO_flush(rctx->io); |
324 | 310 | if (i > 0) { | |
325 | if (i > 0) | ||
326 | { | ||
327 | rctx->state = OHS_FIRSTLINE; | 311 | rctx->state = OHS_FIRSTLINE; |
328 | goto next_io; | 312 | goto next_io; |
329 | } | 313 | } |
330 | 314 | ||
331 | if (BIO_should_retry(rctx->io)) | 315 | if (BIO_should_retry(rctx->io)) |
332 | return -1; | 316 | return -1; |
@@ -334,79 +318,62 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
334 | rctx->state = OHS_ERROR; | 318 | rctx->state = OHS_ERROR; |
335 | return 0; | 319 | return 0; |
336 | 320 | ||
337 | case OHS_ERROR: | 321 | case OHS_ERROR: |
338 | return 0; | 322 | return 0; |
339 | 323 | ||
340 | case OHS_FIRSTLINE: | 324 | case OHS_FIRSTLINE: |
341 | case OHS_HEADERS: | 325 | case OHS_HEADERS: |
342 | |||
343 | /* Attempt to read a line in */ | 326 | /* Attempt to read a line in */ |
344 | 327 | next_line: | |
345 | next_line: | ||
346 | /* Due to &%^*$" memory BIO behaviour with BIO_gets we | 328 | /* Due to &%^*$" memory BIO behaviour with BIO_gets we |
347 | * have to check there's a complete line in there before | 329 | * have to check there's a complete line in there before |
348 | * calling BIO_gets or we'll just get a partial read. | 330 | * calling BIO_gets or we'll just get a partial read. |
349 | */ | 331 | */ |
350 | n = BIO_get_mem_data(rctx->mem, &p); | 332 | n = BIO_get_mem_data(rctx->mem, &p); |
351 | if ((n <= 0) || !memchr(p, '\n', n)) | 333 | if ((n <= 0) || !memchr(p, '\n', n)) { |
352 | { | 334 | if (n >= rctx->iobuflen) { |
353 | if (n >= rctx->iobuflen) | ||
354 | { | ||
355 | rctx->state = OHS_ERROR; | 335 | rctx->state = OHS_ERROR; |
356 | return 0; | 336 | return 0; |
357 | } | ||
358 | goto next_io; | ||
359 | } | 337 | } |
338 | goto next_io; | ||
339 | } | ||
360 | n = BIO_gets(rctx->mem, (char *)rctx->iobuf, rctx->iobuflen); | 340 | n = BIO_gets(rctx->mem, (char *)rctx->iobuf, rctx->iobuflen); |
361 | 341 | if (n <= 0) { | |
362 | if (n <= 0) | ||
363 | { | ||
364 | if (BIO_should_retry(rctx->mem)) | 342 | if (BIO_should_retry(rctx->mem)) |
365 | goto next_io; | 343 | goto next_io; |
366 | rctx->state = OHS_ERROR; | 344 | rctx->state = OHS_ERROR; |
367 | return 0; | 345 | return 0; |
368 | } | 346 | } |
369 | 347 | ||
370 | /* Don't allow excessive lines */ | 348 | /* Don't allow excessive lines */ |
371 | if (n == rctx->iobuflen) | 349 | if (n == rctx->iobuflen) { |
372 | { | ||
373 | rctx->state = OHS_ERROR; | 350 | rctx->state = OHS_ERROR; |
374 | return 0; | 351 | return 0; |
375 | } | 352 | } |
376 | 353 | ||
377 | /* First line */ | 354 | /* First line */ |
378 | if (rctx->state == OHS_FIRSTLINE) | 355 | if (rctx->state == OHS_FIRSTLINE) { |
379 | { | 356 | if (parse_http_line1((char *)rctx->iobuf)) { |
380 | if (parse_http_line1((char *)rctx->iobuf)) | ||
381 | { | ||
382 | rctx->state = OHS_HEADERS; | 357 | rctx->state = OHS_HEADERS; |
383 | goto next_line; | 358 | goto next_line; |
384 | } | 359 | } else { |
385 | else | ||
386 | { | ||
387 | rctx->state = OHS_ERROR; | 360 | rctx->state = OHS_ERROR; |
388 | return 0; | 361 | return 0; |
389 | } | ||
390 | } | 362 | } |
391 | else | 363 | } else { |
392 | { | ||
393 | /* Look for blank line: end of headers */ | 364 | /* Look for blank line: end of headers */ |
394 | for (p = rctx->iobuf; *p; p++) | 365 | for (p = rctx->iobuf; *p; p++) { |
395 | { | ||
396 | if ((*p != '\r') && (*p != '\n')) | 366 | if ((*p != '\r') && (*p != '\n')) |
397 | break; | 367 | break; |
398 | } | 368 | } |
399 | if (*p) | 369 | if (*p) |
400 | goto next_line; | 370 | goto next_line; |
401 | 371 | ||
402 | rctx->state = OHS_ASN1_HEADER; | 372 | rctx->state = OHS_ASN1_HEADER; |
373 | } | ||
374 | /* FALLTRHOUGH */ | ||
403 | 375 | ||
404 | } | 376 | case OHS_ASN1_HEADER: |
405 | |||
406 | /* Fall thru */ | ||
407 | |||
408 | |||
409 | case OHS_ASN1_HEADER: | ||
410 | /* Now reading ASN1 header: can read at least 2 bytes which | 377 | /* Now reading ASN1 header: can read at least 2 bytes which |
411 | * is enough for ASN1 SEQUENCE header and either length field | 378 | * is enough for ASN1 SEQUENCE header and either length field |
412 | * or at least the length of the length field. | 379 | * or at least the length of the length field. |
@@ -416,15 +383,13 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
416 | goto next_io; | 383 | goto next_io; |
417 | 384 | ||
418 | /* Check it is an ASN1 SEQUENCE */ | 385 | /* Check it is an ASN1 SEQUENCE */ |
419 | if (*p++ != (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) | 386 | if (*p++ != (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) { |
420 | { | ||
421 | rctx->state = OHS_ERROR; | 387 | rctx->state = OHS_ERROR; |
422 | return 0; | 388 | return 0; |
423 | } | 389 | } |
424 | 390 | ||
425 | /* Check out length field */ | 391 | /* Check out length field */ |
426 | if (*p & 0x80) | 392 | if (*p & 0x80) { |
427 | { | ||
428 | /* If MSB set on initial length octet we can now | 393 | /* If MSB set on initial length octet we can now |
429 | * always read 6 octets: make sure we have them. | 394 | * always read 6 octets: make sure we have them. |
430 | */ | 395 | */ |
@@ -432,78 +397,64 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
432 | goto next_io; | 397 | goto next_io; |
433 | n = *p & 0x7F; | 398 | n = *p & 0x7F; |
434 | /* Not NDEF or excessive length */ | 399 | /* Not NDEF or excessive length */ |
435 | if (!n || (n > 4)) | 400 | if (!n || (n > 4)) { |
436 | { | ||
437 | rctx->state = OHS_ERROR; | 401 | rctx->state = OHS_ERROR; |
438 | return 0; | 402 | return 0; |
439 | } | 403 | } |
440 | p++; | 404 | p++; |
441 | rctx->asn1_len = 0; | 405 | rctx->asn1_len = 0; |
442 | for (i = 0; i < n; i++) | 406 | for (i = 0; i < n; i++) { |
443 | { | ||
444 | rctx->asn1_len <<= 8; | 407 | rctx->asn1_len <<= 8; |
445 | rctx->asn1_len |= *p++; | 408 | rctx->asn1_len |= *p++; |
446 | } | 409 | } |
447 | 410 | ||
448 | if (rctx->asn1_len > OCSP_MAX_REQUEST_LENGTH) | 411 | if (rctx->asn1_len > OCSP_MAX_REQUEST_LENGTH) { |
449 | { | ||
450 | rctx->state = OHS_ERROR; | 412 | rctx->state = OHS_ERROR; |
451 | return 0; | 413 | return 0; |
452 | } | 414 | } |
453 | 415 | ||
454 | rctx->asn1_len += n + 2; | 416 | rctx->asn1_len += n + 2; |
455 | } | 417 | } else |
456 | else | ||
457 | rctx->asn1_len = *p + 2; | 418 | rctx->asn1_len = *p + 2; |
458 | 419 | ||
459 | rctx->state = OHS_ASN1_CONTENT; | 420 | rctx->state = OHS_ASN1_CONTENT; |
460 | 421 | ||
461 | /* Fall thru */ | 422 | /* FALLTHROUGH */ |
462 | 423 | ||
463 | case OHS_ASN1_CONTENT: | 424 | case OHS_ASN1_CONTENT: |
464 | n = BIO_get_mem_data(rctx->mem, &p); | 425 | n = BIO_get_mem_data(rctx->mem, &p); |
465 | if (n < (int)rctx->asn1_len) | 426 | if (n < (int)rctx->asn1_len) |
466 | goto next_io; | 427 | goto next_io; |
467 | 428 | ||
468 | |||
469 | *presp = d2i_OCSP_RESPONSE(NULL, &p, rctx->asn1_len); | 429 | *presp = d2i_OCSP_RESPONSE(NULL, &p, rctx->asn1_len); |
470 | if (*presp) | 430 | if (*presp) { |
471 | { | ||
472 | rctx->state = OHS_DONE; | 431 | rctx->state = OHS_DONE; |
473 | return 1; | 432 | return 1; |
474 | } | 433 | } |
475 | 434 | ||
476 | rctx->state = OHS_ERROR; | 435 | rctx->state = OHS_ERROR; |
477 | return 0; | 436 | return 0; |
478 | 437 | ||
479 | break; | 438 | case OHS_DONE: |
480 | |||
481 | case OHS_DONE: | ||
482 | return 1; | 439 | return 1; |
483 | 440 | } | |
484 | } | ||
485 | |||
486 | |||
487 | 441 | ||
488 | return 0; | 442 | return 0; |
489 | 443 | } | |
490 | |||
491 | } | ||
492 | 444 | ||
493 | /* Blocking OCSP request handler: now a special case of non-blocking I/O */ | 445 | /* Blocking OCSP request handler: now a special case of non-blocking I/O */ |
494 | 446 | OCSP_RESPONSE * | |
495 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) | 447 | OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) |
496 | { | 448 | { |
497 | OCSP_RESPONSE *resp = NULL; | 449 | OCSP_RESPONSE *resp = NULL; |
498 | OCSP_REQ_CTX *ctx; | 450 | OCSP_REQ_CTX *ctx; |
499 | int rv; | 451 | int rv; |
500 | 452 | ||
501 | ctx = OCSP_sendreq_new(b, path, req, -1); | 453 | ctx = OCSP_sendreq_new(b, path, req, -1); |
502 | 454 | ||
503 | do | 455 | do { |
504 | { | ||
505 | rv = OCSP_sendreq_nbio(&resp, ctx); | 456 | rv = OCSP_sendreq_nbio(&resp, ctx); |
506 | } while ((rv == -1) && BIO_should_retry(b)); | 457 | } while ((rv == -1) && BIO_should_retry(b)); |
507 | 458 | ||
508 | OCSP_REQ_CTX_free(ctx); | 459 | OCSP_REQ_CTX_free(ctx); |
509 | 460 | ||
@@ -511,4 +462,4 @@ OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) | |||
511 | return resp; | 462 | return resp; |
512 | 463 | ||
513 | return NULL; | 464 | return NULL; |
514 | } | 465 | } |
diff --git a/src/lib/libcrypto/ocsp/ocsp_lib.c b/src/lib/libcrypto/ocsp/ocsp_lib.c index 514cdabf2d..056bd27665 100644 --- a/src/lib/libcrypto/ocsp/ocsp_lib.c +++ b/src/lib/libcrypto/ocsp/ocsp_lib.c | |||
@@ -73,102 +73,112 @@ | |||
73 | 73 | ||
74 | /* Convert a certificate and its issuer to an OCSP_CERTID */ | 74 | /* Convert a certificate and its issuer to an OCSP_CERTID */ |
75 | 75 | ||
76 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer) | 76 | OCSP_CERTID * |
77 | OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer) | ||
77 | { | 78 | { |
78 | X509_NAME *iname; | 79 | X509_NAME *iname; |
79 | ASN1_INTEGER *serial; | 80 | ASN1_INTEGER *serial; |
80 | ASN1_BIT_STRING *ikey; | 81 | ASN1_BIT_STRING *ikey; |
82 | |||
81 | #ifndef OPENSSL_NO_SHA1 | 83 | #ifndef OPENSSL_NO_SHA1 |
82 | if(!dgst) dgst = EVP_sha1(); | 84 | if (!dgst) |
85 | dgst = EVP_sha1(); | ||
83 | #endif | 86 | #endif |
84 | if (subject) | 87 | if (subject) { |
85 | { | ||
86 | iname = X509_get_issuer_name(subject); | 88 | iname = X509_get_issuer_name(subject); |
87 | serial = X509_get_serialNumber(subject); | 89 | serial = X509_get_serialNumber(subject); |
88 | } | 90 | } else { |
89 | else | ||
90 | { | ||
91 | iname = X509_get_subject_name(issuer); | 91 | iname = X509_get_subject_name(issuer); |
92 | serial = NULL; | 92 | serial = NULL; |
93 | } | 93 | } |
94 | ikey = X509_get0_pubkey_bitstr(issuer); | 94 | ikey = X509_get0_pubkey_bitstr(issuer); |
95 | return OCSP_cert_id_new(dgst, iname, ikey, serial); | 95 | return OCSP_cert_id_new(dgst, iname, ikey, serial); |
96 | } | 96 | } |
97 | 97 | ||
98 | 98 | OCSP_CERTID * | |
99 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, | 99 | OCSP_cert_id_new(const EVP_MD *dgst, X509_NAME *issuerName, |
100 | X509_NAME *issuerName, | 100 | ASN1_BIT_STRING* issuerKey, ASN1_INTEGER *serialNumber) |
101 | ASN1_BIT_STRING* issuerKey, | 101 | { |
102 | ASN1_INTEGER *serialNumber) | ||
103 | { | ||
104 | int nid; | 102 | int nid; |
105 | unsigned int i; | 103 | unsigned int i; |
106 | X509_ALGOR *alg; | 104 | X509_ALGOR *alg; |
107 | OCSP_CERTID *cid = NULL; | 105 | OCSP_CERTID *cid = NULL; |
108 | unsigned char md[EVP_MAX_MD_SIZE]; | 106 | unsigned char md[EVP_MAX_MD_SIZE]; |
109 | 107 | ||
110 | if (!(cid = OCSP_CERTID_new())) goto err; | 108 | if (!(cid = OCSP_CERTID_new())) |
109 | goto err; | ||
111 | 110 | ||
112 | alg = cid->hashAlgorithm; | 111 | alg = cid->hashAlgorithm; |
113 | if (alg->algorithm != NULL) ASN1_OBJECT_free(alg->algorithm); | 112 | if (alg->algorithm != NULL) |
114 | if ((nid = EVP_MD_type(dgst)) == NID_undef) | 113 | ASN1_OBJECT_free(alg->algorithm); |
115 | { | 114 | if ((nid = EVP_MD_type(dgst)) == NID_undef) { |
116 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_UNKNOWN_NID); | 115 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW, OCSP_R_UNKNOWN_NID); |
116 | goto err; | ||
117 | } | ||
118 | if (!(alg->algorithm=OBJ_nid2obj(nid))) | ||
119 | goto err; | ||
120 | if ((alg->parameter=ASN1_TYPE_new()) == NULL) | ||
117 | goto err; | 121 | goto err; |
118 | } | ||
119 | if (!(alg->algorithm=OBJ_nid2obj(nid))) goto err; | ||
120 | if ((alg->parameter=ASN1_TYPE_new()) == NULL) goto err; | ||
121 | alg->parameter->type=V_ASN1_NULL; | 122 | alg->parameter->type=V_ASN1_NULL; |
122 | 123 | ||
123 | if (!X509_NAME_digest(issuerName, dgst, md, &i)) goto digerr; | 124 | if (!X509_NAME_digest(issuerName, dgst, md, &i)) |
124 | if (!(ASN1_OCTET_STRING_set(cid->issuerNameHash, md, i))) goto err; | 125 | goto digerr; |
126 | if (!(ASN1_OCTET_STRING_set(cid->issuerNameHash, md, i))) | ||
127 | goto err; | ||
125 | 128 | ||
126 | /* Calculate the issuerKey hash, excluding tag and length */ | 129 | /* Calculate the issuerKey hash, excluding tag and length */ |
127 | if (!EVP_Digest(issuerKey->data, issuerKey->length, md, &i, dgst, NULL)) | 130 | if (!EVP_Digest(issuerKey->data, issuerKey->length, md, &i, dgst, NULL)) |
128 | goto err; | 131 | goto err; |
129 | 132 | ||
130 | if (!(ASN1_OCTET_STRING_set(cid->issuerKeyHash, md, i))) goto err; | 133 | if (!(ASN1_OCTET_STRING_set(cid->issuerKeyHash, md, i))) |
134 | goto err; | ||
131 | 135 | ||
132 | if (serialNumber) | 136 | if (serialNumber) { |
133 | { | ||
134 | ASN1_INTEGER_free(cid->serialNumber); | 137 | ASN1_INTEGER_free(cid->serialNumber); |
135 | if (!(cid->serialNumber = ASN1_INTEGER_dup(serialNumber))) goto err; | 138 | if (!(cid->serialNumber = ASN1_INTEGER_dup(serialNumber))) |
136 | } | 139 | goto err; |
140 | } | ||
137 | return cid; | 141 | return cid; |
138 | digerr: | 142 | digerr: |
139 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_DIGEST_ERR); | 143 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW, OCSP_R_DIGEST_ERR); |
140 | err: | 144 | err: |
141 | if (cid) OCSP_CERTID_free(cid); | 145 | if (cid) |
146 | OCSP_CERTID_free(cid); | ||
142 | return NULL; | 147 | return NULL; |
143 | } | 148 | } |
144 | 149 | ||
145 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b) | 150 | int |
146 | { | 151 | OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b) |
152 | { | ||
147 | int ret; | 153 | int ret; |
154 | |||
148 | ret = OBJ_cmp(a->hashAlgorithm->algorithm, b->hashAlgorithm->algorithm); | 155 | ret = OBJ_cmp(a->hashAlgorithm->algorithm, b->hashAlgorithm->algorithm); |
149 | if (ret) return ret; | 156 | if (ret) |
157 | return ret; | ||
150 | ret = ASN1_OCTET_STRING_cmp(a->issuerNameHash, b->issuerNameHash); | 158 | ret = ASN1_OCTET_STRING_cmp(a->issuerNameHash, b->issuerNameHash); |
151 | if (ret) return ret; | 159 | if (ret) |
160 | return ret; | ||
152 | return ASN1_OCTET_STRING_cmp(a->issuerKeyHash, b->issuerKeyHash); | 161 | return ASN1_OCTET_STRING_cmp(a->issuerKeyHash, b->issuerKeyHash); |
153 | } | 162 | } |
154 | 163 | ||
155 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b) | 164 | int |
156 | { | 165 | OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b) |
166 | { | ||
157 | int ret; | 167 | int ret; |
168 | |||
158 | ret = OCSP_id_issuer_cmp(a, b); | 169 | ret = OCSP_id_issuer_cmp(a, b); |
159 | if (ret) return ret; | 170 | if (ret) |
171 | return ret; | ||
160 | return ASN1_INTEGER_cmp(a->serialNumber, b->serialNumber); | 172 | return ASN1_INTEGER_cmp(a->serialNumber, b->serialNumber); |
161 | } | 173 | } |
162 | |||
163 | 174 | ||
164 | /* Parse a URL and split it up into host, port and path components and whether | 175 | /* Parse a URL and split it up into host, port and path components and whether |
165 | * it is SSL. | 176 | * it is SSL. |
166 | */ | 177 | */ |
167 | 178 | int | |
168 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl) | 179 | OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl) |
169 | { | 180 | { |
170 | char *p, *buf; | 181 | char *p, *buf; |
171 | |||
172 | char *host, *port; | 182 | char *host, *port; |
173 | 183 | ||
174 | *phost = NULL; | 184 | *phost = NULL; |
@@ -177,26 +187,23 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pss | |||
177 | 187 | ||
178 | /* dup the buffer since we are going to mess with it */ | 188 | /* dup the buffer since we are going to mess with it */ |
179 | buf = BUF_strdup(url); | 189 | buf = BUF_strdup(url); |
180 | if (!buf) goto mem_err; | 190 | if (!buf) |
191 | goto mem_err; | ||
181 | 192 | ||
182 | /* Check for initial colon */ | 193 | /* Check for initial colon */ |
183 | p = strchr(buf, ':'); | 194 | p = strchr(buf, ':'); |
184 | 195 | if (!p) | |
185 | if (!p) goto parse_err; | 196 | goto parse_err; |
186 | 197 | ||
187 | *(p++) = '\0'; | 198 | *(p++) = '\0'; |
188 | 199 | ||
189 | if (!strcmp(buf, "http")) | 200 | if (!strcmp(buf, "http")) { |
190 | { | ||
191 | *pssl = 0; | 201 | *pssl = 0; |
192 | port = "80"; | 202 | port = "80"; |
193 | } | 203 | } else if (!strcmp(buf, "https")) { |
194 | else if (!strcmp(buf, "https")) | ||
195 | { | ||
196 | *pssl = 1; | 204 | *pssl = 1; |
197 | port = "443"; | 205 | port = "443"; |
198 | } | 206 | } else |
199 | else | ||
200 | goto parse_err; | 207 | goto parse_err; |
201 | 208 | ||
202 | /* Check for double slash */ | 209 | /* Check for double slash */ |
@@ -208,59 +215,56 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pss | |||
208 | host = p; | 215 | host = p; |
209 | 216 | ||
210 | /* Check for trailing part of path */ | 217 | /* Check for trailing part of path */ |
211 | |||
212 | p = strchr(p, '/'); | 218 | p = strchr(p, '/'); |
213 | |||
214 | if (!p) | 219 | if (!p) |
215 | *ppath = BUF_strdup("/"); | 220 | *ppath = BUF_strdup("/"); |
216 | else | 221 | else { |
217 | { | ||
218 | *ppath = BUF_strdup(p); | 222 | *ppath = BUF_strdup(p); |
219 | /* Set start of path to 0 so hostname is valid */ | 223 | /* Set start of path to 0 so hostname is valid */ |
220 | *p = '\0'; | 224 | *p = '\0'; |
221 | } | 225 | } |
222 | 226 | ||
223 | if (!*ppath) goto mem_err; | 227 | if (!*ppath) |
228 | goto mem_err; | ||
224 | 229 | ||
225 | /* Look for optional ':' for port number */ | 230 | /* Look for optional ':' for port number */ |
226 | if ((p = strchr(host, ':'))) | 231 | if ((p = strchr(host, ':'))) { |
227 | { | ||
228 | *p = 0; | 232 | *p = 0; |
229 | port = p + 1; | 233 | port = p + 1; |
230 | } | 234 | } else { |
231 | else | ||
232 | { | ||
233 | /* Not found: set default port */ | 235 | /* Not found: set default port */ |
234 | if (*pssl) port = "443"; | 236 | if (*pssl) |
235 | else port = "80"; | 237 | port = "443"; |
236 | } | 238 | else |
239 | port = "80"; | ||
240 | } | ||
237 | 241 | ||
238 | *pport = BUF_strdup(port); | 242 | *pport = BUF_strdup(port); |
239 | if (!*pport) goto mem_err; | 243 | if (!*pport) |
244 | goto mem_err; | ||
240 | 245 | ||
241 | *phost = BUF_strdup(host); | 246 | *phost = BUF_strdup(host); |
242 | 247 | ||
243 | if (!*phost) goto mem_err; | 248 | if (!*phost) |
249 | goto mem_err; | ||
244 | 250 | ||
245 | free(buf); | 251 | free(buf); |
246 | 252 | ||
247 | return 1; | 253 | return 1; |
248 | 254 | ||
249 | mem_err: | 255 | mem_err: |
250 | OCSPerr(OCSP_F_OCSP_PARSE_URL, ERR_R_MALLOC_FAILURE); | 256 | OCSPerr(OCSP_F_OCSP_PARSE_URL, ERR_R_MALLOC_FAILURE); |
251 | goto err; | 257 | goto err; |
252 | 258 | ||
253 | parse_err: | 259 | parse_err: |
254 | OCSPerr(OCSP_F_OCSP_PARSE_URL, OCSP_R_ERROR_PARSING_URL); | 260 | OCSPerr(OCSP_F_OCSP_PARSE_URL, OCSP_R_ERROR_PARSING_URL); |
255 | 261 | ||
256 | 262 | err: | |
257 | err: | 263 | free(buf); |
258 | if (buf) free(buf); | 264 | free(*ppath); |
259 | if (*ppath) free(*ppath); | 265 | free(*pport); |
260 | if (*pport) free(*pport); | 266 | free(*phost); |
261 | if (*phost) free(*phost); | ||
262 | return 0; | 267 | return 0; |
263 | 268 | } | |
264 | } | ||
265 | 269 | ||
266 | IMPLEMENT_ASN1_DUP_FUNCTION(OCSP_CERTID) | 270 | IMPLEMENT_ASN1_DUP_FUNCTION(OCSP_CERTID) |
diff --git a/src/lib/libcrypto/ocsp/ocsp_prn.c b/src/lib/libcrypto/ocsp/ocsp_prn.c index 87608ff399..9e4b81f061 100644 --- a/src/lib/libcrypto/ocsp/ocsp_prn.c +++ b/src/lib/libcrypto/ocsp/ocsp_prn.c | |||
@@ -66,8 +66,9 @@ | |||
66 | #include <openssl/ocsp.h> | 66 | #include <openssl/ocsp.h> |
67 | #include <openssl/pem.h> | 67 | #include <openssl/pem.h> |
68 | 68 | ||
69 | static int ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) | 69 | static int |
70 | { | 70 | ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) |
71 | { | ||
71 | BIO_printf(bp, "%*sCertificate ID:\n", indent, ""); | 72 | BIO_printf(bp, "%*sCertificate ID:\n", indent, ""); |
72 | indent += 2; | 73 | indent += 2; |
73 | BIO_printf(bp, "%*sHash Algorithm: ", indent, ""); | 74 | BIO_printf(bp, "%*sHash Algorithm: ", indent, ""); |
@@ -80,60 +81,68 @@ static int ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) | |||
80 | i2a_ASN1_INTEGER(bp, a->serialNumber); | 81 | i2a_ASN1_INTEGER(bp, a->serialNumber); |
81 | BIO_printf(bp, "\n"); | 82 | BIO_printf(bp, "\n"); |
82 | return 1; | 83 | return 1; |
83 | } | 84 | } |
84 | 85 | ||
85 | typedef struct | 86 | typedef struct { |
86 | { | ||
87 | long t; | 87 | long t; |
88 | const char *m; | 88 | const char *m; |
89 | } OCSP_TBLSTR; | 89 | } OCSP_TBLSTR; |
90 | 90 | ||
91 | static const char *table2string(long s, const OCSP_TBLSTR *ts, int len) | 91 | static const char * |
92 | table2string(long s, const OCSP_TBLSTR *ts, int len) | ||
92 | { | 93 | { |
93 | const OCSP_TBLSTR *p; | 94 | const OCSP_TBLSTR *p; |
95 | |||
94 | for (p=ts; p < ts + len; p++) | 96 | for (p=ts; p < ts + len; p++) |
95 | if (p->t == s) | 97 | if (p->t == s) |
96 | return p->m; | 98 | return p->m; |
97 | return "(UNKNOWN)"; | 99 | return "(UNKNOWN)"; |
98 | } | 100 | } |
99 | 101 | ||
100 | const char *OCSP_response_status_str(long s) | 102 | const char * |
101 | { | 103 | OCSP_response_status_str(long s) |
104 | { | ||
102 | static const OCSP_TBLSTR rstat_tbl[] = { | 105 | static const OCSP_TBLSTR rstat_tbl[] = { |
103 | { OCSP_RESPONSE_STATUS_SUCCESSFUL, "successful" }, | 106 | { OCSP_RESPONSE_STATUS_SUCCESSFUL, "successful" }, |
104 | { OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, "malformedrequest" }, | 107 | { OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, "malformedrequest" }, |
105 | { OCSP_RESPONSE_STATUS_INTERNALERROR, "internalerror" }, | 108 | { OCSP_RESPONSE_STATUS_INTERNALERROR, "internalerror" }, |
106 | { OCSP_RESPONSE_STATUS_TRYLATER, "trylater" }, | 109 | { OCSP_RESPONSE_STATUS_TRYLATER, "trylater" }, |
107 | { OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigrequired" }, | 110 | { OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigrequired" }, |
108 | { OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" } }; | 111 | { OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" } |
112 | }; | ||
109 | return table2string(s, rstat_tbl, 6); | 113 | return table2string(s, rstat_tbl, 6); |
110 | } | 114 | } |
111 | 115 | ||
112 | const char *OCSP_cert_status_str(long s) | 116 | const char * |
113 | { | 117 | OCSP_cert_status_str(long s) |
118 | { | ||
114 | static const OCSP_TBLSTR cstat_tbl[] = { | 119 | static const OCSP_TBLSTR cstat_tbl[] = { |
115 | { V_OCSP_CERTSTATUS_GOOD, "good" }, | 120 | { V_OCSP_CERTSTATUS_GOOD, "good" }, |
116 | { V_OCSP_CERTSTATUS_REVOKED, "revoked" }, | 121 | { V_OCSP_CERTSTATUS_REVOKED, "revoked" }, |
117 | { V_OCSP_CERTSTATUS_UNKNOWN, "unknown" } }; | 122 | { V_OCSP_CERTSTATUS_UNKNOWN, "unknown" } |
123 | }; | ||
118 | return table2string(s, cstat_tbl, 3); | 124 | return table2string(s, cstat_tbl, 3); |
119 | } | 125 | } |
120 | 126 | ||
121 | const char *OCSP_crl_reason_str(long s) | 127 | const char * |
122 | { | 128 | OCSP_crl_reason_str(long s) |
129 | { | ||
123 | static const OCSP_TBLSTR reason_tbl[] = { | 130 | static const OCSP_TBLSTR reason_tbl[] = { |
124 | { OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" }, | 131 | { OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" }, |
125 | { OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" }, | 132 | { OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" }, |
126 | { OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" }, | 133 | { OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" }, |
127 | { OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, "affiliationChanged" }, | 134 | { OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, "affiliationChanged" }, |
128 | { OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" }, | 135 | { OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" }, |
129 | { OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, "cessationOfOperation" }, | 136 | { OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, "cessationOfOperation" }, |
130 | { OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" }, | 137 | { OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" }, |
131 | { OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" } }; | 138 | { OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" } |
139 | }; | ||
132 | return table2string(s, reason_tbl, 8); | 140 | return table2string(s, reason_tbl, 8); |
133 | } | 141 | } |
134 | 142 | ||
135 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) | 143 | int |
136 | { | 144 | OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) |
145 | { | ||
137 | int i; | 146 | int i; |
138 | long l; | 147 | long l; |
139 | OCSP_CERTID* cid = NULL; | 148 | OCSP_CERTID* cid = NULL; |
@@ -141,45 +150,45 @@ int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) | |||
141 | OCSP_REQINFO *inf = o->tbsRequest; | 150 | OCSP_REQINFO *inf = o->tbsRequest; |
142 | OCSP_SIGNATURE *sig = o->optionalSignature; | 151 | OCSP_SIGNATURE *sig = o->optionalSignature; |
143 | 152 | ||
144 | if (BIO_write(bp,"OCSP Request Data:\n",19) <= 0) goto err; | 153 | if (BIO_write(bp,"OCSP Request Data:\n",19) <= 0) |
145 | l=ASN1_INTEGER_get(inf->version); | 154 | goto err; |
146 | if (BIO_printf(bp," Version: %lu (0x%lx)",l+1,l) <= 0) goto err; | 155 | l = ASN1_INTEGER_get(inf->version); |
147 | if (inf->requestorName != NULL) | 156 | if (BIO_printf(bp," Version: %lu (0x%lx)",l+1,l) <= 0) |
148 | { | 157 | goto err; |
158 | if (inf->requestorName != NULL) { | ||
149 | if (BIO_write(bp,"\n Requestor Name: ",21) <= 0) | 159 | if (BIO_write(bp,"\n Requestor Name: ",21) <= 0) |
150 | goto err; | 160 | goto err; |
151 | GENERAL_NAME_print(bp, inf->requestorName); | 161 | GENERAL_NAME_print(bp, inf->requestorName); |
152 | } | 162 | } |
153 | if (BIO_write(bp,"\n Requestor List:\n",21) <= 0) goto err; | 163 | if (BIO_write(bp,"\n Requestor List:\n",21) <= 0) |
154 | for (i = 0; i < sk_OCSP_ONEREQ_num(inf->requestList); i++) | 164 | goto err; |
155 | { | 165 | for (i = 0; i < sk_OCSP_ONEREQ_num(inf->requestList); i++) { |
156 | one = sk_OCSP_ONEREQ_value(inf->requestList, i); | 166 | one = sk_OCSP_ONEREQ_value(inf->requestList, i); |
157 | cid = one->reqCert; | 167 | cid = one->reqCert; |
158 | ocsp_certid_print(bp, cid, 8); | 168 | ocsp_certid_print(bp, cid, 8); |
159 | if (!X509V3_extensions_print(bp, | 169 | if (!X509V3_extensions_print(bp, "Request Single Extensions", |
160 | "Request Single Extensions", | 170 | one->singleRequestExtensions, flags, 8)) |
161 | one->singleRequestExtensions, flags, 8)) | 171 | goto err; |
162 | goto err; | 172 | } |
163 | } | ||
164 | if (!X509V3_extensions_print(bp, "Request Extensions", | 173 | if (!X509V3_extensions_print(bp, "Request Extensions", |
165 | inf->requestExtensions, flags, 4)) | 174 | inf->requestExtensions, flags, 4)) |
166 | goto err; | 175 | goto err; |
167 | if (sig) | 176 | if (sig) { |
168 | { | 177 | X509_signature_print(bp, sig->signatureAlgorithm, |
169 | X509_signature_print(bp, sig->signatureAlgorithm, sig->signature); | 178 | sig->signature); |
170 | for (i=0; i<sk_X509_num(sig->certs); i++) | 179 | for (i=0; i<sk_X509_num(sig->certs); i++) { |
171 | { | ||
172 | X509_print(bp, sk_X509_value(sig->certs,i)); | 180 | X509_print(bp, sk_X509_value(sig->certs,i)); |
173 | PEM_write_bio_X509(bp,sk_X509_value(sig->certs,i)); | 181 | PEM_write_bio_X509(bp,sk_X509_value(sig->certs,i)); |
174 | } | ||
175 | } | 182 | } |
183 | } | ||
176 | return 1; | 184 | return 1; |
177 | err: | 185 | err: |
178 | return 0; | 186 | return 0; |
179 | } | 187 | } |
180 | 188 | ||
181 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) | 189 | int |
182 | { | 190 | OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) |
191 | { | ||
183 | int i, ret = 0; | 192 | int i, ret = 0; |
184 | long l; | 193 | long l; |
185 | OCSP_CERTID *cid = NULL; | 194 | OCSP_CERTID *cid = NULL; |
@@ -191,100 +200,107 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) | |||
191 | OCSP_SINGLERESP *single = NULL; | 200 | OCSP_SINGLERESP *single = NULL; |
192 | OCSP_RESPBYTES *rb = o->responseBytes; | 201 | OCSP_RESPBYTES *rb = o->responseBytes; |
193 | 202 | ||
194 | if (BIO_puts(bp,"OCSP Response Data:\n") <= 0) goto err; | 203 | if (BIO_puts(bp,"OCSP Response Data:\n") <= 0) |
195 | l=ASN1_ENUMERATED_get(o->responseStatus); | 204 | goto err; |
205 | l = ASN1_ENUMERATED_get(o->responseStatus); | ||
196 | if (BIO_printf(bp," OCSP Response Status: %s (0x%lx)\n", | 206 | if (BIO_printf(bp," OCSP Response Status: %s (0x%lx)\n", |
197 | OCSP_response_status_str(l), l) <= 0) goto err; | 207 | OCSP_response_status_str(l), l) <= 0) |
198 | if (rb == NULL) return 1; | 208 | goto err; |
199 | if (BIO_puts(bp," Response Type: ") <= 0) | 209 | if (rb == NULL) |
200 | goto err; | 210 | return 1; |
211 | if (BIO_puts(bp," Response Type: ") <= 0) | ||
212 | goto err; | ||
201 | if(i2a_ASN1_OBJECT(bp, rb->responseType) <= 0) | 213 | if(i2a_ASN1_OBJECT(bp, rb->responseType) <= 0) |
202 | goto err; | 214 | goto err; |
203 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) | 215 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) { |
204 | { | ||
205 | BIO_puts(bp," (unknown response type)\n"); | 216 | BIO_puts(bp," (unknown response type)\n"); |
206 | return 1; | 217 | return 1; |
207 | } | 218 | } |
208 | 219 | ||
209 | i = ASN1_STRING_length(rb->response); | 220 | i = ASN1_STRING_length(rb->response); |
210 | if (!(br = OCSP_response_get1_basic(o))) goto err; | 221 | if (!(br = OCSP_response_get1_basic(o))) |
222 | goto err; | ||
211 | rd = br->tbsResponseData; | 223 | rd = br->tbsResponseData; |
212 | l=ASN1_INTEGER_get(rd->version); | 224 | l = ASN1_INTEGER_get(rd->version); |
213 | if (BIO_printf(bp,"\n Version: %lu (0x%lx)\n", | 225 | if (BIO_printf(bp,"\n Version: %lu (0x%lx)\n", l+1,l) <= 0) |
214 | l+1,l) <= 0) goto err; | 226 | goto err; |
215 | if (BIO_puts(bp," Responder Id: ") <= 0) goto err; | 227 | if (BIO_puts(bp," Responder Id: ") <= 0) |
228 | goto err; | ||
216 | 229 | ||
217 | rid = rd->responderId; | 230 | rid = rd->responderId; |
218 | switch (rid->type) | 231 | switch (rid->type) { |
219 | { | 232 | case V_OCSP_RESPID_NAME: |
220 | case V_OCSP_RESPID_NAME: | 233 | X509_NAME_print_ex(bp, rid->value.byName, 0, XN_FLAG_ONELINE); |
221 | X509_NAME_print_ex(bp, rid->value.byName, 0, XN_FLAG_ONELINE); | 234 | break; |
222 | break; | 235 | case V_OCSP_RESPID_KEY: |
223 | case V_OCSP_RESPID_KEY: | 236 | i2a_ASN1_STRING(bp, rid->value.byKey, V_ASN1_OCTET_STRING); |
224 | i2a_ASN1_STRING(bp, rid->value.byKey, V_ASN1_OCTET_STRING); | 237 | break; |
225 | break; | 238 | } |
226 | } | ||
227 | 239 | ||
228 | if (BIO_printf(bp,"\n Produced At: ")<=0) goto err; | 240 | if (BIO_printf(bp,"\n Produced At: ")<=0) |
229 | if (!ASN1_GENERALIZEDTIME_print(bp, rd->producedAt)) goto err; | 241 | goto err; |
230 | if (BIO_printf(bp,"\n Responses:\n") <= 0) goto err; | 242 | if (!ASN1_GENERALIZEDTIME_print(bp, rd->producedAt)) |
231 | for (i = 0; i < sk_OCSP_SINGLERESP_num(rd->responses); i++) | 243 | goto err; |
232 | { | 244 | if (BIO_printf(bp,"\n Responses:\n") <= 0) |
233 | if (! sk_OCSP_SINGLERESP_value(rd->responses, i)) continue; | 245 | goto err; |
246 | for (i = 0; i < sk_OCSP_SINGLERESP_num(rd->responses); i++) { | ||
247 | if (! sk_OCSP_SINGLERESP_value(rd->responses, i)) | ||
248 | continue; | ||
234 | single = sk_OCSP_SINGLERESP_value(rd->responses, i); | 249 | single = sk_OCSP_SINGLERESP_value(rd->responses, i); |
235 | cid = single->certId; | 250 | cid = single->certId; |
236 | if(ocsp_certid_print(bp, cid, 4) <= 0) goto err; | 251 | if (ocsp_certid_print(bp, cid, 4) <= 0) |
252 | goto err; | ||
237 | cst = single->certStatus; | 253 | cst = single->certStatus; |
238 | if (BIO_printf(bp," Cert Status: %s", | 254 | if (BIO_printf(bp," Cert Status: %s", |
239 | OCSP_cert_status_str(cst->type)) <= 0) | 255 | OCSP_cert_status_str(cst->type)) <= 0) |
240 | goto err; | 256 | goto err; |
241 | if (cst->type == V_OCSP_CERTSTATUS_REVOKED) | 257 | if (cst->type == V_OCSP_CERTSTATUS_REVOKED) { |
242 | { | 258 | rev = cst->value.revoked; |
243 | rev = cst->value.revoked; | ||
244 | if (BIO_printf(bp, "\n Revocation Time: ") <= 0) | 259 | if (BIO_printf(bp, "\n Revocation Time: ") <= 0) |
245 | goto err; | ||
246 | if (!ASN1_GENERALIZEDTIME_print(bp, | ||
247 | rev->revocationTime)) | ||
248 | goto err; | 260 | goto err; |
249 | if (rev->revocationReason) | 261 | if (!ASN1_GENERALIZEDTIME_print(bp, |
250 | { | 262 | rev->revocationTime)) |
251 | l=ASN1_ENUMERATED_get(rev->revocationReason); | 263 | goto err; |
252 | if (BIO_printf(bp, | 264 | if (rev->revocationReason) { |
253 | "\n Revocation Reason: %s (0x%lx)", | 265 | l = ASN1_ENUMERATED_get(rev->revocationReason); |
254 | OCSP_crl_reason_str(l), l) <= 0) | 266 | if (BIO_printf(bp, |
255 | goto err; | 267 | "\n Revocation Reason: %s (0x%lx)", |
256 | } | 268 | OCSP_crl_reason_str(l), l) <= 0) |
269 | goto err; | ||
257 | } | 270 | } |
258 | if (BIO_printf(bp,"\n This Update: ") <= 0) goto err; | 271 | } |
272 | if (BIO_printf(bp,"\n This Update: ") <= 0) | ||
273 | goto err; | ||
259 | if (!ASN1_GENERALIZEDTIME_print(bp, single->thisUpdate)) | 274 | if (!ASN1_GENERALIZEDTIME_print(bp, single->thisUpdate)) |
260 | goto err; | 275 | goto err; |
261 | if (single->nextUpdate) | 276 | if (single->nextUpdate) { |
262 | { | 277 | if (BIO_printf(bp,"\n Next Update: ") <= 0) |
263 | if (BIO_printf(bp,"\n Next Update: ") <= 0)goto err; | 278 | goto err; |
264 | if (!ASN1_GENERALIZEDTIME_print(bp,single->nextUpdate)) | 279 | if (!ASN1_GENERALIZEDTIME_print(bp,single->nextUpdate)) |
265 | goto err; | 280 | goto err; |
266 | } | ||
267 | if (BIO_write(bp,"\n",1) <= 0) goto err; | ||
268 | if (!X509V3_extensions_print(bp, | ||
269 | "Response Single Extensions", | ||
270 | single->singleExtensions, flags, 8)) | ||
271 | goto err; | ||
272 | if (BIO_write(bp,"\n",1) <= 0) goto err; | ||
273 | } | 281 | } |
282 | if (BIO_write(bp,"\n",1) <= 0) | ||
283 | goto err; | ||
284 | if (!X509V3_extensions_print(bp, "Response Single Extensions", | ||
285 | single->singleExtensions, flags, 8)) | ||
286 | goto err; | ||
287 | if (BIO_write(bp,"\n",1) <= 0) | ||
288 | goto err; | ||
289 | } | ||
274 | if (!X509V3_extensions_print(bp, "Response Extensions", | 290 | if (!X509V3_extensions_print(bp, "Response Extensions", |
275 | rd->responseExtensions, flags, 4)) | 291 | rd->responseExtensions, flags, 4)) |
276 | goto err; | 292 | goto err; |
277 | if(X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= 0) | 293 | if (X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= |
278 | goto err; | 294 | 0) |
295 | goto err; | ||
279 | 296 | ||
280 | for (i=0; i<sk_X509_num(br->certs); i++) | 297 | for (i = 0; i < sk_X509_num(br->certs); i++) { |
281 | { | 298 | X509_print(bp, sk_X509_value(br->certs, i)); |
282 | X509_print(bp, sk_X509_value(br->certs,i)); | 299 | PEM_write_bio_X509(bp,sk_X509_value(br->certs, i)); |
283 | PEM_write_bio_X509(bp,sk_X509_value(br->certs,i)); | 300 | } |
284 | } | ||
285 | 301 | ||
286 | ret = 1; | 302 | ret = 1; |
287 | err: | 303 | err: |
288 | OCSP_BASICRESP_free(br); | 304 | OCSP_BASICRESP_free(br); |
289 | return ret; | 305 | return ret; |
290 | } | 306 | } |
diff --git a/src/lib/libcrypto/ocsp/ocsp_srv.c b/src/lib/libcrypto/ocsp/ocsp_srv.c index 1c606dd0b6..c14e8e2bc3 100644 --- a/src/lib/libcrypto/ocsp/ocsp_srv.c +++ b/src/lib/libcrypto/ocsp/ocsp_srv.c | |||
@@ -69,107 +69,118 @@ | |||
69 | * relevant information from the request. | 69 | * relevant information from the request. |
70 | */ | 70 | */ |
71 | 71 | ||
72 | int OCSP_request_onereq_count(OCSP_REQUEST *req) | 72 | int |
73 | { | 73 | OCSP_request_onereq_count(OCSP_REQUEST *req) |
74 | { | ||
74 | return sk_OCSP_ONEREQ_num(req->tbsRequest->requestList); | 75 | return sk_OCSP_ONEREQ_num(req->tbsRequest->requestList); |
75 | } | 76 | } |
76 | 77 | ||
77 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i) | 78 | OCSP_ONEREQ * |
78 | { | 79 | OCSP_request_onereq_get0(OCSP_REQUEST *req, int i) |
80 | { | ||
79 | return sk_OCSP_ONEREQ_value(req->tbsRequest->requestList, i); | 81 | return sk_OCSP_ONEREQ_value(req->tbsRequest->requestList, i); |
80 | } | 82 | } |
81 | 83 | ||
82 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one) | 84 | OCSP_CERTID * |
83 | { | 85 | OCSP_onereq_get0_id(OCSP_ONEREQ *one) |
86 | { | ||
84 | return one->reqCert; | 87 | return one->reqCert; |
85 | } | 88 | } |
86 | 89 | ||
87 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, | 90 | int |
88 | ASN1_OCTET_STRING **pikeyHash, | 91 | OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, |
89 | ASN1_INTEGER **pserial, OCSP_CERTID *cid) | 92 | ASN1_OCTET_STRING **pikeyHash, ASN1_INTEGER **pserial, OCSP_CERTID *cid) |
90 | { | 93 | { |
91 | if (!cid) return 0; | 94 | if (!cid) |
92 | if (pmd) *pmd = cid->hashAlgorithm->algorithm; | 95 | return 0; |
93 | if(piNameHash) *piNameHash = cid->issuerNameHash; | 96 | if (pmd) |
94 | if (pikeyHash) *pikeyHash = cid->issuerKeyHash; | 97 | *pmd = cid->hashAlgorithm->algorithm; |
95 | if (pserial) *pserial = cid->serialNumber; | 98 | if (piNameHash) |
99 | *piNameHash = cid->issuerNameHash; | ||
100 | if (pikeyHash) | ||
101 | *pikeyHash = cid->issuerKeyHash; | ||
102 | if (pserial) | ||
103 | *pserial = cid->serialNumber; | ||
96 | return 1; | 104 | return 1; |
97 | } | 105 | } |
98 | 106 | ||
99 | int OCSP_request_is_signed(OCSP_REQUEST *req) | 107 | int |
100 | { | 108 | OCSP_request_is_signed(OCSP_REQUEST *req) |
101 | if(req->optionalSignature) return 1; | 109 | { |
110 | if (req->optionalSignature) | ||
111 | return 1; | ||
102 | return 0; | 112 | return 0; |
103 | } | 113 | } |
104 | 114 | ||
105 | /* Create an OCSP response and encode an optional basic response */ | 115 | /* Create an OCSP response and encode an optional basic response */ |
106 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs) | 116 | OCSP_RESPONSE * |
107 | { | 117 | OCSP_response_create(int status, OCSP_BASICRESP *bs) |
108 | OCSP_RESPONSE *rsp = NULL; | 118 | { |
119 | OCSP_RESPONSE *rsp = NULL; | ||
109 | 120 | ||
110 | if (!(rsp = OCSP_RESPONSE_new())) goto err; | 121 | if (!(rsp = OCSP_RESPONSE_new())) |
111 | if (!(ASN1_ENUMERATED_set(rsp->responseStatus, status))) goto err; | 122 | goto err; |
112 | if (!bs) return rsp; | 123 | if (!(ASN1_ENUMERATED_set(rsp->responseStatus, status))) |
113 | if (!(rsp->responseBytes = OCSP_RESPBYTES_new())) goto err; | 124 | goto err; |
125 | if (!bs) | ||
126 | return rsp; | ||
127 | if (!(rsp->responseBytes = OCSP_RESPBYTES_new())) | ||
128 | goto err; | ||
114 | rsp->responseBytes->responseType = OBJ_nid2obj(NID_id_pkix_OCSP_basic); | 129 | rsp->responseBytes->responseType = OBJ_nid2obj(NID_id_pkix_OCSP_basic); |
115 | if (!ASN1_item_pack(bs, ASN1_ITEM_rptr(OCSP_BASICRESP), &rsp->responseBytes->response)) | 130 | if (!ASN1_item_pack(bs, ASN1_ITEM_rptr(OCSP_BASICRESP), |
116 | goto err; | 131 | &rsp->responseBytes->response)) |
132 | goto err; | ||
117 | return rsp; | 133 | return rsp; |
118 | err: | 134 | err: |
119 | if (rsp) OCSP_RESPONSE_free(rsp); | 135 | if (rsp) |
136 | OCSP_RESPONSE_free(rsp); | ||
120 | return NULL; | 137 | return NULL; |
121 | } | 138 | } |
122 | |||
123 | 139 | ||
124 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | 140 | OCSP_SINGLERESP * |
125 | OCSP_CERTID *cid, | 141 | OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid, int status, |
126 | int status, int reason, | 142 | int reason, ASN1_TIME *revtime, ASN1_TIME *thisupd, ASN1_TIME *nextupd) |
127 | ASN1_TIME *revtime, | 143 | { |
128 | ASN1_TIME *thisupd, ASN1_TIME *nextupd) | ||
129 | { | ||
130 | OCSP_SINGLERESP *single = NULL; | 144 | OCSP_SINGLERESP *single = NULL; |
131 | OCSP_CERTSTATUS *cs; | 145 | OCSP_CERTSTATUS *cs; |
132 | OCSP_REVOKEDINFO *ri; | 146 | OCSP_REVOKEDINFO *ri; |
133 | 147 | ||
134 | if(!rsp->tbsResponseData->responses && | 148 | if (!rsp->tbsResponseData->responses && |
135 | !(rsp->tbsResponseData->responses = sk_OCSP_SINGLERESP_new_null())) | 149 | !(rsp->tbsResponseData->responses = sk_OCSP_SINGLERESP_new_null())) |
136 | goto err; | 150 | goto err; |
137 | 151 | ||
138 | if (!(single = OCSP_SINGLERESP_new())) | 152 | if (!(single = OCSP_SINGLERESP_new())) |
139 | goto err; | 153 | goto err; |
140 | 154 | ||
141 | |||
142 | |||
143 | if (!ASN1_TIME_to_generalizedtime(thisupd, &single->thisUpdate)) | 155 | if (!ASN1_TIME_to_generalizedtime(thisupd, &single->thisUpdate)) |
144 | goto err; | 156 | goto err; |
145 | if (nextupd && | 157 | if (nextupd && |
146 | !ASN1_TIME_to_generalizedtime(nextupd, &single->nextUpdate)) | 158 | !ASN1_TIME_to_generalizedtime(nextupd, &single->nextUpdate)) |
147 | goto err; | 159 | goto err; |
148 | 160 | ||
149 | OCSP_CERTID_free(single->certId); | 161 | OCSP_CERTID_free(single->certId); |
150 | 162 | ||
151 | if(!(single->certId = OCSP_CERTID_dup(cid))) | 163 | if (!(single->certId = OCSP_CERTID_dup(cid))) |
152 | goto err; | 164 | goto err; |
153 | 165 | ||
154 | cs = single->certStatus; | 166 | cs = single->certStatus; |
155 | switch(cs->type = status) | 167 | switch(cs->type = status) { |
156 | { | ||
157 | case V_OCSP_CERTSTATUS_REVOKED: | 168 | case V_OCSP_CERTSTATUS_REVOKED: |
158 | if (!revtime) | 169 | if (!revtime) { |
159 | { | 170 | OCSPerr(OCSP_F_OCSP_BASIC_ADD1_STATUS, |
160 | OCSPerr(OCSP_F_OCSP_BASIC_ADD1_STATUS,OCSP_R_NO_REVOKED_TIME); | 171 | OCSP_R_NO_REVOKED_TIME); |
172 | goto err; | ||
173 | } | ||
174 | if (!(cs->value.revoked = ri = OCSP_REVOKEDINFO_new())) | ||
161 | goto err; | 175 | goto err; |
162 | } | ||
163 | if (!(cs->value.revoked = ri = OCSP_REVOKEDINFO_new())) goto err; | ||
164 | if (!ASN1_TIME_to_generalizedtime(revtime, &ri->revocationTime)) | 176 | if (!ASN1_TIME_to_generalizedtime(revtime, &ri->revocationTime)) |
165 | goto err; | 177 | goto err; |
166 | if (reason != OCSP_REVOKED_STATUS_NOSTATUS) | 178 | if (reason != OCSP_REVOKED_STATUS_NOSTATUS) { |
167 | { | ||
168 | if (!(ri->revocationReason = ASN1_ENUMERATED_new())) | 179 | if (!(ri->revocationReason = ASN1_ENUMERATED_new())) |
169 | goto err; | 180 | goto err; |
170 | if (!(ASN1_ENUMERATED_set(ri->revocationReason, | 181 | if (!(ASN1_ENUMERATED_set(ri->revocationReason, |
171 | reason))) | 182 | reason))) |
172 | goto err; | 183 | goto err; |
173 | } | 184 | } |
174 | break; | 185 | break; |
175 | 186 | ||
@@ -183,82 +194,80 @@ OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | |||
183 | 194 | ||
184 | default: | 195 | default: |
185 | goto err; | 196 | goto err; |
186 | 197 | } | |
187 | } | ||
188 | if (!(sk_OCSP_SINGLERESP_push(rsp->tbsResponseData->responses, single))) | 198 | if (!(sk_OCSP_SINGLERESP_push(rsp->tbsResponseData->responses, single))) |
189 | goto err; | 199 | goto err; |
190 | return single; | 200 | return single; |
191 | err: | 201 | err: |
192 | OCSP_SINGLERESP_free(single); | 202 | OCSP_SINGLERESP_free(single); |
193 | return NULL; | 203 | return NULL; |
194 | } | 204 | } |
195 | 205 | ||
196 | /* Add a certificate to an OCSP request */ | 206 | /* Add a certificate to an OCSP request */ |
197 | 207 | int | |
198 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert) | 208 | OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert) |
199 | { | 209 | { |
200 | if (!resp->certs && !(resp->certs = sk_X509_new_null())) | 210 | if (!resp->certs && !(resp->certs = sk_X509_new_null())) |
201 | return 0; | 211 | return 0; |
202 | 212 | ||
203 | if(!sk_X509_push(resp->certs, cert)) return 0; | 213 | if (!sk_X509_push(resp->certs, cert)) |
214 | return 0; | ||
204 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); | 215 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); |
205 | return 1; | 216 | return 1; |
206 | } | 217 | } |
207 | 218 | ||
208 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, | 219 | int |
209 | X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, | 220 | OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, |
210 | STACK_OF(X509) *certs, unsigned long flags) | 221 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags) |
211 | { | 222 | { |
212 | int i; | 223 | int i; |
213 | OCSP_RESPID *rid; | 224 | OCSP_RESPID *rid; |
214 | 225 | ||
215 | if (!X509_check_private_key(signer, key)) | 226 | if (!X509_check_private_key(signer, key)) { |
216 | { | 227 | OCSPerr(OCSP_F_OCSP_BASIC_SIGN, |
217 | OCSPerr(OCSP_F_OCSP_BASIC_SIGN, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | 228 | OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); |
218 | goto err; | 229 | goto err; |
219 | } | 230 | } |
220 | 231 | ||
221 | if(!(flags & OCSP_NOCERTS)) | 232 | if (!(flags & OCSP_NOCERTS)) { |
222 | { | 233 | if (!OCSP_basic_add1_cert(brsp, signer)) |
223 | if(!OCSP_basic_add1_cert(brsp, signer)) | ||
224 | goto err; | 234 | goto err; |
225 | for (i = 0; i < sk_X509_num(certs); i++) | 235 | for (i = 0; i < sk_X509_num(certs); i++) { |
226 | { | ||
227 | X509 *tmpcert = sk_X509_value(certs, i); | 236 | X509 *tmpcert = sk_X509_value(certs, i); |
228 | if(!OCSP_basic_add1_cert(brsp, tmpcert)) | 237 | if (!OCSP_basic_add1_cert(brsp, tmpcert)) |
229 | goto err; | 238 | goto err; |
230 | } | ||
231 | } | 239 | } |
240 | } | ||
232 | 241 | ||
233 | rid = brsp->tbsResponseData->responderId; | 242 | rid = brsp->tbsResponseData->responderId; |
234 | if (flags & OCSP_RESPID_KEY) | 243 | if (flags & OCSP_RESPID_KEY) { |
235 | { | ||
236 | unsigned char md[SHA_DIGEST_LENGTH]; | 244 | unsigned char md[SHA_DIGEST_LENGTH]; |
245 | |||
237 | X509_pubkey_digest(signer, EVP_sha1(), md, NULL); | 246 | X509_pubkey_digest(signer, EVP_sha1(), md, NULL); |
238 | if (!(rid->value.byKey = ASN1_OCTET_STRING_new())) | 247 | if (!(rid->value.byKey = ASN1_OCTET_STRING_new())) |
239 | goto err; | 248 | goto err; |
240 | if (!(ASN1_OCTET_STRING_set(rid->value.byKey, md, SHA_DIGEST_LENGTH))) | 249 | if (!(ASN1_OCTET_STRING_set(rid->value.byKey, md, |
241 | goto err; | 250 | SHA_DIGEST_LENGTH))) |
251 | goto err; | ||
242 | rid->type = V_OCSP_RESPID_KEY; | 252 | rid->type = V_OCSP_RESPID_KEY; |
243 | } | 253 | } else { |
244 | else | ||
245 | { | ||
246 | if (!X509_NAME_set(&rid->value.byName, | 254 | if (!X509_NAME_set(&rid->value.byName, |
247 | X509_get_subject_name(signer))) | 255 | X509_get_subject_name(signer))) |
248 | goto err; | 256 | goto err; |
249 | rid->type = V_OCSP_RESPID_NAME; | 257 | rid->type = V_OCSP_RESPID_NAME; |
250 | } | 258 | } |
251 | 259 | ||
252 | if (!(flags & OCSP_NOTIME) && | 260 | if (!(flags & OCSP_NOTIME) && |
253 | !X509_gmtime_adj(brsp->tbsResponseData->producedAt, 0)) | 261 | !X509_gmtime_adj(brsp->tbsResponseData->producedAt, 0)) |
254 | goto err; | 262 | goto err; |
255 | 263 | ||
256 | /* Right now, I think that not doing double hashing is the right | 264 | /* Right now, I think that not doing double hashing is the right |
257 | thing. -- Richard Levitte */ | 265 | thing. -- Richard Levitte */ |
258 | 266 | ||
259 | if (!OCSP_BASICRESP_sign(brsp, key, dgst, 0)) goto err; | 267 | if (!OCSP_BASICRESP_sign(brsp, key, dgst, 0)) |
268 | goto err; | ||
260 | 269 | ||
261 | return 1; | 270 | return 1; |
262 | err: | 271 | err: |
263 | return 0; | 272 | return 0; |
264 | } | 273 | } |
diff --git a/src/lib/libcrypto/ocsp/ocsp_vfy.c b/src/lib/libcrypto/ocsp/ocsp_vfy.c index 0b181d5abe..aede155871 100644 --- a/src/lib/libcrypto/ocsp/ocsp_vfy.c +++ b/src/lib/libcrypto/ocsp/ocsp_vfy.c | |||
@@ -60,134 +60,137 @@ | |||
60 | #include <openssl/err.h> | 60 | #include <openssl/err.h> |
61 | #include <string.h> | 61 | #include <string.h> |
62 | 62 | ||
63 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 63 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, |
64 | X509_STORE *st, unsigned long flags); | 64 | STACK_OF(X509) *certs, X509_STORE *st, unsigned long flags); |
65 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id); | 65 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id); |
66 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, unsigned long flags); | 66 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, |
67 | unsigned long flags); | ||
67 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret); | 68 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret); |
68 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, STACK_OF(OCSP_SINGLERESP) *sresp); | 69 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, |
70 | STACK_OF(OCSP_SINGLERESP) *sresp); | ||
69 | static int ocsp_check_delegated(X509 *x, int flags); | 71 | static int ocsp_check_delegated(X509 *x, int flags); |
70 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, STACK_OF(X509) *certs, | 72 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, |
71 | X509_STORE *st, unsigned long flags); | 73 | X509_NAME *nm, STACK_OF(X509) *certs, X509_STORE *st, |
74 | unsigned long flags); | ||
72 | 75 | ||
73 | /* Verify a basic response message */ | 76 | /* Verify a basic response message */ |
74 | 77 | int | |
75 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 78 | OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, X509_STORE *st, |
76 | X509_STORE *st, unsigned long flags) | 79 | unsigned long flags) |
77 | { | 80 | { |
78 | X509 *signer, *x; | 81 | X509 *signer, *x; |
79 | STACK_OF(X509) *chain = NULL; | 82 | STACK_OF(X509) *chain = NULL; |
80 | X509_STORE_CTX ctx; | 83 | X509_STORE_CTX ctx; |
81 | int i, ret = 0; | 84 | int i, ret = 0; |
85 | |||
82 | ret = ocsp_find_signer(&signer, bs, certs, st, flags); | 86 | ret = ocsp_find_signer(&signer, bs, certs, st, flags); |
83 | if (!ret) | 87 | if (!ret) { |
84 | { | 88 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
85 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); | 89 | OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); |
86 | goto end; | 90 | goto end; |
87 | } | 91 | } |
88 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) | 92 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) |
89 | flags |= OCSP_NOVERIFY; | 93 | flags |= OCSP_NOVERIFY; |
90 | if (!(flags & OCSP_NOSIGS)) | 94 | if (!(flags & OCSP_NOSIGS)) { |
91 | { | ||
92 | EVP_PKEY *skey; | 95 | EVP_PKEY *skey; |
96 | |||
93 | skey = X509_get_pubkey(signer); | 97 | skey = X509_get_pubkey(signer); |
94 | if (skey) | 98 | if (skey) { |
95 | { | ||
96 | ret = OCSP_BASICRESP_verify(bs, skey, 0); | 99 | ret = OCSP_BASICRESP_verify(bs, skey, 0); |
97 | EVP_PKEY_free(skey); | 100 | EVP_PKEY_free(skey); |
98 | } | 101 | } |
99 | if(!skey || ret <= 0) | 102 | if (!skey || ret <= 0) { |
100 | { | 103 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
101 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE); | 104 | OCSP_R_SIGNATURE_FAILURE); |
102 | goto end; | 105 | goto end; |
103 | } | ||
104 | } | 106 | } |
105 | if (!(flags & OCSP_NOVERIFY)) | 107 | } |
106 | { | 108 | if (!(flags & OCSP_NOVERIFY)) { |
107 | int init_res; | 109 | int init_res; |
110 | |||
108 | if(flags & OCSP_NOCHAIN) | 111 | if(flags & OCSP_NOCHAIN) |
109 | init_res = X509_STORE_CTX_init(&ctx, st, signer, NULL); | 112 | init_res = X509_STORE_CTX_init(&ctx, st, signer, NULL); |
110 | else | 113 | else |
111 | init_res = X509_STORE_CTX_init(&ctx, st, signer, bs->certs); | 114 | init_res = X509_STORE_CTX_init(&ctx, st, signer, |
112 | if(!init_res) | 115 | bs->certs); |
113 | { | 116 | if (!init_res) { |
114 | ret = -1; | 117 | ret = -1; |
115 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,ERR_R_X509_LIB); | 118 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,ERR_R_X509_LIB); |
116 | goto end; | 119 | goto end; |
117 | } | 120 | } |
118 | 121 | ||
119 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); | 122 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); |
120 | ret = X509_verify_cert(&ctx); | 123 | ret = X509_verify_cert(&ctx); |
121 | chain = X509_STORE_CTX_get1_chain(&ctx); | 124 | chain = X509_STORE_CTX_get1_chain(&ctx); |
122 | X509_STORE_CTX_cleanup(&ctx); | 125 | X509_STORE_CTX_cleanup(&ctx); |
123 | if (ret <= 0) | 126 | if (ret <= 0) { |
124 | { | ||
125 | i = X509_STORE_CTX_get_error(&ctx); | 127 | i = X509_STORE_CTX_get_error(&ctx); |
126 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,OCSP_R_CERTIFICATE_VERIFY_ERROR); | 128 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
129 | OCSP_R_CERTIFICATE_VERIFY_ERROR); | ||
127 | ERR_asprintf_error_data("Verify error:%s", | 130 | ERR_asprintf_error_data("Verify error:%s", |
128 | X509_verify_cert_error_string(i)); | 131 | X509_verify_cert_error_string(i)); |
129 | goto end; | 132 | goto end; |
130 | } | 133 | } |
131 | if(flags & OCSP_NOCHECKS) | 134 | if(flags & OCSP_NOCHECKS) { |
132 | { | ||
133 | ret = 1; | 135 | ret = 1; |
134 | goto end; | 136 | goto end; |
135 | } | 137 | } |
136 | /* At this point we have a valid certificate chain | 138 | /* At this point we have a valid certificate chain |
137 | * need to verify it against the OCSP issuer criteria. | 139 | * need to verify it against the OCSP issuer criteria. |
138 | */ | 140 | */ |
139 | ret = ocsp_check_issuer(bs, chain, flags); | 141 | ret = ocsp_check_issuer(bs, chain, flags); |
140 | 142 | ||
141 | /* If fatal error or valid match then finish */ | 143 | /* If fatal error or valid match then finish */ |
142 | if (ret != 0) goto end; | 144 | if (ret != 0) |
145 | goto end; | ||
143 | 146 | ||
144 | /* Easy case: explicitly trusted. Get root CA and | 147 | /* Easy case: explicitly trusted. Get root CA and |
145 | * check for explicit trust | 148 | * check for explicit trust |
146 | */ | 149 | */ |
147 | if(flags & OCSP_NOEXPLICIT) goto end; | 150 | if (flags & OCSP_NOEXPLICIT) |
151 | goto end; | ||
148 | 152 | ||
149 | x = sk_X509_value(chain, sk_X509_num(chain) - 1); | 153 | x = sk_X509_value(chain, sk_X509_num(chain) - 1); |
150 | if(X509_check_trust(x, NID_OCSP_sign, 0) != X509_TRUST_TRUSTED) | 154 | if (X509_check_trust(x, NID_OCSP_sign, 0) != |
151 | { | 155 | X509_TRUST_TRUSTED) { |
152 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,OCSP_R_ROOT_CA_NOT_TRUSTED); | 156 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
157 | OCSP_R_ROOT_CA_NOT_TRUSTED); | ||
153 | goto end; | 158 | goto end; |
154 | } | ||
155 | ret = 1; | ||
156 | } | 159 | } |
157 | 160 | ret = 1; | |
158 | |||
159 | |||
160 | end: | ||
161 | if(chain) sk_X509_pop_free(chain, X509_free); | ||
162 | return ret; | ||
163 | } | 161 | } |
164 | 162 | ||
163 | end: | ||
164 | if (chain) | ||
165 | sk_X509_pop_free(chain, X509_free); | ||
166 | return ret; | ||
167 | } | ||
165 | 168 | ||
166 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 169 | static int |
167 | X509_STORE *st, unsigned long flags) | 170 | ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, |
168 | { | 171 | X509_STORE *st, unsigned long flags) |
172 | { | ||
169 | X509 *signer; | 173 | X509 *signer; |
170 | OCSP_RESPID *rid = bs->tbsResponseData->responderId; | 174 | OCSP_RESPID *rid = bs->tbsResponseData->responderId; |
171 | if ((signer = ocsp_find_signer_sk(certs, rid))) | 175 | |
172 | { | 176 | if ((signer = ocsp_find_signer_sk(certs, rid))) { |
173 | *psigner = signer; | 177 | *psigner = signer; |
174 | return 2; | 178 | return 2; |
175 | } | 179 | } |
176 | if(!(flags & OCSP_NOINTERN) && | 180 | if (!(flags & OCSP_NOINTERN) && |
177 | (signer = ocsp_find_signer_sk(bs->certs, rid))) | 181 | (signer = ocsp_find_signer_sk(bs->certs, rid))) { |
178 | { | ||
179 | *psigner = signer; | 182 | *psigner = signer; |
180 | return 1; | 183 | return 1; |
181 | } | 184 | } |
182 | /* Maybe lookup from store if by subject name */ | 185 | /* Maybe lookup from store if by subject name */ |
183 | 186 | ||
184 | *psigner = NULL; | 187 | *psigner = NULL; |
185 | return 0; | 188 | return 0; |
186 | } | 189 | } |
187 | |||
188 | 190 | ||
189 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) | 191 | static X509 * |
190 | { | 192 | ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) |
193 | { | ||
191 | int i; | 194 | int i; |
192 | unsigned char tmphash[SHA_DIGEST_LENGTH], *keyhash; | 195 | unsigned char tmphash[SHA_DIGEST_LENGTH], *keyhash; |
193 | X509 *x; | 196 | X509 *x; |
@@ -199,123 +202,124 @@ static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) | |||
199 | /* Lookup by key hash */ | 202 | /* Lookup by key hash */ |
200 | 203 | ||
201 | /* If key hash isn't SHA1 length then forget it */ | 204 | /* If key hash isn't SHA1 length then forget it */ |
202 | if (id->value.byKey->length != SHA_DIGEST_LENGTH) return NULL; | 205 | if (id->value.byKey->length != SHA_DIGEST_LENGTH) |
206 | return NULL; | ||
203 | keyhash = id->value.byKey->data; | 207 | keyhash = id->value.byKey->data; |
204 | /* Calculate hash of each key and compare */ | 208 | /* Calculate hash of each key and compare */ |
205 | for (i = 0; i < sk_X509_num(certs); i++) | 209 | for (i = 0; i < sk_X509_num(certs); i++) { |
206 | { | ||
207 | x = sk_X509_value(certs, i); | 210 | x = sk_X509_value(certs, i); |
208 | X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL); | 211 | X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL); |
209 | if(!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH)) | 212 | if (!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH)) |
210 | return x; | 213 | return x; |
211 | } | ||
212 | return NULL; | ||
213 | } | 214 | } |
215 | return NULL; | ||
216 | } | ||
214 | 217 | ||
215 | 218 | static int | |
216 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, unsigned long flags) | 219 | ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, |
217 | { | 220 | unsigned long flags) |
221 | { | ||
218 | STACK_OF(OCSP_SINGLERESP) *sresp; | 222 | STACK_OF(OCSP_SINGLERESP) *sresp; |
219 | X509 *signer, *sca; | 223 | X509 *signer, *sca; |
220 | OCSP_CERTID *caid = NULL; | 224 | OCSP_CERTID *caid = NULL; |
221 | int i; | 225 | int i; |
226 | |||
222 | sresp = bs->tbsResponseData->responses; | 227 | sresp = bs->tbsResponseData->responses; |
223 | 228 | ||
224 | if (sk_X509_num(chain) <= 0) | 229 | if (sk_X509_num(chain) <= 0) { |
225 | { | 230 | OCSPerr(OCSP_F_OCSP_CHECK_ISSUER, |
226 | OCSPerr(OCSP_F_OCSP_CHECK_ISSUER, OCSP_R_NO_CERTIFICATES_IN_CHAIN); | 231 | OCSP_R_NO_CERTIFICATES_IN_CHAIN); |
227 | return -1; | 232 | return -1; |
228 | } | 233 | } |
229 | 234 | ||
230 | /* See if the issuer IDs match. */ | 235 | /* See if the issuer IDs match. */ |
231 | i = ocsp_check_ids(sresp, &caid); | 236 | i = ocsp_check_ids(sresp, &caid); |
232 | 237 | ||
233 | /* If ID mismatch or other error then return */ | 238 | /* If ID mismatch or other error then return */ |
234 | if (i <= 0) return i; | 239 | if (i <= 0) |
240 | return i; | ||
235 | 241 | ||
236 | signer = sk_X509_value(chain, 0); | 242 | signer = sk_X509_value(chain, 0); |
237 | /* Check to see if OCSP responder CA matches request CA */ | 243 | /* Check to see if OCSP responder CA matches request CA */ |
238 | if (sk_X509_num(chain) > 1) | 244 | if (sk_X509_num(chain) > 1) { |
239 | { | ||
240 | sca = sk_X509_value(chain, 1); | 245 | sca = sk_X509_value(chain, 1); |
241 | i = ocsp_match_issuerid(sca, caid, sresp); | 246 | i = ocsp_match_issuerid(sca, caid, sresp); |
242 | if (i < 0) return i; | 247 | if (i < 0) |
243 | if (i) | 248 | return i; |
244 | { | 249 | if (i) { |
245 | /* We have a match, if extensions OK then success */ | 250 | /* We have a match, if extensions OK then success */ |
246 | if (ocsp_check_delegated(signer, flags)) return 1; | 251 | if (ocsp_check_delegated(signer, flags)) |
252 | return 1; | ||
247 | return 0; | 253 | return 0; |
248 | } | ||
249 | } | 254 | } |
255 | } | ||
250 | 256 | ||
251 | /* Otherwise check if OCSP request signed directly by request CA */ | 257 | /* Otherwise check if OCSP request signed directly by request CA */ |
252 | return ocsp_match_issuerid(signer, caid, sresp); | 258 | return ocsp_match_issuerid(signer, caid, sresp); |
253 | } | 259 | } |
254 | |||
255 | 260 | ||
256 | /* Check the issuer certificate IDs for equality. If there is a mismatch with the same | 261 | /* Check the issuer certificate IDs for equality. If there is a mismatch with the same |
257 | * algorithm then there's no point trying to match any certificates against the issuer. | 262 | * algorithm then there's no point trying to match any certificates against the issuer. |
258 | * If the issuer IDs all match then we just need to check equality against one of them. | 263 | * If the issuer IDs all match then we just need to check equality against one of them. |
259 | */ | 264 | */ |
260 | 265 | static int | |
261 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret) | 266 | ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret) |
262 | { | 267 | { |
263 | OCSP_CERTID *tmpid, *cid; | 268 | OCSP_CERTID *tmpid, *cid; |
264 | int i, idcount; | 269 | int i, idcount; |
265 | 270 | ||
266 | idcount = sk_OCSP_SINGLERESP_num(sresp); | 271 | idcount = sk_OCSP_SINGLERESP_num(sresp); |
267 | if (idcount <= 0) | 272 | if (idcount <= 0) { |
268 | { | 273 | OCSPerr(OCSP_F_OCSP_CHECK_IDS, |
269 | OCSPerr(OCSP_F_OCSP_CHECK_IDS, OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA); | 274 | OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA); |
270 | return -1; | 275 | return -1; |
271 | } | 276 | } |
272 | 277 | ||
273 | cid = sk_OCSP_SINGLERESP_value(sresp, 0)->certId; | 278 | cid = sk_OCSP_SINGLERESP_value(sresp, 0)->certId; |
274 | 279 | ||
275 | *ret = NULL; | 280 | *ret = NULL; |
276 | 281 | ||
277 | for (i = 1; i < idcount; i++) | 282 | for (i = 1; i < idcount; i++) { |
278 | { | ||
279 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; | 283 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; |
280 | /* Check to see if IDs match */ | 284 | /* Check to see if IDs match */ |
281 | if (OCSP_id_issuer_cmp(cid, tmpid)) | 285 | if (OCSP_id_issuer_cmp(cid, tmpid)) { |
282 | { | ||
283 | /* If algoritm mismatch let caller deal with it */ | 286 | /* If algoritm mismatch let caller deal with it */ |
284 | if (OBJ_cmp(tmpid->hashAlgorithm->algorithm, | 287 | if (OBJ_cmp(tmpid->hashAlgorithm->algorithm, |
285 | cid->hashAlgorithm->algorithm)) | 288 | cid->hashAlgorithm->algorithm)) |
286 | return 2; | 289 | return 2; |
287 | /* Else mismatch */ | 290 | /* Else mismatch */ |
288 | return 0; | 291 | return 0; |
289 | } | ||
290 | } | 292 | } |
293 | } | ||
291 | 294 | ||
292 | /* All IDs match: only need to check one ID */ | 295 | /* All IDs match: only need to check one ID */ |
293 | *ret = cid; | 296 | *ret = cid; |
294 | return 1; | 297 | return 1; |
295 | } | 298 | } |
296 | 299 | ||
297 | 300 | static int | |
298 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, | 301 | ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, |
299 | STACK_OF(OCSP_SINGLERESP) *sresp) | 302 | STACK_OF(OCSP_SINGLERESP) *sresp) |
300 | { | 303 | { |
301 | /* If only one ID to match then do it */ | 304 | /* If only one ID to match then do it */ |
302 | if(cid) | 305 | if (cid) { |
303 | { | ||
304 | const EVP_MD *dgst; | 306 | const EVP_MD *dgst; |
305 | X509_NAME *iname; | 307 | X509_NAME *iname; |
306 | int mdlen; | 308 | int mdlen; |
307 | unsigned char md[EVP_MAX_MD_SIZE]; | 309 | unsigned char md[EVP_MAX_MD_SIZE]; |
308 | if (!(dgst = EVP_get_digestbyobj(cid->hashAlgorithm->algorithm))) | 310 | |
309 | { | 311 | if (!(dgst = |
310 | OCSPerr(OCSP_F_OCSP_MATCH_ISSUERID, OCSP_R_UNKNOWN_MESSAGE_DIGEST); | 312 | EVP_get_digestbyobj(cid->hashAlgorithm->algorithm))) { |
313 | OCSPerr(OCSP_F_OCSP_MATCH_ISSUERID, | ||
314 | OCSP_R_UNKNOWN_MESSAGE_DIGEST); | ||
311 | return -1; | 315 | return -1; |
312 | } | 316 | } |
313 | 317 | ||
314 | mdlen = EVP_MD_size(dgst); | 318 | mdlen = EVP_MD_size(dgst); |
315 | if (mdlen < 0) | 319 | if (mdlen < 0) |
316 | return -1; | 320 | return -1; |
317 | if ((cid->issuerNameHash->length != mdlen) || | 321 | if (cid->issuerNameHash->length != mdlen || |
318 | (cid->issuerKeyHash->length != mdlen)) | 322 | cid->issuerKeyHash->length != mdlen) |
319 | return 0; | 323 | return 0; |
320 | iname = X509_get_subject_name(cert); | 324 | iname = X509_get_subject_name(cert); |
321 | if (!X509_NAME_digest(iname, dgst, md, NULL)) | 325 | if (!X509_NAME_digest(iname, dgst, md, NULL)) |
@@ -327,124 +331,123 @@ static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, | |||
327 | return 0; | 331 | return 0; |
328 | 332 | ||
329 | return 1; | 333 | return 1; |
330 | 334 | } else { | |
331 | } | ||
332 | else | ||
333 | { | ||
334 | /* We have to match the whole lot */ | 335 | /* We have to match the whole lot */ |
335 | int i, ret; | 336 | int i, ret; |
336 | OCSP_CERTID *tmpid; | 337 | OCSP_CERTID *tmpid; |
337 | for (i = 0; i < sk_OCSP_SINGLERESP_num(sresp); i++) | 338 | |
338 | { | 339 | for (i = 0; i < sk_OCSP_SINGLERESP_num(sresp); i++) { |
339 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; | 340 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; |
340 | ret = ocsp_match_issuerid(cert, tmpid, NULL); | 341 | ret = ocsp_match_issuerid(cert, tmpid, NULL); |
341 | if (ret <= 0) return ret; | 342 | if (ret <= 0) |
342 | } | 343 | return ret; |
343 | return 1; | ||
344 | } | 344 | } |
345 | 345 | return 1; | |
346 | } | 346 | } |
347 | } | ||
347 | 348 | ||
348 | static int ocsp_check_delegated(X509 *x, int flags) | 349 | static int |
349 | { | 350 | ocsp_check_delegated(X509 *x, int flags) |
351 | { | ||
350 | X509_check_purpose(x, -1, 0); | 352 | X509_check_purpose(x, -1, 0); |
351 | if ((x->ex_flags & EXFLAG_XKUSAGE) && | 353 | if ((x->ex_flags & EXFLAG_XKUSAGE) && (x->ex_xkusage & XKU_OCSP_SIGN)) |
352 | (x->ex_xkusage & XKU_OCSP_SIGN)) | ||
353 | return 1; | 354 | return 1; |
354 | OCSPerr(OCSP_F_OCSP_CHECK_DELEGATED, OCSP_R_MISSING_OCSPSIGNING_USAGE); | 355 | OCSPerr(OCSP_F_OCSP_CHECK_DELEGATED, OCSP_R_MISSING_OCSPSIGNING_USAGE); |
355 | return 0; | 356 | return 0; |
356 | } | 357 | } |
357 | 358 | ||
358 | /* Verify an OCSP request. This is fortunately much easier than OCSP | 359 | /* Verify an OCSP request. This is fortunately much easier than OCSP |
359 | * response verify. Just find the signers certificate and verify it | 360 | * response verify. Just find the signers certificate and verify it |
360 | * against a given trust value. | 361 | * against a given trust value. |
361 | */ | 362 | */ |
362 | 363 | int | |
363 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags) | 364 | OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, |
364 | { | 365 | unsigned long flags) |
366 | { | ||
365 | X509 *signer; | 367 | X509 *signer; |
366 | X509_NAME *nm; | 368 | X509_NAME *nm; |
367 | GENERAL_NAME *gen; | 369 | GENERAL_NAME *gen; |
368 | int ret; | 370 | int ret; |
369 | X509_STORE_CTX ctx; | 371 | X509_STORE_CTX ctx; |
370 | if (!req->optionalSignature) | 372 | |
371 | { | 373 | if (!req->optionalSignature) { |
372 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_REQUEST_NOT_SIGNED); | 374 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_REQUEST_NOT_SIGNED); |
373 | return 0; | 375 | return 0; |
374 | } | 376 | } |
375 | gen = req->tbsRequest->requestorName; | 377 | gen = req->tbsRequest->requestorName; |
376 | if (!gen || gen->type != GEN_DIRNAME) | 378 | if (!gen || gen->type != GEN_DIRNAME) { |
377 | { | 379 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
378 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE); | 380 | OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE); |
379 | return 0; | 381 | return 0; |
380 | } | 382 | } |
381 | nm = gen->d.directoryName; | 383 | nm = gen->d.directoryName; |
382 | ret = ocsp_req_find_signer(&signer, req, nm, certs, store, flags); | 384 | ret = ocsp_req_find_signer(&signer, req, nm, certs, store, flags); |
383 | if (ret <= 0) | 385 | if (ret <= 0) { |
384 | { | 386 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
385 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); | 387 | OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); |
386 | return 0; | 388 | return 0; |
387 | } | 389 | } |
388 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) | 390 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) |
389 | flags |= OCSP_NOVERIFY; | 391 | flags |= OCSP_NOVERIFY; |
390 | if (!(flags & OCSP_NOSIGS)) | 392 | if (!(flags & OCSP_NOSIGS)) { |
391 | { | ||
392 | EVP_PKEY *skey; | 393 | EVP_PKEY *skey; |
394 | |||
393 | skey = X509_get_pubkey(signer); | 395 | skey = X509_get_pubkey(signer); |
394 | ret = OCSP_REQUEST_verify(req, skey); | 396 | ret = OCSP_REQUEST_verify(req, skey); |
395 | EVP_PKEY_free(skey); | 397 | EVP_PKEY_free(skey); |
396 | if(ret <= 0) | 398 | if (ret <= 0) { |
397 | { | 399 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
398 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_SIGNATURE_FAILURE); | 400 | OCSP_R_SIGNATURE_FAILURE); |
399 | return 0; | 401 | return 0; |
400 | } | ||
401 | } | 402 | } |
402 | if (!(flags & OCSP_NOVERIFY)) | 403 | } |
403 | { | 404 | if (!(flags & OCSP_NOVERIFY)) { |
404 | int init_res; | 405 | int init_res; |
405 | if(flags & OCSP_NOCHAIN) | 406 | |
406 | init_res = X509_STORE_CTX_init(&ctx, store, signer, NULL); | 407 | if (flags & OCSP_NOCHAIN) |
408 | init_res = X509_STORE_CTX_init(&ctx, store, signer, | ||
409 | NULL); | ||
407 | else | 410 | else |
408 | init_res = X509_STORE_CTX_init(&ctx, store, signer, | 411 | init_res = X509_STORE_CTX_init(&ctx, store, signer, |
409 | req->optionalSignature->certs); | 412 | req->optionalSignature->certs); |
410 | if(!init_res) | 413 | if (!init_res) { |
411 | { | ||
412 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,ERR_R_X509_LIB); | 414 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,ERR_R_X509_LIB); |
413 | return 0; | 415 | return 0; |
414 | } | 416 | } |
415 | 417 | ||
416 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); | 418 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); |
417 | X509_STORE_CTX_set_trust(&ctx, X509_TRUST_OCSP_REQUEST); | 419 | X509_STORE_CTX_set_trust(&ctx, X509_TRUST_OCSP_REQUEST); |
418 | ret = X509_verify_cert(&ctx); | 420 | ret = X509_verify_cert(&ctx); |
419 | X509_STORE_CTX_cleanup(&ctx); | 421 | X509_STORE_CTX_cleanup(&ctx); |
420 | if (ret <= 0) | 422 | if (ret <= 0) { |
421 | { | ||
422 | ret = X509_STORE_CTX_get_error(&ctx); | 423 | ret = X509_STORE_CTX_get_error(&ctx); |
423 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,OCSP_R_CERTIFICATE_VERIFY_ERROR); | 424 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
425 | OCSP_R_CERTIFICATE_VERIFY_ERROR); | ||
424 | ERR_asprintf_error_data("Verify error:%s", | 426 | ERR_asprintf_error_data("Verify error:%s", |
425 | X509_verify_cert_error_string(ret)); | 427 | X509_verify_cert_error_string(ret)); |
426 | return 0; | 428 | return 0; |
427 | } | ||
428 | } | 429 | } |
430 | } | ||
429 | return 1; | 431 | return 1; |
430 | } | 432 | } |
431 | 433 | ||
432 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, STACK_OF(X509) *certs, | 434 | static int |
433 | X509_STORE *st, unsigned long flags) | 435 | ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, |
434 | { | 436 | STACK_OF(X509) *certs, X509_STORE *st, unsigned long flags) |
437 | { | ||
435 | X509 *signer; | 438 | X509 *signer; |
436 | if(!(flags & OCSP_NOINTERN)) | 439 | |
437 | { | 440 | if (!(flags & OCSP_NOINTERN)) { |
438 | signer = X509_find_by_subject(req->optionalSignature->certs, nm); | 441 | signer = |
442 | X509_find_by_subject(req->optionalSignature->certs, nm); | ||
439 | *psigner = signer; | 443 | *psigner = signer; |
440 | return 1; | 444 | return 1; |
441 | } | 445 | } |
442 | 446 | ||
443 | signer = X509_find_by_subject(certs, nm); | 447 | signer = X509_find_by_subject(certs, nm); |
444 | if (signer) | 448 | if (signer) { |
445 | { | ||
446 | *psigner = signer; | 449 | *psigner = signer; |
447 | return 2; | 450 | return 2; |
448 | } | ||
449 | return 0; | ||
450 | } | 451 | } |
452 | return 0; | ||
453 | } | ||
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp.h b/src/lib/libssl/src/crypto/ocsp/ocsp.h index 31e45744ba..9401f7db2f 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp.h +++ b/src/lib/libssl/src/crypto/ocsp/ocsp.h | |||
@@ -96,13 +96,12 @@ extern "C" { | |||
96 | * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) | 96 | * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) |
97 | * serialNumber CertificateSerialNumber } | 97 | * serialNumber CertificateSerialNumber } |
98 | */ | 98 | */ |
99 | typedef struct ocsp_cert_id_st | 99 | typedef struct ocsp_cert_id_st { |
100 | { | ||
101 | X509_ALGOR *hashAlgorithm; | 100 | X509_ALGOR *hashAlgorithm; |
102 | ASN1_OCTET_STRING *issuerNameHash; | 101 | ASN1_OCTET_STRING *issuerNameHash; |
103 | ASN1_OCTET_STRING *issuerKeyHash; | 102 | ASN1_OCTET_STRING *issuerKeyHash; |
104 | ASN1_INTEGER *serialNumber; | 103 | ASN1_INTEGER *serialNumber; |
105 | } OCSP_CERTID; | 104 | } OCSP_CERTID; |
106 | 105 | ||
107 | DECLARE_STACK_OF(OCSP_CERTID) | 106 | DECLARE_STACK_OF(OCSP_CERTID) |
108 | 107 | ||
@@ -110,11 +109,10 @@ DECLARE_STACK_OF(OCSP_CERTID) | |||
110 | * reqCert CertID, | 109 | * reqCert CertID, |
111 | * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } | 110 | * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } |
112 | */ | 111 | */ |
113 | typedef struct ocsp_one_request_st | 112 | typedef struct ocsp_one_request_st { |
114 | { | ||
115 | OCSP_CERTID *reqCert; | 113 | OCSP_CERTID *reqCert; |
116 | STACK_OF(X509_EXTENSION) *singleRequestExtensions; | 114 | STACK_OF(X509_EXTENSION) *singleRequestExtensions; |
117 | } OCSP_ONEREQ; | 115 | } OCSP_ONEREQ; |
118 | 116 | ||
119 | DECLARE_STACK_OF(OCSP_ONEREQ) | 117 | DECLARE_STACK_OF(OCSP_ONEREQ) |
120 | DECLARE_ASN1_SET_OF(OCSP_ONEREQ) | 118 | DECLARE_ASN1_SET_OF(OCSP_ONEREQ) |
@@ -126,35 +124,32 @@ DECLARE_ASN1_SET_OF(OCSP_ONEREQ) | |||
126 | * requestList SEQUENCE OF Request, | 124 | * requestList SEQUENCE OF Request, |
127 | * requestExtensions [2] EXPLICIT Extensions OPTIONAL } | 125 | * requestExtensions [2] EXPLICIT Extensions OPTIONAL } |
128 | */ | 126 | */ |
129 | typedef struct ocsp_req_info_st | 127 | typedef struct ocsp_req_info_st { |
130 | { | ||
131 | ASN1_INTEGER *version; | 128 | ASN1_INTEGER *version; |
132 | GENERAL_NAME *requestorName; | 129 | GENERAL_NAME *requestorName; |
133 | STACK_OF(OCSP_ONEREQ) *requestList; | 130 | STACK_OF(OCSP_ONEREQ) *requestList; |
134 | STACK_OF(X509_EXTENSION) *requestExtensions; | 131 | STACK_OF(X509_EXTENSION) *requestExtensions; |
135 | } OCSP_REQINFO; | 132 | } OCSP_REQINFO; |
136 | 133 | ||
137 | /* Signature ::= SEQUENCE { | 134 | /* Signature ::= SEQUENCE { |
138 | * signatureAlgorithm AlgorithmIdentifier, | 135 | * signatureAlgorithm AlgorithmIdentifier, |
139 | * signature BIT STRING, | 136 | * signature BIT STRING, |
140 | * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } | 137 | * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } |
141 | */ | 138 | */ |
142 | typedef struct ocsp_signature_st | 139 | typedef struct ocsp_signature_st { |
143 | { | ||
144 | X509_ALGOR *signatureAlgorithm; | 140 | X509_ALGOR *signatureAlgorithm; |
145 | ASN1_BIT_STRING *signature; | 141 | ASN1_BIT_STRING *signature; |
146 | STACK_OF(X509) *certs; | 142 | STACK_OF(X509) *certs; |
147 | } OCSP_SIGNATURE; | 143 | } OCSP_SIGNATURE; |
148 | 144 | ||
149 | /* OCSPRequest ::= SEQUENCE { | 145 | /* OCSPRequest ::= SEQUENCE { |
150 | * tbsRequest TBSRequest, | 146 | * tbsRequest TBSRequest, |
151 | * optionalSignature [0] EXPLICIT Signature OPTIONAL } | 147 | * optionalSignature [0] EXPLICIT Signature OPTIONAL } |
152 | */ | 148 | */ |
153 | typedef struct ocsp_request_st | 149 | typedef struct ocsp_request_st { |
154 | { | ||
155 | OCSP_REQINFO *tbsRequest; | 150 | OCSP_REQINFO *tbsRequest; |
156 | OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ | 151 | OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ |
157 | } OCSP_REQUEST; | 152 | } OCSP_REQUEST; |
158 | 153 | ||
159 | /* OCSPResponseStatus ::= ENUMERATED { | 154 | /* OCSPResponseStatus ::= ENUMERATED { |
160 | * successful (0), --Response has valid confirmations | 155 | * successful (0), --Response has valid confirmations |
@@ -166,32 +161,30 @@ typedef struct ocsp_request_st | |||
166 | * unauthorized (6) --Request unauthorized | 161 | * unauthorized (6) --Request unauthorized |
167 | * } | 162 | * } |
168 | */ | 163 | */ |
169 | #define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 | 164 | #define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 |
170 | #define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 | 165 | #define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 |
171 | #define OCSP_RESPONSE_STATUS_INTERNALERROR 2 | 166 | #define OCSP_RESPONSE_STATUS_INTERNALERROR 2 |
172 | #define OCSP_RESPONSE_STATUS_TRYLATER 3 | 167 | #define OCSP_RESPONSE_STATUS_TRYLATER 3 |
173 | #define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 | 168 | #define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 |
174 | #define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 | 169 | #define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 |
175 | 170 | ||
176 | /* ResponseBytes ::= SEQUENCE { | 171 | /* ResponseBytes ::= SEQUENCE { |
177 | * responseType OBJECT IDENTIFIER, | 172 | * responseType OBJECT IDENTIFIER, |
178 | * response OCTET STRING } | 173 | * response OCTET STRING } |
179 | */ | 174 | */ |
180 | typedef struct ocsp_resp_bytes_st | 175 | typedef struct ocsp_resp_bytes_st { |
181 | { | ||
182 | ASN1_OBJECT *responseType; | 176 | ASN1_OBJECT *responseType; |
183 | ASN1_OCTET_STRING *response; | 177 | ASN1_OCTET_STRING *response; |
184 | } OCSP_RESPBYTES; | 178 | } OCSP_RESPBYTES; |
185 | 179 | ||
186 | /* OCSPResponse ::= SEQUENCE { | 180 | /* OCSPResponse ::= SEQUENCE { |
187 | * responseStatus OCSPResponseStatus, | 181 | * responseStatus OCSPResponseStatus, |
188 | * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } | 182 | * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } |
189 | */ | 183 | */ |
190 | struct ocsp_response_st | 184 | struct ocsp_response_st { |
191 | { | ||
192 | ASN1_ENUMERATED *responseStatus; | 185 | ASN1_ENUMERATED *responseStatus; |
193 | OCSP_RESPBYTES *responseBytes; | 186 | OCSP_RESPBYTES *responseBytes; |
194 | }; | 187 | }; |
195 | 188 | ||
196 | /* ResponderID ::= CHOICE { | 189 | /* ResponderID ::= CHOICE { |
197 | * byName [1] Name, | 190 | * byName [1] Name, |
@@ -199,14 +192,13 @@ struct ocsp_response_st | |||
199 | */ | 192 | */ |
200 | #define V_OCSP_RESPID_NAME 0 | 193 | #define V_OCSP_RESPID_NAME 0 |
201 | #define V_OCSP_RESPID_KEY 1 | 194 | #define V_OCSP_RESPID_KEY 1 |
202 | struct ocsp_responder_id_st | 195 | struct ocsp_responder_id_st { |
203 | { | ||
204 | int type; | 196 | int type; |
205 | union { | 197 | union { |
206 | X509_NAME* byName; | 198 | X509_NAME* byName; |
207 | ASN1_OCTET_STRING *byKey; | 199 | ASN1_OCTET_STRING *byKey; |
208 | } value; | 200 | } value; |
209 | }; | 201 | }; |
210 | 202 | ||
211 | DECLARE_STACK_OF(OCSP_RESPID) | 203 | DECLARE_STACK_OF(OCSP_RESPID) |
212 | DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) | 204 | DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) |
@@ -219,11 +211,10 @@ DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) | |||
219 | * revocationTime GeneralizedTime, | 211 | * revocationTime GeneralizedTime, |
220 | * revocationReason [0] EXPLICIT CRLReason OPTIONAL } | 212 | * revocationReason [0] EXPLICIT CRLReason OPTIONAL } |
221 | */ | 213 | */ |
222 | typedef struct ocsp_revoked_info_st | 214 | typedef struct ocsp_revoked_info_st { |
223 | { | ||
224 | ASN1_GENERALIZEDTIME *revocationTime; | 215 | ASN1_GENERALIZEDTIME *revocationTime; |
225 | ASN1_ENUMERATED *revocationReason; | 216 | ASN1_ENUMERATED *revocationReason; |
226 | } OCSP_REVOKEDINFO; | 217 | } OCSP_REVOKEDINFO; |
227 | 218 | ||
228 | /* CertStatus ::= CHOICE { | 219 | /* CertStatus ::= CHOICE { |
229 | * good [0] IMPLICIT NULL, | 220 | * good [0] IMPLICIT NULL, |
@@ -233,15 +224,14 @@ typedef struct ocsp_revoked_info_st | |||
233 | #define V_OCSP_CERTSTATUS_GOOD 0 | 224 | #define V_OCSP_CERTSTATUS_GOOD 0 |
234 | #define V_OCSP_CERTSTATUS_REVOKED 1 | 225 | #define V_OCSP_CERTSTATUS_REVOKED 1 |
235 | #define V_OCSP_CERTSTATUS_UNKNOWN 2 | 226 | #define V_OCSP_CERTSTATUS_UNKNOWN 2 |
236 | typedef struct ocsp_cert_status_st | 227 | typedef struct ocsp_cert_status_st { |
237 | { | ||
238 | int type; | 228 | int type; |
239 | union { | 229 | union { |
240 | ASN1_NULL *good; | 230 | ASN1_NULL *good; |
241 | OCSP_REVOKEDINFO *revoked; | 231 | OCSP_REVOKEDINFO *revoked; |
242 | ASN1_NULL *unknown; | 232 | ASN1_NULL *unknown; |
243 | } value; | 233 | } value; |
244 | } OCSP_CERTSTATUS; | 234 | } OCSP_CERTSTATUS; |
245 | 235 | ||
246 | /* SingleResponse ::= SEQUENCE { | 236 | /* SingleResponse ::= SEQUENCE { |
247 | * certID CertID, | 237 | * certID CertID, |
@@ -250,14 +240,13 @@ typedef struct ocsp_cert_status_st | |||
250 | * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, | 240 | * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, |
251 | * singleExtensions [1] EXPLICIT Extensions OPTIONAL } | 241 | * singleExtensions [1] EXPLICIT Extensions OPTIONAL } |
252 | */ | 242 | */ |
253 | typedef struct ocsp_single_response_st | 243 | typedef struct ocsp_single_response_st { |
254 | { | ||
255 | OCSP_CERTID *certId; | 244 | OCSP_CERTID *certId; |
256 | OCSP_CERTSTATUS *certStatus; | 245 | OCSP_CERTSTATUS *certStatus; |
257 | ASN1_GENERALIZEDTIME *thisUpdate; | 246 | ASN1_GENERALIZEDTIME *thisUpdate; |
258 | ASN1_GENERALIZEDTIME *nextUpdate; | 247 | ASN1_GENERALIZEDTIME *nextUpdate; |
259 | STACK_OF(X509_EXTENSION) *singleExtensions; | 248 | STACK_OF(X509_EXTENSION) *singleExtensions; |
260 | } OCSP_SINGLERESP; | 249 | } OCSP_SINGLERESP; |
261 | 250 | ||
262 | DECLARE_STACK_OF(OCSP_SINGLERESP) | 251 | DECLARE_STACK_OF(OCSP_SINGLERESP) |
263 | DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) | 252 | DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) |
@@ -269,14 +258,13 @@ DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) | |||
269 | * responses SEQUENCE OF SingleResponse, | 258 | * responses SEQUENCE OF SingleResponse, |
270 | * responseExtensions [1] EXPLICIT Extensions OPTIONAL } | 259 | * responseExtensions [1] EXPLICIT Extensions OPTIONAL } |
271 | */ | 260 | */ |
272 | typedef struct ocsp_response_data_st | 261 | typedef struct ocsp_response_data_st { |
273 | { | ||
274 | ASN1_INTEGER *version; | 262 | ASN1_INTEGER *version; |
275 | OCSP_RESPID *responderId; | 263 | OCSP_RESPID *responderId; |
276 | ASN1_GENERALIZEDTIME *producedAt; | 264 | ASN1_GENERALIZEDTIME *producedAt; |
277 | STACK_OF(OCSP_SINGLERESP) *responses; | 265 | STACK_OF(OCSP_SINGLERESP) *responses; |
278 | STACK_OF(X509_EXTENSION) *responseExtensions; | 266 | STACK_OF(X509_EXTENSION) *responseExtensions; |
279 | } OCSP_RESPDATA; | 267 | } OCSP_RESPDATA; |
280 | 268 | ||
281 | /* BasicOCSPResponse ::= SEQUENCE { | 269 | /* BasicOCSPResponse ::= SEQUENCE { |
282 | * tbsResponseData ResponseData, | 270 | * tbsResponseData ResponseData, |
@@ -300,13 +288,12 @@ typedef struct ocsp_response_data_st | |||
300 | that it doesn't do the double hashing that the RFC seems to say one | 288 | that it doesn't do the double hashing that the RFC seems to say one |
301 | should. Therefore, all relevant functions take a flag saying which | 289 | should. Therefore, all relevant functions take a flag saying which |
302 | variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ | 290 | variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ |
303 | typedef struct ocsp_basic_response_st | 291 | typedef struct ocsp_basic_response_st { |
304 | { | ||
305 | OCSP_RESPDATA *tbsResponseData; | 292 | OCSP_RESPDATA *tbsResponseData; |
306 | X509_ALGOR *signatureAlgorithm; | 293 | X509_ALGOR *signatureAlgorithm; |
307 | ASN1_BIT_STRING *signature; | 294 | ASN1_BIT_STRING *signature; |
308 | STACK_OF(X509) *certs; | 295 | STACK_OF(X509) *certs; |
309 | } OCSP_BASICRESP; | 296 | } OCSP_BASICRESP; |
310 | 297 | ||
311 | /* | 298 | /* |
312 | * CRLReason ::= ENUMERATED { | 299 | * CRLReason ::= ENUMERATED { |
@@ -319,164 +306,159 @@ typedef struct ocsp_basic_response_st | |||
319 | * certificateHold (6), | 306 | * certificateHold (6), |
320 | * removeFromCRL (8) } | 307 | * removeFromCRL (8) } |
321 | */ | 308 | */ |
322 | #define OCSP_REVOKED_STATUS_NOSTATUS -1 | 309 | #define OCSP_REVOKED_STATUS_NOSTATUS -1 |
323 | #define OCSP_REVOKED_STATUS_UNSPECIFIED 0 | 310 | #define OCSP_REVOKED_STATUS_UNSPECIFIED 0 |
324 | #define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 | 311 | #define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 |
325 | #define OCSP_REVOKED_STATUS_CACOMPROMISE 2 | 312 | #define OCSP_REVOKED_STATUS_CACOMPROMISE 2 |
326 | #define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 | 313 | #define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 |
327 | #define OCSP_REVOKED_STATUS_SUPERSEDED 4 | 314 | #define OCSP_REVOKED_STATUS_SUPERSEDED 4 |
328 | #define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 | 315 | #define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 |
329 | #define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 | 316 | #define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 |
330 | #define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 | 317 | #define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 |
331 | 318 | ||
332 | /* CrlID ::= SEQUENCE { | 319 | /* CrlID ::= SEQUENCE { |
333 | * crlUrl [0] EXPLICIT IA5String OPTIONAL, | 320 | * crlUrl [0] EXPLICIT IA5String OPTIONAL, |
334 | * crlNum [1] EXPLICIT INTEGER OPTIONAL, | 321 | * crlNum [1] EXPLICIT INTEGER OPTIONAL, |
335 | * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } | 322 | * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } |
336 | */ | 323 | */ |
337 | typedef struct ocsp_crl_id_st | 324 | typedef struct ocsp_crl_id_st { |
338 | { | ||
339 | ASN1_IA5STRING *crlUrl; | 325 | ASN1_IA5STRING *crlUrl; |
340 | ASN1_INTEGER *crlNum; | 326 | ASN1_INTEGER *crlNum; |
341 | ASN1_GENERALIZEDTIME *crlTime; | 327 | ASN1_GENERALIZEDTIME *crlTime; |
342 | } OCSP_CRLID; | 328 | } OCSP_CRLID; |
343 | 329 | ||
344 | /* ServiceLocator ::= SEQUENCE { | 330 | /* ServiceLocator ::= SEQUENCE { |
345 | * issuer Name, | 331 | * issuer Name, |
346 | * locator AuthorityInfoAccessSyntax OPTIONAL } | 332 | * locator AuthorityInfoAccessSyntax OPTIONAL } |
347 | */ | 333 | */ |
348 | typedef struct ocsp_service_locator_st | 334 | typedef struct ocsp_service_locator_st { |
349 | { | ||
350 | X509_NAME* issuer; | 335 | X509_NAME* issuer; |
351 | STACK_OF(ACCESS_DESCRIPTION) *locator; | 336 | STACK_OF(ACCESS_DESCRIPTION) *locator; |
352 | } OCSP_SERVICELOC; | 337 | } OCSP_SERVICELOC; |
353 | 338 | ||
354 | #define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" | 339 | #define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" |
355 | #define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" | 340 | #define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" |
356 | 341 | ||
357 | #define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) | 342 | #define d2i_OCSP_REQUEST_bio(bp,p) \ |
343 | ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) | ||
358 | 344 | ||
359 | #define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) | 345 | #define d2i_OCSP_RESPONSE_bio(bp,p) \ |
346 | ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) | ||
360 | 347 | ||
361 | #define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ | 348 | #define PEM_read_bio_OCSP_REQUEST(bp,x,cb) \ |
362 | (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) | 349 | (OCSP_REQUEST *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_REQUEST, \ |
350 | PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) | ||
363 | 351 | ||
364 | #define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ | 352 | #define PEM_read_bio_OCSP_RESPONSE(bp,x,cb) \ |
365 | (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) | 353 | (OCSP_RESPONSE *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_RESPONSE, \ |
354 | PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) | ||
366 | 355 | ||
367 | #define PEM_write_bio_OCSP_REQUEST(bp,o) \ | 356 | #define PEM_write_bio_OCSP_REQUEST(bp,o) \ |
368 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ | 357 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ |
369 | bp,(char *)o, NULL,NULL,0,NULL,NULL) | 358 | bp,(char *)o, NULL,NULL,0,NULL,NULL) |
370 | 359 | ||
371 | #define PEM_write_bio_OCSP_RESPONSE(bp,o) \ | 360 | #define PEM_write_bio_OCSP_RESPONSE(bp,o) \ |
372 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ | 361 | PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ |
373 | bp,(char *)o, NULL,NULL,0,NULL,NULL) | 362 | bp,(char *)o, NULL,NULL,0,NULL,NULL) |
374 | 363 | ||
375 | #define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) | 364 | #define i2d_OCSP_RESPONSE_bio(bp,o) \ |
365 | ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) | ||
376 | 366 | ||
377 | #define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) | 367 | #define i2d_OCSP_REQUEST_bio(bp,o) \ |
368 | ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) | ||
378 | 369 | ||
379 | #define OCSP_REQUEST_sign(o,pkey,md) \ | 370 | #define OCSP_REQUEST_sign(o,pkey,md) \ |
380 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ | 371 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO), \ |
381 | o->optionalSignature->signatureAlgorithm,NULL,\ | 372 | o->optionalSignature->signatureAlgorithm,NULL, \ |
382 | o->optionalSignature->signature,o->tbsRequest,pkey,md) | 373 | o->optionalSignature->signature,o->tbsRequest,pkey,md) |
383 | 374 | ||
384 | #define OCSP_BASICRESP_sign(o,pkey,md,d) \ | 375 | #define OCSP_BASICRESP_sign(o,pkey,md,d) \ |
385 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ | 376 | ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL, \ |
386 | o->signature,o->tbsResponseData,pkey,md) | 377 | o->signature,o->tbsResponseData,pkey,md) |
387 | 378 | ||
388 | #define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ | 379 | #define OCSP_REQUEST_verify(a,r) \ |
389 | a->optionalSignature->signatureAlgorithm,\ | 380 | ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO), \ |
381 | a->optionalSignature->signatureAlgorithm, \ | ||
390 | a->optionalSignature->signature,a->tbsRequest,r) | 382 | a->optionalSignature->signature,a->tbsRequest,r) |
391 | 383 | ||
392 | #define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ | 384 | #define OCSP_BASICRESP_verify(a,r,d) \ |
385 | ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA), \ | ||
393 | a->signatureAlgorithm,a->signature,a->tbsResponseData,r) | 386 | a->signatureAlgorithm,a->signature,a->tbsResponseData,r) |
394 | 387 | ||
395 | #define ASN1_BIT_STRING_digest(data,type,md,len) \ | 388 | #define ASN1_BIT_STRING_digest(data,type,md,len) \ |
396 | ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) | 389 | ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) |
397 | 390 | ||
398 | #define OCSP_CERTSTATUS_dup(cs)\ | 391 | #define OCSP_CERTSTATUS_dup(cs)\ |
399 | (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ | 392 | (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ |
400 | (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) | 393 | (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) |
401 | 394 | ||
402 | OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); | 395 | OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); |
403 | 396 | ||
404 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); | 397 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); |
405 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | 398 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, |
406 | int maxline); | 399 | int maxline); |
407 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); | 400 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); |
408 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); | 401 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); |
409 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); | 402 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); |
410 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, | 403 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, const char *name, |
411 | const char *name, const char *value); | 404 | const char *value); |
412 | 405 | ||
413 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); | 406 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); |
414 | 407 | ||
415 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, | 408 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, X509_NAME *issuerName, |
416 | X509_NAME *issuerName, | 409 | ASN1_BIT_STRING* issuerKey, ASN1_INTEGER *serialNumber); |
417 | ASN1_BIT_STRING* issuerKey, | ||
418 | ASN1_INTEGER *serialNumber); | ||
419 | 410 | ||
420 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); | 411 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); |
421 | 412 | ||
422 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); | 413 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); |
423 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); | 414 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); |
424 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); | 415 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); |
425 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); | 416 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); |
426 | 417 | ||
427 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); | 418 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); |
428 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); | 419 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); |
429 | 420 | ||
430 | int OCSP_request_sign(OCSP_REQUEST *req, | 421 | int OCSP_request_sign(OCSP_REQUEST *req, X509 *signer, EVP_PKEY *key, |
431 | X509 *signer, | 422 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); |
432 | EVP_PKEY *key, | ||
433 | const EVP_MD *dgst, | ||
434 | STACK_OF(X509) *certs, | ||
435 | unsigned long flags); | ||
436 | 423 | ||
437 | int OCSP_response_status(OCSP_RESPONSE *resp); | 424 | int OCSP_response_status(OCSP_RESPONSE *resp); |
438 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); | 425 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); |
439 | 426 | ||
440 | int OCSP_resp_count(OCSP_BASICRESP *bs); | 427 | int OCSP_resp_count(OCSP_BASICRESP *bs); |
441 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); | 428 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); |
442 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); | 429 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); |
443 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, | 430 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, |
444 | ASN1_GENERALIZEDTIME **revtime, | 431 | ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
445 | ASN1_GENERALIZEDTIME **thisupd, | 432 | ASN1_GENERALIZEDTIME **nextupd); |
446 | ASN1_GENERALIZEDTIME **nextupd); | 433 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, |
447 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | 434 | int *reason, ASN1_GENERALIZEDTIME **revtime, |
448 | int *reason, | 435 | ASN1_GENERALIZEDTIME **thisupd, ASN1_GENERALIZEDTIME **nextupd); |
449 | ASN1_GENERALIZEDTIME **revtime, | 436 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, |
450 | ASN1_GENERALIZEDTIME **thisupd, | 437 | ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); |
451 | ASN1_GENERALIZEDTIME **nextupd); | 438 | |
452 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, | 439 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, |
453 | ASN1_GENERALIZEDTIME *nextupd, | 440 | X509_STORE *store, unsigned long flags); |
454 | long sec, long maxsec); | 441 | |
455 | 442 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, | |
456 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags); | 443 | int *pssl); |
457 | 444 | ||
458 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl); | 445 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); |
459 | 446 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | |
460 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | 447 | |
461 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); | 448 | int OCSP_request_onereq_count(OCSP_REQUEST *req); |
462 | |||
463 | int OCSP_request_onereq_count(OCSP_REQUEST *req); | ||
464 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); | 449 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); |
465 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); | 450 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); |
466 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, | 451 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, |
467 | ASN1_OCTET_STRING **pikeyHash, | 452 | ASN1_OCTET_STRING **pikeyHash, ASN1_INTEGER **pserial, |
468 | ASN1_INTEGER **pserial, OCSP_CERTID *cid); | 453 | OCSP_CERTID *cid); |
469 | int OCSP_request_is_signed(OCSP_REQUEST *req); | 454 | int OCSP_request_is_signed(OCSP_REQUEST *req); |
470 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); | 455 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); |
471 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | 456 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid, |
472 | OCSP_CERTID *cid, | 457 | int status, int reason, ASN1_TIME *revtime, ASN1_TIME *thisupd, |
473 | int status, int reason, | 458 | ASN1_TIME *nextupd); |
474 | ASN1_TIME *revtime, | 459 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); |
475 | ASN1_TIME *thisupd, ASN1_TIME *nextupd); | 460 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, |
476 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); | 461 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); |
477 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, | ||
478 | X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, | ||
479 | STACK_OF(X509) *certs, unsigned long flags); | ||
480 | 462 | ||
481 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); | 463 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); |
482 | 464 | ||
@@ -486,49 +468,60 @@ X509_EXTENSION *OCSP_archive_cutoff_new(char* tim); | |||
486 | 468 | ||
487 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); | 469 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); |
488 | 470 | ||
489 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); | 471 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); |
490 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); | 472 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); |
491 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos); | 473 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, |
492 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); | 474 | int lastpos); |
475 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, | ||
476 | int lastpos); | ||
493 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); | 477 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); |
494 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); | 478 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); |
495 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); | 479 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); |
496 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, | 480 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, |
497 | unsigned long flags); | 481 | int crit, unsigned long flags); |
498 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); | 482 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); |
499 | 483 | ||
500 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); | 484 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); |
501 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); | 485 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); |
502 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); | 486 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, |
503 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); | 487 | int lastpos); |
488 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); | ||
504 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); | 489 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); |
505 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); | 490 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); |
506 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); | 491 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); |
507 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, | 492 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, |
508 | unsigned long flags); | 493 | unsigned long flags); |
509 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); | 494 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); |
510 | 495 | ||
511 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); | 496 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); |
512 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); | 497 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); |
513 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos); | 498 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, |
514 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos); | 499 | int lastpos); |
500 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, | ||
501 | int lastpos); | ||
515 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); | 502 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); |
516 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); | 503 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); |
517 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx); | 504 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, |
518 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | 505 | int *idx); |
519 | unsigned long flags); | 506 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, |
520 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); | 507 | int crit, unsigned long flags); |
521 | 508 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); | |
522 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); | 509 | |
523 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); | 510 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); |
524 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos); | 511 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, |
525 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos); | 512 | int lastpos); |
513 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, | ||
514 | int lastpos); | ||
515 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, | ||
516 | int lastpos); | ||
526 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); | 517 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); |
527 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); | 518 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); |
528 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx); | 519 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, |
529 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, | 520 | int *idx); |
530 | unsigned long flags); | 521 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, |
531 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); | 522 | int crit, unsigned long flags); |
523 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, | ||
524 | int loc); | ||
532 | 525 | ||
533 | DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) | 526 | DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) |
534 | DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) | 527 | DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) |
@@ -550,11 +543,11 @@ const char *OCSP_response_status_str(long s); | |||
550 | const char *OCSP_cert_status_str(long s); | 543 | const char *OCSP_cert_status_str(long s); |
551 | const char *OCSP_crl_reason_str(long s); | 544 | const char *OCSP_crl_reason_str(long s); |
552 | 545 | ||
553 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); | 546 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); |
554 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); | 547 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); |
555 | 548 | ||
556 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 549 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, |
557 | X509_STORE *st, unsigned long flags); | 550 | X509_STORE *st, unsigned long flags); |
558 | 551 | ||
559 | /* BEGIN ERROR CODES */ | 552 | /* BEGIN ERROR CODES */ |
560 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 553 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_cl.c b/src/lib/libssl/src/crypto/ocsp/ocsp_cl.c index 9c14d9da27..716513d2f9 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_cl.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_cl.c | |||
@@ -78,229 +78,241 @@ | |||
78 | /* Add an OCSP_CERTID to an OCSP request. Return new OCSP_ONEREQ | 78 | /* Add an OCSP_CERTID to an OCSP request. Return new OCSP_ONEREQ |
79 | * pointer: useful if we want to add extensions. | 79 | * pointer: useful if we want to add extensions. |
80 | */ | 80 | */ |
81 | 81 | OCSP_ONEREQ * | |
82 | OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid) | 82 | OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid) |
83 | { | 83 | { |
84 | OCSP_ONEREQ *one = NULL; | 84 | OCSP_ONEREQ *one = NULL; |
85 | 85 | ||
86 | if (!(one = OCSP_ONEREQ_new())) goto err; | 86 | if (!(one = OCSP_ONEREQ_new())) |
87 | if (one->reqCert) OCSP_CERTID_free(one->reqCert); | 87 | goto err; |
88 | if (one->reqCert) | ||
89 | OCSP_CERTID_free(one->reqCert); | ||
88 | one->reqCert = cid; | 90 | one->reqCert = cid; |
89 | if (req && | 91 | if (req && !sk_OCSP_ONEREQ_push(req->tbsRequest->requestList, one)) |
90 | !sk_OCSP_ONEREQ_push(req->tbsRequest->requestList, one)) | 92 | goto err; |
91 | goto err; | ||
92 | return one; | 93 | return one; |
93 | err: | 94 | err: |
94 | OCSP_ONEREQ_free(one); | 95 | OCSP_ONEREQ_free(one); |
95 | return NULL; | 96 | return NULL; |
96 | } | 97 | } |
97 | 98 | ||
98 | /* Set requestorName from an X509_NAME structure */ | 99 | /* Set requestorName from an X509_NAME structure */ |
99 | 100 | int | |
100 | int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm) | 101 | OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm) |
101 | { | 102 | { |
102 | GENERAL_NAME *gen; | 103 | GENERAL_NAME *gen; |
104 | |||
103 | gen = GENERAL_NAME_new(); | 105 | gen = GENERAL_NAME_new(); |
104 | if (gen == NULL) | 106 | if (gen == NULL) |
105 | return 0; | 107 | return 0; |
106 | if (!X509_NAME_set(&gen->d.directoryName, nm)) | 108 | if (!X509_NAME_set(&gen->d.directoryName, nm)) { |
107 | { | ||
108 | GENERAL_NAME_free(gen); | 109 | GENERAL_NAME_free(gen); |
109 | return 0; | 110 | return 0; |
110 | } | 111 | } |
111 | gen->type = GEN_DIRNAME; | 112 | gen->type = GEN_DIRNAME; |
112 | if (req->tbsRequest->requestorName) | 113 | if (req->tbsRequest->requestorName) |
113 | GENERAL_NAME_free(req->tbsRequest->requestorName); | 114 | GENERAL_NAME_free(req->tbsRequest->requestorName); |
114 | req->tbsRequest->requestorName = gen; | 115 | req->tbsRequest->requestorName = gen; |
115 | return 1; | 116 | return 1; |
116 | } | 117 | } |
117 | 118 | ||
118 | |||
119 | /* Add a certificate to an OCSP request */ | 119 | /* Add a certificate to an OCSP request */ |
120 | 120 | int | |
121 | int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert) | 121 | OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert) |
122 | { | 122 | { |
123 | OCSP_SIGNATURE *sig; | 123 | OCSP_SIGNATURE *sig; |
124 | |||
124 | if (!req->optionalSignature) | 125 | if (!req->optionalSignature) |
125 | req->optionalSignature = OCSP_SIGNATURE_new(); | 126 | req->optionalSignature = OCSP_SIGNATURE_new(); |
126 | sig = req->optionalSignature; | 127 | sig = req->optionalSignature; |
127 | if (!sig) return 0; | 128 | if (!sig) |
128 | if (!cert) return 1; | 129 | return 0; |
130 | if (!cert) | ||
131 | return 1; | ||
129 | if (!sig->certs && !(sig->certs = sk_X509_new_null())) | 132 | if (!sig->certs && !(sig->certs = sk_X509_new_null())) |
130 | return 0; | 133 | return 0; |
131 | 134 | ||
132 | if(!sk_X509_push(sig->certs, cert)) return 0; | 135 | if(!sk_X509_push(sig->certs, cert)) |
136 | return 0; | ||
133 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); | 137 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); |
134 | return 1; | 138 | return 1; |
135 | } | 139 | } |
136 | 140 | ||
137 | /* Sign an OCSP request set the requestorName to the subjec | 141 | /* Sign an OCSP request set the requestorName to the subjec |
138 | * name of an optional signers certificate and include one | 142 | * name of an optional signers certificate and include one |
139 | * or more optional certificates in the request. Behaves | 143 | * or more optional certificates in the request. Behaves |
140 | * like PKCS7_sign(). | 144 | * like PKCS7_sign(). |
141 | */ | 145 | */ |
142 | 146 | int | |
143 | int OCSP_request_sign(OCSP_REQUEST *req, | 147 | OCSP_request_sign(OCSP_REQUEST *req, X509 *signer, EVP_PKEY *key, |
144 | X509 *signer, | 148 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags) |
145 | EVP_PKEY *key, | 149 | { |
146 | const EVP_MD *dgst, | ||
147 | STACK_OF(X509) *certs, | ||
148 | unsigned long flags) | ||
149 | { | ||
150 | int i; | 150 | int i; |
151 | OCSP_SIGNATURE *sig; | 151 | OCSP_SIGNATURE *sig; |
152 | X509 *x; | 152 | X509 *x; |
153 | 153 | ||
154 | if (!OCSP_request_set1_name(req, X509_get_subject_name(signer))) | 154 | if (!OCSP_request_set1_name(req, X509_get_subject_name(signer))) |
155 | goto err; | ||
156 | |||
157 | if (!(req->optionalSignature = sig = OCSP_SIGNATURE_new())) | ||
158 | goto err; | ||
159 | if (key) { | ||
160 | if (!X509_check_private_key(signer, key)) { | ||
161 | OCSPerr(OCSP_F_OCSP_REQUEST_SIGN, | ||
162 | OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | ||
155 | goto err; | 163 | goto err; |
156 | |||
157 | if (!(req->optionalSignature = sig = OCSP_SIGNATURE_new())) goto err; | ||
158 | if (key) | ||
159 | { | ||
160 | if (!X509_check_private_key(signer, key)) | ||
161 | { | ||
162 | OCSPerr(OCSP_F_OCSP_REQUEST_SIGN, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | ||
163 | goto err; | ||
164 | } | ||
165 | if (!OCSP_REQUEST_sign(req, key, dgst)) goto err; | ||
166 | } | 164 | } |
165 | if (!OCSP_REQUEST_sign(req, key, dgst)) | ||
166 | goto err; | ||
167 | } | ||
167 | 168 | ||
168 | if (!(flags & OCSP_NOCERTS)) | 169 | if (!(flags & OCSP_NOCERTS)) { |
169 | { | 170 | if(!OCSP_request_add1_cert(req, signer)) |
170 | if(!OCSP_request_add1_cert(req, signer)) goto err; | 171 | goto err; |
171 | for (i = 0; i < sk_X509_num(certs); i++) | 172 | for (i = 0; i < sk_X509_num(certs); i++) { |
172 | { | ||
173 | x = sk_X509_value(certs, i); | 173 | x = sk_X509_value(certs, i); |
174 | if (!OCSP_request_add1_cert(req, x)) goto err; | 174 | if (!OCSP_request_add1_cert(req, x)) |
175 | } | 175 | goto err; |
176 | } | 176 | } |
177 | } | ||
177 | 178 | ||
178 | return 1; | 179 | return 1; |
179 | err: | 180 | err: |
180 | OCSP_SIGNATURE_free(req->optionalSignature); | 181 | OCSP_SIGNATURE_free(req->optionalSignature); |
181 | req->optionalSignature = NULL; | 182 | req->optionalSignature = NULL; |
182 | return 0; | 183 | return 0; |
183 | } | 184 | } |
184 | 185 | ||
185 | /* Get response status */ | 186 | /* Get response status */ |
186 | 187 | int | |
187 | int OCSP_response_status(OCSP_RESPONSE *resp) | 188 | OCSP_response_status(OCSP_RESPONSE *resp) |
188 | { | 189 | { |
189 | return ASN1_ENUMERATED_get(resp->responseStatus); | 190 | return ASN1_ENUMERATED_get(resp->responseStatus); |
190 | } | 191 | } |
191 | 192 | ||
192 | /* Extract basic response from OCSP_RESPONSE or NULL if | 193 | /* Extract basic response from OCSP_RESPONSE or NULL if |
193 | * no basic response present. | 194 | * no basic response present. |
194 | */ | 195 | */ |
195 | 196 | OCSP_BASICRESP * | |
196 | 197 | OCSP_response_get1_basic(OCSP_RESPONSE *resp) | |
197 | OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp) | 198 | { |
198 | { | ||
199 | OCSP_RESPBYTES *rb; | 199 | OCSP_RESPBYTES *rb; |
200 | |||
200 | rb = resp->responseBytes; | 201 | rb = resp->responseBytes; |
201 | if (!rb) | 202 | if (!rb) { |
202 | { | 203 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, |
203 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, OCSP_R_NO_RESPONSE_DATA); | 204 | OCSP_R_NO_RESPONSE_DATA); |
204 | return NULL; | 205 | return NULL; |
205 | } | 206 | } |
206 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) | 207 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) { |
207 | { | 208 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, |
208 | OCSPerr(OCSP_F_OCSP_RESPONSE_GET1_BASIC, OCSP_R_NOT_BASIC_RESPONSE); | 209 | OCSP_R_NOT_BASIC_RESPONSE); |
209 | return NULL; | 210 | return NULL; |
210 | } | 211 | } |
211 | 212 | ||
212 | return ASN1_item_unpack(rb->response, ASN1_ITEM_rptr(OCSP_BASICRESP)); | 213 | return ASN1_item_unpack(rb->response, ASN1_ITEM_rptr(OCSP_BASICRESP)); |
213 | } | 214 | } |
214 | 215 | ||
215 | /* Return number of OCSP_SINGLERESP reponses present in | 216 | /* Return number of OCSP_SINGLERESP reponses present in |
216 | * a basic response. | 217 | * a basic response. |
217 | */ | 218 | */ |
218 | 219 | int | |
219 | int OCSP_resp_count(OCSP_BASICRESP *bs) | 220 | OCSP_resp_count(OCSP_BASICRESP *bs) |
220 | { | 221 | { |
221 | if (!bs) return -1; | 222 | if (!bs) |
223 | return -1; | ||
222 | return sk_OCSP_SINGLERESP_num(bs->tbsResponseData->responses); | 224 | return sk_OCSP_SINGLERESP_num(bs->tbsResponseData->responses); |
223 | } | 225 | } |
224 | 226 | ||
225 | /* Extract an OCSP_SINGLERESP response with a given index */ | 227 | /* Extract an OCSP_SINGLERESP response with a given index */ |
226 | 228 | OCSP_SINGLERESP * | |
227 | OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx) | 229 | OCSP_resp_get0(OCSP_BASICRESP *bs, int idx) |
228 | { | 230 | { |
229 | if (!bs) return NULL; | 231 | if (!bs) |
232 | return NULL; | ||
230 | return sk_OCSP_SINGLERESP_value(bs->tbsResponseData->responses, idx); | 233 | return sk_OCSP_SINGLERESP_value(bs->tbsResponseData->responses, idx); |
231 | } | 234 | } |
232 | 235 | ||
233 | /* Look single response matching a given certificate ID */ | 236 | /* Look single response matching a given certificate ID */ |
234 | 237 | int | |
235 | int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last) | 238 | OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last) |
236 | { | 239 | { |
237 | int i; | 240 | int i; |
238 | STACK_OF(OCSP_SINGLERESP) *sresp; | 241 | STACK_OF(OCSP_SINGLERESP) *sresp; |
239 | OCSP_SINGLERESP *single; | 242 | OCSP_SINGLERESP *single; |
240 | if (!bs) return -1; | 243 | |
241 | if (last < 0) last = 0; | 244 | if (!bs) |
242 | else last++; | 245 | return -1; |
246 | if (last < 0) | ||
247 | last = 0; | ||
248 | else | ||
249 | last++; | ||
243 | sresp = bs->tbsResponseData->responses; | 250 | sresp = bs->tbsResponseData->responses; |
244 | for (i = last; i < sk_OCSP_SINGLERESP_num(sresp); i++) | 251 | for (i = last; i < sk_OCSP_SINGLERESP_num(sresp); i++) { |
245 | { | ||
246 | single = sk_OCSP_SINGLERESP_value(sresp, i); | 252 | single = sk_OCSP_SINGLERESP_value(sresp, i); |
247 | if (!OCSP_id_cmp(id, single->certId)) return i; | 253 | if (!OCSP_id_cmp(id, single->certId)) |
248 | } | 254 | return i; |
249 | return -1; | ||
250 | } | 255 | } |
256 | return -1; | ||
257 | } | ||
251 | 258 | ||
252 | /* Extract status information from an OCSP_SINGLERESP structure. | 259 | /* Extract status information from an OCSP_SINGLERESP structure. |
253 | * Note: the revtime and reason values are only set if the | 260 | * Note: the revtime and reason values are only set if the |
254 | * certificate status is revoked. Returns numerical value of | 261 | * certificate status is revoked. Returns numerical value of |
255 | * status. | 262 | * status. |
256 | */ | 263 | */ |
257 | 264 | int | |
258 | int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, | 265 | OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, |
259 | ASN1_GENERALIZEDTIME **revtime, | 266 | ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
260 | ASN1_GENERALIZEDTIME **thisupd, | 267 | ASN1_GENERALIZEDTIME **nextupd) |
261 | ASN1_GENERALIZEDTIME **nextupd) | 268 | { |
262 | { | ||
263 | int ret; | 269 | int ret; |
264 | OCSP_CERTSTATUS *cst; | 270 | OCSP_CERTSTATUS *cst; |
265 | if(!single) return -1; | 271 | |
272 | if (!single) | ||
273 | return -1; | ||
266 | cst = single->certStatus; | 274 | cst = single->certStatus; |
267 | ret = cst->type; | 275 | ret = cst->type; |
268 | if (ret == V_OCSP_CERTSTATUS_REVOKED) | 276 | if (ret == V_OCSP_CERTSTATUS_REVOKED) { |
269 | { | ||
270 | OCSP_REVOKEDINFO *rev = cst->value.revoked; | 277 | OCSP_REVOKEDINFO *rev = cst->value.revoked; |
271 | if (revtime) *revtime = rev->revocationTime; | 278 | |
272 | if (reason) | 279 | if (revtime) |
273 | { | 280 | *revtime = rev->revocationTime; |
274 | if(rev->revocationReason) | 281 | if (reason) { |
282 | if (rev->revocationReason) | ||
275 | *reason = ASN1_ENUMERATED_get(rev->revocationReason); | 283 | *reason = ASN1_ENUMERATED_get(rev->revocationReason); |
276 | else *reason = -1; | 284 | else |
277 | } | 285 | *reason = -1; |
278 | } | 286 | } |
279 | if(thisupd) *thisupd = single->thisUpdate; | ||
280 | if(nextupd) *nextupd = single->nextUpdate; | ||
281 | return ret; | ||
282 | } | 287 | } |
288 | if (thisupd) | ||
289 | *thisupd = single->thisUpdate; | ||
290 | if (nextupd) | ||
291 | *nextupd = single->nextUpdate; | ||
292 | return ret; | ||
293 | } | ||
283 | 294 | ||
284 | /* This function combines the previous ones: look up a certificate ID and | 295 | /* This function combines the previous ones: look up a certificate ID and |
285 | * if found extract status information. Return 0 is successful. | 296 | * if found extract status information. Return 0 is successful. |
286 | */ | 297 | */ |
287 | 298 | int | |
288 | int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | 299 | OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, |
289 | int *reason, | 300 | int *reason, ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, |
290 | ASN1_GENERALIZEDTIME **revtime, | 301 | ASN1_GENERALIZEDTIME **nextupd) |
291 | ASN1_GENERALIZEDTIME **thisupd, | 302 | { |
292 | ASN1_GENERALIZEDTIME **nextupd) | ||
293 | { | ||
294 | int i; | 303 | int i; |
295 | OCSP_SINGLERESP *single; | 304 | OCSP_SINGLERESP *single; |
305 | |||
296 | i = OCSP_resp_find(bs, id, -1); | 306 | i = OCSP_resp_find(bs, id, -1); |
297 | /* Maybe check for multiple responses and give an error? */ | 307 | /* Maybe check for multiple responses and give an error? */ |
298 | if(i < 0) return 0; | 308 | if (i < 0) |
309 | return 0; | ||
299 | single = OCSP_resp_get0(bs, i); | 310 | single = OCSP_resp_get0(bs, i); |
300 | i = OCSP_single_get0_status(single, reason, revtime, thisupd, nextupd); | 311 | i = OCSP_single_get0_status(single, reason, revtime, thisupd, nextupd); |
301 | if(status) *status = i; | 312 | if (status) |
313 | *status = i; | ||
302 | return 1; | 314 | return 1; |
303 | } | 315 | } |
304 | 316 | ||
305 | /* Check validity of thisUpdate and nextUpdate fields. It is possible that the request will | 317 | /* Check validity of thisUpdate and nextUpdate fields. It is possible that the request will |
306 | * take a few seconds to process and/or the time wont be totally accurate. Therefore to avoid | 318 | * take a few seconds to process and/or the time wont be totally accurate. Therefore to avoid |
@@ -308,64 +320,61 @@ int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, | |||
308 | * Also to avoid accepting very old responses without a nextUpdate field an optional maxage | 320 | * Also to avoid accepting very old responses without a nextUpdate field an optional maxage |
309 | * parameter specifies the maximum age the thisUpdate field can be. | 321 | * parameter specifies the maximum age the thisUpdate field can be. |
310 | */ | 322 | */ |
311 | 323 | int | |
312 | int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec) | 324 | OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, |
313 | { | 325 | ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec) |
326 | { | ||
314 | int ret = 1; | 327 | int ret = 1; |
315 | time_t t_now, t_tmp; | 328 | time_t t_now, t_tmp; |
329 | |||
316 | time(&t_now); | 330 | time(&t_now); |
317 | /* Check thisUpdate is valid and not more than nsec in the future */ | 331 | /* Check thisUpdate is valid and not more than nsec in the future */ |
318 | if (!ASN1_GENERALIZEDTIME_check(thisupd)) | 332 | if (!ASN1_GENERALIZEDTIME_check(thisupd)) { |
319 | { | 333 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
320 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_ERROR_IN_THISUPDATE_FIELD); | 334 | OCSP_R_ERROR_IN_THISUPDATE_FIELD); |
321 | ret = 0; | 335 | ret = 0; |
322 | } | 336 | } else { |
323 | else | 337 | t_tmp = t_now + nsec; |
324 | { | 338 | if (X509_cmp_time(thisupd, &t_tmp) > 0) { |
325 | t_tmp = t_now + nsec; | 339 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
326 | if (X509_cmp_time(thisupd, &t_tmp) > 0) | 340 | OCSP_R_STATUS_NOT_YET_VALID); |
327 | { | ||
328 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_NOT_YET_VALID); | ||
329 | ret = 0; | 341 | ret = 0; |
330 | } | 342 | } |
331 | 343 | ||
332 | /* If maxsec specified check thisUpdate is not more than maxsec in the past */ | 344 | /* If maxsec specified check thisUpdate is not more than maxsec in the past */ |
333 | if (maxsec >= 0) | 345 | if (maxsec >= 0) { |
334 | { | ||
335 | t_tmp = t_now - maxsec; | 346 | t_tmp = t_now - maxsec; |
336 | if (X509_cmp_time(thisupd, &t_tmp) < 0) | 347 | if (X509_cmp_time(thisupd, &t_tmp) < 0) { |
337 | { | 348 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
338 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_TOO_OLD); | 349 | OCSP_R_STATUS_TOO_OLD); |
339 | ret = 0; | 350 | ret = 0; |
340 | } | ||
341 | } | 351 | } |
342 | } | 352 | } |
343 | 353 | } | |
344 | 354 | ||
345 | if (!nextupd) return ret; | 355 | if (!nextupd) |
356 | return ret; | ||
346 | 357 | ||
347 | /* Check nextUpdate is valid and not more than nsec in the past */ | 358 | /* Check nextUpdate is valid and not more than nsec in the past */ |
348 | if (!ASN1_GENERALIZEDTIME_check(nextupd)) | 359 | if (!ASN1_GENERALIZEDTIME_check(nextupd)) { |
349 | { | 360 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
350 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_ERROR_IN_NEXTUPDATE_FIELD); | 361 | OCSP_R_ERROR_IN_NEXTUPDATE_FIELD); |
351 | ret = 0; | 362 | ret = 0; |
352 | } | 363 | } else { |
353 | else | ||
354 | { | ||
355 | t_tmp = t_now - nsec; | 364 | t_tmp = t_now - nsec; |
356 | if (X509_cmp_time(nextupd, &t_tmp) < 0) | 365 | if (X509_cmp_time(nextupd, &t_tmp) < 0) { |
357 | { | 366 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
358 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_STATUS_EXPIRED); | 367 | OCSP_R_STATUS_EXPIRED); |
359 | ret = 0; | 368 | ret = 0; |
360 | } | ||
361 | } | 369 | } |
370 | } | ||
362 | 371 | ||
363 | /* Also don't allow nextUpdate to precede thisUpdate */ | 372 | /* Also don't allow nextUpdate to precede thisUpdate */ |
364 | if (ASN1_STRING_cmp(nextupd, thisupd) < 0) | 373 | if (ASN1_STRING_cmp(nextupd, thisupd) < 0) { |
365 | { | 374 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, |
366 | OCSPerr(OCSP_F_OCSP_CHECK_VALIDITY, OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE); | 375 | OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE); |
367 | ret = 0; | 376 | ret = 0; |
368 | } | 377 | } |
369 | 378 | ||
370 | return ret; | 379 | return ret; |
371 | } | 380 | } |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_ext.c b/src/lib/libssl/src/crypto/ocsp/ocsp_ext.c index 9c7832b301..6ec8ca4adf 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_ext.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_ext.c | |||
@@ -73,238 +73,285 @@ | |||
73 | 73 | ||
74 | /* OCSP request extensions */ | 74 | /* OCSP request extensions */ |
75 | 75 | ||
76 | int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x) | 76 | int |
77 | { | 77 | OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x) |
78 | return(X509v3_get_ext_count(x->tbsRequest->requestExtensions)); | 78 | { |
79 | } | 79 | return X509v3_get_ext_count(x->tbsRequest->requestExtensions); |
80 | 80 | } | |
81 | int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos) | 81 | |
82 | { | 82 | int |
83 | return(X509v3_get_ext_by_NID(x->tbsRequest->requestExtensions,nid,lastpos)); | 83 | OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos) |
84 | } | 84 | { |
85 | 85 | return X509v3_get_ext_by_NID(x->tbsRequest->requestExtensions, nid, | |
86 | int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos) | 86 | lastpos); |
87 | { | 87 | } |
88 | return(X509v3_get_ext_by_OBJ(x->tbsRequest->requestExtensions,obj,lastpos)); | 88 | |
89 | } | 89 | int |
90 | 90 | OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos) | |
91 | int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos) | 91 | { |
92 | { | 92 | return X509v3_get_ext_by_OBJ(x->tbsRequest->requestExtensions, obj, |
93 | return(X509v3_get_ext_by_critical(x->tbsRequest->requestExtensions,crit,lastpos)); | 93 | lastpos); |
94 | } | 94 | } |
95 | 95 | ||
96 | X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc) | 96 | int |
97 | { | 97 | OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos) |
98 | return(X509v3_get_ext(x->tbsRequest->requestExtensions,loc)); | 98 | { |
99 | } | 99 | return X509v3_get_ext_by_critical(x->tbsRequest->requestExtensions, |
100 | 100 | crit, lastpos); | |
101 | X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc) | 101 | } |
102 | { | 102 | |
103 | return(X509v3_delete_ext(x->tbsRequest->requestExtensions,loc)); | 103 | X509_EXTENSION * |
104 | } | 104 | OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc) |
105 | 105 | { | |
106 | void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx) | 106 | return X509v3_get_ext(x->tbsRequest->requestExtensions, loc); |
107 | { | 107 | } |
108 | |||
109 | X509_EXTENSION * | ||
110 | OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc) | ||
111 | { | ||
112 | return X509v3_delete_ext(x->tbsRequest->requestExtensions, loc); | ||
113 | } | ||
114 | |||
115 | void * | ||
116 | OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx) | ||
117 | { | ||
108 | return X509V3_get_d2i(x->tbsRequest->requestExtensions, nid, crit, idx); | 118 | return X509V3_get_d2i(x->tbsRequest->requestExtensions, nid, crit, idx); |
109 | } | 119 | } |
110 | 120 | ||
111 | int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, | 121 | int |
112 | unsigned long flags) | 122 | OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, |
113 | { | 123 | unsigned long flags) |
114 | return X509V3_add1_i2d(&x->tbsRequest->requestExtensions, nid, value, crit, flags); | 124 | { |
115 | } | 125 | return X509V3_add1_i2d(&x->tbsRequest->requestExtensions, nid, value, |
116 | 126 | crit, flags); | |
117 | int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc) | 127 | } |
118 | { | 128 | |
119 | return(X509v3_add_ext(&(x->tbsRequest->requestExtensions),ex,loc) != NULL); | 129 | int |
120 | } | 130 | OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc) |
131 | { | ||
132 | return X509v3_add_ext(&(x->tbsRequest->requestExtensions), ex, loc) != | ||
133 | NULL; | ||
134 | } | ||
121 | 135 | ||
122 | /* Single extensions */ | 136 | /* Single extensions */ |
123 | 137 | ||
124 | int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x) | 138 | int |
125 | { | 139 | OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x) |
126 | return(X509v3_get_ext_count(x->singleRequestExtensions)); | 140 | { |
127 | } | 141 | return X509v3_get_ext_count(x->singleRequestExtensions); |
128 | 142 | } | |
129 | int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos) | 143 | |
130 | { | 144 | int |
131 | return(X509v3_get_ext_by_NID(x->singleRequestExtensions,nid,lastpos)); | 145 | OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos) |
132 | } | 146 | { |
133 | 147 | return X509v3_get_ext_by_NID(x->singleRequestExtensions, nid, lastpos); | |
134 | int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos) | 148 | } |
135 | { | 149 | |
136 | return(X509v3_get_ext_by_OBJ(x->singleRequestExtensions,obj,lastpos)); | 150 | int |
137 | } | 151 | OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos) |
138 | 152 | { | |
139 | int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos) | 153 | return X509v3_get_ext_by_OBJ(x->singleRequestExtensions, obj, lastpos); |
140 | { | 154 | } |
141 | return(X509v3_get_ext_by_critical(x->singleRequestExtensions,crit,lastpos)); | 155 | |
142 | } | 156 | int |
143 | 157 | OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos) | |
144 | X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc) | 158 | { |
145 | { | 159 | return X509v3_get_ext_by_critical(x->singleRequestExtensions, crit, |
146 | return(X509v3_get_ext(x->singleRequestExtensions,loc)); | 160 | lastpos); |
147 | } | 161 | } |
148 | 162 | ||
149 | X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc) | 163 | X509_EXTENSION * |
150 | { | 164 | OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc) |
151 | return(X509v3_delete_ext(x->singleRequestExtensions,loc)); | 165 | { |
152 | } | 166 | return X509v3_get_ext(x->singleRequestExtensions, loc); |
167 | } | ||
168 | |||
169 | X509_EXTENSION * | ||
170 | OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc) | ||
171 | { | ||
172 | return X509v3_delete_ext(x->singleRequestExtensions, loc); | ||
173 | } | ||
153 | 174 | ||
154 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx) | 175 | void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx) |
155 | { | 176 | { |
156 | return X509V3_get_d2i(x->singleRequestExtensions, nid, crit, idx); | 177 | return X509V3_get_d2i(x->singleRequestExtensions, nid, crit, idx); |
157 | } | 178 | } |
158 | 179 | ||
159 | int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, | 180 | int |
160 | unsigned long flags) | 181 | OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, |
161 | { | 182 | unsigned long flags) |
162 | return X509V3_add1_i2d(&x->singleRequestExtensions, nid, value, crit, flags); | 183 | { |
163 | } | 184 | return X509V3_add1_i2d(&x->singleRequestExtensions, nid, value, crit, |
164 | 185 | flags); | |
165 | int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc) | 186 | } |
166 | { | 187 | |
167 | return(X509v3_add_ext(&(x->singleRequestExtensions),ex,loc) != NULL); | 188 | int |
168 | } | 189 | OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc) |
190 | { | ||
191 | return X509v3_add_ext(&(x->singleRequestExtensions), ex, loc) != NULL; | ||
192 | } | ||
169 | 193 | ||
170 | /* OCSP Basic response */ | 194 | /* OCSP Basic response */ |
171 | 195 | ||
172 | int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x) | 196 | int |
173 | { | 197 | OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x) |
174 | return(X509v3_get_ext_count(x->tbsResponseData->responseExtensions)); | 198 | { |
175 | } | 199 | return X509v3_get_ext_count(x->tbsResponseData->responseExtensions); |
176 | 200 | } | |
177 | int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos) | 201 | |
178 | { | 202 | int |
179 | return(X509v3_get_ext_by_NID(x->tbsResponseData->responseExtensions,nid,lastpos)); | 203 | OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos) |
180 | } | 204 | { |
181 | 205 | return X509v3_get_ext_by_NID(x->tbsResponseData->responseExtensions, | |
182 | int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos) | 206 | nid ,lastpos); |
183 | { | 207 | } |
184 | return(X509v3_get_ext_by_OBJ(x->tbsResponseData->responseExtensions,obj,lastpos)); | 208 | |
185 | } | 209 | int |
186 | 210 | OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos) | |
187 | int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos) | 211 | { |
188 | { | 212 | return X509v3_get_ext_by_OBJ(x->tbsResponseData->responseExtensions, |
189 | return(X509v3_get_ext_by_critical(x->tbsResponseData->responseExtensions,crit,lastpos)); | 213 | obj, lastpos); |
190 | } | 214 | } |
191 | 215 | ||
192 | X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc) | 216 | int |
193 | { | 217 | OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos) |
194 | return(X509v3_get_ext(x->tbsResponseData->responseExtensions,loc)); | 218 | { |
195 | } | 219 | return X509v3_get_ext_by_critical(x->tbsResponseData->responseExtensions, |
196 | 220 | crit, lastpos); | |
197 | X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc) | 221 | } |
198 | { | 222 | |
199 | return(X509v3_delete_ext(x->tbsResponseData->responseExtensions,loc)); | 223 | X509_EXTENSION * |
200 | } | 224 | OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc) |
201 | 225 | { | |
202 | void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx) | 226 | return X509v3_get_ext(x->tbsResponseData->responseExtensions, loc); |
203 | { | 227 | } |
204 | return X509V3_get_d2i(x->tbsResponseData->responseExtensions, nid, crit, idx); | 228 | |
205 | } | 229 | X509_EXTENSION * |
206 | 230 | OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc) | |
207 | int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | 231 | { |
208 | unsigned long flags) | 232 | return X509v3_delete_ext(x->tbsResponseData->responseExtensions, loc); |
209 | { | 233 | } |
210 | return X509V3_add1_i2d(&x->tbsResponseData->responseExtensions, nid, value, crit, flags); | 234 | |
211 | } | 235 | void * |
212 | 236 | OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx) | |
213 | int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc) | 237 | { |
214 | { | 238 | return X509V3_get_d2i(x->tbsResponseData->responseExtensions, nid, |
215 | return(X509v3_add_ext(&(x->tbsResponseData->responseExtensions),ex,loc) != NULL); | 239 | crit, idx); |
216 | } | 240 | } |
241 | |||
242 | int | ||
243 | OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, | ||
244 | unsigned long flags) | ||
245 | { | ||
246 | return X509V3_add1_i2d(&x->tbsResponseData->responseExtensions, nid, | ||
247 | value, crit, flags); | ||
248 | } | ||
249 | |||
250 | int | ||
251 | OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc) | ||
252 | { | ||
253 | return X509v3_add_ext(&(x->tbsResponseData->responseExtensions), ex, | ||
254 | loc) != NULL; | ||
255 | } | ||
217 | 256 | ||
218 | /* OCSP single response extensions */ | 257 | /* OCSP single response extensions */ |
219 | 258 | ||
220 | int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x) | 259 | int |
221 | { | 260 | OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x) |
222 | return(X509v3_get_ext_count(x->singleExtensions)); | 261 | { |
223 | } | 262 | return X509v3_get_ext_count(x->singleExtensions); |
224 | 263 | } | |
225 | int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos) | 264 | |
226 | { | 265 | int |
227 | return(X509v3_get_ext_by_NID(x->singleExtensions,nid,lastpos)); | 266 | OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos) |
228 | } | 267 | { |
229 | 268 | return X509v3_get_ext_by_NID(x->singleExtensions, nid, lastpos); | |
230 | int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos) | 269 | } |
231 | { | 270 | |
232 | return(X509v3_get_ext_by_OBJ(x->singleExtensions,obj,lastpos)); | 271 | int |
233 | } | 272 | OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, |
234 | 273 | int lastpos) | |
235 | int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos) | 274 | { |
236 | { | 275 | return X509v3_get_ext_by_OBJ(x->singleExtensions, obj, lastpos); |
237 | return(X509v3_get_ext_by_critical(x->singleExtensions,crit,lastpos)); | 276 | } |
238 | } | 277 | |
239 | 278 | int | |
240 | X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc) | 279 | OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos) |
241 | { | 280 | { |
242 | return(X509v3_get_ext(x->singleExtensions,loc)); | 281 | return X509v3_get_ext_by_critical(x->singleExtensions, crit, lastpos); |
243 | } | 282 | } |
244 | 283 | ||
245 | X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc) | 284 | X509_EXTENSION * |
246 | { | 285 | OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc) |
247 | return(X509v3_delete_ext(x->singleExtensions,loc)); | 286 | { |
248 | } | 287 | return X509v3_get_ext(x->singleExtensions, loc); |
249 | 288 | } | |
250 | void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx) | 289 | |
251 | { | 290 | X509_EXTENSION * |
291 | OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc) | ||
292 | { | ||
293 | return X509v3_delete_ext(x->singleExtensions, loc); | ||
294 | } | ||
295 | |||
296 | void * | ||
297 | OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx) | ||
298 | { | ||
252 | return X509V3_get_d2i(x->singleExtensions, nid, crit, idx); | 299 | return X509V3_get_d2i(x->singleExtensions, nid, crit, idx); |
253 | } | 300 | } |
254 | 301 | ||
255 | int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, | 302 | int |
256 | unsigned long flags) | 303 | OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, |
257 | { | 304 | unsigned long flags) |
305 | { | ||
258 | return X509V3_add1_i2d(&x->singleExtensions, nid, value, crit, flags); | 306 | return X509V3_add1_i2d(&x->singleExtensions, nid, value, crit, flags); |
259 | } | 307 | } |
260 | 308 | ||
261 | int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc) | 309 | int |
262 | { | 310 | OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc) |
263 | return(X509v3_add_ext(&(x->singleExtensions),ex,loc) != NULL); | 311 | { |
264 | } | 312 | return X509v3_add_ext(&(x->singleExtensions), ex, loc) != NULL; |
313 | } | ||
265 | 314 | ||
266 | /* also CRL Entry Extensions */ | 315 | /* also CRL Entry Extensions */ |
267 | #if 0 | 316 | #if 0 |
268 | ASN1_STRING *ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d, | 317 | ASN1_STRING * |
269 | void *data, STACK_OF(ASN1_OBJECT) *sk) | 318 | ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d, void *data, |
270 | { | 319 | STACK_OF(ASN1_OBJECT) *sk) |
320 | { | ||
271 | int i; | 321 | int i; |
272 | unsigned char *p, *b = NULL; | 322 | unsigned char *p, *b = NULL; |
273 | 323 | ||
274 | if (data) | 324 | if (data) { |
275 | { | 325 | if ((i = i2d(data, NULL)) <= 0) |
276 | if ((i=i2d(data,NULL)) <= 0) goto err; | ||
277 | if (!(b=p=malloc((unsigned int)i))) | ||
278 | goto err; | 326 | goto err; |
279 | if (i2d(data, &p) <= 0) goto err; | 327 | if (!(b = p = malloc((unsigned int)i))) |
280 | } | 328 | goto err; |
281 | else if (sk) | 329 | if (i2d(data, &p) <= 0) |
282 | { | 330 | goto err; |
283 | if ((i=i2d_ASN1_SET_OF_ASN1_OBJECT(sk,NULL, | 331 | } else if (sk) { |
284 | (I2D_OF(ASN1_OBJECT))i2d, | 332 | if ((i = i2d_ASN1_SET_OF_ASN1_OBJECT(sk,NULL, |
285 | V_ASN1_SEQUENCE, | 333 | (I2D_OF(ASN1_OBJECT))i2d, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, |
286 | V_ASN1_UNIVERSAL, | 334 | IS_SEQUENCE)) <= 0) |
287 | IS_SEQUENCE))<=0) goto err; | 335 | goto err; |
288 | if (!(b=p=malloc((unsigned int)i))) | 336 | if (!(b = p = malloc((unsigned int)i))) |
289 | goto err; | 337 | goto err; |
290 | if (i2d_ASN1_SET_OF_ASN1_OBJECT(sk,&p,(I2D_OF(ASN1_OBJECT))i2d, | 338 | if (i2d_ASN1_SET_OF_ASN1_OBJECT(sk,&p,(I2D_OF(ASN1_OBJECT))i2d, |
291 | V_ASN1_SEQUENCE, | 339 | V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, IS_SEQUENCE) <= 0) |
292 | V_ASN1_UNIVERSAL, | 340 | goto err; |
293 | IS_SEQUENCE)<=0) goto err; | 341 | } else { |
294 | } | 342 | OCSPerr(OCSP_F_ASN1_STRING_ENCODE, OCSP_R_BAD_DATA); |
295 | else | 343 | goto err; |
296 | { | 344 | } |
297 | OCSPerr(OCSP_F_ASN1_STRING_ENCODE,OCSP_R_BAD_DATA); | 345 | if (!s && !(s = ASN1_STRING_new())) |
346 | goto err; | ||
347 | if (!(ASN1_STRING_set(s, b, i))) | ||
298 | goto err; | 348 | goto err; |
299 | } | ||
300 | if (!s && !(s = ASN1_STRING_new())) goto err; | ||
301 | if (!(ASN1_STRING_set(s, b, i))) goto err; | ||
302 | free(b); | 349 | free(b); |
303 | return s; | 350 | return s; |
304 | err: | 351 | err: |
305 | if (b) free(b); | 352 | free(b); |
306 | return NULL; | 353 | return NULL; |
307 | } | 354 | } |
308 | #endif | 355 | #endif |
309 | 356 | ||
310 | /* Nonce handling functions */ | 357 | /* Nonce handling functions */ |
@@ -315,16 +362,19 @@ err: | |||
315 | * nonce, previous versions used the raw nonce. | 362 | * nonce, previous versions used the raw nonce. |
316 | */ | 363 | */ |
317 | 364 | ||
318 | static int ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, int len) | 365 | static int |
319 | { | 366 | ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, int len) |
367 | { | ||
320 | unsigned char *tmpval; | 368 | unsigned char *tmpval; |
321 | ASN1_OCTET_STRING os; | 369 | ASN1_OCTET_STRING os; |
322 | int ret = 0; | 370 | int ret = 0; |
323 | if (len <= 0) len = OCSP_DEFAULT_NONCE_LENGTH; | 371 | |
372 | if (len <= 0) | ||
373 | len = OCSP_DEFAULT_NONCE_LENGTH; | ||
324 | /* Create the OCTET STRING manually by writing out the header and | 374 | /* Create the OCTET STRING manually by writing out the header and |
325 | * appending the content octets. This avoids an extra memory allocation | 375 | * appending the content octets. This avoids an extra memory allocation |
326 | * operation in some cases. Applications should *NOT* do this because | 376 | * operation in some cases. Applications should *NOT* do this because |
327 | * it relies on library internals. | 377 | * it relies on library internals. |
328 | */ | 378 | */ |
329 | os.length = ASN1_object_size(0, len, V_ASN1_OCTET_STRING); | 379 | os.length = ASN1_object_size(0, len, V_ASN1_OCTET_STRING); |
330 | os.data = malloc(os.length); | 380 | os.data = malloc(os.length); |
@@ -336,30 +386,29 @@ static int ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts, unsigned char *val, | |||
336 | memcpy(tmpval, val, len); | 386 | memcpy(tmpval, val, len); |
337 | else | 387 | else |
338 | RAND_pseudo_bytes(tmpval, len); | 388 | RAND_pseudo_bytes(tmpval, len); |
339 | if(!X509V3_add1_i2d(exts, NID_id_pkix_OCSP_Nonce, | 389 | if (!X509V3_add1_i2d(exts, NID_id_pkix_OCSP_Nonce, &os, 0, |
340 | &os, 0, X509V3_ADD_REPLACE)) | 390 | X509V3_ADD_REPLACE)) |
341 | goto err; | 391 | goto err; |
342 | ret = 1; | 392 | ret = 1; |
343 | err: | 393 | err: |
344 | if (os.data) | 394 | free(os.data); |
345 | free(os.data); | ||
346 | return ret; | 395 | return ret; |
347 | } | 396 | } |
348 | |||
349 | 397 | ||
350 | /* Add nonce to an OCSP request */ | 398 | /* Add nonce to an OCSP request */ |
351 | 399 | int | |
352 | int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len) | 400 | OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len) |
353 | { | 401 | { |
354 | return ocsp_add1_nonce(&req->tbsRequest->requestExtensions, val, len); | 402 | return ocsp_add1_nonce(&req->tbsRequest->requestExtensions, val, len); |
355 | } | 403 | } |
356 | 404 | ||
357 | /* Same as above but for a response */ | 405 | /* Same as above but for a response */ |
358 | 406 | int | |
359 | int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) | 407 | OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) |
360 | { | 408 | { |
361 | return ocsp_add1_nonce(&resp->tbsResponseData->responseExtensions, val, len); | 409 | return ocsp_add1_nonce(&resp->tbsResponseData->responseExtensions, val, |
362 | } | 410 | len); |
411 | } | ||
363 | 412 | ||
364 | /* Check nonce validity in a request and response. | 413 | /* Check nonce validity in a request and response. |
365 | * Return value reflects result: | 414 | * Return value reflects result: |
@@ -373,9 +422,9 @@ int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len) | |||
373 | * If responder doesn't handle nonces return != 0 may be | 422 | * If responder doesn't handle nonces return != 0 may be |
374 | * necessary. return == 0 is always an error. | 423 | * necessary. return == 0 is always an error. |
375 | */ | 424 | */ |
376 | 425 | int | |
377 | int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) | 426 | OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) |
378 | { | 427 | { |
379 | /* | 428 | /* |
380 | * Since we are only interested in the presence or absence of | 429 | * Since we are only interested in the presence or absence of |
381 | * the nonce and comparing its value there is no need to use | 430 | * the nonce and comparing its value there is no need to use |
@@ -383,136 +432,160 @@ int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs) | |||
383 | * ASN1_OCTET_STRING structure for the value which would be | 432 | * ASN1_OCTET_STRING structure for the value which would be |
384 | * freed immediately anyway. | 433 | * freed immediately anyway. |
385 | */ | 434 | */ |
386 | |||
387 | int req_idx, resp_idx; | 435 | int req_idx, resp_idx; |
388 | X509_EXTENSION *req_ext, *resp_ext; | 436 | X509_EXTENSION *req_ext, *resp_ext; |
437 | |||
389 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); | 438 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); |
390 | resp_idx = OCSP_BASICRESP_get_ext_by_NID(bs, NID_id_pkix_OCSP_Nonce, -1); | 439 | resp_idx = OCSP_BASICRESP_get_ext_by_NID(bs, NID_id_pkix_OCSP_Nonce, -1); |
391 | /* Check both absent */ | 440 | /* Check both absent */ |
392 | if((req_idx < 0) && (resp_idx < 0)) | 441 | if (req_idx < 0 && resp_idx < 0) |
393 | return 2; | 442 | return 2; |
394 | /* Check in request only */ | 443 | /* Check in request only */ |
395 | if((req_idx >= 0) && (resp_idx < 0)) | 444 | if (req_idx >= 0 && resp_idx < 0) |
396 | return -1; | 445 | return -1; |
397 | /* Check in response but not request */ | 446 | /* Check in response but not request */ |
398 | if((req_idx < 0) && (resp_idx >= 0)) | 447 | if (req_idx < 0 && resp_idx >= 0) |
399 | return 3; | 448 | return 3; |
400 | /* Otherwise nonce in request and response so retrieve the extensions */ | 449 | /* Otherwise nonce in request and response so retrieve the extensions */ |
401 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); | 450 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); |
402 | resp_ext = OCSP_BASICRESP_get_ext(bs, resp_idx); | 451 | resp_ext = OCSP_BASICRESP_get_ext(bs, resp_idx); |
403 | if(ASN1_OCTET_STRING_cmp(req_ext->value, resp_ext->value)) | 452 | if (ASN1_OCTET_STRING_cmp(req_ext->value, resp_ext->value)) |
404 | return 0; | 453 | return 0; |
405 | return 1; | 454 | return 1; |
406 | } | 455 | } |
407 | 456 | ||
408 | /* Copy the nonce value (if any) from an OCSP request to | 457 | /* Copy the nonce value (if any) from an OCSP request to |
409 | * a response. | 458 | * a response. |
410 | */ | 459 | */ |
411 | 460 | int | |
412 | int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req) | 461 | OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req) |
413 | { | 462 | { |
414 | X509_EXTENSION *req_ext; | 463 | X509_EXTENSION *req_ext; |
415 | int req_idx; | 464 | int req_idx; |
465 | |||
416 | /* Check for nonce in request */ | 466 | /* Check for nonce in request */ |
417 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); | 467 | req_idx = OCSP_REQUEST_get_ext_by_NID(req, NID_id_pkix_OCSP_Nonce, -1); |
418 | /* If no nonce that's OK */ | 468 | /* If no nonce that's OK */ |
419 | if (req_idx < 0) return 2; | 469 | if (req_idx < 0) |
470 | return 2; | ||
420 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); | 471 | req_ext = OCSP_REQUEST_get_ext(req, req_idx); |
421 | return OCSP_BASICRESP_add_ext(resp, req_ext, -1); | 472 | return OCSP_BASICRESP_add_ext(resp, req_ext, -1); |
422 | } | 473 | } |
423 | 474 | ||
424 | X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim) | 475 | X509_EXTENSION * |
425 | { | 476 | OCSP_crlID_new(char *url, long *n, char *tim) |
477 | { | ||
426 | X509_EXTENSION *x = NULL; | 478 | X509_EXTENSION *x = NULL; |
427 | OCSP_CRLID *cid = NULL; | 479 | OCSP_CRLID *cid = NULL; |
428 | 480 | ||
429 | if (!(cid = OCSP_CRLID_new())) goto err; | 481 | if (!(cid = OCSP_CRLID_new())) |
430 | if (url) | 482 | goto err; |
431 | { | 483 | if (url) { |
432 | if (!(cid->crlUrl = ASN1_IA5STRING_new())) goto err; | 484 | if (!(cid->crlUrl = ASN1_IA5STRING_new())) |
433 | if (!(ASN1_STRING_set(cid->crlUrl, url, -1))) goto err; | 485 | goto err; |
434 | } | 486 | if (!(ASN1_STRING_set(cid->crlUrl, url, -1))) |
435 | if (n) | 487 | goto err; |
436 | { | 488 | } |
437 | if (!(cid->crlNum = ASN1_INTEGER_new())) goto err; | 489 | if (n) { |
438 | if (!(ASN1_INTEGER_set(cid->crlNum, *n))) goto err; | 490 | if (!(cid->crlNum = ASN1_INTEGER_new())) |
439 | } | 491 | goto err; |
440 | if (tim) | 492 | if (!(ASN1_INTEGER_set(cid->crlNum, *n))) |
441 | { | 493 | goto err; |
442 | if (!(cid->crlTime = ASN1_GENERALIZEDTIME_new())) goto err; | 494 | } |
495 | if (tim) { | ||
496 | if (!(cid->crlTime = ASN1_GENERALIZEDTIME_new())) | ||
497 | goto err; | ||
443 | if (!(ASN1_GENERALIZEDTIME_set_string(cid->crlTime, tim))) | 498 | if (!(ASN1_GENERALIZEDTIME_set_string(cid->crlTime, tim))) |
444 | goto err; | 499 | goto err; |
445 | } | 500 | } |
446 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_CrlID, 0, cid); | 501 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_CrlID, 0, cid); |
447 | err: | 502 | err: |
448 | if (cid) OCSP_CRLID_free(cid); | 503 | if (cid) |
504 | OCSP_CRLID_free(cid); | ||
449 | return x; | 505 | return x; |
450 | } | 506 | } |
451 | 507 | ||
452 | /* AcceptableResponses ::= SEQUENCE OF OBJECT IDENTIFIER */ | 508 | /* AcceptableResponses ::= SEQUENCE OF OBJECT IDENTIFIER */ |
453 | X509_EXTENSION *OCSP_accept_responses_new(char **oids) | 509 | X509_EXTENSION * |
454 | { | 510 | OCSP_accept_responses_new(char **oids) |
511 | { | ||
455 | int nid; | 512 | int nid; |
456 | STACK_OF(ASN1_OBJECT) *sk = NULL; | 513 | STACK_OF(ASN1_OBJECT) *sk = NULL; |
457 | ASN1_OBJECT *o = NULL; | 514 | ASN1_OBJECT *o = NULL; |
458 | X509_EXTENSION *x = NULL; | 515 | X509_EXTENSION *x = NULL; |
459 | 516 | ||
460 | if (!(sk = sk_ASN1_OBJECT_new_null())) goto err; | 517 | if (!(sk = sk_ASN1_OBJECT_new_null())) |
461 | while (oids && *oids) | 518 | goto err; |
462 | { | 519 | while (oids && *oids) { |
463 | if ((nid=OBJ_txt2nid(*oids))!=NID_undef&&(o=OBJ_nid2obj(nid))) | 520 | if ((nid = OBJ_txt2nid(*oids)) != NID_undef && |
464 | sk_ASN1_OBJECT_push(sk, o); | 521 | (o = OBJ_nid2obj(nid))) |
522 | sk_ASN1_OBJECT_push(sk, o); | ||
465 | oids++; | 523 | oids++; |
466 | } | 524 | } |
467 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_acceptableResponses, 0, sk); | 525 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_acceptableResponses, 0, sk); |
468 | err: | 526 | err: |
469 | if (sk) sk_ASN1_OBJECT_pop_free(sk, ASN1_OBJECT_free); | 527 | if (sk) |
528 | sk_ASN1_OBJECT_pop_free(sk, ASN1_OBJECT_free); | ||
470 | return x; | 529 | return x; |
471 | } | 530 | } |
472 | 531 | ||
473 | /* ArchiveCutoff ::= GeneralizedTime */ | 532 | /* ArchiveCutoff ::= GeneralizedTime */ |
474 | X509_EXTENSION *OCSP_archive_cutoff_new(char* tim) | 533 | X509_EXTENSION * |
475 | { | 534 | OCSP_archive_cutoff_new(char* tim) |
476 | X509_EXTENSION *x=NULL; | 535 | { |
536 | X509_EXTENSION *x = NULL; | ||
477 | ASN1_GENERALIZEDTIME *gt = NULL; | 537 | ASN1_GENERALIZEDTIME *gt = NULL; |
478 | 538 | ||
479 | if (!(gt = ASN1_GENERALIZEDTIME_new())) goto err; | 539 | if (!(gt = ASN1_GENERALIZEDTIME_new())) |
480 | if (!(ASN1_GENERALIZEDTIME_set_string(gt, tim))) goto err; | 540 | goto err; |
541 | if (!(ASN1_GENERALIZEDTIME_set_string(gt, tim))) | ||
542 | goto err; | ||
481 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_archiveCutoff, 0, gt); | 543 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_archiveCutoff, 0, gt); |
482 | err: | 544 | err: |
483 | if (gt) ASN1_GENERALIZEDTIME_free(gt); | 545 | if (gt) |
546 | ASN1_GENERALIZEDTIME_free(gt); | ||
484 | return x; | 547 | return x; |
485 | } | 548 | } |
486 | 549 | ||
487 | /* per ACCESS_DESCRIPTION parameter are oids, of which there are currently | 550 | /* per ACCESS_DESCRIPTION parameter are oids, of which there are currently |
488 | * two--NID_ad_ocsp, NID_id_ad_caIssuers--and GeneralName value. This | 551 | * two--NID_ad_ocsp, NID_id_ad_caIssuers--and GeneralName value. This |
489 | * method forces NID_ad_ocsp and uniformResourceLocator [6] IA5String. | 552 | * method forces NID_ad_ocsp and uniformResourceLocator [6] IA5String. |
490 | */ | 553 | */ |
491 | X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls) | 554 | X509_EXTENSION * |
492 | { | 555 | OCSP_url_svcloc_new(X509_NAME* issuer, char **urls) |
556 | { | ||
493 | X509_EXTENSION *x = NULL; | 557 | X509_EXTENSION *x = NULL; |
494 | ASN1_IA5STRING *ia5 = NULL; | 558 | ASN1_IA5STRING *ia5 = NULL; |
495 | OCSP_SERVICELOC *sloc = NULL; | 559 | OCSP_SERVICELOC *sloc = NULL; |
496 | ACCESS_DESCRIPTION *ad = NULL; | 560 | ACCESS_DESCRIPTION *ad = NULL; |
497 | 561 | ||
498 | if (!(sloc = OCSP_SERVICELOC_new())) goto err; | 562 | if (!(sloc = OCSP_SERVICELOC_new())) |
499 | if (!(sloc->issuer = X509_NAME_dup(issuer))) goto err; | 563 | goto err; |
500 | if (urls && *urls && !(sloc->locator = sk_ACCESS_DESCRIPTION_new_null())) goto err; | 564 | if (!(sloc->issuer = X509_NAME_dup(issuer))) |
501 | while (urls && *urls) | 565 | goto err; |
502 | { | 566 | if (urls && *urls && |
503 | if (!(ad = ACCESS_DESCRIPTION_new())) goto err; | 567 | !(sloc->locator = sk_ACCESS_DESCRIPTION_new_null())) |
504 | if (!(ad->method=OBJ_nid2obj(NID_ad_OCSP))) goto err; | 568 | goto err; |
505 | if (!(ad->location = GENERAL_NAME_new())) goto err; | 569 | while (urls && *urls) { |
506 | if (!(ia5 = ASN1_IA5STRING_new())) goto err; | 570 | if (!(ad = ACCESS_DESCRIPTION_new())) |
507 | if (!ASN1_STRING_set((ASN1_STRING*)ia5, *urls, -1)) goto err; | 571 | goto err; |
572 | if (!(ad->method = OBJ_nid2obj(NID_ad_OCSP))) | ||
573 | goto err; | ||
574 | if (!(ad->location = GENERAL_NAME_new())) | ||
575 | goto err; | ||
576 | if (!(ia5 = ASN1_IA5STRING_new())) | ||
577 | goto err; | ||
578 | if (!ASN1_STRING_set((ASN1_STRING*)ia5, *urls, -1)) | ||
579 | goto err; | ||
508 | ad->location->type = GEN_URI; | 580 | ad->location->type = GEN_URI; |
509 | ad->location->d.ia5 = ia5; | 581 | ad->location->d.ia5 = ia5; |
510 | if (!sk_ACCESS_DESCRIPTION_push(sloc->locator, ad)) goto err; | 582 | if (!sk_ACCESS_DESCRIPTION_push(sloc->locator, ad)) |
583 | goto err; | ||
511 | urls++; | 584 | urls++; |
512 | } | 585 | } |
513 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_serviceLocator, 0, sloc); | 586 | x = X509V3_EXT_i2d(NID_id_pkix_OCSP_serviceLocator, 0, sloc); |
514 | err: | 587 | err: |
515 | if (sloc) OCSP_SERVICELOC_free(sloc); | 588 | if (sloc) |
589 | OCSP_SERVICELOC_free(sloc); | ||
516 | return x; | 590 | return x; |
517 | } | 591 | } |
518 | |||
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_ht.c b/src/lib/libssl/src/crypto/ocsp/ocsp_ht.c index b45eaf6767..fe4a7a1a72 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_ht.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_ht.c | |||
@@ -79,7 +79,7 @@ struct ocsp_req_ctx_st { | |||
79 | BIO *io; /* BIO to perform I/O with */ | 79 | BIO *io; /* BIO to perform I/O with */ |
80 | BIO *mem; /* Memory BIO response is built into */ | 80 | BIO *mem; /* Memory BIO response is built into */ |
81 | unsigned long asn1_len; /* ASN1 length of response */ | 81 | unsigned long asn1_len; /* ASN1 length of response */ |
82 | }; | 82 | }; |
83 | 83 | ||
84 | #define OCSP_MAX_REQUEST_LENGTH (100 * 1024) | 84 | #define OCSP_MAX_REQUEST_LENGTH (100 * 1024) |
85 | #define OCSP_MAX_LINE_LEN 4096; | 85 | #define OCSP_MAX_LINE_LEN 4096; |
@@ -108,54 +108,57 @@ struct ocsp_req_ctx_st { | |||
108 | 108 | ||
109 | static int parse_http_line1(char *line); | 109 | static int parse_http_line1(char *line); |
110 | 110 | ||
111 | void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx) | 111 | void |
112 | { | 112 | OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx) |
113 | { | ||
113 | if (rctx->mem) | 114 | if (rctx->mem) |
114 | BIO_free(rctx->mem); | 115 | BIO_free(rctx->mem); |
115 | if (rctx->iobuf) | 116 | if (rctx->iobuf) |
116 | free(rctx->iobuf); | 117 | free(rctx->iobuf); |
117 | free(rctx); | 118 | free(rctx); |
118 | } | 119 | } |
119 | 120 | ||
120 | int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req) | 121 | int |
121 | { | 122 | OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req) |
123 | { | ||
122 | static const char req_hdr[] = | 124 | static const char req_hdr[] = |
123 | "Content-Type: application/ocsp-request\r\n" | 125 | "Content-Type: application/ocsp-request\r\n" |
124 | "Content-Length: %d\r\n\r\n"; | 126 | "Content-Length: %d\r\n\r\n"; |
125 | if (BIO_printf(rctx->mem, req_hdr, i2d_OCSP_REQUEST(req, NULL)) <= 0) | 127 | |
128 | if (BIO_printf(rctx->mem, req_hdr, i2d_OCSP_REQUEST(req, NULL)) <= 0) | ||
126 | return 0; | 129 | return 0; |
127 | if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) | 130 | if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) |
128 | return 0; | 131 | return 0; |
129 | rctx->state = OHS_ASN1_WRITE; | 132 | rctx->state = OHS_ASN1_WRITE; |
130 | rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); | 133 | rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); |
131 | return 1; | 134 | return 1; |
132 | } | 135 | } |
133 | 136 | ||
134 | int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, | 137 | int |
135 | const char *name, const char *value) | 138 | OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, const char *name, |
136 | { | 139 | const char *value) |
140 | { | ||
137 | if (!name) | 141 | if (!name) |
138 | return 0; | 142 | return 0; |
139 | if (BIO_puts(rctx->mem, name) <= 0) | 143 | if (BIO_puts(rctx->mem, name) <= 0) |
140 | return 0; | 144 | return 0; |
141 | if (value) | 145 | if (value) { |
142 | { | ||
143 | if (BIO_write(rctx->mem, ": ", 2) != 2) | 146 | if (BIO_write(rctx->mem, ": ", 2) != 2) |
144 | return 0; | 147 | return 0; |
145 | if (BIO_puts(rctx->mem, value) <= 0) | 148 | if (BIO_puts(rctx->mem, value) <= 0) |
146 | return 0; | 149 | return 0; |
147 | } | 150 | } |
148 | if (BIO_write(rctx->mem, "\r\n", 2) != 2) | 151 | if (BIO_write(rctx->mem, "\r\n", 2) != 2) |
149 | return 0; | 152 | return 0; |
150 | return 1; | 153 | return 1; |
151 | } | 154 | } |
152 | 155 | ||
153 | OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | 156 | OCSP_REQ_CTX * |
154 | int maxline) | 157 | OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, int maxline) |
155 | { | 158 | { |
156 | static const char post_hdr[] = "POST %s HTTP/1.0\r\n"; | 159 | static const char post_hdr[] = "POST %s HTTP/1.0\r\n"; |
157 | |||
158 | OCSP_REQ_CTX *rctx; | 160 | OCSP_REQ_CTX *rctx; |
161 | |||
159 | rctx = malloc(sizeof(OCSP_REQ_CTX)); | 162 | rctx = malloc(sizeof(OCSP_REQ_CTX)); |
160 | rctx->state = OHS_ERROR; | 163 | rctx->state = OHS_ERROR; |
161 | rctx->mem = BIO_new(BIO_s_mem()); | 164 | rctx->mem = BIO_new(BIO_s_mem()); |
@@ -174,7 +177,7 @@ OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | |||
174 | if (!path) | 177 | if (!path) |
175 | path = "/"; | 178 | path = "/"; |
176 | 179 | ||
177 | if (BIO_printf(rctx->mem, post_hdr, path) <= 0) { | 180 | if (BIO_printf(rctx->mem, post_hdr, path) <= 0) { |
178 | free(rctx->iobuf); | 181 | free(rctx->iobuf); |
179 | BIO_free(rctx->mem); | 182 | BIO_free(rctx->mem); |
180 | free(rctx); | 183 | free(rctx); |
@@ -189,49 +192,44 @@ OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, | |||
189 | } | 192 | } |
190 | 193 | ||
191 | return rctx; | 194 | return rctx; |
192 | } | 195 | } |
193 | 196 | ||
194 | /* Parse the HTTP response. This will look like this: | 197 | /* Parse the HTTP response. This will look like this: |
195 | * "HTTP/1.0 200 OK". We need to obtain the numeric code and | 198 | * "HTTP/1.0 200 OK". We need to obtain the numeric code and |
196 | * (optional) informational message. | 199 | * (optional) informational message. |
197 | */ | 200 | */ |
198 | 201 | static int | |
199 | static int parse_http_line1(char *line) | 202 | parse_http_line1(char *line) |
200 | { | 203 | { |
201 | int retcode; | 204 | int retcode; |
202 | char *p, *q, *r; | 205 | char *p, *q, *r; |
203 | /* Skip to first white space (passed protocol info) */ | ||
204 | 206 | ||
205 | for(p = line; *p && !isspace((unsigned char)*p); p++) | 207 | /* Skip to first white space (passed protocol info) */ |
208 | for (p = line; *p && !isspace((unsigned char)*p); p++) | ||
206 | continue; | 209 | continue; |
207 | if(!*p) | 210 | if (!*p) { |
208 | { | ||
209 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 211 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
210 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 212 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
211 | return 0; | 213 | return 0; |
212 | } | 214 | } |
213 | 215 | ||
214 | /* Skip past white space to start of response code */ | 216 | /* Skip past white space to start of response code */ |
215 | while(*p && isspace((unsigned char)*p)) | 217 | while (*p && isspace((unsigned char)*p)) |
216 | p++; | 218 | p++; |
217 | 219 | if (!*p) { | |
218 | if(!*p) | ||
219 | { | ||
220 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 220 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
221 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 221 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
222 | return 0; | 222 | return 0; |
223 | } | 223 | } |
224 | 224 | ||
225 | /* Find end of response code: first whitespace after start of code */ | 225 | /* Find end of response code: first whitespace after start of code */ |
226 | for(q = p; *q && !isspace((unsigned char)*q); q++) | 226 | for (q = p; *q && !isspace((unsigned char)*q); q++) |
227 | continue; | 227 | continue; |
228 | 228 | if (!*q) { | |
229 | if(!*q) | ||
230 | { | ||
231 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, | 229 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, |
232 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); | 230 | OCSP_R_SERVER_RESPONSE_PARSE_ERROR); |
233 | return 0; | 231 | return 0; |
234 | } | 232 | } |
235 | 233 | ||
236 | /* Set end of response code and start of message */ | 234 | /* Set end of response code and start of message */ |
237 | *q++ = 0; | 235 | *q++ = 0; |
@@ -239,94 +237,80 @@ static int parse_http_line1(char *line) | |||
239 | /* Attempt to parse numeric code */ | 237 | /* Attempt to parse numeric code */ |
240 | retcode = strtoul(p, &r, 10); | 238 | retcode = strtoul(p, &r, 10); |
241 | 239 | ||
242 | if(*r) | 240 | if (*r) |
243 | return 0; | 241 | return 0; |
244 | 242 | ||
245 | /* Skip over any leading white space in message */ | 243 | /* Skip over any leading white space in message */ |
246 | while(*q && isspace((unsigned char)*q)) | 244 | while (*q && isspace((unsigned char)*q)) |
247 | q++; | 245 | q++; |
248 | 246 | if (*q) { | |
249 | if(*q) | ||
250 | { | ||
251 | /* Finally zap any trailing white space in message (include | 247 | /* Finally zap any trailing white space in message (include |
252 | * CRLF) */ | 248 | * CRLF) */ |
253 | 249 | ||
254 | /* We know q has a non white space character so this is OK */ | 250 | /* We know q has a non white space character so this is OK */ |
255 | for(r = q + strlen(q) - 1; isspace((unsigned char)*r); r--) | 251 | for (r = q + strlen(q) - 1; isspace((unsigned char)*r); r--) |
256 | *r = 0; | 252 | *r = 0; |
257 | } | 253 | } |
258 | if(retcode != 200) | 254 | if (retcode != 200) { |
259 | { | ||
260 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, OCSP_R_SERVER_RESPONSE_ERROR); | 255 | OCSPerr(OCSP_F_PARSE_HTTP_LINE1, OCSP_R_SERVER_RESPONSE_ERROR); |
261 | if(!*q) | 256 | if (!*q) |
262 | ERR_asprintf_error_data("Code=%s", p); | 257 | ERR_asprintf_error_data("Code=%s", p); |
263 | else | 258 | else |
264 | ERR_asprintf_error_data("Code=%s,Reason=%s", p, q); | 259 | ERR_asprintf_error_data("Code=%s,Reason=%s", p, q); |
265 | return 0; | 260 | return 0; |
266 | } | 261 | } |
267 | |||
268 | 262 | ||
269 | return 1; | 263 | return 1; |
264 | } | ||
270 | 265 | ||
271 | } | 266 | int |
272 | 267 | OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |
273 | int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | 268 | { |
274 | { | ||
275 | int i, n; | 269 | int i, n; |
276 | const unsigned char *p; | 270 | const unsigned char *p; |
277 | next_io: | 271 | |
278 | if (!(rctx->state & OHS_NOREAD)) | 272 | next_io: |
279 | { | 273 | if (!(rctx->state & OHS_NOREAD)) { |
280 | n = BIO_read(rctx->io, rctx->iobuf, rctx->iobuflen); | 274 | n = BIO_read(rctx->io, rctx->iobuf, rctx->iobuflen); |
281 | 275 | ||
282 | if (n <= 0) | 276 | if (n <= 0) { |
283 | { | ||
284 | if (BIO_should_retry(rctx->io)) | 277 | if (BIO_should_retry(rctx->io)) |
285 | return -1; | 278 | return -1; |
286 | return 0; | 279 | return 0; |
287 | } | 280 | } |
288 | 281 | ||
289 | /* Write data to memory BIO */ | 282 | /* Write data to memory BIO */ |
290 | |||
291 | if (BIO_write(rctx->mem, rctx->iobuf, n) != n) | 283 | if (BIO_write(rctx->mem, rctx->iobuf, n) != n) |
292 | return 0; | 284 | return 0; |
293 | } | 285 | } |
294 | |||
295 | switch(rctx->state) | ||
296 | { | ||
297 | 286 | ||
298 | case OHS_ASN1_WRITE: | 287 | switch (rctx->state) { |
288 | case OHS_ASN1_WRITE: | ||
299 | n = BIO_get_mem_data(rctx->mem, &p); | 289 | n = BIO_get_mem_data(rctx->mem, &p); |
300 | |||
301 | i = BIO_write(rctx->io, | 290 | i = BIO_write(rctx->io, |
302 | p + (n - rctx->asn1_len), rctx->asn1_len); | 291 | p + (n - rctx->asn1_len), rctx->asn1_len); |
303 | 292 | if (i <= 0) { | |
304 | if (i <= 0) | ||
305 | { | ||
306 | if (BIO_should_retry(rctx->io)) | 293 | if (BIO_should_retry(rctx->io)) |
307 | return -1; | 294 | return -1; |
308 | rctx->state = OHS_ERROR; | 295 | rctx->state = OHS_ERROR; |
309 | return 0; | 296 | return 0; |
310 | } | 297 | } |
311 | 298 | ||
312 | rctx->asn1_len -= i; | 299 | rctx->asn1_len -= i; |
313 | |||
314 | if (rctx->asn1_len > 0) | 300 | if (rctx->asn1_len > 0) |
315 | goto next_io; | 301 | goto next_io; |
316 | 302 | ||
317 | rctx->state = OHS_ASN1_FLUSH; | 303 | rctx->state = OHS_ASN1_FLUSH; |
318 | 304 | ||
319 | (void)BIO_reset(rctx->mem); | 305 | (void)BIO_reset(rctx->mem); |
306 | /* FALLTHROUGH */ | ||
320 | 307 | ||
321 | case OHS_ASN1_FLUSH: | 308 | case OHS_ASN1_FLUSH: |
322 | |||
323 | i = BIO_flush(rctx->io); | 309 | i = BIO_flush(rctx->io); |
324 | 310 | if (i > 0) { | |
325 | if (i > 0) | ||
326 | { | ||
327 | rctx->state = OHS_FIRSTLINE; | 311 | rctx->state = OHS_FIRSTLINE; |
328 | goto next_io; | 312 | goto next_io; |
329 | } | 313 | } |
330 | 314 | ||
331 | if (BIO_should_retry(rctx->io)) | 315 | if (BIO_should_retry(rctx->io)) |
332 | return -1; | 316 | return -1; |
@@ -334,79 +318,62 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
334 | rctx->state = OHS_ERROR; | 318 | rctx->state = OHS_ERROR; |
335 | return 0; | 319 | return 0; |
336 | 320 | ||
337 | case OHS_ERROR: | 321 | case OHS_ERROR: |
338 | return 0; | 322 | return 0; |
339 | 323 | ||
340 | case OHS_FIRSTLINE: | 324 | case OHS_FIRSTLINE: |
341 | case OHS_HEADERS: | 325 | case OHS_HEADERS: |
342 | |||
343 | /* Attempt to read a line in */ | 326 | /* Attempt to read a line in */ |
344 | 327 | next_line: | |
345 | next_line: | ||
346 | /* Due to &%^*$" memory BIO behaviour with BIO_gets we | 328 | /* Due to &%^*$" memory BIO behaviour with BIO_gets we |
347 | * have to check there's a complete line in there before | 329 | * have to check there's a complete line in there before |
348 | * calling BIO_gets or we'll just get a partial read. | 330 | * calling BIO_gets or we'll just get a partial read. |
349 | */ | 331 | */ |
350 | n = BIO_get_mem_data(rctx->mem, &p); | 332 | n = BIO_get_mem_data(rctx->mem, &p); |
351 | if ((n <= 0) || !memchr(p, '\n', n)) | 333 | if ((n <= 0) || !memchr(p, '\n', n)) { |
352 | { | 334 | if (n >= rctx->iobuflen) { |
353 | if (n >= rctx->iobuflen) | ||
354 | { | ||
355 | rctx->state = OHS_ERROR; | 335 | rctx->state = OHS_ERROR; |
356 | return 0; | 336 | return 0; |
357 | } | ||
358 | goto next_io; | ||
359 | } | 337 | } |
338 | goto next_io; | ||
339 | } | ||
360 | n = BIO_gets(rctx->mem, (char *)rctx->iobuf, rctx->iobuflen); | 340 | n = BIO_gets(rctx->mem, (char *)rctx->iobuf, rctx->iobuflen); |
361 | 341 | if (n <= 0) { | |
362 | if (n <= 0) | ||
363 | { | ||
364 | if (BIO_should_retry(rctx->mem)) | 342 | if (BIO_should_retry(rctx->mem)) |
365 | goto next_io; | 343 | goto next_io; |
366 | rctx->state = OHS_ERROR; | 344 | rctx->state = OHS_ERROR; |
367 | return 0; | 345 | return 0; |
368 | } | 346 | } |
369 | 347 | ||
370 | /* Don't allow excessive lines */ | 348 | /* Don't allow excessive lines */ |
371 | if (n == rctx->iobuflen) | 349 | if (n == rctx->iobuflen) { |
372 | { | ||
373 | rctx->state = OHS_ERROR; | 350 | rctx->state = OHS_ERROR; |
374 | return 0; | 351 | return 0; |
375 | } | 352 | } |
376 | 353 | ||
377 | /* First line */ | 354 | /* First line */ |
378 | if (rctx->state == OHS_FIRSTLINE) | 355 | if (rctx->state == OHS_FIRSTLINE) { |
379 | { | 356 | if (parse_http_line1((char *)rctx->iobuf)) { |
380 | if (parse_http_line1((char *)rctx->iobuf)) | ||
381 | { | ||
382 | rctx->state = OHS_HEADERS; | 357 | rctx->state = OHS_HEADERS; |
383 | goto next_line; | 358 | goto next_line; |
384 | } | 359 | } else { |
385 | else | ||
386 | { | ||
387 | rctx->state = OHS_ERROR; | 360 | rctx->state = OHS_ERROR; |
388 | return 0; | 361 | return 0; |
389 | } | ||
390 | } | 362 | } |
391 | else | 363 | } else { |
392 | { | ||
393 | /* Look for blank line: end of headers */ | 364 | /* Look for blank line: end of headers */ |
394 | for (p = rctx->iobuf; *p; p++) | 365 | for (p = rctx->iobuf; *p; p++) { |
395 | { | ||
396 | if ((*p != '\r') && (*p != '\n')) | 366 | if ((*p != '\r') && (*p != '\n')) |
397 | break; | 367 | break; |
398 | } | 368 | } |
399 | if (*p) | 369 | if (*p) |
400 | goto next_line; | 370 | goto next_line; |
401 | 371 | ||
402 | rctx->state = OHS_ASN1_HEADER; | 372 | rctx->state = OHS_ASN1_HEADER; |
373 | } | ||
374 | /* FALLTRHOUGH */ | ||
403 | 375 | ||
404 | } | 376 | case OHS_ASN1_HEADER: |
405 | |||
406 | /* Fall thru */ | ||
407 | |||
408 | |||
409 | case OHS_ASN1_HEADER: | ||
410 | /* Now reading ASN1 header: can read at least 2 bytes which | 377 | /* Now reading ASN1 header: can read at least 2 bytes which |
411 | * is enough for ASN1 SEQUENCE header and either length field | 378 | * is enough for ASN1 SEQUENCE header and either length field |
412 | * or at least the length of the length field. | 379 | * or at least the length of the length field. |
@@ -416,15 +383,13 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
416 | goto next_io; | 383 | goto next_io; |
417 | 384 | ||
418 | /* Check it is an ASN1 SEQUENCE */ | 385 | /* Check it is an ASN1 SEQUENCE */ |
419 | if (*p++ != (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) | 386 | if (*p++ != (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) { |
420 | { | ||
421 | rctx->state = OHS_ERROR; | 387 | rctx->state = OHS_ERROR; |
422 | return 0; | 388 | return 0; |
423 | } | 389 | } |
424 | 390 | ||
425 | /* Check out length field */ | 391 | /* Check out length field */ |
426 | if (*p & 0x80) | 392 | if (*p & 0x80) { |
427 | { | ||
428 | /* If MSB set on initial length octet we can now | 393 | /* If MSB set on initial length octet we can now |
429 | * always read 6 octets: make sure we have them. | 394 | * always read 6 octets: make sure we have them. |
430 | */ | 395 | */ |
@@ -432,78 +397,64 @@ int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx) | |||
432 | goto next_io; | 397 | goto next_io; |
433 | n = *p & 0x7F; | 398 | n = *p & 0x7F; |
434 | /* Not NDEF or excessive length */ | 399 | /* Not NDEF or excessive length */ |
435 | if (!n || (n > 4)) | 400 | if (!n || (n > 4)) { |
436 | { | ||
437 | rctx->state = OHS_ERROR; | 401 | rctx->state = OHS_ERROR; |
438 | return 0; | 402 | return 0; |
439 | } | 403 | } |
440 | p++; | 404 | p++; |
441 | rctx->asn1_len = 0; | 405 | rctx->asn1_len = 0; |
442 | for (i = 0; i < n; i++) | 406 | for (i = 0; i < n; i++) { |
443 | { | ||
444 | rctx->asn1_len <<= 8; | 407 | rctx->asn1_len <<= 8; |
445 | rctx->asn1_len |= *p++; | 408 | rctx->asn1_len |= *p++; |
446 | } | 409 | } |
447 | 410 | ||
448 | if (rctx->asn1_len > OCSP_MAX_REQUEST_LENGTH) | 411 | if (rctx->asn1_len > OCSP_MAX_REQUEST_LENGTH) { |
449 | { | ||
450 | rctx->state = OHS_ERROR; | 412 | rctx->state = OHS_ERROR; |
451 | return 0; | 413 | return 0; |
452 | } | 414 | } |
453 | 415 | ||
454 | rctx->asn1_len += n + 2; | 416 | rctx->asn1_len += n + 2; |
455 | } | 417 | } else |
456 | else | ||
457 | rctx->asn1_len = *p + 2; | 418 | rctx->asn1_len = *p + 2; |
458 | 419 | ||
459 | rctx->state = OHS_ASN1_CONTENT; | 420 | rctx->state = OHS_ASN1_CONTENT; |
460 | 421 | ||
461 | /* Fall thru */ | 422 | /* FALLTHROUGH */ |
462 | 423 | ||
463 | case OHS_ASN1_CONTENT: | 424 | case OHS_ASN1_CONTENT: |
464 | n = BIO_get_mem_data(rctx->mem, &p); | 425 | n = BIO_get_mem_data(rctx->mem, &p); |
465 | if (n < (int)rctx->asn1_len) | 426 | if (n < (int)rctx->asn1_len) |
466 | goto next_io; | 427 | goto next_io; |
467 | 428 | ||
468 | |||
469 | *presp = d2i_OCSP_RESPONSE(NULL, &p, rctx->asn1_len); | 429 | *presp = d2i_OCSP_RESPONSE(NULL, &p, rctx->asn1_len); |
470 | if (*presp) | 430 | if (*presp) { |
471 | { | ||
472 | rctx->state = OHS_DONE; | 431 | rctx->state = OHS_DONE; |
473 | return 1; | 432 | return 1; |
474 | } | 433 | } |
475 | 434 | ||
476 | rctx->state = OHS_ERROR; | 435 | rctx->state = OHS_ERROR; |
477 | return 0; | 436 | return 0; |
478 | 437 | ||
479 | break; | 438 | case OHS_DONE: |
480 | |||
481 | case OHS_DONE: | ||
482 | return 1; | 439 | return 1; |
483 | 440 | } | |
484 | } | ||
485 | |||
486 | |||
487 | 441 | ||
488 | return 0; | 442 | return 0; |
489 | 443 | } | |
490 | |||
491 | } | ||
492 | 444 | ||
493 | /* Blocking OCSP request handler: now a special case of non-blocking I/O */ | 445 | /* Blocking OCSP request handler: now a special case of non-blocking I/O */ |
494 | 446 | OCSP_RESPONSE * | |
495 | OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) | 447 | OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) |
496 | { | 448 | { |
497 | OCSP_RESPONSE *resp = NULL; | 449 | OCSP_RESPONSE *resp = NULL; |
498 | OCSP_REQ_CTX *ctx; | 450 | OCSP_REQ_CTX *ctx; |
499 | int rv; | 451 | int rv; |
500 | 452 | ||
501 | ctx = OCSP_sendreq_new(b, path, req, -1); | 453 | ctx = OCSP_sendreq_new(b, path, req, -1); |
502 | 454 | ||
503 | do | 455 | do { |
504 | { | ||
505 | rv = OCSP_sendreq_nbio(&resp, ctx); | 456 | rv = OCSP_sendreq_nbio(&resp, ctx); |
506 | } while ((rv == -1) && BIO_should_retry(b)); | 457 | } while ((rv == -1) && BIO_should_retry(b)); |
507 | 458 | ||
508 | OCSP_REQ_CTX_free(ctx); | 459 | OCSP_REQ_CTX_free(ctx); |
509 | 460 | ||
@@ -511,4 +462,4 @@ OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req) | |||
511 | return resp; | 462 | return resp; |
512 | 463 | ||
513 | return NULL; | 464 | return NULL; |
514 | } | 465 | } |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_lib.c b/src/lib/libssl/src/crypto/ocsp/ocsp_lib.c index 514cdabf2d..056bd27665 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_lib.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_lib.c | |||
@@ -73,102 +73,112 @@ | |||
73 | 73 | ||
74 | /* Convert a certificate and its issuer to an OCSP_CERTID */ | 74 | /* Convert a certificate and its issuer to an OCSP_CERTID */ |
75 | 75 | ||
76 | OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer) | 76 | OCSP_CERTID * |
77 | OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer) | ||
77 | { | 78 | { |
78 | X509_NAME *iname; | 79 | X509_NAME *iname; |
79 | ASN1_INTEGER *serial; | 80 | ASN1_INTEGER *serial; |
80 | ASN1_BIT_STRING *ikey; | 81 | ASN1_BIT_STRING *ikey; |
82 | |||
81 | #ifndef OPENSSL_NO_SHA1 | 83 | #ifndef OPENSSL_NO_SHA1 |
82 | if(!dgst) dgst = EVP_sha1(); | 84 | if (!dgst) |
85 | dgst = EVP_sha1(); | ||
83 | #endif | 86 | #endif |
84 | if (subject) | 87 | if (subject) { |
85 | { | ||
86 | iname = X509_get_issuer_name(subject); | 88 | iname = X509_get_issuer_name(subject); |
87 | serial = X509_get_serialNumber(subject); | 89 | serial = X509_get_serialNumber(subject); |
88 | } | 90 | } else { |
89 | else | ||
90 | { | ||
91 | iname = X509_get_subject_name(issuer); | 91 | iname = X509_get_subject_name(issuer); |
92 | serial = NULL; | 92 | serial = NULL; |
93 | } | 93 | } |
94 | ikey = X509_get0_pubkey_bitstr(issuer); | 94 | ikey = X509_get0_pubkey_bitstr(issuer); |
95 | return OCSP_cert_id_new(dgst, iname, ikey, serial); | 95 | return OCSP_cert_id_new(dgst, iname, ikey, serial); |
96 | } | 96 | } |
97 | 97 | ||
98 | 98 | OCSP_CERTID * | |
99 | OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, | 99 | OCSP_cert_id_new(const EVP_MD *dgst, X509_NAME *issuerName, |
100 | X509_NAME *issuerName, | 100 | ASN1_BIT_STRING* issuerKey, ASN1_INTEGER *serialNumber) |
101 | ASN1_BIT_STRING* issuerKey, | 101 | { |
102 | ASN1_INTEGER *serialNumber) | ||
103 | { | ||
104 | int nid; | 102 | int nid; |
105 | unsigned int i; | 103 | unsigned int i; |
106 | X509_ALGOR *alg; | 104 | X509_ALGOR *alg; |
107 | OCSP_CERTID *cid = NULL; | 105 | OCSP_CERTID *cid = NULL; |
108 | unsigned char md[EVP_MAX_MD_SIZE]; | 106 | unsigned char md[EVP_MAX_MD_SIZE]; |
109 | 107 | ||
110 | if (!(cid = OCSP_CERTID_new())) goto err; | 108 | if (!(cid = OCSP_CERTID_new())) |
109 | goto err; | ||
111 | 110 | ||
112 | alg = cid->hashAlgorithm; | 111 | alg = cid->hashAlgorithm; |
113 | if (alg->algorithm != NULL) ASN1_OBJECT_free(alg->algorithm); | 112 | if (alg->algorithm != NULL) |
114 | if ((nid = EVP_MD_type(dgst)) == NID_undef) | 113 | ASN1_OBJECT_free(alg->algorithm); |
115 | { | 114 | if ((nid = EVP_MD_type(dgst)) == NID_undef) { |
116 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_UNKNOWN_NID); | 115 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW, OCSP_R_UNKNOWN_NID); |
116 | goto err; | ||
117 | } | ||
118 | if (!(alg->algorithm=OBJ_nid2obj(nid))) | ||
119 | goto err; | ||
120 | if ((alg->parameter=ASN1_TYPE_new()) == NULL) | ||
117 | goto err; | 121 | goto err; |
118 | } | ||
119 | if (!(alg->algorithm=OBJ_nid2obj(nid))) goto err; | ||
120 | if ((alg->parameter=ASN1_TYPE_new()) == NULL) goto err; | ||
121 | alg->parameter->type=V_ASN1_NULL; | 122 | alg->parameter->type=V_ASN1_NULL; |
122 | 123 | ||
123 | if (!X509_NAME_digest(issuerName, dgst, md, &i)) goto digerr; | 124 | if (!X509_NAME_digest(issuerName, dgst, md, &i)) |
124 | if (!(ASN1_OCTET_STRING_set(cid->issuerNameHash, md, i))) goto err; | 125 | goto digerr; |
126 | if (!(ASN1_OCTET_STRING_set(cid->issuerNameHash, md, i))) | ||
127 | goto err; | ||
125 | 128 | ||
126 | /* Calculate the issuerKey hash, excluding tag and length */ | 129 | /* Calculate the issuerKey hash, excluding tag and length */ |
127 | if (!EVP_Digest(issuerKey->data, issuerKey->length, md, &i, dgst, NULL)) | 130 | if (!EVP_Digest(issuerKey->data, issuerKey->length, md, &i, dgst, NULL)) |
128 | goto err; | 131 | goto err; |
129 | 132 | ||
130 | if (!(ASN1_OCTET_STRING_set(cid->issuerKeyHash, md, i))) goto err; | 133 | if (!(ASN1_OCTET_STRING_set(cid->issuerKeyHash, md, i))) |
134 | goto err; | ||
131 | 135 | ||
132 | if (serialNumber) | 136 | if (serialNumber) { |
133 | { | ||
134 | ASN1_INTEGER_free(cid->serialNumber); | 137 | ASN1_INTEGER_free(cid->serialNumber); |
135 | if (!(cid->serialNumber = ASN1_INTEGER_dup(serialNumber))) goto err; | 138 | if (!(cid->serialNumber = ASN1_INTEGER_dup(serialNumber))) |
136 | } | 139 | goto err; |
140 | } | ||
137 | return cid; | 141 | return cid; |
138 | digerr: | 142 | digerr: |
139 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_DIGEST_ERR); | 143 | OCSPerr(OCSP_F_OCSP_CERT_ID_NEW, OCSP_R_DIGEST_ERR); |
140 | err: | 144 | err: |
141 | if (cid) OCSP_CERTID_free(cid); | 145 | if (cid) |
146 | OCSP_CERTID_free(cid); | ||
142 | return NULL; | 147 | return NULL; |
143 | } | 148 | } |
144 | 149 | ||
145 | int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b) | 150 | int |
146 | { | 151 | OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b) |
152 | { | ||
147 | int ret; | 153 | int ret; |
154 | |||
148 | ret = OBJ_cmp(a->hashAlgorithm->algorithm, b->hashAlgorithm->algorithm); | 155 | ret = OBJ_cmp(a->hashAlgorithm->algorithm, b->hashAlgorithm->algorithm); |
149 | if (ret) return ret; | 156 | if (ret) |
157 | return ret; | ||
150 | ret = ASN1_OCTET_STRING_cmp(a->issuerNameHash, b->issuerNameHash); | 158 | ret = ASN1_OCTET_STRING_cmp(a->issuerNameHash, b->issuerNameHash); |
151 | if (ret) return ret; | 159 | if (ret) |
160 | return ret; | ||
152 | return ASN1_OCTET_STRING_cmp(a->issuerKeyHash, b->issuerKeyHash); | 161 | return ASN1_OCTET_STRING_cmp(a->issuerKeyHash, b->issuerKeyHash); |
153 | } | 162 | } |
154 | 163 | ||
155 | int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b) | 164 | int |
156 | { | 165 | OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b) |
166 | { | ||
157 | int ret; | 167 | int ret; |
168 | |||
158 | ret = OCSP_id_issuer_cmp(a, b); | 169 | ret = OCSP_id_issuer_cmp(a, b); |
159 | if (ret) return ret; | 170 | if (ret) |
171 | return ret; | ||
160 | return ASN1_INTEGER_cmp(a->serialNumber, b->serialNumber); | 172 | return ASN1_INTEGER_cmp(a->serialNumber, b->serialNumber); |
161 | } | 173 | } |
162 | |||
163 | 174 | ||
164 | /* Parse a URL and split it up into host, port and path components and whether | 175 | /* Parse a URL and split it up into host, port and path components and whether |
165 | * it is SSL. | 176 | * it is SSL. |
166 | */ | 177 | */ |
167 | 178 | int | |
168 | int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl) | 179 | OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl) |
169 | { | 180 | { |
170 | char *p, *buf; | 181 | char *p, *buf; |
171 | |||
172 | char *host, *port; | 182 | char *host, *port; |
173 | 183 | ||
174 | *phost = NULL; | 184 | *phost = NULL; |
@@ -177,26 +187,23 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pss | |||
177 | 187 | ||
178 | /* dup the buffer since we are going to mess with it */ | 188 | /* dup the buffer since we are going to mess with it */ |
179 | buf = BUF_strdup(url); | 189 | buf = BUF_strdup(url); |
180 | if (!buf) goto mem_err; | 190 | if (!buf) |
191 | goto mem_err; | ||
181 | 192 | ||
182 | /* Check for initial colon */ | 193 | /* Check for initial colon */ |
183 | p = strchr(buf, ':'); | 194 | p = strchr(buf, ':'); |
184 | 195 | if (!p) | |
185 | if (!p) goto parse_err; | 196 | goto parse_err; |
186 | 197 | ||
187 | *(p++) = '\0'; | 198 | *(p++) = '\0'; |
188 | 199 | ||
189 | if (!strcmp(buf, "http")) | 200 | if (!strcmp(buf, "http")) { |
190 | { | ||
191 | *pssl = 0; | 201 | *pssl = 0; |
192 | port = "80"; | 202 | port = "80"; |
193 | } | 203 | } else if (!strcmp(buf, "https")) { |
194 | else if (!strcmp(buf, "https")) | ||
195 | { | ||
196 | *pssl = 1; | 204 | *pssl = 1; |
197 | port = "443"; | 205 | port = "443"; |
198 | } | 206 | } else |
199 | else | ||
200 | goto parse_err; | 207 | goto parse_err; |
201 | 208 | ||
202 | /* Check for double slash */ | 209 | /* Check for double slash */ |
@@ -208,59 +215,56 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pss | |||
208 | host = p; | 215 | host = p; |
209 | 216 | ||
210 | /* Check for trailing part of path */ | 217 | /* Check for trailing part of path */ |
211 | |||
212 | p = strchr(p, '/'); | 218 | p = strchr(p, '/'); |
213 | |||
214 | if (!p) | 219 | if (!p) |
215 | *ppath = BUF_strdup("/"); | 220 | *ppath = BUF_strdup("/"); |
216 | else | 221 | else { |
217 | { | ||
218 | *ppath = BUF_strdup(p); | 222 | *ppath = BUF_strdup(p); |
219 | /* Set start of path to 0 so hostname is valid */ | 223 | /* Set start of path to 0 so hostname is valid */ |
220 | *p = '\0'; | 224 | *p = '\0'; |
221 | } | 225 | } |
222 | 226 | ||
223 | if (!*ppath) goto mem_err; | 227 | if (!*ppath) |
228 | goto mem_err; | ||
224 | 229 | ||
225 | /* Look for optional ':' for port number */ | 230 | /* Look for optional ':' for port number */ |
226 | if ((p = strchr(host, ':'))) | 231 | if ((p = strchr(host, ':'))) { |
227 | { | ||
228 | *p = 0; | 232 | *p = 0; |
229 | port = p + 1; | 233 | port = p + 1; |
230 | } | 234 | } else { |
231 | else | ||
232 | { | ||
233 | /* Not found: set default port */ | 235 | /* Not found: set default port */ |
234 | if (*pssl) port = "443"; | 236 | if (*pssl) |
235 | else port = "80"; | 237 | port = "443"; |
236 | } | 238 | else |
239 | port = "80"; | ||
240 | } | ||
237 | 241 | ||
238 | *pport = BUF_strdup(port); | 242 | *pport = BUF_strdup(port); |
239 | if (!*pport) goto mem_err; | 243 | if (!*pport) |
244 | goto mem_err; | ||
240 | 245 | ||
241 | *phost = BUF_strdup(host); | 246 | *phost = BUF_strdup(host); |
242 | 247 | ||
243 | if (!*phost) goto mem_err; | 248 | if (!*phost) |
249 | goto mem_err; | ||
244 | 250 | ||
245 | free(buf); | 251 | free(buf); |
246 | 252 | ||
247 | return 1; | 253 | return 1; |
248 | 254 | ||
249 | mem_err: | 255 | mem_err: |
250 | OCSPerr(OCSP_F_OCSP_PARSE_URL, ERR_R_MALLOC_FAILURE); | 256 | OCSPerr(OCSP_F_OCSP_PARSE_URL, ERR_R_MALLOC_FAILURE); |
251 | goto err; | 257 | goto err; |
252 | 258 | ||
253 | parse_err: | 259 | parse_err: |
254 | OCSPerr(OCSP_F_OCSP_PARSE_URL, OCSP_R_ERROR_PARSING_URL); | 260 | OCSPerr(OCSP_F_OCSP_PARSE_URL, OCSP_R_ERROR_PARSING_URL); |
255 | 261 | ||
256 | 262 | err: | |
257 | err: | 263 | free(buf); |
258 | if (buf) free(buf); | 264 | free(*ppath); |
259 | if (*ppath) free(*ppath); | 265 | free(*pport); |
260 | if (*pport) free(*pport); | 266 | free(*phost); |
261 | if (*phost) free(*phost); | ||
262 | return 0; | 267 | return 0; |
263 | 268 | } | |
264 | } | ||
265 | 269 | ||
266 | IMPLEMENT_ASN1_DUP_FUNCTION(OCSP_CERTID) | 270 | IMPLEMENT_ASN1_DUP_FUNCTION(OCSP_CERTID) |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_prn.c b/src/lib/libssl/src/crypto/ocsp/ocsp_prn.c index 87608ff399..9e4b81f061 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_prn.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_prn.c | |||
@@ -66,8 +66,9 @@ | |||
66 | #include <openssl/ocsp.h> | 66 | #include <openssl/ocsp.h> |
67 | #include <openssl/pem.h> | 67 | #include <openssl/pem.h> |
68 | 68 | ||
69 | static int ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) | 69 | static int |
70 | { | 70 | ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) |
71 | { | ||
71 | BIO_printf(bp, "%*sCertificate ID:\n", indent, ""); | 72 | BIO_printf(bp, "%*sCertificate ID:\n", indent, ""); |
72 | indent += 2; | 73 | indent += 2; |
73 | BIO_printf(bp, "%*sHash Algorithm: ", indent, ""); | 74 | BIO_printf(bp, "%*sHash Algorithm: ", indent, ""); |
@@ -80,60 +81,68 @@ static int ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent) | |||
80 | i2a_ASN1_INTEGER(bp, a->serialNumber); | 81 | i2a_ASN1_INTEGER(bp, a->serialNumber); |
81 | BIO_printf(bp, "\n"); | 82 | BIO_printf(bp, "\n"); |
82 | return 1; | 83 | return 1; |
83 | } | 84 | } |
84 | 85 | ||
85 | typedef struct | 86 | typedef struct { |
86 | { | ||
87 | long t; | 87 | long t; |
88 | const char *m; | 88 | const char *m; |
89 | } OCSP_TBLSTR; | 89 | } OCSP_TBLSTR; |
90 | 90 | ||
91 | static const char *table2string(long s, const OCSP_TBLSTR *ts, int len) | 91 | static const char * |
92 | table2string(long s, const OCSP_TBLSTR *ts, int len) | ||
92 | { | 93 | { |
93 | const OCSP_TBLSTR *p; | 94 | const OCSP_TBLSTR *p; |
95 | |||
94 | for (p=ts; p < ts + len; p++) | 96 | for (p=ts; p < ts + len; p++) |
95 | if (p->t == s) | 97 | if (p->t == s) |
96 | return p->m; | 98 | return p->m; |
97 | return "(UNKNOWN)"; | 99 | return "(UNKNOWN)"; |
98 | } | 100 | } |
99 | 101 | ||
100 | const char *OCSP_response_status_str(long s) | 102 | const char * |
101 | { | 103 | OCSP_response_status_str(long s) |
104 | { | ||
102 | static const OCSP_TBLSTR rstat_tbl[] = { | 105 | static const OCSP_TBLSTR rstat_tbl[] = { |
103 | { OCSP_RESPONSE_STATUS_SUCCESSFUL, "successful" }, | 106 | { OCSP_RESPONSE_STATUS_SUCCESSFUL, "successful" }, |
104 | { OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, "malformedrequest" }, | 107 | { OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, "malformedrequest" }, |
105 | { OCSP_RESPONSE_STATUS_INTERNALERROR, "internalerror" }, | 108 | { OCSP_RESPONSE_STATUS_INTERNALERROR, "internalerror" }, |
106 | { OCSP_RESPONSE_STATUS_TRYLATER, "trylater" }, | 109 | { OCSP_RESPONSE_STATUS_TRYLATER, "trylater" }, |
107 | { OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigrequired" }, | 110 | { OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigrequired" }, |
108 | { OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" } }; | 111 | { OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" } |
112 | }; | ||
109 | return table2string(s, rstat_tbl, 6); | 113 | return table2string(s, rstat_tbl, 6); |
110 | } | 114 | } |
111 | 115 | ||
112 | const char *OCSP_cert_status_str(long s) | 116 | const char * |
113 | { | 117 | OCSP_cert_status_str(long s) |
118 | { | ||
114 | static const OCSP_TBLSTR cstat_tbl[] = { | 119 | static const OCSP_TBLSTR cstat_tbl[] = { |
115 | { V_OCSP_CERTSTATUS_GOOD, "good" }, | 120 | { V_OCSP_CERTSTATUS_GOOD, "good" }, |
116 | { V_OCSP_CERTSTATUS_REVOKED, "revoked" }, | 121 | { V_OCSP_CERTSTATUS_REVOKED, "revoked" }, |
117 | { V_OCSP_CERTSTATUS_UNKNOWN, "unknown" } }; | 122 | { V_OCSP_CERTSTATUS_UNKNOWN, "unknown" } |
123 | }; | ||
118 | return table2string(s, cstat_tbl, 3); | 124 | return table2string(s, cstat_tbl, 3); |
119 | } | 125 | } |
120 | 126 | ||
121 | const char *OCSP_crl_reason_str(long s) | 127 | const char * |
122 | { | 128 | OCSP_crl_reason_str(long s) |
129 | { | ||
123 | static const OCSP_TBLSTR reason_tbl[] = { | 130 | static const OCSP_TBLSTR reason_tbl[] = { |
124 | { OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" }, | 131 | { OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" }, |
125 | { OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" }, | 132 | { OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" }, |
126 | { OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" }, | 133 | { OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" }, |
127 | { OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, "affiliationChanged" }, | 134 | { OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, "affiliationChanged" }, |
128 | { OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" }, | 135 | { OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" }, |
129 | { OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, "cessationOfOperation" }, | 136 | { OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, "cessationOfOperation" }, |
130 | { OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" }, | 137 | { OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" }, |
131 | { OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" } }; | 138 | { OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" } |
139 | }; | ||
132 | return table2string(s, reason_tbl, 8); | 140 | return table2string(s, reason_tbl, 8); |
133 | } | 141 | } |
134 | 142 | ||
135 | int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) | 143 | int |
136 | { | 144 | OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) |
145 | { | ||
137 | int i; | 146 | int i; |
138 | long l; | 147 | long l; |
139 | OCSP_CERTID* cid = NULL; | 148 | OCSP_CERTID* cid = NULL; |
@@ -141,45 +150,45 @@ int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags) | |||
141 | OCSP_REQINFO *inf = o->tbsRequest; | 150 | OCSP_REQINFO *inf = o->tbsRequest; |
142 | OCSP_SIGNATURE *sig = o->optionalSignature; | 151 | OCSP_SIGNATURE *sig = o->optionalSignature; |
143 | 152 | ||
144 | if (BIO_write(bp,"OCSP Request Data:\n",19) <= 0) goto err; | 153 | if (BIO_write(bp,"OCSP Request Data:\n",19) <= 0) |
145 | l=ASN1_INTEGER_get(inf->version); | 154 | goto err; |
146 | if (BIO_printf(bp," Version: %lu (0x%lx)",l+1,l) <= 0) goto err; | 155 | l = ASN1_INTEGER_get(inf->version); |
147 | if (inf->requestorName != NULL) | 156 | if (BIO_printf(bp," Version: %lu (0x%lx)",l+1,l) <= 0) |
148 | { | 157 | goto err; |
158 | if (inf->requestorName != NULL) { | ||
149 | if (BIO_write(bp,"\n Requestor Name: ",21) <= 0) | 159 | if (BIO_write(bp,"\n Requestor Name: ",21) <= 0) |
150 | goto err; | 160 | goto err; |
151 | GENERAL_NAME_print(bp, inf->requestorName); | 161 | GENERAL_NAME_print(bp, inf->requestorName); |
152 | } | 162 | } |
153 | if (BIO_write(bp,"\n Requestor List:\n",21) <= 0) goto err; | 163 | if (BIO_write(bp,"\n Requestor List:\n",21) <= 0) |
154 | for (i = 0; i < sk_OCSP_ONEREQ_num(inf->requestList); i++) | 164 | goto err; |
155 | { | 165 | for (i = 0; i < sk_OCSP_ONEREQ_num(inf->requestList); i++) { |
156 | one = sk_OCSP_ONEREQ_value(inf->requestList, i); | 166 | one = sk_OCSP_ONEREQ_value(inf->requestList, i); |
157 | cid = one->reqCert; | 167 | cid = one->reqCert; |
158 | ocsp_certid_print(bp, cid, 8); | 168 | ocsp_certid_print(bp, cid, 8); |
159 | if (!X509V3_extensions_print(bp, | 169 | if (!X509V3_extensions_print(bp, "Request Single Extensions", |
160 | "Request Single Extensions", | 170 | one->singleRequestExtensions, flags, 8)) |
161 | one->singleRequestExtensions, flags, 8)) | 171 | goto err; |
162 | goto err; | 172 | } |
163 | } | ||
164 | if (!X509V3_extensions_print(bp, "Request Extensions", | 173 | if (!X509V3_extensions_print(bp, "Request Extensions", |
165 | inf->requestExtensions, flags, 4)) | 174 | inf->requestExtensions, flags, 4)) |
166 | goto err; | 175 | goto err; |
167 | if (sig) | 176 | if (sig) { |
168 | { | 177 | X509_signature_print(bp, sig->signatureAlgorithm, |
169 | X509_signature_print(bp, sig->signatureAlgorithm, sig->signature); | 178 | sig->signature); |
170 | for (i=0; i<sk_X509_num(sig->certs); i++) | 179 | for (i=0; i<sk_X509_num(sig->certs); i++) { |
171 | { | ||
172 | X509_print(bp, sk_X509_value(sig->certs,i)); | 180 | X509_print(bp, sk_X509_value(sig->certs,i)); |
173 | PEM_write_bio_X509(bp,sk_X509_value(sig->certs,i)); | 181 | PEM_write_bio_X509(bp,sk_X509_value(sig->certs,i)); |
174 | } | ||
175 | } | 182 | } |
183 | } | ||
176 | return 1; | 184 | return 1; |
177 | err: | 185 | err: |
178 | return 0; | 186 | return 0; |
179 | } | 187 | } |
180 | 188 | ||
181 | int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) | 189 | int |
182 | { | 190 | OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) |
191 | { | ||
183 | int i, ret = 0; | 192 | int i, ret = 0; |
184 | long l; | 193 | long l; |
185 | OCSP_CERTID *cid = NULL; | 194 | OCSP_CERTID *cid = NULL; |
@@ -191,100 +200,107 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags) | |||
191 | OCSP_SINGLERESP *single = NULL; | 200 | OCSP_SINGLERESP *single = NULL; |
192 | OCSP_RESPBYTES *rb = o->responseBytes; | 201 | OCSP_RESPBYTES *rb = o->responseBytes; |
193 | 202 | ||
194 | if (BIO_puts(bp,"OCSP Response Data:\n") <= 0) goto err; | 203 | if (BIO_puts(bp,"OCSP Response Data:\n") <= 0) |
195 | l=ASN1_ENUMERATED_get(o->responseStatus); | 204 | goto err; |
205 | l = ASN1_ENUMERATED_get(o->responseStatus); | ||
196 | if (BIO_printf(bp," OCSP Response Status: %s (0x%lx)\n", | 206 | if (BIO_printf(bp," OCSP Response Status: %s (0x%lx)\n", |
197 | OCSP_response_status_str(l), l) <= 0) goto err; | 207 | OCSP_response_status_str(l), l) <= 0) |
198 | if (rb == NULL) return 1; | 208 | goto err; |
199 | if (BIO_puts(bp," Response Type: ") <= 0) | 209 | if (rb == NULL) |
200 | goto err; | 210 | return 1; |
211 | if (BIO_puts(bp," Response Type: ") <= 0) | ||
212 | goto err; | ||
201 | if(i2a_ASN1_OBJECT(bp, rb->responseType) <= 0) | 213 | if(i2a_ASN1_OBJECT(bp, rb->responseType) <= 0) |
202 | goto err; | 214 | goto err; |
203 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) | 215 | if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) { |
204 | { | ||
205 | BIO_puts(bp," (unknown response type)\n"); | 216 | BIO_puts(bp," (unknown response type)\n"); |
206 | return 1; | 217 | return 1; |
207 | } | 218 | } |
208 | 219 | ||
209 | i = ASN1_STRING_length(rb->response); | 220 | i = ASN1_STRING_length(rb->response); |
210 | if (!(br = OCSP_response_get1_basic(o))) goto err; | 221 | if (!(br = OCSP_response_get1_basic(o))) |
222 | goto err; | ||
211 | rd = br->tbsResponseData; | 223 | rd = br->tbsResponseData; |
212 | l=ASN1_INTEGER_get(rd->version); | 224 | l = ASN1_INTEGER_get(rd->version); |
213 | if (BIO_printf(bp,"\n Version: %lu (0x%lx)\n", | 225 | if (BIO_printf(bp,"\n Version: %lu (0x%lx)\n", l+1,l) <= 0) |
214 | l+1,l) <= 0) goto err; | 226 | goto err; |
215 | if (BIO_puts(bp," Responder Id: ") <= 0) goto err; | 227 | if (BIO_puts(bp," Responder Id: ") <= 0) |
228 | goto err; | ||
216 | 229 | ||
217 | rid = rd->responderId; | 230 | rid = rd->responderId; |
218 | switch (rid->type) | 231 | switch (rid->type) { |
219 | { | 232 | case V_OCSP_RESPID_NAME: |
220 | case V_OCSP_RESPID_NAME: | 233 | X509_NAME_print_ex(bp, rid->value.byName, 0, XN_FLAG_ONELINE); |
221 | X509_NAME_print_ex(bp, rid->value.byName, 0, XN_FLAG_ONELINE); | 234 | break; |
222 | break; | 235 | case V_OCSP_RESPID_KEY: |
223 | case V_OCSP_RESPID_KEY: | 236 | i2a_ASN1_STRING(bp, rid->value.byKey, V_ASN1_OCTET_STRING); |
224 | i2a_ASN1_STRING(bp, rid->value.byKey, V_ASN1_OCTET_STRING); | 237 | break; |
225 | break; | 238 | } |
226 | } | ||
227 | 239 | ||
228 | if (BIO_printf(bp,"\n Produced At: ")<=0) goto err; | 240 | if (BIO_printf(bp,"\n Produced At: ")<=0) |
229 | if (!ASN1_GENERALIZEDTIME_print(bp, rd->producedAt)) goto err; | 241 | goto err; |
230 | if (BIO_printf(bp,"\n Responses:\n") <= 0) goto err; | 242 | if (!ASN1_GENERALIZEDTIME_print(bp, rd->producedAt)) |
231 | for (i = 0; i < sk_OCSP_SINGLERESP_num(rd->responses); i++) | 243 | goto err; |
232 | { | 244 | if (BIO_printf(bp,"\n Responses:\n") <= 0) |
233 | if (! sk_OCSP_SINGLERESP_value(rd->responses, i)) continue; | 245 | goto err; |
246 | for (i = 0; i < sk_OCSP_SINGLERESP_num(rd->responses); i++) { | ||
247 | if (! sk_OCSP_SINGLERESP_value(rd->responses, i)) | ||
248 | continue; | ||
234 | single = sk_OCSP_SINGLERESP_value(rd->responses, i); | 249 | single = sk_OCSP_SINGLERESP_value(rd->responses, i); |
235 | cid = single->certId; | 250 | cid = single->certId; |
236 | if(ocsp_certid_print(bp, cid, 4) <= 0) goto err; | 251 | if (ocsp_certid_print(bp, cid, 4) <= 0) |
252 | goto err; | ||
237 | cst = single->certStatus; | 253 | cst = single->certStatus; |
238 | if (BIO_printf(bp," Cert Status: %s", | 254 | if (BIO_printf(bp," Cert Status: %s", |
239 | OCSP_cert_status_str(cst->type)) <= 0) | 255 | OCSP_cert_status_str(cst->type)) <= 0) |
240 | goto err; | 256 | goto err; |
241 | if (cst->type == V_OCSP_CERTSTATUS_REVOKED) | 257 | if (cst->type == V_OCSP_CERTSTATUS_REVOKED) { |
242 | { | 258 | rev = cst->value.revoked; |
243 | rev = cst->value.revoked; | ||
244 | if (BIO_printf(bp, "\n Revocation Time: ") <= 0) | 259 | if (BIO_printf(bp, "\n Revocation Time: ") <= 0) |
245 | goto err; | ||
246 | if (!ASN1_GENERALIZEDTIME_print(bp, | ||
247 | rev->revocationTime)) | ||
248 | goto err; | 260 | goto err; |
249 | if (rev->revocationReason) | 261 | if (!ASN1_GENERALIZEDTIME_print(bp, |
250 | { | 262 | rev->revocationTime)) |
251 | l=ASN1_ENUMERATED_get(rev->revocationReason); | 263 | goto err; |
252 | if (BIO_printf(bp, | 264 | if (rev->revocationReason) { |
253 | "\n Revocation Reason: %s (0x%lx)", | 265 | l = ASN1_ENUMERATED_get(rev->revocationReason); |
254 | OCSP_crl_reason_str(l), l) <= 0) | 266 | if (BIO_printf(bp, |
255 | goto err; | 267 | "\n Revocation Reason: %s (0x%lx)", |
256 | } | 268 | OCSP_crl_reason_str(l), l) <= 0) |
269 | goto err; | ||
257 | } | 270 | } |
258 | if (BIO_printf(bp,"\n This Update: ") <= 0) goto err; | 271 | } |
272 | if (BIO_printf(bp,"\n This Update: ") <= 0) | ||
273 | goto err; | ||
259 | if (!ASN1_GENERALIZEDTIME_print(bp, single->thisUpdate)) | 274 | if (!ASN1_GENERALIZEDTIME_print(bp, single->thisUpdate)) |
260 | goto err; | 275 | goto err; |
261 | if (single->nextUpdate) | 276 | if (single->nextUpdate) { |
262 | { | 277 | if (BIO_printf(bp,"\n Next Update: ") <= 0) |
263 | if (BIO_printf(bp,"\n Next Update: ") <= 0)goto err; | 278 | goto err; |
264 | if (!ASN1_GENERALIZEDTIME_print(bp,single->nextUpdate)) | 279 | if (!ASN1_GENERALIZEDTIME_print(bp,single->nextUpdate)) |
265 | goto err; | 280 | goto err; |
266 | } | ||
267 | if (BIO_write(bp,"\n",1) <= 0) goto err; | ||
268 | if (!X509V3_extensions_print(bp, | ||
269 | "Response Single Extensions", | ||
270 | single->singleExtensions, flags, 8)) | ||
271 | goto err; | ||
272 | if (BIO_write(bp,"\n",1) <= 0) goto err; | ||
273 | } | 281 | } |
282 | if (BIO_write(bp,"\n",1) <= 0) | ||
283 | goto err; | ||
284 | if (!X509V3_extensions_print(bp, "Response Single Extensions", | ||
285 | single->singleExtensions, flags, 8)) | ||
286 | goto err; | ||
287 | if (BIO_write(bp,"\n",1) <= 0) | ||
288 | goto err; | ||
289 | } | ||
274 | if (!X509V3_extensions_print(bp, "Response Extensions", | 290 | if (!X509V3_extensions_print(bp, "Response Extensions", |
275 | rd->responseExtensions, flags, 4)) | 291 | rd->responseExtensions, flags, 4)) |
276 | goto err; | 292 | goto err; |
277 | if(X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= 0) | 293 | if (X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= |
278 | goto err; | 294 | 0) |
295 | goto err; | ||
279 | 296 | ||
280 | for (i=0; i<sk_X509_num(br->certs); i++) | 297 | for (i = 0; i < sk_X509_num(br->certs); i++) { |
281 | { | 298 | X509_print(bp, sk_X509_value(br->certs, i)); |
282 | X509_print(bp, sk_X509_value(br->certs,i)); | 299 | PEM_write_bio_X509(bp,sk_X509_value(br->certs, i)); |
283 | PEM_write_bio_X509(bp,sk_X509_value(br->certs,i)); | 300 | } |
284 | } | ||
285 | 301 | ||
286 | ret = 1; | 302 | ret = 1; |
287 | err: | 303 | err: |
288 | OCSP_BASICRESP_free(br); | 304 | OCSP_BASICRESP_free(br); |
289 | return ret; | 305 | return ret; |
290 | } | 306 | } |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_srv.c b/src/lib/libssl/src/crypto/ocsp/ocsp_srv.c index 1c606dd0b6..c14e8e2bc3 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_srv.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_srv.c | |||
@@ -69,107 +69,118 @@ | |||
69 | * relevant information from the request. | 69 | * relevant information from the request. |
70 | */ | 70 | */ |
71 | 71 | ||
72 | int OCSP_request_onereq_count(OCSP_REQUEST *req) | 72 | int |
73 | { | 73 | OCSP_request_onereq_count(OCSP_REQUEST *req) |
74 | { | ||
74 | return sk_OCSP_ONEREQ_num(req->tbsRequest->requestList); | 75 | return sk_OCSP_ONEREQ_num(req->tbsRequest->requestList); |
75 | } | 76 | } |
76 | 77 | ||
77 | OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i) | 78 | OCSP_ONEREQ * |
78 | { | 79 | OCSP_request_onereq_get0(OCSP_REQUEST *req, int i) |
80 | { | ||
79 | return sk_OCSP_ONEREQ_value(req->tbsRequest->requestList, i); | 81 | return sk_OCSP_ONEREQ_value(req->tbsRequest->requestList, i); |
80 | } | 82 | } |
81 | 83 | ||
82 | OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one) | 84 | OCSP_CERTID * |
83 | { | 85 | OCSP_onereq_get0_id(OCSP_ONEREQ *one) |
86 | { | ||
84 | return one->reqCert; | 87 | return one->reqCert; |
85 | } | 88 | } |
86 | 89 | ||
87 | int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, | 90 | int |
88 | ASN1_OCTET_STRING **pikeyHash, | 91 | OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, |
89 | ASN1_INTEGER **pserial, OCSP_CERTID *cid) | 92 | ASN1_OCTET_STRING **pikeyHash, ASN1_INTEGER **pserial, OCSP_CERTID *cid) |
90 | { | 93 | { |
91 | if (!cid) return 0; | 94 | if (!cid) |
92 | if (pmd) *pmd = cid->hashAlgorithm->algorithm; | 95 | return 0; |
93 | if(piNameHash) *piNameHash = cid->issuerNameHash; | 96 | if (pmd) |
94 | if (pikeyHash) *pikeyHash = cid->issuerKeyHash; | 97 | *pmd = cid->hashAlgorithm->algorithm; |
95 | if (pserial) *pserial = cid->serialNumber; | 98 | if (piNameHash) |
99 | *piNameHash = cid->issuerNameHash; | ||
100 | if (pikeyHash) | ||
101 | *pikeyHash = cid->issuerKeyHash; | ||
102 | if (pserial) | ||
103 | *pserial = cid->serialNumber; | ||
96 | return 1; | 104 | return 1; |
97 | } | 105 | } |
98 | 106 | ||
99 | int OCSP_request_is_signed(OCSP_REQUEST *req) | 107 | int |
100 | { | 108 | OCSP_request_is_signed(OCSP_REQUEST *req) |
101 | if(req->optionalSignature) return 1; | 109 | { |
110 | if (req->optionalSignature) | ||
111 | return 1; | ||
102 | return 0; | 112 | return 0; |
103 | } | 113 | } |
104 | 114 | ||
105 | /* Create an OCSP response and encode an optional basic response */ | 115 | /* Create an OCSP response and encode an optional basic response */ |
106 | OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs) | 116 | OCSP_RESPONSE * |
107 | { | 117 | OCSP_response_create(int status, OCSP_BASICRESP *bs) |
108 | OCSP_RESPONSE *rsp = NULL; | 118 | { |
119 | OCSP_RESPONSE *rsp = NULL; | ||
109 | 120 | ||
110 | if (!(rsp = OCSP_RESPONSE_new())) goto err; | 121 | if (!(rsp = OCSP_RESPONSE_new())) |
111 | if (!(ASN1_ENUMERATED_set(rsp->responseStatus, status))) goto err; | 122 | goto err; |
112 | if (!bs) return rsp; | 123 | if (!(ASN1_ENUMERATED_set(rsp->responseStatus, status))) |
113 | if (!(rsp->responseBytes = OCSP_RESPBYTES_new())) goto err; | 124 | goto err; |
125 | if (!bs) | ||
126 | return rsp; | ||
127 | if (!(rsp->responseBytes = OCSP_RESPBYTES_new())) | ||
128 | goto err; | ||
114 | rsp->responseBytes->responseType = OBJ_nid2obj(NID_id_pkix_OCSP_basic); | 129 | rsp->responseBytes->responseType = OBJ_nid2obj(NID_id_pkix_OCSP_basic); |
115 | if (!ASN1_item_pack(bs, ASN1_ITEM_rptr(OCSP_BASICRESP), &rsp->responseBytes->response)) | 130 | if (!ASN1_item_pack(bs, ASN1_ITEM_rptr(OCSP_BASICRESP), |
116 | goto err; | 131 | &rsp->responseBytes->response)) |
132 | goto err; | ||
117 | return rsp; | 133 | return rsp; |
118 | err: | 134 | err: |
119 | if (rsp) OCSP_RESPONSE_free(rsp); | 135 | if (rsp) |
136 | OCSP_RESPONSE_free(rsp); | ||
120 | return NULL; | 137 | return NULL; |
121 | } | 138 | } |
122 | |||
123 | 139 | ||
124 | OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | 140 | OCSP_SINGLERESP * |
125 | OCSP_CERTID *cid, | 141 | OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid, int status, |
126 | int status, int reason, | 142 | int reason, ASN1_TIME *revtime, ASN1_TIME *thisupd, ASN1_TIME *nextupd) |
127 | ASN1_TIME *revtime, | 143 | { |
128 | ASN1_TIME *thisupd, ASN1_TIME *nextupd) | ||
129 | { | ||
130 | OCSP_SINGLERESP *single = NULL; | 144 | OCSP_SINGLERESP *single = NULL; |
131 | OCSP_CERTSTATUS *cs; | 145 | OCSP_CERTSTATUS *cs; |
132 | OCSP_REVOKEDINFO *ri; | 146 | OCSP_REVOKEDINFO *ri; |
133 | 147 | ||
134 | if(!rsp->tbsResponseData->responses && | 148 | if (!rsp->tbsResponseData->responses && |
135 | !(rsp->tbsResponseData->responses = sk_OCSP_SINGLERESP_new_null())) | 149 | !(rsp->tbsResponseData->responses = sk_OCSP_SINGLERESP_new_null())) |
136 | goto err; | 150 | goto err; |
137 | 151 | ||
138 | if (!(single = OCSP_SINGLERESP_new())) | 152 | if (!(single = OCSP_SINGLERESP_new())) |
139 | goto err; | 153 | goto err; |
140 | 154 | ||
141 | |||
142 | |||
143 | if (!ASN1_TIME_to_generalizedtime(thisupd, &single->thisUpdate)) | 155 | if (!ASN1_TIME_to_generalizedtime(thisupd, &single->thisUpdate)) |
144 | goto err; | 156 | goto err; |
145 | if (nextupd && | 157 | if (nextupd && |
146 | !ASN1_TIME_to_generalizedtime(nextupd, &single->nextUpdate)) | 158 | !ASN1_TIME_to_generalizedtime(nextupd, &single->nextUpdate)) |
147 | goto err; | 159 | goto err; |
148 | 160 | ||
149 | OCSP_CERTID_free(single->certId); | 161 | OCSP_CERTID_free(single->certId); |
150 | 162 | ||
151 | if(!(single->certId = OCSP_CERTID_dup(cid))) | 163 | if (!(single->certId = OCSP_CERTID_dup(cid))) |
152 | goto err; | 164 | goto err; |
153 | 165 | ||
154 | cs = single->certStatus; | 166 | cs = single->certStatus; |
155 | switch(cs->type = status) | 167 | switch(cs->type = status) { |
156 | { | ||
157 | case V_OCSP_CERTSTATUS_REVOKED: | 168 | case V_OCSP_CERTSTATUS_REVOKED: |
158 | if (!revtime) | 169 | if (!revtime) { |
159 | { | 170 | OCSPerr(OCSP_F_OCSP_BASIC_ADD1_STATUS, |
160 | OCSPerr(OCSP_F_OCSP_BASIC_ADD1_STATUS,OCSP_R_NO_REVOKED_TIME); | 171 | OCSP_R_NO_REVOKED_TIME); |
172 | goto err; | ||
173 | } | ||
174 | if (!(cs->value.revoked = ri = OCSP_REVOKEDINFO_new())) | ||
161 | goto err; | 175 | goto err; |
162 | } | ||
163 | if (!(cs->value.revoked = ri = OCSP_REVOKEDINFO_new())) goto err; | ||
164 | if (!ASN1_TIME_to_generalizedtime(revtime, &ri->revocationTime)) | 176 | if (!ASN1_TIME_to_generalizedtime(revtime, &ri->revocationTime)) |
165 | goto err; | 177 | goto err; |
166 | if (reason != OCSP_REVOKED_STATUS_NOSTATUS) | 178 | if (reason != OCSP_REVOKED_STATUS_NOSTATUS) { |
167 | { | ||
168 | if (!(ri->revocationReason = ASN1_ENUMERATED_new())) | 179 | if (!(ri->revocationReason = ASN1_ENUMERATED_new())) |
169 | goto err; | 180 | goto err; |
170 | if (!(ASN1_ENUMERATED_set(ri->revocationReason, | 181 | if (!(ASN1_ENUMERATED_set(ri->revocationReason, |
171 | reason))) | 182 | reason))) |
172 | goto err; | 183 | goto err; |
173 | } | 184 | } |
174 | break; | 185 | break; |
175 | 186 | ||
@@ -183,82 +194,80 @@ OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, | |||
183 | 194 | ||
184 | default: | 195 | default: |
185 | goto err; | 196 | goto err; |
186 | 197 | } | |
187 | } | ||
188 | if (!(sk_OCSP_SINGLERESP_push(rsp->tbsResponseData->responses, single))) | 198 | if (!(sk_OCSP_SINGLERESP_push(rsp->tbsResponseData->responses, single))) |
189 | goto err; | 199 | goto err; |
190 | return single; | 200 | return single; |
191 | err: | 201 | err: |
192 | OCSP_SINGLERESP_free(single); | 202 | OCSP_SINGLERESP_free(single); |
193 | return NULL; | 203 | return NULL; |
194 | } | 204 | } |
195 | 205 | ||
196 | /* Add a certificate to an OCSP request */ | 206 | /* Add a certificate to an OCSP request */ |
197 | 207 | int | |
198 | int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert) | 208 | OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert) |
199 | { | 209 | { |
200 | if (!resp->certs && !(resp->certs = sk_X509_new_null())) | 210 | if (!resp->certs && !(resp->certs = sk_X509_new_null())) |
201 | return 0; | 211 | return 0; |
202 | 212 | ||
203 | if(!sk_X509_push(resp->certs, cert)) return 0; | 213 | if (!sk_X509_push(resp->certs, cert)) |
214 | return 0; | ||
204 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); | 215 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); |
205 | return 1; | 216 | return 1; |
206 | } | 217 | } |
207 | 218 | ||
208 | int OCSP_basic_sign(OCSP_BASICRESP *brsp, | 219 | int |
209 | X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, | 220 | OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, |
210 | STACK_OF(X509) *certs, unsigned long flags) | 221 | const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags) |
211 | { | 222 | { |
212 | int i; | 223 | int i; |
213 | OCSP_RESPID *rid; | 224 | OCSP_RESPID *rid; |
214 | 225 | ||
215 | if (!X509_check_private_key(signer, key)) | 226 | if (!X509_check_private_key(signer, key)) { |
216 | { | 227 | OCSPerr(OCSP_F_OCSP_BASIC_SIGN, |
217 | OCSPerr(OCSP_F_OCSP_BASIC_SIGN, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | 228 | OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); |
218 | goto err; | 229 | goto err; |
219 | } | 230 | } |
220 | 231 | ||
221 | if(!(flags & OCSP_NOCERTS)) | 232 | if (!(flags & OCSP_NOCERTS)) { |
222 | { | 233 | if (!OCSP_basic_add1_cert(brsp, signer)) |
223 | if(!OCSP_basic_add1_cert(brsp, signer)) | ||
224 | goto err; | 234 | goto err; |
225 | for (i = 0; i < sk_X509_num(certs); i++) | 235 | for (i = 0; i < sk_X509_num(certs); i++) { |
226 | { | ||
227 | X509 *tmpcert = sk_X509_value(certs, i); | 236 | X509 *tmpcert = sk_X509_value(certs, i); |
228 | if(!OCSP_basic_add1_cert(brsp, tmpcert)) | 237 | if (!OCSP_basic_add1_cert(brsp, tmpcert)) |
229 | goto err; | 238 | goto err; |
230 | } | ||
231 | } | 239 | } |
240 | } | ||
232 | 241 | ||
233 | rid = brsp->tbsResponseData->responderId; | 242 | rid = brsp->tbsResponseData->responderId; |
234 | if (flags & OCSP_RESPID_KEY) | 243 | if (flags & OCSP_RESPID_KEY) { |
235 | { | ||
236 | unsigned char md[SHA_DIGEST_LENGTH]; | 244 | unsigned char md[SHA_DIGEST_LENGTH]; |
245 | |||
237 | X509_pubkey_digest(signer, EVP_sha1(), md, NULL); | 246 | X509_pubkey_digest(signer, EVP_sha1(), md, NULL); |
238 | if (!(rid->value.byKey = ASN1_OCTET_STRING_new())) | 247 | if (!(rid->value.byKey = ASN1_OCTET_STRING_new())) |
239 | goto err; | 248 | goto err; |
240 | if (!(ASN1_OCTET_STRING_set(rid->value.byKey, md, SHA_DIGEST_LENGTH))) | 249 | if (!(ASN1_OCTET_STRING_set(rid->value.byKey, md, |
241 | goto err; | 250 | SHA_DIGEST_LENGTH))) |
251 | goto err; | ||
242 | rid->type = V_OCSP_RESPID_KEY; | 252 | rid->type = V_OCSP_RESPID_KEY; |
243 | } | 253 | } else { |
244 | else | ||
245 | { | ||
246 | if (!X509_NAME_set(&rid->value.byName, | 254 | if (!X509_NAME_set(&rid->value.byName, |
247 | X509_get_subject_name(signer))) | 255 | X509_get_subject_name(signer))) |
248 | goto err; | 256 | goto err; |
249 | rid->type = V_OCSP_RESPID_NAME; | 257 | rid->type = V_OCSP_RESPID_NAME; |
250 | } | 258 | } |
251 | 259 | ||
252 | if (!(flags & OCSP_NOTIME) && | 260 | if (!(flags & OCSP_NOTIME) && |
253 | !X509_gmtime_adj(brsp->tbsResponseData->producedAt, 0)) | 261 | !X509_gmtime_adj(brsp->tbsResponseData->producedAt, 0)) |
254 | goto err; | 262 | goto err; |
255 | 263 | ||
256 | /* Right now, I think that not doing double hashing is the right | 264 | /* Right now, I think that not doing double hashing is the right |
257 | thing. -- Richard Levitte */ | 265 | thing. -- Richard Levitte */ |
258 | 266 | ||
259 | if (!OCSP_BASICRESP_sign(brsp, key, dgst, 0)) goto err; | 267 | if (!OCSP_BASICRESP_sign(brsp, key, dgst, 0)) |
268 | goto err; | ||
260 | 269 | ||
261 | return 1; | 270 | return 1; |
262 | err: | 271 | err: |
263 | return 0; | 272 | return 0; |
264 | } | 273 | } |
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c b/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c index 0b181d5abe..aede155871 100644 --- a/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c +++ b/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c | |||
@@ -60,134 +60,137 @@ | |||
60 | #include <openssl/err.h> | 60 | #include <openssl/err.h> |
61 | #include <string.h> | 61 | #include <string.h> |
62 | 62 | ||
63 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 63 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, |
64 | X509_STORE *st, unsigned long flags); | 64 | STACK_OF(X509) *certs, X509_STORE *st, unsigned long flags); |
65 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id); | 65 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id); |
66 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, unsigned long flags); | 66 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, |
67 | unsigned long flags); | ||
67 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret); | 68 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret); |
68 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, STACK_OF(OCSP_SINGLERESP) *sresp); | 69 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, |
70 | STACK_OF(OCSP_SINGLERESP) *sresp); | ||
69 | static int ocsp_check_delegated(X509 *x, int flags); | 71 | static int ocsp_check_delegated(X509 *x, int flags); |
70 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, STACK_OF(X509) *certs, | 72 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, |
71 | X509_STORE *st, unsigned long flags); | 73 | X509_NAME *nm, STACK_OF(X509) *certs, X509_STORE *st, |
74 | unsigned long flags); | ||
72 | 75 | ||
73 | /* Verify a basic response message */ | 76 | /* Verify a basic response message */ |
74 | 77 | int | |
75 | int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 78 | OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, X509_STORE *st, |
76 | X509_STORE *st, unsigned long flags) | 79 | unsigned long flags) |
77 | { | 80 | { |
78 | X509 *signer, *x; | 81 | X509 *signer, *x; |
79 | STACK_OF(X509) *chain = NULL; | 82 | STACK_OF(X509) *chain = NULL; |
80 | X509_STORE_CTX ctx; | 83 | X509_STORE_CTX ctx; |
81 | int i, ret = 0; | 84 | int i, ret = 0; |
85 | |||
82 | ret = ocsp_find_signer(&signer, bs, certs, st, flags); | 86 | ret = ocsp_find_signer(&signer, bs, certs, st, flags); |
83 | if (!ret) | 87 | if (!ret) { |
84 | { | 88 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
85 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); | 89 | OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); |
86 | goto end; | 90 | goto end; |
87 | } | 91 | } |
88 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) | 92 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) |
89 | flags |= OCSP_NOVERIFY; | 93 | flags |= OCSP_NOVERIFY; |
90 | if (!(flags & OCSP_NOSIGS)) | 94 | if (!(flags & OCSP_NOSIGS)) { |
91 | { | ||
92 | EVP_PKEY *skey; | 95 | EVP_PKEY *skey; |
96 | |||
93 | skey = X509_get_pubkey(signer); | 97 | skey = X509_get_pubkey(signer); |
94 | if (skey) | 98 | if (skey) { |
95 | { | ||
96 | ret = OCSP_BASICRESP_verify(bs, skey, 0); | 99 | ret = OCSP_BASICRESP_verify(bs, skey, 0); |
97 | EVP_PKEY_free(skey); | 100 | EVP_PKEY_free(skey); |
98 | } | 101 | } |
99 | if(!skey || ret <= 0) | 102 | if (!skey || ret <= 0) { |
100 | { | 103 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
101 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE); | 104 | OCSP_R_SIGNATURE_FAILURE); |
102 | goto end; | 105 | goto end; |
103 | } | ||
104 | } | 106 | } |
105 | if (!(flags & OCSP_NOVERIFY)) | 107 | } |
106 | { | 108 | if (!(flags & OCSP_NOVERIFY)) { |
107 | int init_res; | 109 | int init_res; |
110 | |||
108 | if(flags & OCSP_NOCHAIN) | 111 | if(flags & OCSP_NOCHAIN) |
109 | init_res = X509_STORE_CTX_init(&ctx, st, signer, NULL); | 112 | init_res = X509_STORE_CTX_init(&ctx, st, signer, NULL); |
110 | else | 113 | else |
111 | init_res = X509_STORE_CTX_init(&ctx, st, signer, bs->certs); | 114 | init_res = X509_STORE_CTX_init(&ctx, st, signer, |
112 | if(!init_res) | 115 | bs->certs); |
113 | { | 116 | if (!init_res) { |
114 | ret = -1; | 117 | ret = -1; |
115 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,ERR_R_X509_LIB); | 118 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,ERR_R_X509_LIB); |
116 | goto end; | 119 | goto end; |
117 | } | 120 | } |
118 | 121 | ||
119 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); | 122 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); |
120 | ret = X509_verify_cert(&ctx); | 123 | ret = X509_verify_cert(&ctx); |
121 | chain = X509_STORE_CTX_get1_chain(&ctx); | 124 | chain = X509_STORE_CTX_get1_chain(&ctx); |
122 | X509_STORE_CTX_cleanup(&ctx); | 125 | X509_STORE_CTX_cleanup(&ctx); |
123 | if (ret <= 0) | 126 | if (ret <= 0) { |
124 | { | ||
125 | i = X509_STORE_CTX_get_error(&ctx); | 127 | i = X509_STORE_CTX_get_error(&ctx); |
126 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,OCSP_R_CERTIFICATE_VERIFY_ERROR); | 128 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
129 | OCSP_R_CERTIFICATE_VERIFY_ERROR); | ||
127 | ERR_asprintf_error_data("Verify error:%s", | 130 | ERR_asprintf_error_data("Verify error:%s", |
128 | X509_verify_cert_error_string(i)); | 131 | X509_verify_cert_error_string(i)); |
129 | goto end; | 132 | goto end; |
130 | } | 133 | } |
131 | if(flags & OCSP_NOCHECKS) | 134 | if(flags & OCSP_NOCHECKS) { |
132 | { | ||
133 | ret = 1; | 135 | ret = 1; |
134 | goto end; | 136 | goto end; |
135 | } | 137 | } |
136 | /* At this point we have a valid certificate chain | 138 | /* At this point we have a valid certificate chain |
137 | * need to verify it against the OCSP issuer criteria. | 139 | * need to verify it against the OCSP issuer criteria. |
138 | */ | 140 | */ |
139 | ret = ocsp_check_issuer(bs, chain, flags); | 141 | ret = ocsp_check_issuer(bs, chain, flags); |
140 | 142 | ||
141 | /* If fatal error or valid match then finish */ | 143 | /* If fatal error or valid match then finish */ |
142 | if (ret != 0) goto end; | 144 | if (ret != 0) |
145 | goto end; | ||
143 | 146 | ||
144 | /* Easy case: explicitly trusted. Get root CA and | 147 | /* Easy case: explicitly trusted. Get root CA and |
145 | * check for explicit trust | 148 | * check for explicit trust |
146 | */ | 149 | */ |
147 | if(flags & OCSP_NOEXPLICIT) goto end; | 150 | if (flags & OCSP_NOEXPLICIT) |
151 | goto end; | ||
148 | 152 | ||
149 | x = sk_X509_value(chain, sk_X509_num(chain) - 1); | 153 | x = sk_X509_value(chain, sk_X509_num(chain) - 1); |
150 | if(X509_check_trust(x, NID_OCSP_sign, 0) != X509_TRUST_TRUSTED) | 154 | if (X509_check_trust(x, NID_OCSP_sign, 0) != |
151 | { | 155 | X509_TRUST_TRUSTED) { |
152 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,OCSP_R_ROOT_CA_NOT_TRUSTED); | 156 | OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, |
157 | OCSP_R_ROOT_CA_NOT_TRUSTED); | ||
153 | goto end; | 158 | goto end; |
154 | } | ||
155 | ret = 1; | ||
156 | } | 159 | } |
157 | 160 | ret = 1; | |
158 | |||
159 | |||
160 | end: | ||
161 | if(chain) sk_X509_pop_free(chain, X509_free); | ||
162 | return ret; | ||
163 | } | 161 | } |
164 | 162 | ||
163 | end: | ||
164 | if (chain) | ||
165 | sk_X509_pop_free(chain, X509_free); | ||
166 | return ret; | ||
167 | } | ||
165 | 168 | ||
166 | static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, | 169 | static int |
167 | X509_STORE *st, unsigned long flags) | 170 | ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs, STACK_OF(X509) *certs, |
168 | { | 171 | X509_STORE *st, unsigned long flags) |
172 | { | ||
169 | X509 *signer; | 173 | X509 *signer; |
170 | OCSP_RESPID *rid = bs->tbsResponseData->responderId; | 174 | OCSP_RESPID *rid = bs->tbsResponseData->responderId; |
171 | if ((signer = ocsp_find_signer_sk(certs, rid))) | 175 | |
172 | { | 176 | if ((signer = ocsp_find_signer_sk(certs, rid))) { |
173 | *psigner = signer; | 177 | *psigner = signer; |
174 | return 2; | 178 | return 2; |
175 | } | 179 | } |
176 | if(!(flags & OCSP_NOINTERN) && | 180 | if (!(flags & OCSP_NOINTERN) && |
177 | (signer = ocsp_find_signer_sk(bs->certs, rid))) | 181 | (signer = ocsp_find_signer_sk(bs->certs, rid))) { |
178 | { | ||
179 | *psigner = signer; | 182 | *psigner = signer; |
180 | return 1; | 183 | return 1; |
181 | } | 184 | } |
182 | /* Maybe lookup from store if by subject name */ | 185 | /* Maybe lookup from store if by subject name */ |
183 | 186 | ||
184 | *psigner = NULL; | 187 | *psigner = NULL; |
185 | return 0; | 188 | return 0; |
186 | } | 189 | } |
187 | |||
188 | 190 | ||
189 | static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) | 191 | static X509 * |
190 | { | 192 | ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) |
193 | { | ||
191 | int i; | 194 | int i; |
192 | unsigned char tmphash[SHA_DIGEST_LENGTH], *keyhash; | 195 | unsigned char tmphash[SHA_DIGEST_LENGTH], *keyhash; |
193 | X509 *x; | 196 | X509 *x; |
@@ -199,123 +202,124 @@ static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id) | |||
199 | /* Lookup by key hash */ | 202 | /* Lookup by key hash */ |
200 | 203 | ||
201 | /* If key hash isn't SHA1 length then forget it */ | 204 | /* If key hash isn't SHA1 length then forget it */ |
202 | if (id->value.byKey->length != SHA_DIGEST_LENGTH) return NULL; | 205 | if (id->value.byKey->length != SHA_DIGEST_LENGTH) |
206 | return NULL; | ||
203 | keyhash = id->value.byKey->data; | 207 | keyhash = id->value.byKey->data; |
204 | /* Calculate hash of each key and compare */ | 208 | /* Calculate hash of each key and compare */ |
205 | for (i = 0; i < sk_X509_num(certs); i++) | 209 | for (i = 0; i < sk_X509_num(certs); i++) { |
206 | { | ||
207 | x = sk_X509_value(certs, i); | 210 | x = sk_X509_value(certs, i); |
208 | X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL); | 211 | X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL); |
209 | if(!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH)) | 212 | if (!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH)) |
210 | return x; | 213 | return x; |
211 | } | ||
212 | return NULL; | ||
213 | } | 214 | } |
215 | return NULL; | ||
216 | } | ||
214 | 217 | ||
215 | 218 | static int | |
216 | static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, unsigned long flags) | 219 | ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain, |
217 | { | 220 | unsigned long flags) |
221 | { | ||
218 | STACK_OF(OCSP_SINGLERESP) *sresp; | 222 | STACK_OF(OCSP_SINGLERESP) *sresp; |
219 | X509 *signer, *sca; | 223 | X509 *signer, *sca; |
220 | OCSP_CERTID *caid = NULL; | 224 | OCSP_CERTID *caid = NULL; |
221 | int i; | 225 | int i; |
226 | |||
222 | sresp = bs->tbsResponseData->responses; | 227 | sresp = bs->tbsResponseData->responses; |
223 | 228 | ||
224 | if (sk_X509_num(chain) <= 0) | 229 | if (sk_X509_num(chain) <= 0) { |
225 | { | 230 | OCSPerr(OCSP_F_OCSP_CHECK_ISSUER, |
226 | OCSPerr(OCSP_F_OCSP_CHECK_ISSUER, OCSP_R_NO_CERTIFICATES_IN_CHAIN); | 231 | OCSP_R_NO_CERTIFICATES_IN_CHAIN); |
227 | return -1; | 232 | return -1; |
228 | } | 233 | } |
229 | 234 | ||
230 | /* See if the issuer IDs match. */ | 235 | /* See if the issuer IDs match. */ |
231 | i = ocsp_check_ids(sresp, &caid); | 236 | i = ocsp_check_ids(sresp, &caid); |
232 | 237 | ||
233 | /* If ID mismatch or other error then return */ | 238 | /* If ID mismatch or other error then return */ |
234 | if (i <= 0) return i; | 239 | if (i <= 0) |
240 | return i; | ||
235 | 241 | ||
236 | signer = sk_X509_value(chain, 0); | 242 | signer = sk_X509_value(chain, 0); |
237 | /* Check to see if OCSP responder CA matches request CA */ | 243 | /* Check to see if OCSP responder CA matches request CA */ |
238 | if (sk_X509_num(chain) > 1) | 244 | if (sk_X509_num(chain) > 1) { |
239 | { | ||
240 | sca = sk_X509_value(chain, 1); | 245 | sca = sk_X509_value(chain, 1); |
241 | i = ocsp_match_issuerid(sca, caid, sresp); | 246 | i = ocsp_match_issuerid(sca, caid, sresp); |
242 | if (i < 0) return i; | 247 | if (i < 0) |
243 | if (i) | 248 | return i; |
244 | { | 249 | if (i) { |
245 | /* We have a match, if extensions OK then success */ | 250 | /* We have a match, if extensions OK then success */ |
246 | if (ocsp_check_delegated(signer, flags)) return 1; | 251 | if (ocsp_check_delegated(signer, flags)) |
252 | return 1; | ||
247 | return 0; | 253 | return 0; |
248 | } | ||
249 | } | 254 | } |
255 | } | ||
250 | 256 | ||
251 | /* Otherwise check if OCSP request signed directly by request CA */ | 257 | /* Otherwise check if OCSP request signed directly by request CA */ |
252 | return ocsp_match_issuerid(signer, caid, sresp); | 258 | return ocsp_match_issuerid(signer, caid, sresp); |
253 | } | 259 | } |
254 | |||
255 | 260 | ||
256 | /* Check the issuer certificate IDs for equality. If there is a mismatch with the same | 261 | /* Check the issuer certificate IDs for equality. If there is a mismatch with the same |
257 | * algorithm then there's no point trying to match any certificates against the issuer. | 262 | * algorithm then there's no point trying to match any certificates against the issuer. |
258 | * If the issuer IDs all match then we just need to check equality against one of them. | 263 | * If the issuer IDs all match then we just need to check equality against one of them. |
259 | */ | 264 | */ |
260 | 265 | static int | |
261 | static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret) | 266 | ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret) |
262 | { | 267 | { |
263 | OCSP_CERTID *tmpid, *cid; | 268 | OCSP_CERTID *tmpid, *cid; |
264 | int i, idcount; | 269 | int i, idcount; |
265 | 270 | ||
266 | idcount = sk_OCSP_SINGLERESP_num(sresp); | 271 | idcount = sk_OCSP_SINGLERESP_num(sresp); |
267 | if (idcount <= 0) | 272 | if (idcount <= 0) { |
268 | { | 273 | OCSPerr(OCSP_F_OCSP_CHECK_IDS, |
269 | OCSPerr(OCSP_F_OCSP_CHECK_IDS, OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA); | 274 | OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA); |
270 | return -1; | 275 | return -1; |
271 | } | 276 | } |
272 | 277 | ||
273 | cid = sk_OCSP_SINGLERESP_value(sresp, 0)->certId; | 278 | cid = sk_OCSP_SINGLERESP_value(sresp, 0)->certId; |
274 | 279 | ||
275 | *ret = NULL; | 280 | *ret = NULL; |
276 | 281 | ||
277 | for (i = 1; i < idcount; i++) | 282 | for (i = 1; i < idcount; i++) { |
278 | { | ||
279 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; | 283 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; |
280 | /* Check to see if IDs match */ | 284 | /* Check to see if IDs match */ |
281 | if (OCSP_id_issuer_cmp(cid, tmpid)) | 285 | if (OCSP_id_issuer_cmp(cid, tmpid)) { |
282 | { | ||
283 | /* If algoritm mismatch let caller deal with it */ | 286 | /* If algoritm mismatch let caller deal with it */ |
284 | if (OBJ_cmp(tmpid->hashAlgorithm->algorithm, | 287 | if (OBJ_cmp(tmpid->hashAlgorithm->algorithm, |
285 | cid->hashAlgorithm->algorithm)) | 288 | cid->hashAlgorithm->algorithm)) |
286 | return 2; | 289 | return 2; |
287 | /* Else mismatch */ | 290 | /* Else mismatch */ |
288 | return 0; | 291 | return 0; |
289 | } | ||
290 | } | 292 | } |
293 | } | ||
291 | 294 | ||
292 | /* All IDs match: only need to check one ID */ | 295 | /* All IDs match: only need to check one ID */ |
293 | *ret = cid; | 296 | *ret = cid; |
294 | return 1; | 297 | return 1; |
295 | } | 298 | } |
296 | 299 | ||
297 | 300 | static int | |
298 | static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, | 301 | ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, |
299 | STACK_OF(OCSP_SINGLERESP) *sresp) | 302 | STACK_OF(OCSP_SINGLERESP) *sresp) |
300 | { | 303 | { |
301 | /* If only one ID to match then do it */ | 304 | /* If only one ID to match then do it */ |
302 | if(cid) | 305 | if (cid) { |
303 | { | ||
304 | const EVP_MD *dgst; | 306 | const EVP_MD *dgst; |
305 | X509_NAME *iname; | 307 | X509_NAME *iname; |
306 | int mdlen; | 308 | int mdlen; |
307 | unsigned char md[EVP_MAX_MD_SIZE]; | 309 | unsigned char md[EVP_MAX_MD_SIZE]; |
308 | if (!(dgst = EVP_get_digestbyobj(cid->hashAlgorithm->algorithm))) | 310 | |
309 | { | 311 | if (!(dgst = |
310 | OCSPerr(OCSP_F_OCSP_MATCH_ISSUERID, OCSP_R_UNKNOWN_MESSAGE_DIGEST); | 312 | EVP_get_digestbyobj(cid->hashAlgorithm->algorithm))) { |
313 | OCSPerr(OCSP_F_OCSP_MATCH_ISSUERID, | ||
314 | OCSP_R_UNKNOWN_MESSAGE_DIGEST); | ||
311 | return -1; | 315 | return -1; |
312 | } | 316 | } |
313 | 317 | ||
314 | mdlen = EVP_MD_size(dgst); | 318 | mdlen = EVP_MD_size(dgst); |
315 | if (mdlen < 0) | 319 | if (mdlen < 0) |
316 | return -1; | 320 | return -1; |
317 | if ((cid->issuerNameHash->length != mdlen) || | 321 | if (cid->issuerNameHash->length != mdlen || |
318 | (cid->issuerKeyHash->length != mdlen)) | 322 | cid->issuerKeyHash->length != mdlen) |
319 | return 0; | 323 | return 0; |
320 | iname = X509_get_subject_name(cert); | 324 | iname = X509_get_subject_name(cert); |
321 | if (!X509_NAME_digest(iname, dgst, md, NULL)) | 325 | if (!X509_NAME_digest(iname, dgst, md, NULL)) |
@@ -327,124 +331,123 @@ static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid, | |||
327 | return 0; | 331 | return 0; |
328 | 332 | ||
329 | return 1; | 333 | return 1; |
330 | 334 | } else { | |
331 | } | ||
332 | else | ||
333 | { | ||
334 | /* We have to match the whole lot */ | 335 | /* We have to match the whole lot */ |
335 | int i, ret; | 336 | int i, ret; |
336 | OCSP_CERTID *tmpid; | 337 | OCSP_CERTID *tmpid; |
337 | for (i = 0; i < sk_OCSP_SINGLERESP_num(sresp); i++) | 338 | |
338 | { | 339 | for (i = 0; i < sk_OCSP_SINGLERESP_num(sresp); i++) { |
339 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; | 340 | tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId; |
340 | ret = ocsp_match_issuerid(cert, tmpid, NULL); | 341 | ret = ocsp_match_issuerid(cert, tmpid, NULL); |
341 | if (ret <= 0) return ret; | 342 | if (ret <= 0) |
342 | } | 343 | return ret; |
343 | return 1; | ||
344 | } | 344 | } |
345 | 345 | return 1; | |
346 | } | 346 | } |
347 | } | ||
347 | 348 | ||
348 | static int ocsp_check_delegated(X509 *x, int flags) | 349 | static int |
349 | { | 350 | ocsp_check_delegated(X509 *x, int flags) |
351 | { | ||
350 | X509_check_purpose(x, -1, 0); | 352 | X509_check_purpose(x, -1, 0); |
351 | if ((x->ex_flags & EXFLAG_XKUSAGE) && | 353 | if ((x->ex_flags & EXFLAG_XKUSAGE) && (x->ex_xkusage & XKU_OCSP_SIGN)) |
352 | (x->ex_xkusage & XKU_OCSP_SIGN)) | ||
353 | return 1; | 354 | return 1; |
354 | OCSPerr(OCSP_F_OCSP_CHECK_DELEGATED, OCSP_R_MISSING_OCSPSIGNING_USAGE); | 355 | OCSPerr(OCSP_F_OCSP_CHECK_DELEGATED, OCSP_R_MISSING_OCSPSIGNING_USAGE); |
355 | return 0; | 356 | return 0; |
356 | } | 357 | } |
357 | 358 | ||
358 | /* Verify an OCSP request. This is fortunately much easier than OCSP | 359 | /* Verify an OCSP request. This is fortunately much easier than OCSP |
359 | * response verify. Just find the signers certificate and verify it | 360 | * response verify. Just find the signers certificate and verify it |
360 | * against a given trust value. | 361 | * against a given trust value. |
361 | */ | 362 | */ |
362 | 363 | int | |
363 | int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags) | 364 | OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, |
364 | { | 365 | unsigned long flags) |
366 | { | ||
365 | X509 *signer; | 367 | X509 *signer; |
366 | X509_NAME *nm; | 368 | X509_NAME *nm; |
367 | GENERAL_NAME *gen; | 369 | GENERAL_NAME *gen; |
368 | int ret; | 370 | int ret; |
369 | X509_STORE_CTX ctx; | 371 | X509_STORE_CTX ctx; |
370 | if (!req->optionalSignature) | 372 | |
371 | { | 373 | if (!req->optionalSignature) { |
372 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_REQUEST_NOT_SIGNED); | 374 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_REQUEST_NOT_SIGNED); |
373 | return 0; | 375 | return 0; |
374 | } | 376 | } |
375 | gen = req->tbsRequest->requestorName; | 377 | gen = req->tbsRequest->requestorName; |
376 | if (!gen || gen->type != GEN_DIRNAME) | 378 | if (!gen || gen->type != GEN_DIRNAME) { |
377 | { | 379 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
378 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE); | 380 | OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE); |
379 | return 0; | 381 | return 0; |
380 | } | 382 | } |
381 | nm = gen->d.directoryName; | 383 | nm = gen->d.directoryName; |
382 | ret = ocsp_req_find_signer(&signer, req, nm, certs, store, flags); | 384 | ret = ocsp_req_find_signer(&signer, req, nm, certs, store, flags); |
383 | if (ret <= 0) | 385 | if (ret <= 0) { |
384 | { | 386 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
385 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); | 387 | OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND); |
386 | return 0; | 388 | return 0; |
387 | } | 389 | } |
388 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) | 390 | if ((ret == 2) && (flags & OCSP_TRUSTOTHER)) |
389 | flags |= OCSP_NOVERIFY; | 391 | flags |= OCSP_NOVERIFY; |
390 | if (!(flags & OCSP_NOSIGS)) | 392 | if (!(flags & OCSP_NOSIGS)) { |
391 | { | ||
392 | EVP_PKEY *skey; | 393 | EVP_PKEY *skey; |
394 | |||
393 | skey = X509_get_pubkey(signer); | 395 | skey = X509_get_pubkey(signer); |
394 | ret = OCSP_REQUEST_verify(req, skey); | 396 | ret = OCSP_REQUEST_verify(req, skey); |
395 | EVP_PKEY_free(skey); | 397 | EVP_PKEY_free(skey); |
396 | if(ret <= 0) | 398 | if (ret <= 0) { |
397 | { | 399 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
398 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_SIGNATURE_FAILURE); | 400 | OCSP_R_SIGNATURE_FAILURE); |
399 | return 0; | 401 | return 0; |
400 | } | ||
401 | } | 402 | } |
402 | if (!(flags & OCSP_NOVERIFY)) | 403 | } |
403 | { | 404 | if (!(flags & OCSP_NOVERIFY)) { |
404 | int init_res; | 405 | int init_res; |
405 | if(flags & OCSP_NOCHAIN) | 406 | |
406 | init_res = X509_STORE_CTX_init(&ctx, store, signer, NULL); | 407 | if (flags & OCSP_NOCHAIN) |
408 | init_res = X509_STORE_CTX_init(&ctx, store, signer, | ||
409 | NULL); | ||
407 | else | 410 | else |
408 | init_res = X509_STORE_CTX_init(&ctx, store, signer, | 411 | init_res = X509_STORE_CTX_init(&ctx, store, signer, |
409 | req->optionalSignature->certs); | 412 | req->optionalSignature->certs); |
410 | if(!init_res) | 413 | if (!init_res) { |
411 | { | ||
412 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,ERR_R_X509_LIB); | 414 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,ERR_R_X509_LIB); |
413 | return 0; | 415 | return 0; |
414 | } | 416 | } |
415 | 417 | ||
416 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); | 418 | X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER); |
417 | X509_STORE_CTX_set_trust(&ctx, X509_TRUST_OCSP_REQUEST); | 419 | X509_STORE_CTX_set_trust(&ctx, X509_TRUST_OCSP_REQUEST); |
418 | ret = X509_verify_cert(&ctx); | 420 | ret = X509_verify_cert(&ctx); |
419 | X509_STORE_CTX_cleanup(&ctx); | 421 | X509_STORE_CTX_cleanup(&ctx); |
420 | if (ret <= 0) | 422 | if (ret <= 0) { |
421 | { | ||
422 | ret = X509_STORE_CTX_get_error(&ctx); | 423 | ret = X509_STORE_CTX_get_error(&ctx); |
423 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,OCSP_R_CERTIFICATE_VERIFY_ERROR); | 424 | OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, |
425 | OCSP_R_CERTIFICATE_VERIFY_ERROR); | ||
424 | ERR_asprintf_error_data("Verify error:%s", | 426 | ERR_asprintf_error_data("Verify error:%s", |
425 | X509_verify_cert_error_string(ret)); | 427 | X509_verify_cert_error_string(ret)); |
426 | return 0; | 428 | return 0; |
427 | } | ||
428 | } | 429 | } |
430 | } | ||
429 | return 1; | 431 | return 1; |
430 | } | 432 | } |
431 | 433 | ||
432 | static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, STACK_OF(X509) *certs, | 434 | static int |
433 | X509_STORE *st, unsigned long flags) | 435 | ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req, X509_NAME *nm, |
434 | { | 436 | STACK_OF(X509) *certs, X509_STORE *st, unsigned long flags) |
437 | { | ||
435 | X509 *signer; | 438 | X509 *signer; |
436 | if(!(flags & OCSP_NOINTERN)) | 439 | |
437 | { | 440 | if (!(flags & OCSP_NOINTERN)) { |
438 | signer = X509_find_by_subject(req->optionalSignature->certs, nm); | 441 | signer = |
442 | X509_find_by_subject(req->optionalSignature->certs, nm); | ||
439 | *psigner = signer; | 443 | *psigner = signer; |
440 | return 1; | 444 | return 1; |
441 | } | 445 | } |
442 | 446 | ||
443 | signer = X509_find_by_subject(certs, nm); | 447 | signer = X509_find_by_subject(certs, nm); |
444 | if (signer) | 448 | if (signer) { |
445 | { | ||
446 | *psigner = signer; | 449 | *psigner = signer; |
447 | return 2; | 450 | return 2; |
448 | } | ||
449 | return 0; | ||
450 | } | 451 | } |
452 | return 0; | ||
453 | } | ||