aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rcynic/rcynic.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index a6375126..3d32f66c 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -248,6 +248,7 @@ static const struct {
QB(manifest_lists_missing_object, "Manifest lists missing object") \
QB(manifest_not_yet_valid, "Manifest not yet valid") \
QB(missing_resources, "Missing resources") \
+ QB(multiple_rsync_uris_in_extension, "Multiple rsync URIs in extension") \
QB(negative_manifest_number, "Negative manifestNumber") \
QB(nonconformant_asn1_time_value, "Nonconformant ASN.1 time value") \
QB(nonconformant_public_key_algorithm,"Nonconformant public key algorithm")\
@@ -2783,7 +2784,7 @@ static int extract_crldp_uri(rcynic_ctx_t *rc,
DIST_POINT *d;
int i;
- assert(crldp);
+ assert(rc && uri && crldp && result);
if (sk_DIST_POINT_num(crldp) != 1)
goto bad;
@@ -2797,16 +2798,18 @@ static int extract_crldp_uri(rcynic_ctx_t *rc,
GENERAL_NAME *n = sk_GENERAL_NAME_value(d->distpoint->name.fullname, i);
if (n == NULL || n->type != GEN_URI)
goto bad;
- if (!is_rsync((char *) n->d.uniformResourceIdentifier->data)) {
+ if (!is_rsync((char *) n->d.uniformResourceIdentifier->data))
log_validation_status(rc, uri, non_rsync_uri_in_extension, generation);
- } else if (sizeof(result->s) <= n->d.uniformResourceIdentifier->length) {
+ else if (sizeof(result->s) <= n->d.uniformResourceIdentifier->length)
log_validation_status(rc, uri, uri_too_long, generation);
- } else {
+ else if (result->s[0])
+ log_validation_status(rc, uri, multiple_rsync_uris_in_extension, generation);
+ else
strcpy(result->s, (char *) n->d.uniformResourceIdentifier->data);
- return 1;
- }
}
+ return result->s[0];
+
bad:
log_validation_status(rc, uri, malformed_crldp_extension, generation);
return 0;
@@ -2821,11 +2824,12 @@ static int extract_access_uri(rcynic_ctx_t *rc,
const AUTHORITY_INFO_ACCESS *xia,
const unsigned char *oid,
const int oidlen,
- uri_t *result)
+ uri_t *result,
+ int *count)
{
int i;
- assert(xia);
+ assert(rc && uri && xia && oid && result && count);
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(xia); i++) {
ACCESS_DESCRIPTION *a = sk_ACCESS_DESCRIPTION_value(xia, i);
@@ -2833,14 +2837,15 @@ static int extract_access_uri(rcynic_ctx_t *rc,
return 0;
if (oid_cmp(a->method, oid, oidlen))
continue;
- if (!is_rsync((char *) a->location->d.uniformResourceIdentifier->data)) {
+ ++*count;
+ if (!is_rsync((char *) a->location->d.uniformResourceIdentifier->data))
log_validation_status(rc, uri, non_rsync_uri_in_extension, generation);
- } else if (sizeof(result->s) <= a->location->d.uniformResourceIdentifier->length) {
+ else if (sizeof(result->s) <= a->location->d.uniformResourceIdentifier->length)
log_validation_status(rc, uri, uri_too_long, generation);
- } else {
- strcpy(result->s, (char *) a->location->d.uniformResourceIdentifier->data);
- return 1;
- }
+ else if (result->s[0])
+ log_validation_status(rc, uri, multiple_rsync_uris_in_extension, generation);
+ else
+ strcpy(result->s, (char *) a->location->d.uniformResourceIdentifier->data);
}
return 1;
}
@@ -3282,10 +3287,13 @@ static int check_x509(rcynic_ctx_t *rc,
}
if ((aia = X509_get_ext_d2i(x, NID_info_access, NULL, NULL)) != NULL) {
+ int n_caIssuers = 0;
ex_count--;
if (!extract_access_uri(rc, uri, generation, aia,
- id_ad_caIssuers, sizeof(id_ad_caIssuers), &certinfo->aia) ||
- !certinfo->aia.s[0]) {
+ id_ad_caIssuers, sizeof(id_ad_caIssuers),
+ &certinfo->aia, &n_caIssuers) ||
+ !certinfo->aia.s[0] ||
+ sk_ACCESS_DESCRIPTION_num(aia) != n_caIssuers) {
log_validation_status(rc, uri, malformed_aia_extension, generation);
goto done;
}
@@ -3302,18 +3310,19 @@ static int check_x509(rcynic_ctx_t *rc,
}
if ((sia = X509_get_ext_d2i(x, NID_sinfo_access, NULL, NULL)) != NULL) {
- int got_caDirectory, got_rpkiManifest, got_signedObject;
+ int got_caDirectory, got_rpkiManifest, got_signedObject;
+ int n_caDirectory = 0, n_rpkiManifest = 0, n_signedObject = 0;
ex_count--;
ok = (extract_access_uri(rc, uri, generation, sia, id_ad_caRepository,
- sizeof(id_ad_caRepository), &certinfo->sia) &&
+ sizeof(id_ad_caRepository), &certinfo->sia, &n_caDirectory) &&
extract_access_uri(rc, uri, generation, sia, id_ad_rpkiManifest,
- sizeof(id_ad_rpkiManifest), &certinfo->manifest) &&
+ sizeof(id_ad_rpkiManifest), &certinfo->manifest, &n_rpkiManifest) &&
extract_access_uri(rc, uri, generation, sia, id_ad_signedObject,
- sizeof(id_ad_signedObject), &certinfo->signedobject));
+ sizeof(id_ad_signedObject), &certinfo->signedobject, &n_signedObject));
got_caDirectory = certinfo->sia.s[0] != '\0';
got_rpkiManifest = certinfo->manifest.s[0] != '\0';
got_signedObject = certinfo->signedobject.s[0] != '\0';
- ok &= sk_ACCESS_DESCRIPTION_num(sia) == got_caDirectory + got_rpkiManifest + got_signedObject;
+ ok &= sk_ACCESS_DESCRIPTION_num(sia) == n_caDirectory + n_rpkiManifest + n_signedObject;
if (certinfo->ca)
ok &= got_caDirectory && got_rpkiManifest && !got_signedObject;
else if (rc->allow_ee_without_signedObject)