org.bouncycastle.cert.path.validations.CertificatePoliciesValidation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bcpkix-jdk15to18 Show documentation
Show all versions of bcpkix-jdk15to18 Show documentation
The Bouncy Castle Java APIs for CMS, PKCS, EAC, TSP, CMP, CRMF, OCSP, and certificate generation. This jar contains APIs for JDK 1.5 to JDK 1.8. The APIs can be used in conjunction with a JCE/JCA provider such as the one provided with the Bouncy Castle Cryptography APIs.
package org.bouncycastle.cert.path.validations;
import java.math.BigInteger;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.PolicyConstraints;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.path.CertPathValidation;
import org.bouncycastle.cert.path.CertPathValidationContext;
import org.bouncycastle.cert.path.CertPathValidationException;
import org.bouncycastle.util.Memoable;
public class CertificatePoliciesValidation
implements CertPathValidation
{
private int explicitPolicy;
private int policyMapping;
private int inhibitAnyPolicy;
CertificatePoliciesValidation(int pathLength)
{
this(pathLength, false, false, false);
}
CertificatePoliciesValidation(int pathLength, boolean isExplicitPolicyRequired, boolean isAnyPolicyInhibited, boolean isPolicyMappingInhibited)
{
//
// (d)
//
if (isExplicitPolicyRequired)
{
explicitPolicy = 0;
}
else
{
explicitPolicy = pathLength + 1;
}
//
// (e)
//
if (isAnyPolicyInhibited)
{
inhibitAnyPolicy = 0;
}
else
{
inhibitAnyPolicy = pathLength + 1;
}
//
// (f)
//
if (isPolicyMappingInhibited)
{
policyMapping = 0;
}
else
{
policyMapping = pathLength + 1;
}
}
public void validate(CertPathValidationContext context, X509CertificateHolder certificate)
throws CertPathValidationException
{
context.addHandledExtension(Extension.policyConstraints);
context.addHandledExtension(Extension.inhibitAnyPolicy);
if (!context.isEndEntity())
{
if (!ValidationUtils.isSelfIssued(certificate))
{
//
// H (1), (2), (3)
//
explicitPolicy = countDown(explicitPolicy);
policyMapping = countDown(policyMapping);
inhibitAnyPolicy = countDown(inhibitAnyPolicy);
//
// I (1), (2)
//
PolicyConstraints policyConstraints = PolicyConstraints.fromExtensions(certificate.getExtensions());
if (policyConstraints != null)
{
BigInteger requireExplicitPolicyMapping = policyConstraints.getRequireExplicitPolicyMapping();
if (requireExplicitPolicyMapping != null)
{
if (requireExplicitPolicyMapping.intValue() < explicitPolicy)
{
explicitPolicy = requireExplicitPolicyMapping.intValue();
}
}
BigInteger inhibitPolicyMapping = policyConstraints.getInhibitPolicyMapping();
if (inhibitPolicyMapping != null)
{
if (inhibitPolicyMapping.intValue() < policyMapping)
{
policyMapping = inhibitPolicyMapping.intValue();
}
}
}
//
// J
//
Extension ext = certificate.getExtension(Extension.inhibitAnyPolicy);
if (ext != null)
{
int extValue = ASN1Integer.getInstance(ext.getParsedValue()).intValueExact();
if (extValue < inhibitAnyPolicy)
{
inhibitAnyPolicy = extValue;
}
}
}
}
}
private int countDown(int policyCounter)
{
if (policyCounter != 0)
{
return policyCounter - 1;
}
return 0;
}
public Memoable copy()
{
return new CertificatePoliciesValidation(0); // TODO:
}
public void reset(Memoable other)
{
CertificatePoliciesValidation v = (CertificatePoliciesValidation)other; // TODO:
}
}