summaryrefslogtreecommitdiff
path: root/crypto/asn1/x_crl.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2006-09-10 12:38:37 +0000
committerDr. Stephen Henson <steve@openssl.org>2006-09-10 12:38:37 +0000
commit4d50a2b4d6ae7618844380c1ebd5437226286db7 (patch)
tree72f5b13d45f7f766bbf52e4953aba1804c960b84 /crypto/asn1/x_crl.c
parent7f4301668f83950b33f79424d047832a1989bec2 (diff)
Add verify callback functions to lookup a STACK of matching certs or CRLs
based on subject name. New thread safe functions to retrieve matching STACK from X509_STORE. Cache some IDP components.
Diffstat (limited to 'crypto/asn1/x_crl.c')
-rw-r--r--crypto/asn1/x_crl.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/crypto/asn1/x_crl.c b/crypto/asn1/x_crl.c
index 8943b84373..f8ad1f3417 100644
--- a/crypto/asn1/x_crl.c
+++ b/crypto/asn1/x_crl.c
@@ -64,6 +64,7 @@
static int X509_REVOKED_cmp(const X509_REVOKED * const *a,
const X509_REVOKED * const *b);
+static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp);
ASN1_SEQUENCE(X509_REVOKED) = {
ASN1_SIMPLE(X509_REVOKED,serialNumber, ASN1_INTEGER),
@@ -116,6 +117,8 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
case ASN1_OP_NEW_POST:
crl->idp = NULL;
crl->akid = NULL;
+ crl->flags = 0;
+ crl->idp_flags = 0;
break;
case ASN1_OP_D2I_POST:
@@ -124,6 +127,9 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
#endif
crl->idp = X509_CRL_get_ext_d2i(crl,
NID_issuing_distribution_point, NULL, NULL);
+ if (crl->idp)
+ setup_idp(crl, crl->idp);
+
crl->akid = X509_CRL_get_ext_d2i(crl,
NID_authority_key_identifier, NULL, NULL);
break;
@@ -138,6 +144,46 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
return 1;
}
+/* Convert IDP into a more convenient form */
+
+static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)
+ {
+ int idp_only = 0;
+ /* Set various flags according to IDP */
+ crl->idp_flags |= IDP_PRESENT;
+ if (idp->onlyuser > 0)
+ {
+ idp_only++;
+ crl->idp_flags |= IDP_ONLYUSER;
+ }
+ if (idp->onlyCA > 0)
+ {
+ idp_only++;
+ crl->idp_flags |= IDP_ONLYCA;
+ }
+ if (idp->onlyattr > 0)
+ {
+ idp_only++;
+ crl->idp_flags |= IDP_ONLYATTR;
+ }
+
+ if (idp_only > 1)
+ crl->idp_flags |= IDP_INVALID;
+
+ if (idp->indirectCRL > 0)
+ crl->idp_flags |= IDP_INDIRECT;
+
+ if (idp->onlysomereasons)
+ {
+ crl->idp_flags |= IDP_REASONS;
+ if (idp->onlysomereasons->length > 0)
+ crl->idp_reasons = idp->onlysomereasons->data[0];
+ if (idp->onlysomereasons->length > 1)
+ crl->idp_reasons |=
+ (idp->onlysomereasons->data[1] << 8);
+ }
+ }
+
ASN1_SEQUENCE_ref(X509_CRL, crl_cb, CRYPTO_LOCK_X509_CRL) = {
ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO),
ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR),