aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rcynic/rcynic.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index 9eb5f45f..2f134437 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -223,6 +223,7 @@ static const struct {
QB(certificate_bad_signature, "Bad certificate signature") \
QB(certificate_failed_validation, "Certificate failed validation") \
QB(cms_econtent_decode_error, "CMS eContent decode error") \
+ QB(cms_includes_crls, "CMS includes CRLs") \
QB(cms_signer_missing, "CMS signer missing") \
QB(cms_ski_mismatch, "CMS SKI mismatch") \
QB(cms_validation_failure, "CMS validation failure") \
@@ -3666,12 +3667,12 @@ static int check_cms(rcynic_ctx_t *rc,
{
const ASN1_OBJECT *eContentType = NULL;
STACK_OF(CMS_SignerInfo) *signer_infos = NULL;
- STACK_OF(X509) *signers = NULL;
CMS_ContentInfo *cms = NULL;
CMS_SignerInfo *si = NULL;
ASN1_OCTET_STRING *sid = NULL;
X509_NAME *si_issuer = NULL;
ASN1_INTEGER *si_serial = NULL;
+ STACK_OF(X509_CRL) *crls = NULL;
hashbuf_t hashbuf;
X509 *x = NULL;
certinfo_t certinfo_;
@@ -3712,9 +3713,8 @@ static int check_cms(rcynic_ctx_t *rc,
goto error;
}
- if (!(signers = CMS_get0_signers(cms)) || sk_X509_num(signers) != 1 ||
- (x = sk_X509_value(signers, 0)) == NULL) {
- log_validation_status(rc, uri, cms_signer_missing, generation);
+ if ((crls = CMS_get1_crls(cms)) != NULL) {
+ log_validation_status(rc, uri, cms_includes_crls, generation);
goto error;
}
@@ -3727,6 +3727,12 @@ static int check_cms(rcynic_ctx_t *rc,
goto error;
}
+ CMS_SignerInfo_get0_algs(si, NULL, &x, NULL, NULL);
+ if (x == NULL) {
+ log_validation_status(rc, uri, cms_signer_missing, generation);
+ goto error;
+ }
+
if (CMS_SignerInfo_cert_cmp(si, x)) {
log_validation_status(rc, uri, cms_ski_mismatch, generation);
goto error;
@@ -3763,6 +3769,7 @@ static int check_cms(rcynic_ctx_t *rc,
error:
CMS_ContentInfo_free(cms);
+ sk_X509_CRL_pop_free(crls, X509_CRL_free);
return result;
}