c328f9589d
Reviewed-by: mullan, coffeys
544 lines
23 KiB
Java
544 lines
23 KiB
Java
/*
|
|
* Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
import static sun.security.x509.GeneralNameInterface.NAME_DIRECTORY;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
import java.math.BigInteger;
|
|
import java.security.GeneralSecurityException;
|
|
import java.security.KeyFactory;
|
|
import java.security.PublicKey;
|
|
import java.security.cert.CertificateException;
|
|
import java.security.cert.CertificateFactory;
|
|
import java.security.cert.X509CertSelector;
|
|
import java.security.cert.X509Certificate;
|
|
import java.security.spec.X509EncodedKeySpec;
|
|
import java.util.Base64;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import sun.security.util.DerInputStream;
|
|
import sun.security.util.DerOutputStream;
|
|
import sun.security.util.DerValue;
|
|
import sun.security.util.ObjectIdentifier;
|
|
import sun.security.x509.AlgorithmId;
|
|
import sun.security.x509.AuthorityKeyIdentifierExtension;
|
|
import sun.security.x509.CertificatePoliciesExtension;
|
|
import sun.security.x509.DNSName;
|
|
import sun.security.x509.GeneralName;
|
|
import sun.security.x509.GeneralNameInterface;
|
|
import sun.security.x509.GeneralNames;
|
|
import sun.security.x509.GeneralSubtree;
|
|
import sun.security.x509.GeneralSubtrees;
|
|
import sun.security.x509.KeyIdentifier;
|
|
import sun.security.x509.NameConstraintsExtension;
|
|
import sun.security.x509.PolicyInformation;
|
|
import sun.security.x509.PrivateKeyUsageExtension;
|
|
import sun.security.x509.SubjectAlternativeNameExtension;
|
|
import sun.security.x509.X500Name;
|
|
import sun.security.util.Debug;
|
|
|
|
/*
|
|
* @test
|
|
* @bug 8074931 8296787
|
|
* @summary This class tests the X509CertSelector. The tests check particular criteria
|
|
* by setting them to a value that should match our test certificate and
|
|
* ensuring that they do match, then setting them to a value that should not
|
|
* match our test certificate and ensuring that they do not match.
|
|
* @modules java.base/sun.security.x509
|
|
* java.base/sun.security.util
|
|
*/
|
|
public class X509CertSelectorTest {
|
|
/*
|
|
Certificate:
|
|
Data:
|
|
Version: 3 (0x2)
|
|
Serial Number: 954172088 (0x38df82b8)
|
|
Signature Algorithm: dsaWithSHA1
|
|
Issuer: C=us, O=sun, OU=testing
|
|
Validity
|
|
Not Before: Mar 27 15:48:08 2000 GMT
|
|
Not After : Jun 25 14:48:08 2000 GMT
|
|
Subject: C=us, O=sun, OU=testing, CN=mullan
|
|
Subject Public Key Info:
|
|
Public Key Algorithm: dsaEncryption
|
|
pub: 0
|
|
P: 0
|
|
Q: 0
|
|
G: 0
|
|
X509v3 extensions:
|
|
X509v3 Name Constraints: critical
|
|
0D.B0@.>1.0...U....us1.0
|
|
..U.
|
|
..sun1.0...U....testing1.0
|
|
..U....mullan
|
|
X509v3 Subject Key Identifier:
|
|
56:E8:88:AE:9D:B5:3F:2B:CB:A0:4C:4B:E2:87:53:07:33:77:1B:DF
|
|
X509v3 Authority Key Identifier:
|
|
keyid:8E:DD:AF:6F:EE:02:12:F4:61:E9:2F:E3:64:1A:6F:71:32:25:20:C0
|
|
|
|
X509v3 Subject Alternative Name:
|
|
email:mullan@east.sun.com
|
|
X509v3 Private Key Usage Period:
|
|
Not Before: Jan 1 05:00:00 2000 GMT, Not After: Jan 1 05:00:00 2001 GMT
|
|
X509v3 Key Usage: critical
|
|
Digital Signature
|
|
X509v3 Certificate Policies:
|
|
0$0\..*...0.0...+.......0..
|
|
Testing...
|
|
Signature Algorithm: dsaWithSHA1
|
|
r:
|
|
44:c7:35:40:5d:6c:28:75:7f:73:b2:f8:0d:72:6c:
|
|
09:65:b8:81:14
|
|
s:
|
|
76:79:f5:c7:37:3b:0d:9b:db:70:2f:20:80:36:e3:
|
|
80:e8:a6:c6:71
|
|
*/
|
|
private static final String testCert =
|
|
"-----BEGIN CERTIFICATE-----\n" +
|
|
"MIICLjCCAeygAwIBAgIEON+CuDALBgcqhkjOOAQDBQAwLTELMAkGA1UEBhMCdXMx\n" +
|
|
"DDAKBgNVBAoTA3N1bjEQMA4GA1UECxMHdGVzdGluZzAeFw0wMDAzMjcxNTQ4MDha\n" +
|
|
"Fw0wMDA2MjUxNDQ4MDhaMD4xCzAJBgNVBAYTAnVzMQwwCgYDVQQKEwNzdW4xEDAO\n" +
|
|
"BgNVBAsTB3Rlc3RpbmcxDzANBgNVBAMTBm11bGxhbjAcMBQGByqGSM44BAEwCQIB\n" +
|
|
"AAIBAAIBAAMEAAIBAKOCASMwggEfMFAGA1UdHgEB/wRGMESgQjBApD4xCzAJBgNV\n" +
|
|
"BAYTAnVzMQwwCgYDVQQKEwNzdW4xEDAOBgNVBAsTB3Rlc3RpbmcxDzANBgNVBAMT\n" +
|
|
"Bm11bGxhbjAdBgNVHQ4EFgQUVuiIrp21PyvLoExL4odTBzN3G98wHwYDVR0jBBgw\n" +
|
|
"FoAUjt2vb+4CEvRh6S/jZBpvcTIlIMAwHgYDVR0RBBcwFYETbXVsbGFuQGVhc3Qu\n" +
|
|
"c3VuLmNvbTArBgNVHRAEJDAigA8yMDAwMDEwMTA1MDAwMFqBDzIwMDEwMTAxMDUw\n" +
|
|
"MDAwWjAPBgNVHQ8BAf8EBQMDB4AAMC0GA1UdIAQmMCQwIgYEKoSAADAaMBgGCCsG\n" +
|
|
"AQUFBwICMAwSClRlc3RpbmcuLi4wCwYHKoZIzjgEAwUAAy8AMCwCFETHNUBdbCh1\n" +
|
|
"f3Oy+A1ybAlluIEUAhR2efXHNzsNm9twLyCANuOA6KbGcQ==\n" +
|
|
"-----END CERTIFICATE-----\n" +
|
|
"";
|
|
|
|
private static final String testKey =
|
|
"MIIBtjCCASsGByqGSM44BAEwggEeAoGBAIVWPEkcxbxhQRCqVzg55tNqbP5j0K4kdu4bkmXvfqC5\n" +
|
|
"+qA75DvnfzsOJseb+9AuKXWk/DvCzFDmrY1YaU3scZC3OQEO9lEO3F4VDKOaudY6OT1SI22pAIwz\n" +
|
|
"j5pvq+i7zOp4xUqkQUeh/4iQSfxOT5UrFGjkcbnbpVkCXD/GxAz7AhUAjtnm3dVIddUUHl6wxpZ7\n" +
|
|
"GcA6gSsCgYAf/PXzQtemgIDjpFrNNSgTEKkLposBXKatAM+gUKlMUjf8SQvquqPxDtRrscGjXkoL\n" +
|
|
"oTkaR7/akULYFpBvUcFkeIFiCnJg8M9XhCWdLvn9MPt+jR2oxookvCb9xLtD6WvIM/wd/nZ1iK4u\n" +
|
|
"iY1+q85xvns/Awbtwl7oZDAwE2TUKAOBhAACgYBDc9UZ+3xsZubUZvRG5cpyJceYpJp2exOPVJXn\n" +
|
|
"jR4CcR+cT9bAJpFSxqE/8KtNHXxHdu4f3DU67IMOVDpugzihyzXJvNm3w2H9x+6xczHG2wjvAJeh\n" +
|
|
"X62EWbUatxPXFAoVKZWuUbaYaZzdWBDtNRrCuKKsLo0GFy8g2BZISuD3jw==\n" +
|
|
"";
|
|
|
|
// Certificate to run tests on
|
|
private final X509Certificate cert;
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
X509CertSelectorTest test = new X509CertSelectorTest();
|
|
test.doTest();
|
|
}
|
|
|
|
public X509CertSelectorTest() throws CertificateException, IOException {
|
|
cert = (X509Certificate) CertificateFactory.getInstance("X.509")
|
|
.generateCertificate(new ByteArrayInputStream(testCert.getBytes()));
|
|
}
|
|
|
|
// Runs the test.
|
|
private void doTest() throws Exception {
|
|
System.out.println("START OF TESTS FOR " + "X509CertSelector");
|
|
|
|
testSerialNumber();
|
|
testIssuer();
|
|
testSubjectKeyIdentifier();
|
|
testAuthorityKeyIdentifier();
|
|
testCertificateValid();
|
|
testPrivateKeyValid();
|
|
testSubjectPublicKeyAlgID();
|
|
testKeyUsage();
|
|
testSubjectAltName();
|
|
testPolicy();
|
|
testPathToName();
|
|
testSubject();
|
|
testSubjectPublicKey();
|
|
testNameConstraints();
|
|
testBasicConstraints();
|
|
testCertificate();
|
|
}
|
|
|
|
// Tests matching on the serial number contained in the certificate.
|
|
private void testSerialNumber() {
|
|
System.out.println("X.509 Certificate Match on serialNumber");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
selector.setSerialNumber(new BigInteger("999999999"));
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setSerialNumber(cert.getSerialNumber());
|
|
checkMatch(selector, cert, true);
|
|
|
|
// check serial number format
|
|
String serialNum = Debug.toString(selector.getSerialNumber());
|
|
String expected = "38:df:82:b8";
|
|
if (!serialNum.equals(expected)) {
|
|
throw new RuntimeException("Serial number toString format is incorrect. Got: "
|
|
+ serialNum + " Expected: " + expected);
|
|
}
|
|
}
|
|
|
|
// Tests matching on the issuer name contained in the certificate.
|
|
private void testIssuer() throws IOException {
|
|
System.out.println("X.509 Certificate Match on issuer");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
selector.setIssuer("ou=bogus,ou=east,o=sun,c=us");
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setIssuer((cert.getIssuerX500Principal()).getName("RFC2253"));
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the subject key identifier contained in the
|
|
* certificate.
|
|
*/
|
|
private void testSubjectKeyIdentifier() throws IOException {
|
|
System.out.println("X.509 Certificate Match on subjectKeyIdentifier");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
byte[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
|
selector.setSubjectKeyIdentifier(b);
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.14"));
|
|
byte[] encoded = in.getOctetString();
|
|
selector.setSubjectKeyIdentifier(encoded);
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the authority key identifier contained in the
|
|
* certificate.
|
|
*/
|
|
private void testAuthorityKeyIdentifier() throws IOException {
|
|
System.out.println("X.509 Certificate Match on authorityKeyIdentifier");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
byte[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
|
AuthorityKeyIdentifierExtension a = new AuthorityKeyIdentifierExtension(new KeyIdentifier(b), null, null);
|
|
selector.setAuthorityKeyIdentifier(a.getExtensionValue());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.35"));
|
|
byte[] encoded = in.getOctetString();
|
|
selector.setAuthorityKeyIdentifier(encoded);
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the certificate validity component contained in the
|
|
* certificate.
|
|
*/
|
|
private void testCertificateValid() {
|
|
System.out.println("X.509 Certificate Match on certificateValid");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
Calendar cal = Calendar.getInstance();
|
|
cal.set(1968, 12, 31);
|
|
selector.setCertificateValid(cal.getTime());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setCertificateValid(cert.getNotBefore());
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the private key validity component contained in the
|
|
* certificate.
|
|
*/
|
|
private void testPrivateKeyValid() throws IOException, CertificateException {
|
|
System.out.println("X.509 Certificate Match on privateKeyValid");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
Calendar cal = Calendar.getInstance();
|
|
cal.set(1968, 12, 31);
|
|
selector.setPrivateKeyValid(cal.getTime());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.16"));
|
|
byte[] encoded = in.getOctetString();
|
|
PrivateKeyUsageExtension ext = new PrivateKeyUsageExtension(false, encoded);
|
|
Date validDate = ext.getNotBefore();
|
|
selector.setPrivateKeyValid(validDate);
|
|
checkMatch(selector, cert, true);
|
|
|
|
}
|
|
|
|
private ObjectIdentifier getCertPubKeyAlgOID(X509Certificate xcert) throws IOException {
|
|
byte[] encodedKey = xcert.getPublicKey().getEncoded();
|
|
DerValue val = new DerValue(encodedKey);
|
|
if (val.tag != DerValue.tag_Sequence) {
|
|
throw new RuntimeException("invalid key format");
|
|
}
|
|
|
|
return AlgorithmId.parse(val.data.getDerValue()).getOID();
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the subject public key algorithm ID component contained
|
|
* in the certificate.
|
|
*/
|
|
private void testSubjectPublicKeyAlgID() throws IOException {
|
|
System.out.println("X.509 Certificate Match on subjectPublicKeyAlgID");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
selector.setSubjectPublicKeyAlgID("2.5.29.14");
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setSubjectPublicKeyAlgID(getCertPubKeyAlgOID(cert).toString());
|
|
checkMatch(selector, cert, true);
|
|
|
|
}
|
|
|
|
// Tests matching on the key usage extension contained in the certificate.
|
|
private void testKeyUsage() {
|
|
System.out.println("X.509 Certificate Match on keyUsage");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
boolean[] keyUsage = { true, false, true, false, true, false, true, false };
|
|
selector.setKeyUsage(keyUsage);
|
|
System.out.println("Selector = " + selector.toString());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setKeyUsage(cert.getKeyUsage());
|
|
System.out.println("Selector = " + selector.toString());
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the subject alternative name extension contained in the
|
|
* certificate.
|
|
*/
|
|
private void testSubjectAltName() throws IOException {
|
|
System.out.println("X.509 Certificate Match on subjectAltName");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
GeneralNameInterface dnsName = new DNSName("foo.com");
|
|
DerOutputStream tmp = new DerOutputStream();
|
|
dnsName.encode(tmp);
|
|
selector.addSubjectAlternativeName(2, tmp.toByteArray());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.17"));
|
|
byte[] encoded = in.getOctetString();
|
|
SubjectAlternativeNameExtension ext = new SubjectAlternativeNameExtension(false, encoded);
|
|
GeneralNames names = ext.getNames();
|
|
GeneralName name = names.get(0);
|
|
selector.setSubjectAlternativeNames(null);
|
|
DerOutputStream tmp2 = new DerOutputStream();
|
|
name.getName().encode(tmp2);
|
|
selector.addSubjectAlternativeName(name.getType(), tmp2.toByteArray());
|
|
checkMatch(selector, cert, true);
|
|
|
|
// good match 2 (matches at least one)
|
|
selector.setMatchAllSubjectAltNames(false);
|
|
selector.addSubjectAlternativeName(2, "foo.com");
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the policy constraints extension contained in the
|
|
* certificate.
|
|
*/
|
|
private void testPolicy() throws IOException {
|
|
System.out.println("X.509 Certificate Match on certificatePolicies");
|
|
// test encoding of CertificatePoliciesExtension because we wrote the
|
|
// code
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
Set<String> s = new HashSet<>();
|
|
s.add(new String("1.2.5.7.68"));
|
|
selector.setPolicy(s);
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.32"));
|
|
CertificatePoliciesExtension ext = new CertificatePoliciesExtension(false, in.getOctetString());
|
|
List<PolicyInformation> policies = ext.getCertPolicies();
|
|
// match on the first policy id
|
|
PolicyInformation policyInfo = (PolicyInformation) policies.get(0);
|
|
s.clear();
|
|
s.add(policyInfo.getPolicyIdentifier().getIdentifier().toString());
|
|
selector.setPolicy(s);
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
/*
|
|
* Tests matching on the name constraints extension contained in the
|
|
* certificate.
|
|
*/
|
|
private void testPathToName() throws IOException {
|
|
System.out.println("X.509 Certificate Match on pathToName");
|
|
|
|
X509CertSelector selector = null;
|
|
DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.30"));
|
|
byte[] encoded = in.getOctetString();
|
|
NameConstraintsExtension ext = new NameConstraintsExtension(false, encoded);
|
|
GeneralSubtrees permitted = ext.getPermittedSubtrees();
|
|
GeneralSubtrees excluded = ext.getExcludedSubtrees();
|
|
|
|
// bad matches on pathToName within excluded subtrees
|
|
if (excluded != null) {
|
|
Iterator<GeneralSubtree> e = excluded.iterator();
|
|
while (e.hasNext()) {
|
|
GeneralSubtree tree = e.next();
|
|
if (tree.getName().getType() == NAME_DIRECTORY) {
|
|
X500Name excludedDN1 = new X500Name(tree.getName().toString());
|
|
X500Name excludedDN2 = new X500Name("CN=Bogus, " + tree.getName().toString());
|
|
DerOutputStream derDN1 = new DerOutputStream();
|
|
DerOutputStream derDN2 = new DerOutputStream();
|
|
excludedDN1.encode(derDN1);
|
|
excludedDN2.encode(derDN2);
|
|
selector = new X509CertSelector();
|
|
selector.addPathToName(NAME_DIRECTORY, derDN1.toByteArray());
|
|
checkMatch(selector, cert, false);
|
|
selector.setPathToNames(null);
|
|
selector.addPathToName(NAME_DIRECTORY, derDN2.toByteArray());
|
|
checkMatch(selector, cert, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
// good matches on pathToName within permitted subtrees
|
|
if (permitted != null) {
|
|
Iterator<GeneralSubtree> e = permitted.iterator();
|
|
while (e.hasNext()) {
|
|
GeneralSubtree tree = e.next();
|
|
if (tree.getName().getType() == NAME_DIRECTORY) {
|
|
X500Name permittedDN1 = new X500Name(tree.getName().toString());
|
|
X500Name permittedDN2 = new X500Name("CN=good, " + tree.getName().toString());
|
|
DerOutputStream derDN1 = new DerOutputStream();
|
|
DerOutputStream derDN2 = new DerOutputStream();
|
|
permittedDN1.encode(derDN1);
|
|
permittedDN2.encode(derDN2);
|
|
selector = new X509CertSelector();
|
|
selector.addPathToName(NAME_DIRECTORY, derDN1.toByteArray());
|
|
checkMatch(selector, cert, true);
|
|
selector.setPathToNames(null);
|
|
selector.addPathToName(NAME_DIRECTORY, derDN2.toByteArray());
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Tests matching on the subject name contained in the certificate.
|
|
private void testSubject() throws IOException {
|
|
System.out.println("X.509 Certificate Match on subject");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
selector.setSubject("ou=bogus,ou=east,o=sun,c=us");
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setSubject(cert.getSubjectX500Principal().getName("RFC2253"));
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
// Tests matching on the subject public key contained in the certificate.
|
|
private void testSubjectPublicKey() throws IOException, GeneralSecurityException {
|
|
System.out.println("X.509 Certificate Match on subject public key");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
|
|
Base64.getMimeDecoder().decode(testKey.getBytes()));
|
|
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
|
|
PublicKey pubKey = keyFactory.generatePublic(keySpec);
|
|
selector.setSubjectPublicKey(pubKey);
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setSubjectPublicKey(cert.getPublicKey());
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
// Tests matching on the name constraints contained in the certificate.
|
|
private void testNameConstraints() throws IOException {
|
|
System.out.println("X.509 Certificate Match on name constraints");
|
|
// bad match
|
|
GeneralSubtrees subjectTree = new GeneralSubtrees();
|
|
subjectTree.add(getGeneralSubtree((X500Name) cert.getSubjectDN()));
|
|
NameConstraintsExtension ext = new NameConstraintsExtension((GeneralSubtrees) null, subjectTree);
|
|
X509CertSelector selector = new X509CertSelector();
|
|
selector.setNameConstraints(ext.getExtensionValue());
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
ext = new NameConstraintsExtension(subjectTree, null);
|
|
selector.setNameConstraints(ext.getExtensionValue());
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
// Tests matching on basic constraints.
|
|
private void testBasicConstraints() {
|
|
System.out.println("X.509 Certificate Match on basic constraints");
|
|
// bad match
|
|
X509CertSelector selector = new X509CertSelector();
|
|
int mpl = cert.getBasicConstraints();
|
|
selector.setBasicConstraints(0);
|
|
checkMatch(selector, cert, false);
|
|
|
|
// good match
|
|
selector.setBasicConstraints(mpl);
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
// Tests certificateEquals criterion
|
|
private void testCertificate() {
|
|
System.out.println("X.509 Certificate Match on certificateEquals criterion");
|
|
|
|
X509CertSelector selector = new X509CertSelector();
|
|
// good match
|
|
selector.setCertificate(cert);
|
|
checkMatch(selector, cert, true);
|
|
}
|
|
|
|
private void checkMatch(X509CertSelector selector, X509Certificate cert, boolean match) {
|
|
boolean result = selector.match(cert);
|
|
if (match != result)
|
|
throw new RuntimeException(selector + " match " + cert + " is " + result + ", but expect " + match);
|
|
}
|
|
|
|
private static GeneralSubtree getGeneralSubtree(GeneralNameInterface gni) {
|
|
// Create a new GeneralSubtree with the specified name, 0 base, and
|
|
// unlimited length
|
|
GeneralName gn = new GeneralName(gni);
|
|
GeneralSubtree subTree = new GeneralSubtree(gn, 0, -1);
|
|
return subTree;
|
|
}
|
|
}
|