summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_ocsp.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libtls/tls_ocsp.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/lib/libtls/tls_ocsp.c b/src/lib/libtls/tls_ocsp.c
index a8835edc8f..307ae842b8 100644
--- a/src/lib/libtls/tls_ocsp.c
+++ b/src/lib/libtls/tls_ocsp.c
@@ -101,23 +101,24 @@ tls_ocsp_fill_info(struct tls *ctx, int response_status, int cert_status,
101 tls_ocsp_asn1_parse_time(ctx, revtime, &info->revocation_time) != 0) { 101 tls_ocsp_asn1_parse_time(ctx, revtime, &info->revocation_time) != 0) {
102 tls_set_error(ctx, 102 tls_set_error(ctx,
103 "unable to parse revocation time in OCSP reply"); 103 "unable to parse revocation time in OCSP reply");
104 goto error; 104 goto err;
105 } 105 }
106 if (thisupd != NULL && 106 if (thisupd != NULL &&
107 tls_ocsp_asn1_parse_time(ctx, thisupd, &info->this_update) != 0) { 107 tls_ocsp_asn1_parse_time(ctx, thisupd, &info->this_update) != 0) {
108 tls_set_error(ctx, 108 tls_set_error(ctx,
109 "unable to parse this update time in OCSP reply"); 109 "unable to parse this update time in OCSP reply");
110 goto error; 110 goto err;
111 } 111 }
112 if (nextupd != NULL && 112 if (nextupd != NULL &&
113 tls_ocsp_asn1_parse_time(ctx, nextupd, &info->next_update) != 0) { 113 tls_ocsp_asn1_parse_time(ctx, nextupd, &info->next_update) != 0) {
114 tls_set_error(ctx, 114 tls_set_error(ctx,
115 "unable to parse next update time in OCSP reply"); 115 "unable to parse next update time in OCSP reply");
116 goto error; 116 goto err;
117 } 117 }
118 ctx->ocsp->ocsp_result = info; 118 ctx->ocsp->ocsp_result = info;
119 return 0; 119 return 0;
120 error: 120
121 err:
121 free(info); 122 free(info);
122 return -1; 123 return -1;
123} 124}
@@ -162,32 +163,32 @@ tls_ocsp_setup_from_peer(struct tls *ctx)
162 STACK_OF(OPENSSL_STRING) *ocsp_urls = NULL; 163 STACK_OF(OPENSSL_STRING) *ocsp_urls = NULL;
163 164
164 if ((ocsp = tls_ocsp_new()) == NULL) 165 if ((ocsp = tls_ocsp_new()) == NULL)
165 goto failed; 166 goto err;
166 167
167 /* steal state from ctx struct */ 168 /* steal state from ctx struct */
168 ocsp->main_cert = SSL_get_peer_certificate(ctx->ssl_conn); 169 ocsp->main_cert = SSL_get_peer_certificate(ctx->ssl_conn);
169 ocsp->extra_certs = SSL_get_peer_cert_chain(ctx->ssl_conn); 170 ocsp->extra_certs = SSL_get_peer_cert_chain(ctx->ssl_conn);
170 if (ocsp->main_cert == NULL) { 171 if (ocsp->main_cert == NULL) {
171 tls_set_errorx(ctx, "no peer certificate for OCSP"); 172 tls_set_errorx(ctx, "no peer certificate for OCSP");
172 goto failed; 173 goto err;
173 } 174 }
174 175
175 ocsp_urls = X509_get1_ocsp(ocsp->main_cert); 176 ocsp_urls = X509_get1_ocsp(ocsp->main_cert);
176 if (ocsp_urls == NULL) { 177 if (ocsp_urls == NULL) {
177 tls_set_errorx(ctx, "no OCSP URLs in peer certificate"); 178 tls_set_errorx(ctx, "no OCSP URLs in peer certificate");
178 goto failed; 179 goto err;
179 } 180 }
180 181
181 ocsp->ocsp_url = strdup(sk_OPENSSL_STRING_value(ocsp_urls, 0)); 182 ocsp->ocsp_url = strdup(sk_OPENSSL_STRING_value(ocsp_urls, 0));
182 if (ocsp->ocsp_url == NULL) { 183 if (ocsp->ocsp_url == NULL) {
183 tls_set_errorx(ctx, "out of memory"); 184 tls_set_errorx(ctx, "out of memory");
184 goto failed; 185 goto err;
185 } 186 }
186 187
187 X509_email_free(ocsp_urls); 188 X509_email_free(ocsp_urls);
188 return ocsp; 189 return ocsp;
189 190
190 failed: 191 err:
191 tls_ocsp_free(ocsp); 192 tls_ocsp_free(ocsp);
192 X509_email_free(ocsp_urls); 193 X509_email_free(ocsp_urls);
193 return NULL; 194 return NULL;
@@ -206,7 +207,7 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp)
206 207
207 if ((br = OCSP_response_get1_basic(resp)) == NULL) { 208 if ((br = OCSP_response_get1_basic(resp)) == NULL) {
208 tls_set_errorx(ctx, "cannot load ocsp reply"); 209 tls_set_errorx(ctx, "cannot load ocsp reply");
209 goto error; 210 goto err;
210 } 211 }
211 212
212 /* 213 /*
@@ -219,7 +220,7 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp)
219 if (OCSP_basic_verify(br, ctx->ocsp->extra_certs, 220 if (OCSP_basic_verify(br, ctx->ocsp->extra_certs,
220 SSL_CTX_get_cert_store(ctx->ssl_ctx), flags) != 1) { 221 SSL_CTX_get_cert_store(ctx->ssl_ctx), flags) != 1) {
221 tls_set_error(ctx, "ocsp verify failed"); 222 tls_set_error(ctx, "ocsp verify failed");
222 goto error; 223 goto err;
223 } 224 }
224 225
225 /* signature OK, look inside */ 226 /* signature OK, look inside */
@@ -227,43 +228,43 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp)
227 if (response_status != OCSP_RESPONSE_STATUS_SUCCESSFUL) { 228 if (response_status != OCSP_RESPONSE_STATUS_SUCCESSFUL) {
228 tls_set_errorx(ctx, "ocsp verify failed: response - %s", 229 tls_set_errorx(ctx, "ocsp verify failed: response - %s",
229 OCSP_response_status_str(response_status)); 230 OCSP_response_status_str(response_status));
230 goto error; 231 goto err;
231 } 232 }
232 233
233 cid = tls_ocsp_get_certid(ctx->ocsp->main_cert, 234 cid = tls_ocsp_get_certid(ctx->ocsp->main_cert,
234 ctx->ocsp->extra_certs, ctx->ssl_ctx); 235 ctx->ocsp->extra_certs, ctx->ssl_ctx);
235 if (cid == NULL) { 236 if (cid == NULL) {
236 tls_set_errorx(ctx, "ocsp verify failed: no issuer cert"); 237 tls_set_errorx(ctx, "ocsp verify failed: no issuer cert");
237 goto error; 238 goto err;
238 } 239 }
239 240
240 if (OCSP_resp_find_status(br, cid, &cert_status, &crl_reason, 241 if (OCSP_resp_find_status(br, cid, &cert_status, &crl_reason,
241 &revtime, &thisupd, &nextupd) != 1) { 242 &revtime, &thisupd, &nextupd) != 1) {
242 tls_set_errorx(ctx, "ocsp verify failed: no result for cert"); 243 tls_set_errorx(ctx, "ocsp verify failed: no result for cert");
243 goto error; 244 goto err;
244 } 245 }
245 246
246 if (OCSP_check_validity(thisupd, nextupd, JITTER_SEC, 247 if (OCSP_check_validity(thisupd, nextupd, JITTER_SEC,
247 MAXAGE_SEC) != 1) { 248 MAXAGE_SEC) != 1) {
248 tls_set_errorx(ctx, 249 tls_set_errorx(ctx,
249 "ocsp verify failed: ocsp response not current"); 250 "ocsp verify failed: ocsp response not current");
250 goto error; 251 goto err;
251 } 252 }
252 253
253 if (tls_ocsp_fill_info(ctx, response_status, cert_status, 254 if (tls_ocsp_fill_info(ctx, response_status, cert_status,
254 crl_reason, revtime, thisupd, nextupd) != 0) 255 crl_reason, revtime, thisupd, nextupd) != 0)
255 goto error; 256 goto err;
256 257
257 /* finally can look at status */ 258 /* finally can look at status */
258 if (cert_status != V_OCSP_CERTSTATUS_GOOD && cert_status != 259 if (cert_status != V_OCSP_CERTSTATUS_GOOD && cert_status !=
259 V_OCSP_CERTSTATUS_UNKNOWN) { 260 V_OCSP_CERTSTATUS_UNKNOWN) {
260 tls_set_errorx(ctx, "ocsp verify failed: revoked cert - %s", 261 tls_set_errorx(ctx, "ocsp verify failed: revoked cert - %s",
261 OCSP_crl_reason_str(crl_reason)); 262 OCSP_crl_reason_str(crl_reason));
262 goto error; 263 goto err;
263 } 264 }
264 ret = 0; 265 ret = 0;
265 266
266 error: 267 err:
267 sk_X509_free(combined); 268 sk_X509_free(combined);
268 OCSP_CERTID_free(cid); 269 OCSP_CERTID_free(cid);
269 OCSP_BASICRESP_free(br); 270 OCSP_BASICRESP_free(br);