Added support for inhibitAnyPolicy constraint to x509 plugin

This commit is contained in:
Martin Willi
2011-01-05 16:46:05 +01:00
parent b3d359e58f
commit 07eee80401
4 changed files with 62 additions and 33 deletions
+1
View File
@@ -49,6 +49,7 @@ ENUM(builder_part_names, BUILD_FROM_FILE, BUILD_END,
"BUILD_POLICY_MAPPINGS", "BUILD_POLICY_MAPPINGS",
"BUILD_POLICY_CONSTRAINT_EXPLICIT", "BUILD_POLICY_CONSTRAINT_EXPLICIT",
"BUILD_POLICY_CONSTRAINT_INHIBIT", "BUILD_POLICY_CONSTRAINT_INHIBIT",
"BUILD_POLICY_CONSTRAINT_INHIBIT_ANY",
"BUILD_X509_FLAG", "BUILD_X509_FLAG",
"BUILD_REVOKED_ENUMERATOR", "BUILD_REVOKED_ENUMERATOR",
"BUILD_BASE_CRL", "BUILD_BASE_CRL",
+2
View File
@@ -105,6 +105,8 @@ enum builder_part_t {
BUILD_POLICY_CONSTRAINT_EXPLICIT, BUILD_POLICY_CONSTRAINT_EXPLICIT,
/** inhibitPolicyMapping constraint, int */ /** inhibitPolicyMapping constraint, int */
BUILD_POLICY_CONSTRAINT_INHIBIT, BUILD_POLICY_CONSTRAINT_INHIBIT,
/** inhibitAnyPolicy constraint, int */
BUILD_POLICY_CONSTRAINT_INHIBIT_ANY,
/** enforce an additional X509 flag, x509_flag_t */ /** enforce an additional X509 flag, x509_flag_t */
BUILD_X509_FLAG, BUILD_X509_FLAG,
/** enumerator_t over (chunk_t serial, time_t date, crl_reason_t reason) */ /** enumerator_t over (chunk_t serial, time_t date, crl_reason_t reason) */
@@ -67,6 +67,8 @@ enum x509_constraint_t {
X509_INHIBIT_POLICY_MAPPING, X509_INHIBIT_POLICY_MAPPING,
/** requireExplicitPolicy policyConstraint */ /** requireExplicitPolicy policyConstraint */
X509_REQUIRE_EXPLICIT_POLICY, X509_REQUIRE_EXPLICIT_POLICY,
/** inhibitAnyPolicy constraint */
X509_INHIBIT_ANY_POLICY,
}; };
/** /**
+57 -33
View File
@@ -186,6 +186,11 @@ struct private_x509_cert_t {
*/ */
char inhibit_policy_constraint; char inhibit_policy_constraint;
/**
* inhibitAnyPolicy Constraint
*/
char inhibit_any_policy;
/** /**
* x509 constraints and other flags * x509 constraints and other flags
*/ */
@@ -247,6 +252,22 @@ static void policy_mapping_destroy(x509_policy_mapping_t *mapping)
free(mapping); free(mapping);
} }
/**
* Parse a length constraint from an unwrapped integer
*/
static int parse_constraint(chunk_t object)
{
switch (object.len)
{
case 0:
return 0;
case 1:
return object.ptr[0];
default:
return X509_NO_CONSTRAINT;
}
}
/** /**
* ASN.1 definition of a basicConstraints extension * ASN.1 definition of a basicConstraints extension
*/ */
@@ -289,15 +310,7 @@ static void parse_basicConstraints(chunk_t blob, int level0,
case BASIC_CONSTRAINTS_PATH_LEN: case BASIC_CONSTRAINTS_PATH_LEN:
if (isCA) if (isCA)
{ {
if (object.len == 0) this->pathLenConstraint = parse_constraint(object);
{
this->pathLenConstraint = 0;
}
else if (object.len == 1)
{
this->pathLenConstraint = *object.ptr;
}
/* we ignore path length constraints > 127 */
} }
break; break;
default: default:
@@ -1076,24 +1089,10 @@ static void parse_policyConstraints(chunk_t blob, int level0,
switch (objectID) switch (objectID)
{ {
case POLICY_CONSTRAINT_EXPLICIT: case POLICY_CONSTRAINT_EXPLICIT:
if (object.len == 0) this->explicit_policy_constraint = parse_constraint(object);
{
this->explicit_policy_constraint = 0;
}
else if (object.len == 1)
{
this->explicit_policy_constraint = *object.ptr;
}
break; break;
case POLICY_CONSTRAINT_INHIBIT: case POLICY_CONSTRAINT_INHIBIT:
if (object.len == 0) this->inhibit_policy_constraint = parse_constraint(object);
{
this->inhibit_policy_constraint = 0;
}
else if (object.len == 1)
{
this->inhibit_policy_constraint = *object.ptr;
}
break; break;
default: default:
break; break;
@@ -1424,6 +1423,14 @@ static bool parse_certificate(private_x509_cert_t *this)
case OID_POLICY_CONSTRAINTS: case OID_POLICY_CONSTRAINTS:
parse_policyConstraints(object, level, this); parse_policyConstraints(object, level, this);
break; break;
case OID_INHIBIT_ANY_POLICY:
if (!asn1_parse_simple_object(&object, ASN1_INTEGER,
level, "inhibitAnyPolicy"))
{
goto end;
}
this->inhibit_any_policy = parse_constraint(object);
break;
case OID_NS_REVOCATION_URL: case OID_NS_REVOCATION_URL:
case OID_NS_CA_REVOCATION_URL: case OID_NS_CA_REVOCATION_URL:
case OID_NS_CA_POLICY_URL: case OID_NS_CA_POLICY_URL:
@@ -1727,6 +1734,8 @@ METHOD(x509_t, get_constraint, int,
return this->explicit_policy_constraint; return this->explicit_policy_constraint;
case X509_INHIBIT_POLICY_MAPPING: case X509_INHIBIT_POLICY_MAPPING:
return this->inhibit_policy_constraint; return this->inhibit_policy_constraint;
case X509_INHIBIT_ANY_POLICY:
return this->inhibit_any_policy;
default: default:
return X509_NO_CONSTRAINT; return X509_NO_CONSTRAINT;
} }
@@ -1863,6 +1872,7 @@ static private_x509_cert_t* create_empty(void)
.pathLenConstraint = X509_NO_CONSTRAINT, .pathLenConstraint = X509_NO_CONSTRAINT,
.explicit_policy_constraint = X509_NO_CONSTRAINT, .explicit_policy_constraint = X509_NO_CONSTRAINT,
.inhibit_policy_constraint = X509_NO_CONSTRAINT, .inhibit_policy_constraint = X509_NO_CONSTRAINT,
.inhibit_any_policy = X509_NO_CONSTRAINT,
.ref = 1, .ref = 1,
); );
return this; return this;
@@ -1983,7 +1993,7 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
chunk_t subjectAltNames = chunk_empty, policyMappings = chunk_empty; chunk_t subjectAltNames = chunk_empty, policyMappings = chunk_empty;
chunk_t subjectKeyIdentifier = chunk_empty, authKeyIdentifier = chunk_empty; chunk_t subjectKeyIdentifier = chunk_empty, authKeyIdentifier = chunk_empty;
chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty; chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty;
chunk_t policyConstraints = chunk_empty; chunk_t policyConstraints = chunk_empty, inhibitAnyPolicy = chunk_empty;
identification_t *issuer, *subject; identification_t *issuer, *subject;
chunk_t key_info; chunk_t key_info;
signature_scheme_t scheme; signature_scheme_t scheme;
@@ -2270,23 +2280,34 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
asn1_integer("c", asn1_integer("c",
chunk_from_thing(cert->inhibit_policy_constraint))); chunk_from_thing(cert->inhibit_policy_constraint)));
} }
policyConstraints = asn1_wrap(ASN1_SEQUENCE, "mm", policyConstraints = asn1_wrap(ASN1_SEQUENCE, "mmm",
asn1_build_known_oid(OID_POLICY_CONSTRAINTS), asn1_build_known_oid(OID_POLICY_CONSTRAINTS),
asn1_wrap(ASN1_OCTET_STRING, "m", asn1_wrap(ASN1_BOOLEAN, "c", chunk_from_chars(0xFF)),
asn1_wrap(ASN1_SEQUENCE, "mm", asn1_wrap(ASN1_OCTET_STRING, "m",
explicit, inhibit))); asn1_wrap(ASN1_SEQUENCE, "mm",
explicit, inhibit)));
}
if (cert->inhibit_any_policy != X509_NO_CONSTRAINT)
{
inhibitAnyPolicy = asn1_wrap(ASN1_SEQUENCE, "mmm",
asn1_build_known_oid(OID_INHIBIT_ANY_POLICY),
asn1_wrap(ASN1_BOOLEAN, "c", chunk_from_chars(0xFF)),
asn1_wrap(ASN1_OCTET_STRING, "m",
asn1_integer("c",
chunk_from_thing(cert->inhibit_any_policy))));
} }
if (basicConstraints.ptr || subjectAltNames.ptr || authKeyIdentifier.ptr || if (basicConstraints.ptr || subjectAltNames.ptr || authKeyIdentifier.ptr ||
crlDistributionPoints.ptr || nameConstraints.ptr) crlDistributionPoints.ptr || nameConstraints.ptr)
{ {
extensions = asn1_wrap(ASN1_CONTEXT_C_3, "m", extensions = asn1_wrap(ASN1_CONTEXT_C_3, "m",
asn1_wrap(ASN1_SEQUENCE, "mmmmmmmmmmmm", asn1_wrap(ASN1_SEQUENCE, "mmmmmmmmmmmmm",
basicConstraints, keyUsage, subjectKeyIdentifier, basicConstraints, keyUsage, subjectKeyIdentifier,
authKeyIdentifier, subjectAltNames, authKeyIdentifier, subjectAltNames,
extendedKeyUsage, crlDistributionPoints, extendedKeyUsage, crlDistributionPoints,
authorityInfoAccess, nameConstraints, certPolicies, authorityInfoAccess, nameConstraints, certPolicies,
policyMappings, policyConstraints)); policyMappings, policyConstraints, inhibitAnyPolicy));
} }
cert->tbsCertificate = asn1_wrap(ASN1_SEQUENCE, "mmmcmcmm", cert->tbsCertificate = asn1_wrap(ASN1_SEQUENCE, "mmmcmcmm",
@@ -2527,6 +2548,9 @@ x509_cert_t *x509_cert_gen(certificate_type_t type, va_list args)
case BUILD_POLICY_CONSTRAINT_INHIBIT: case BUILD_POLICY_CONSTRAINT_INHIBIT:
cert->inhibit_policy_constraint = va_arg(args, int); cert->inhibit_policy_constraint = va_arg(args, int);
continue; continue;
case BUILD_POLICY_CONSTRAINT_INHIBIT_ANY:
cert->inhibit_any_policy = va_arg(args, int);
continue;
case BUILD_NOT_BEFORE_TIME: case BUILD_NOT_BEFORE_TIME:
cert->notBefore = va_arg(args, time_t); cert->notBefore = va_arg(args, time_t);
continue; continue;