| 1334 | } |
| 1335 | |
| 1336 | apr_status_t md_cert_get_issuers_uri(const char **puri, const md_cert_t *cert, apr_pool_t *p) |
| 1337 | { |
| 1338 | apr_status_t rv = APR_ENOENT; |
| 1339 | STACK_OF(ACCESS_DESCRIPTION) *xinfos; |
| 1340 | const char *uri = NULL; |
| 1341 | unsigned char *buf; |
| 1342 | int i; |
| 1343 | |
| 1344 | xinfos = X509_get_ext_d2i(cert->x509, NID_info_access, NULL, NULL); |
| 1345 | if (xinfos) { |
| 1346 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(xinfos); i++) { |
| 1347 | ACCESS_DESCRIPTION *val = sk_ACCESS_DESCRIPTION_value(xinfos, i); |
| 1348 | if (OBJ_obj2nid(val->method) == NID_ad_ca_issuers |
| 1349 | && val->location && val->location->type == GEN_URI) { |
| 1350 | ASN1_STRING_to_UTF8(&buf, val->location->d.uniformResourceIdentifier); |
| 1351 | uri = apr_pstrdup(p, (char *)buf); |
| 1352 | OPENSSL_free(buf); |
| 1353 | rv = APR_SUCCESS; |
| 1354 | break; |
| 1355 | } |
| 1356 | } |
| 1357 | sk_ACCESS_DESCRIPTION_pop_free(xinfos, ACCESS_DESCRIPTION_free); |
| 1358 | } |
| 1359 | *puri = (APR_SUCCESS == rv)? uri : NULL; |
| 1360 | return rv; |
| 1361 | } |
| 1362 | |
| 1363 | apr_status_t md_cert_get_alt_names(apr_array_header_t **pnames, const md_cert_t *cert, apr_pool_t *p) |
| 1364 | { |