diff options
author | Rob Austein <sra@hactrn.net> | 2012-01-25 05:29:40 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2012-01-25 05:29:40 +0000 |
commit | 460f515ef64db34e927fbb76c1fc347c4866a37a (patch) | |
tree | c9aa921a8167b482bffc96eba2fa9841a8728b30 /rcynic | |
parent | 2dfa373e3f4eaabb1810b26c1bcd134840f09533 (diff) |
Move a few tests out of the not-TA conditional.
svn path=/trunk/; revision=4262
Diffstat (limited to 'rcynic')
-rw-r--r-- | rcynic/rcynic.c | 99 |
1 files changed, 55 insertions, 44 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c index 5858c5bd..8ec858d1 100644 --- a/rcynic/rcynic.c +++ b/rcynic/rcynic.c @@ -215,6 +215,7 @@ static const struct { QB(bad_ipaddrblocks, "Bad IPAddrBlocks extension") \ QB(bad_key_usage, "Bad keyUsage") \ QB(bad_manifest_digest_length, "Bad manifest digest length") \ + QB(bad_public_key, "Bad public key") \ QB(certificate_bad_signature, "Bad certificate signature") \ QB(certificate_failed_validation, "Certificate failed validation") \ QB(cms_econtent_decode_error, "CMS eContent decode error") \ @@ -3208,7 +3209,7 @@ static int check_x509(rcynic_ctx_t *rc, { walk_ctx_t *w = walk_ctx_stack_head(wsk); rcynic_x509_store_ctx_t rctx; - EVP_PKEY *pkey = NULL; + EVP_PKEY *issuer_pkey = NULL, *subject_pkey = NULL; unsigned long flags = (X509_V_FLAG_POLICY_CHECK | X509_V_FLAG_EXPLICIT_POLICY | X509_V_FLAG_X509_STRICT); STACK_OF(DIST_POINT) *crldp = NULL; AUTHORITY_INFO_ACCESS *sia = NULL, *aia = NULL; @@ -3285,62 +3286,61 @@ static int check_x509(rcynic_ctx_t *rc, goto done; if (X509_get_version(x) != 2) { - log_validation_status(rc, &certinfo->uri, wrong_object_version, certinfo->generation); + log_validation_status(rc, uri, wrong_object_version, generation); goto done; } if (!x->cert_info || !x->cert_info->signature || !x->cert_info->signature->algorithm || OBJ_obj2nid(x->cert_info->signature->algorithm) != NID_sha256WithRSAEncryption) { - log_validation_status(rc, &certinfo->uri, nonconformant_signature_algorithm, - certinfo->generation); + log_validation_status(rc, uri, nonconformant_signature_algorithm, generation); goto done; } if (certinfo->sia.s[0] && certinfo->sia.s[strlen(certinfo->sia.s) - 1] != '/') { - log_validation_status(rc, &certinfo->uri, malformed_cadirectory_uri, certinfo->generation); + log_validation_status(rc, uri, malformed_cadirectory_uri, generation); goto done; } if (!certinfo->ta && !certinfo->aia.s[0]) { - log_validation_status(rc, &certinfo->uri, aia_uri_missing, certinfo->generation); + log_validation_status(rc, uri, aia_uri_missing, generation); goto done; } if (!w->certinfo.ta && strcmp(w->certinfo.uri.s, certinfo->aia.s)) { - log_validation_status(rc, &certinfo->uri, aia_doesnt_match_issuer, certinfo->generation); + log_validation_status(rc, uri, aia_doesnt_match_issuer, generation); goto done; } if (certinfo->ca && !certinfo->sia.s[0]) { - log_validation_status(rc, &certinfo->uri, sia_cadirectory_uri_missing, certinfo->generation); + log_validation_status(rc, uri, sia_cadirectory_uri_missing, generation); goto done; } if (certinfo->ca && !certinfo->manifest.s[0]) { - log_validation_status(rc, &certinfo->uri, sia_manifest_uri_missing, certinfo->generation); + log_validation_status(rc, uri, sia_manifest_uri_missing, generation); goto done; } if (certinfo->ca && !startswith(certinfo->manifest.s, certinfo->sia.s)) { - log_validation_status(rc, &certinfo->uri, manifest_carepository_mismatch, certinfo->generation); + log_validation_status(rc, uri, manifest_carepository_mismatch, generation); goto done; } if (x->skid) { ex_count--; } else { - log_validation_status(rc, &certinfo->uri, ski_extension_missing, certinfo->generation); + log_validation_status(rc, uri, ski_extension_missing, generation); goto done; } if (!check_allowed_dn(X509_get_subject_name(x))) { - log_validation_status(rc, &certinfo->uri, nonconformant_subject_name, certinfo->generation); + log_validation_status(rc, uri, nonconformant_subject_name, generation); if (!rc->allow_nonconformant_name) goto done; } if (!check_allowed_dn(X509_get_issuer_name(x))) { - log_validation_status(rc, &certinfo->uri, nonconformant_issuer_name, certinfo->generation); + log_validation_status(rc, uri, nonconformant_issuer_name, generation); if (!rc->allow_nonconformant_name) goto done; } @@ -3390,51 +3390,61 @@ static int check_x509(rcynic_ctx_t *rc, goto done; } + if (x->cert_info && x->cert_info->key && x->cert_info->key->algor) { + switch (OBJ_obj2nid(x->cert_info->key->algor->algorithm)) { + case NID_rsaEncryption: + break; + case NID_X9_62_id_ecPublicKey: /* See draft-ietf-sidr-bgpsec-algs */ + if (!certinfo->ca) + break; + /* Fall through */ + default: + log_validation_status(rc, uri, nonconformant_public_key_algorithm, generation); + goto done; + } + } + /* + * Perhaps this should be combined with the previous test? In + * theory, we should also be checking for RSA public exponent and + * key length here, but I haven't yet found the right API calls. + */ + if (certinfo->ca && ((subject_pkey = X509_get_pubkey(x)) == NULL || + EVP_PKEY_type(subject_pkey->type) != EVP_PKEY_RSA)) { + log_validation_status(rc, uri, bad_public_key, generation); + goto done; + } + + if ((issuer_pkey = X509_get_pubkey(w->cert)) == NULL || X509_verify(x, issuer_pkey) <= 0) { + log_validation_status(rc, uri, certificate_bad_signature, generation); + goto done; + } + if (certinfo->ta) { if (certinfo->crldp.s[0]) { - log_validation_status(rc, &certinfo->uri, trust_anchor_with_crldp, certinfo->generation); + log_validation_status(rc, uri, trust_anchor_with_crldp, generation); goto done; } } else { - if (check_aki(rc, &certinfo->uri, w->cert, x->akid, certinfo->generation)) + if (check_aki(rc, uri, w->cert, x->akid, generation)) ex_count--; else goto done; if (!certinfo->crldp.s[0]) { - log_validation_status(rc, &certinfo->uri, crldp_uri_missing, certinfo->generation); + log_validation_status(rc, uri, crldp_uri_missing, generation); goto done; } if (!certinfo->ca && !startswith(certinfo->crldp.s, w->certinfo.sia.s)) { - log_validation_status(rc, &certinfo->uri, crldp_doesnt_match_issuer_sia, certinfo->generation); - goto done; - } - - if (x->cert_info && x->cert_info->key && x->cert_info->key->algor) { - switch (OBJ_obj2nid(x->cert_info->key->algor ->algorithm)) { - case NID_rsaEncryption: - break; - case NID_X9_62_id_ecPublicKey: /* draft-ietf-sidr-bgpsec-algs */ - if (!certinfo->ca) - break; - /* Fall through */ - default: - log_validation_status(rc, &certinfo->uri, nonconformant_public_key_algorithm, - certinfo->generation); - goto done; - } - } - - if ((pkey = X509_get_pubkey(w->cert)) == NULL || X509_verify(x, pkey) <= 0) { - log_validation_status(rc, &certinfo->uri, certificate_bad_signature, certinfo->generation); + log_validation_status(rc, uri, crldp_doesnt_match_issuer_sia, generation); goto done; } - if (w->crls == NULL && ((w->crls = sk_X509_CRL_new_null()) == NULL || !sk_X509_CRL_push(w->crls, NULL))) { + if (w->crls == NULL && ((w->crls = sk_X509_CRL_new_null()) == NULL || + !sk_X509_CRL_push(w->crls, NULL))) { logmsg(rc, log_sys_err, "Internal allocation error setting up CRL for validation"); goto done; } @@ -3447,15 +3457,15 @@ static int check_x509(rcynic_ctx_t *rc, X509_CRL *new_crl = check_crl(rc, &certinfo->crldp, w->cert); if (w->crldp.s[0]) - log_validation_status(rc, &certinfo->uri, issuer_uses_multiple_crldp_values, certinfo->generation); + log_validation_status(rc, uri, issuer_uses_multiple_crldp_values, generation); if (new_crl == NULL) { - log_validation_status(rc, &certinfo->uri, bad_crl, certinfo->generation); + log_validation_status(rc, uri, bad_crl, generation); goto done; } if (old_crl && new_crl && ASN1_INTEGER_cmp(old_crl->crl_number, new_crl->crl_number) < 0) { - log_validation_status(rc, &certinfo->uri, crldp_names_newer_crl, certinfo->generation); + log_validation_status(rc, uri, crldp_names_newer_crl, generation); X509_CRL_free(old_crl); old_crl = NULL; } @@ -3474,7 +3484,7 @@ static int check_x509(rcynic_ctx_t *rc, } if (ex_count > 0) { - log_validation_status(rc, &certinfo->uri, disallowed_x509v3_extension, certinfo->generation); + log_validation_status(rc, uri, disallowed_x509v3_extension, generation); goto done; } @@ -3487,7 +3497,7 @@ static int check_x509(rcynic_ctx_t *rc, X509_VERIFY_PARAM_add0_policy(rctx.ctx.param, OBJ_txt2obj(rpki_policy_oid, 1)); if (X509_verify_cert(&rctx.ctx) <= 0) { - log_validation_status(rc, &certinfo->uri, certificate_failed_validation, certinfo->generation); + log_validation_status(rc, uri, certificate_failed_validation, generation); goto done; } @@ -3495,7 +3505,8 @@ static int check_x509(rcynic_ctx_t *rc, done: X509_STORE_CTX_cleanup(&rctx.ctx); - EVP_PKEY_free(pkey); + EVP_PKEY_free(issuer_pkey); + EVP_PKEY_free(subject_pkey); BASIC_CONSTRAINTS_free(bc); sk_ACCESS_DESCRIPTION_pop_free(sia, ACCESS_DESCRIPTION_free); sk_ACCESS_DESCRIPTION_pop_free(aia, ACCESS_DESCRIPTION_free); |