aboutsummaryrefslogtreecommitdiff
path: root/rcynic
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2013-11-22 16:54:02 +0000
committerRob Austein <sra@hactrn.net>2013-11-22 16:54:02 +0000
commita398dbaa6d01bed417b096ca888247ec19c35c74 (patch)
tree9c0173c17f556727da43843e7f64945d8d878bb1 /rcynic
parentaf0494654bb1d5fe476eb4e164f93e9903f08bd2 (diff)
Check certificate policy for qualifiers: allow id-qt-cps with a
warning, since there's a WG draft about that, reject anything else. Fixes #640. svn path=/trunk/; revision=5599
Diffstat (limited to 'rcynic')
-rw-r--r--rcynic/rcynic.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index c189d960..cb19734b 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -213,6 +213,7 @@ static const struct {
QB(aki_extension_missing, "AKI extension missing") \
QB(aki_extension_wrong_format, "AKI extension is wrong format") \
QB(bad_asidentifiers, "Bad ASIdentifiers extension") \
+ QB(bad_certificate_policy, "Bad certificate policy") \
QB(bad_cms_econtenttype, "Bad CMS eContentType") \
QB(bad_cms_si_contenttype, "Bad CMS SI ContentType") \
QB(bad_cms_signer_infos, "Bad CMS signerInfos") \
@@ -245,7 +246,6 @@ static const struct {
QB(malformed_aia_extension, "Malformed AIA extension") \
QB(malformed_sia_extension, "Malformed SIA extension") \
QB(malformed_basic_constraints, "Malformed basicConstraints") \
- QB(malformed_certificate_policy, "Malformed certificate policy") \
QB(malformed_trust_anchor, "Malformed trust anchor") \
QB(malformed_cadirectory_uri, "Malformed caDirectory URI") \
QB(malformed_crldp_extension, "Malformed CRDLP extension") \
@@ -296,6 +296,7 @@ static const struct {
QW(multiple_rsync_uris_in_extension, "Multiple rsync URIs in extension") \
QW(nonconformant_issuer_name, "Nonconformant X.509 issuer name") \
QW(nonconformant_subject_name, "Nonconformant X.509 subject name") \
+ QW(policy_qualifier_cps, "Policy Qualifier CPS") \
QW(rsync_partial_transfer, "rsync partial transfer") \
QW(rsync_transfer_skipped, "rsync transfer skipped") \
QW(sia_extension_missing_from_ee, "SIA extension missing from EE") \
@@ -3834,11 +3835,21 @@ static int check_x509(rcynic_ctx_t *rc,
}
if ((policies = X509_get_ext_d2i(x, NID_certificate_policies, &crit, NULL)) != NULL) {
+ POLICYQUALINFO *qualifier = NULL;
+ POLICYINFO *policy = NULL;
ex_count--;
- if (!crit || sk_POLICYINFO_num(policies) != 1) {
- log_validation_status(rc, uri, malformed_certificate_policy, generation);
+ if (!crit || sk_POLICYINFO_num(policies) != 1 ||
+ (policy = sk_POLICYINFO_value(policies, 0)) == NULL ||
+ OBJ_obj2nid(policy->policyid) != NID_cp_ipAddr_asNumber ||
+ sk_POLICYQUALINFO_num(policy->qualifiers) > 1 ||
+ (sk_POLICYQUALINFO_num(policy->qualifiers) == 1 &&
+ ((qualifier = sk_POLICYQUALINFO_value(policy->qualifiers, 0)) == NULL ||
+ OBJ_obj2nid(qualifier->pqualid) != NID_id_qt_cps))) {
+ log_validation_status(rc, uri, bad_certificate_policy, generation);
goto done;
}
+ if (qualifier)
+ log_validation_status(rc, uri, policy_qualifier_cps, generation);
}
if (!X509_EXTENSION_get_critical(X509_get_ext(x, X509_get_ext_by_NID(x, NID_key_usage, -1))) ||