Moved CRL distribution point building to an exportable function
This commit is contained in:
@@ -1929,6 +1929,47 @@ chunk_t x509_build_subjectAltNames(linked_list_t *list)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode CRL distribution points extension from a x509_cdp_t list
|
||||||
|
*/
|
||||||
|
chunk_t x509_build_crlDistributionPoints(linked_list_t *list, int extn)
|
||||||
|
{
|
||||||
|
chunk_t crlDistributionPoints = chunk_empty;
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
x509_cdp_t *cdp;
|
||||||
|
|
||||||
|
if (list->get_count(list) == 0)
|
||||||
|
{
|
||||||
|
return chunk_empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
enumerator = list->create_enumerator(list);
|
||||||
|
while (enumerator->enumerate(enumerator, &cdp))
|
||||||
|
{
|
||||||
|
chunk_t distributionPoint, crlIssuer = chunk_empty;
|
||||||
|
|
||||||
|
if (cdp->issuer)
|
||||||
|
{
|
||||||
|
crlIssuer = asn1_wrap(ASN1_CONTEXT_C_2, "m",
|
||||||
|
build_generalName(cdp->issuer));
|
||||||
|
}
|
||||||
|
distributionPoint = asn1_wrap(ASN1_SEQUENCE, "mm",
|
||||||
|
asn1_wrap(ASN1_CONTEXT_C_0, "m",
|
||||||
|
asn1_wrap(ASN1_CONTEXT_C_0, "m",
|
||||||
|
asn1_wrap(ASN1_CONTEXT_S_6, "c",
|
||||||
|
chunk_create(cdp->uri, strlen(cdp->uri))))),
|
||||||
|
crlIssuer);
|
||||||
|
crlDistributionPoints = chunk_cat("mm", crlDistributionPoints,
|
||||||
|
distributionPoint);
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
return asn1_wrap(ASN1_SEQUENCE, "mm",
|
||||||
|
asn1_build_known_oid(extn),
|
||||||
|
asn1_wrap(ASN1_OCTET_STRING, "m",
|
||||||
|
asn1_wrap(ASN1_SEQUENCE, "m", crlDistributionPoints)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate and sign a new certificate
|
* Generate and sign a new certificate
|
||||||
*/
|
*/
|
||||||
@@ -1945,7 +1986,6 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
|
|||||||
chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty;
|
chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty;
|
||||||
chunk_t policyConstraints = chunk_empty;
|
chunk_t policyConstraints = chunk_empty;
|
||||||
identification_t *issuer, *subject;
|
identification_t *issuer, *subject;
|
||||||
x509_cdp_t *cdp;
|
|
||||||
chunk_t key_info;
|
chunk_t key_info;
|
||||||
signature_scheme_t scheme;
|
signature_scheme_t scheme;
|
||||||
hasher_t *hasher;
|
hasher_t *hasher;
|
||||||
@@ -1998,34 +2038,8 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
|
|||||||
/* encode subjectAltNames */
|
/* encode subjectAltNames */
|
||||||
subjectAltNames = x509_build_subjectAltNames(cert->subjectAltNames);
|
subjectAltNames = x509_build_subjectAltNames(cert->subjectAltNames);
|
||||||
|
|
||||||
/* encode CRL distribution points extension */
|
crlDistributionPoints = x509_build_crlDistributionPoints(cert->crl_uris,
|
||||||
enumerator = cert->crl_uris->create_enumerator(cert->crl_uris);
|
OID_CRL_DISTRIBUTION_POINTS);
|
||||||
while (enumerator->enumerate(enumerator, &cdp))
|
|
||||||
{
|
|
||||||
chunk_t distributionPoint, crlIssuer = chunk_empty;
|
|
||||||
|
|
||||||
if (cdp->issuer)
|
|
||||||
{
|
|
||||||
crlIssuer = asn1_wrap(ASN1_CONTEXT_C_2, "m",
|
|
||||||
build_generalName(cdp->issuer));
|
|
||||||
}
|
|
||||||
distributionPoint = asn1_wrap(ASN1_SEQUENCE, "mm",
|
|
||||||
asn1_wrap(ASN1_CONTEXT_C_0, "m",
|
|
||||||
asn1_wrap(ASN1_CONTEXT_C_0, "m",
|
|
||||||
asn1_wrap(ASN1_CONTEXT_S_6, "c",
|
|
||||||
chunk_create(cdp->uri, strlen(cdp->uri))))),
|
|
||||||
crlIssuer);
|
|
||||||
crlDistributionPoints = chunk_cat("mm", crlDistributionPoints,
|
|
||||||
distributionPoint);
|
|
||||||
}
|
|
||||||
enumerator->destroy(enumerator);
|
|
||||||
if (crlDistributionPoints.ptr)
|
|
||||||
{
|
|
||||||
crlDistributionPoints = asn1_wrap(ASN1_SEQUENCE, "mm",
|
|
||||||
asn1_build_known_oid(OID_CRL_DISTRIBUTION_POINTS),
|
|
||||||
asn1_wrap(ASN1_OCTET_STRING, "m",
|
|
||||||
asn1_wrap(ASN1_SEQUENCE, "m", crlDistributionPoints)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* encode OCSP URIs in authorityInfoAccess extension */
|
/* encode OCSP URIs in authorityInfoAccess extension */
|
||||||
enumerator = cert->ocsp_uris->create_enumerator(cert->ocsp_uris);
|
enumerator = cert->ocsp_uris->create_enumerator(cert->ocsp_uris);
|
||||||
|
|||||||
Reference in New Issue
Block a user