package org.bouncycastle.jcajce; import java.io.IOException; import java.security.cert.CertSelector; import java.security.cert.CertStore; import java.security.cert.CertStoreException; import java.security.cert.Certificate; import java.security.cert.X509CertSelector; import java.util.Collection; import org.bouncycastle.util.Selector; /** * This class is a Selector implementation for certificates. * * @see org.bouncycastle.util.Selector */ public class PKIXCertStoreSelector<T extends Certificate> implements Selector<T> { /** * Builder for a PKIXCertStoreSelector. */ public static class Builder { private final CertSelector baseSelector; /** * Constructor initializing a builder with a CertSelector. * * @param certSelector the CertSelector to copy the match details from. */ public Builder(CertSelector certSelector) { this.baseSelector = (CertSelector)certSelector.clone(); } /** * Build a selector. * * @return a new PKIXCertStoreSelector */ public PKIXCertStoreSelector<? extends Certificate> build() { return new PKIXCertStoreSelector(baseSelector); } } private final CertSelector baseSelector; private PKIXCertStoreSelector(CertSelector baseSelector) { this.baseSelector = baseSelector; } public boolean match(Certificate cert) { return baseSelector.match(cert); } public Object clone() { return new PKIXCertStoreSelector(baseSelector); } public static Collection<? extends Certificate> getCertificates(final PKIXCertStoreSelector selector, CertStore certStore) throws CertStoreException { return certStore.getCertificates(new SelectorClone(selector)); } private static class SelectorClone extends X509CertSelector { private final PKIXCertStoreSelector selector; SelectorClone(PKIXCertStoreSelector selector) { this.selector = selector; if (selector.baseSelector instanceof X509CertSelector) { X509CertSelector baseSelector = (X509CertSelector)selector.baseSelector; this.setAuthorityKeyIdentifier(baseSelector.getAuthorityKeyIdentifier()); this.setBasicConstraints(baseSelector.getBasicConstraints()); this.setCertificate(baseSelector.getCertificate()); this.setCertificateValid(baseSelector.getCertificateValid()); this.setKeyUsage(baseSelector.getKeyUsage()); this.setMatchAllSubjectAltNames(baseSelector.getMatchAllSubjectAltNames()); this.setPrivateKeyValid(baseSelector.getPrivateKeyValid()); this.setSerialNumber(baseSelector.getSerialNumber()); this.setSubjectKeyIdentifier(baseSelector.getSubjectKeyIdentifier()); this.setSubjectPublicKey(baseSelector.getSubjectPublicKey()); try { this.setExtendedKeyUsage(baseSelector.getExtendedKeyUsage()); this.setIssuer(baseSelector.getIssuerAsBytes()); this.setNameConstraints(baseSelector.getNameConstraints()); this.setPathToNames(baseSelector.getPathToNames()); this.setPolicy(baseSelector.getPolicy()); this.setSubject(baseSelector.getSubjectAsBytes()); this.setSubjectAlternativeNames(baseSelector.getSubjectAlternativeNames()); this.setSubjectPublicKeyAlgID(baseSelector.getSubjectPublicKeyAlgID()); } catch (IOException e) { throw new IllegalStateException("base selector invalid: " + e.getMessage(), e); } } } public boolean match(Certificate certificate) { return (selector == null) ? (certificate != null) : selector.match(certificate); } } }