diff options
author | Martin Willi <martin@revosec.ch> | 2010-12-09 10:46:48 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2011-01-05 16:46:00 +0100 |
commit | be8858e9b650829d90b286a20959f6ecaf7ac9c6 (patch) | |
tree | 16ad8328b11e9cff0983cc196bbe944403b5284b /src/libstrongswan/plugins/constraints/constraints_validator.c | |
parent | 01d3038137e7ed789fb792a599a4c450ca269409 (diff) | |
download | strongswan-be8858e9b650829d90b286a20959f6ecaf7ac9c6.tar.bz2 strongswan-be8858e9b650829d90b286a20959f6ecaf7ac9c6.tar.xz |
Moved X509 pathlen constraint checking to constraints plugin
Diffstat (limited to 'src/libstrongswan/plugins/constraints/constraints_validator.c')
-rw-r--r-- | src/libstrongswan/plugins/constraints/constraints_validator.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libstrongswan/plugins/constraints/constraints_validator.c b/src/libstrongswan/plugins/constraints/constraints_validator.c index 834d4efbf..7598f2896 100644 --- a/src/libstrongswan/plugins/constraints/constraints_validator.c +++ b/src/libstrongswan/plugins/constraints/constraints_validator.c @@ -15,6 +15,9 @@ #include "constraints_validator.h" +#include <debug.h> +#include <credentials/certificates/x509.h> + typedef struct private_constraints_validator_t private_constraints_validator_t; /** @@ -28,10 +31,36 @@ struct private_constraints_validator_t { constraints_validator_t public; }; +/** + * Check pathlen constraint of issuer certificate + */ +static bool check_pathlen(x509_t *issuer, int pathlen) +{ + int pathlen_constraint; + + pathlen_constraint = issuer->get_pathLenConstraint(issuer); + 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; + } + return TRUE; +} + METHOD(cert_validator_t, validate, bool, private_constraints_validator_t *this, certificate_t *subject, certificate_t *issuer, bool online, int pathlen, auth_cfg_t *auth) { + if (issuer->get_type(issuer) == CERT_X509 && + subject->get_type(subject) == CERT_X509) + { + if (!check_pathlen((x509_t*)issuer, pathlen)) + { + return FALSE; + } + } return TRUE; } |