| 318 | } |
| 319 | |
| 320 | apr_status_t md_ocsp_prime(md_ocsp_reg_t *reg, const char *ext_id, apr_size_t ext_id_len, |
| 321 | md_cert_t *cert, md_cert_t *issuer, const md_t *md) |
| 322 | { |
| 323 | md_ocsp_status_t *ostat; |
| 324 | const char *name; |
| 325 | md_data_t id; |
| 326 | apr_status_t rv = APR_SUCCESS; |
| 327 | |
| 328 | /* Called during post_config. no mutex protection needed */ |
| 329 | name = md? md->name : MD_OTHER; |
| 330 | md_log_perror(MD_LOG_MARK, MD_LOG_DEBUG, 0, reg->p, |
| 331 | "md[%s]: priming OCSP status", name); |
| 332 | |
| 333 | rv = md_ocsp_init_id(&id, reg->p, cert); |
| 334 | if (APR_SUCCESS != rv) goto cleanup; |
| 335 | |
| 336 | ostat = apr_hash_get(reg->ostat_by_id, id.data, (apr_ssize_t)id.len); |
| 337 | if (ostat) goto cleanup; /* already seen it, cert is used in >1 server_rec */ |
| 338 | |
| 339 | ostat = apr_pcalloc(reg->p, sizeof(*ostat)); |
| 340 | ostat->id = id; |
| 341 | ostat->reg = reg; |
| 342 | ostat->md_name = name; |
| 343 | md_data_to_hex(&ostat->hexid, 0, reg->p, &ostat->id); |
| 344 | ostat->file_name = apr_psprintf(reg->p, "ocsp-%s.json", ostat->hexid); |
| 345 | rv = md_cert_to_sha256_fingerprint(&ostat->hex_sha256, cert, reg->p); |
| 346 | if (APR_SUCCESS != rv) goto cleanup; |
| 347 | |
| 348 | md_log_perror(MD_LOG_MARK, MD_LOG_TRACE2, 0, reg->p, |
| 349 | "md[%s]: getting ocsp responder from cert", name); |
| 350 | rv = md_cert_get_ocsp_responder_url(&ostat->responder_url, reg->p, cert); |
| 351 | if (APR_SUCCESS != rv) { |
| 352 | md_log_perror(MD_LOG_MARK, MD_LOG_DEBUG, rv, reg->p, |
| 353 | "md[%s]: certificate with serial %s has no OCSP responder URL", |
| 354 | name, md_cert_get_serial_number(cert, reg->p)); |
| 355 | goto cleanup; |
| 356 | } |
| 357 | |
| 358 | ostat->certid = OCSP_cert_to_id(NULL, md_cert_get_X509(cert), md_cert_get_X509(issuer)); |
| 359 | if (!ostat->certid) { |
| 360 | rv = APR_EGENERAL; |
| 361 | md_log_perror(MD_LOG_MARK, MD_LOG_ERR, rv, reg->p, |
| 362 | "md[%s]: unable to create OCSP certid for certificate with serial %s", |
| 363 | name, md_cert_get_serial_number(cert, reg->p)); |
| 364 | goto cleanup; |
| 365 | } |
| 366 | |
| 367 | /* See, if we have something in store */ |
| 368 | ocsp_status_refresh(ostat, reg->p); |
| 369 | md_log_perror(MD_LOG_MARK, MD_LOG_DEBUG, rv, reg->p, |
| 370 | "md[%s]: adding ocsp info (responder=%s)", |
| 371 | name, ostat->responder_url); |
| 372 | apr_hash_set(reg->ostat_by_id, ostat->id.data, (apr_ssize_t)ostat->id.len, ostat); |
| 373 | if (ext_id) { |
| 374 | md_ocsp_id_map_t *id_map; |
| 375 | |
| 376 | id_map = apr_pcalloc(reg->p, sizeof(*id_map)); |
| 377 | id_map->id = id; |
no test coverage detected