aboutsummaryrefslogtreecommitdiff
path: root/rcynic
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2013-11-06 23:14:31 +0000
committerRob Austein <sra@hactrn.net>2013-11-06 23:14:31 +0000
commit7d0a796f777112b8d18e27c9d9d7de2dc87be054 (patch)
tree734f74fba85347f84576fb401e7a39a0138b5774 /rcynic
parentbe84d9b9f26c15e619199a87661c136e2ddb58e8 (diff)
Check certificates for non-null SAFI. While we're at it, check for
unknown AFI in case that somehow slips past OpenSSL. Fixes #641. svn path=/trunk/; revision=5583
Diffstat (limited to 'rcynic')
-rw-r--r--rcynic/rcynic.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index 558b4a89..7ca10a89 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -268,6 +268,7 @@ static const struct {
QB(roa_resources_malformed, "ROA resources malformed") \
QB(rsync_transfer_failed, "rsync transfer failed") \
QB(rsync_transfer_timed_out, "rsync transfer timed out") \
+ QB(safi_not_allowed, "SAFI not allowed") \
QB(sia_cadirectory_uri_missing, "SIA caDirectory URI missing") \
QB(sia_extension_missing, "SIA extension missing") \
QB(sia_manifest_uri_missing, "SIA manifest URI missing") \
@@ -275,6 +276,7 @@ static const struct {
QB(ski_public_key_mismatch, "SKI public key mismatch") \
QB(trust_anchor_key_mismatch, "Trust anchor key mismatch") \
QB(trust_anchor_with_crldp, "Trust anchor can't have CRLDP") \
+ QB(unknown_afi, "Unknown AFI") \
QB(unknown_openssl_verify_error, "Unknown OpenSSL verify error") \
QB(unreadable_trust_anchor, "Unreadable trust anchor") \
QB(unreadable_trust_anchor_locator, "Unreadable trust anchor locator") \
@@ -3574,8 +3576,8 @@ static int check_x509(rcynic_ctx_t *rc,
STACK_OF(DIST_POINT) *crldp = NULL;
BASIC_CONSTRAINTS *bc = NULL;
hashbuf_t ski_hashbuf;
- unsigned ski_hashlen;
- int ok, crit, loc, ex_count, ret = 0;
+ unsigned ski_hashlen, afi;
+ int i, ok, crit, loc, ex_count, ret = 0;
assert(rc && wsk && w && uri && x && w->cert);
@@ -3806,6 +3808,18 @@ static int check_x509(rcynic_ctx_t *rc,
log_validation_status(rc, uri, bad_ipaddrblocks, generation);
goto done;
}
+ for (i = 0; i < sk_IPAddressFamily_num(x->rfc3779_addr); i++) {
+ IPAddressFamily *f = sk_IPAddressFamily_value(x->rfc3779_addr, i);
+ afi = v3_addr_get_afi(f);
+ if (afi != IANA_AFI_IPV4 && afi != IANA_AFI_IPV6) {
+ log_validation_status(rc, uri, unknown_afi, generation);
+ goto done;
+ }
+ if (f->addressFamily->length != 2) {
+ log_validation_status(rc, uri, safi_not_allowed, generation);
+ goto done;
+ }
+ }
}
if (x->rfc3779_asid) {