aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2010-07-05 09:36:30 +0200
committerMartin Willi <martin@revosec.ch>2010-07-13 10:26:06 +0200
commit2ca7db1337f22d754955e6b2c4eafa1bd330991a (patch)
tree46e88d0915919f05681f4168869c9520426adcf3
parent5db798c8e0534864412f6aa55b5ae6d2f82dcc7f (diff)
downloadstrongswan-2ca7db1337f22d754955e6b2c4eafa1bd330991a.tar.bz2
strongswan-2ca7db1337f22d754955e6b2c4eafa1bd330991a.tar.xz
Move pathlen constraint checking to X509 specific checks
-rw-r--r--src/libcharon/credentials/credential_manager.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/libcharon/credentials/credential_manager.c b/src/libcharon/credentials/credential_manager.c
index 079af2da8..5714dc0b0 100644
--- a/src/libcharon/credentials/credential_manager.c
+++ b/src/libcharon/credentials/credential_manager.c
@@ -1009,7 +1009,7 @@ static bool check_ip_addr_block_constraints(x509_t *subject, x509_t *issuer)
*/
static bool check_certificate(private_credential_manager_t *this,
certificate_t *subject, certificate_t *issuer,
- bool online, auth_cfg_t *auth)
+ bool online, int pathlen, auth_cfg_t *auth)
{
time_t not_before, not_after;
@@ -1028,10 +1028,25 @@ static bool check_certificate(private_credential_manager_t *this,
if (issuer->get_type(issuer) == CERT_X509 &&
subject->get_type(subject) == CERT_X509)
{
+ int pathlen_constraint;
+ x509_t *x509;
+
if (!check_ip_addr_block_constraints((x509_t*)subject, (x509_t*)issuer))
{
return FALSE;
}
+
+ /* check path length constraint */
+ x509 = (x509_t*)issuer;
+ pathlen_constraint = x509->get_pathLenConstraint(x509);
+ if (pathlen_constraint != X509_NO_PATH_LEN_CONSTRAINT &&
+ pathlen > pathlen_constraint)
+ {
+ DBG1(DBG_CFG, "path length of %d violates constraint of %d",
+ pathlen, pathlen_constraint);
+ return FALSE;
+ }
+
if (online)
{
DBG1(DBG_CFG, "checking certificate status of \"%Y\"",
@@ -1130,9 +1145,8 @@ static bool verify_trust_chain(private_credential_manager_t *this,
bool trusted, bool online)
{
certificate_t *current, *issuer;
- x509_t *x509;
auth_cfg_t *auth;
- int pathlen, pathlen_constraint;
+ int pathlen;
auth = auth_cfg_create();
current = subject->get_ref(subject);
@@ -1180,26 +1194,13 @@ static bool verify_trust_chain(private_credential_manager_t *this,
break;
}
}
- if (!check_certificate(this, current, issuer, online,
+ if (!check_certificate(this, current, issuer, online, pathlen,
current == subject ? auth : NULL))
{
trusted = FALSE;
issuer->destroy(issuer);
break;
}
-
- /* check path length constraint */
- x509 = (x509_t*)issuer;
- pathlen_constraint = x509->get_pathLenConstraint(x509);
- if (pathlen_constraint != X509_NO_PATH_LEN_CONSTRAINT &&
- pathlen > pathlen_constraint)
- {
- DBG1(DBG_CFG, "path length of %d violates constraint of %d",
- pathlen, pathlen_constraint);
- trusted = FALSE;
- issuer->destroy(issuer);
- break;
- }
current->destroy(current);
current = issuer;
if (trusted)