1 /*
2  * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * @test
26  * @bug 8175029
27  * @library /test/lib
28  * @summary check that default implementation of
29  *          X509Certificate.verify(PublicKey, Provider) works on custom
30  *          X509Certificate impl.
31  */
32 
33 import java.math.BigInteger;
34 import java.security.InvalidKeyException;
35 import java.security.NoSuchAlgorithmException;
36 import java.security.NoSuchProviderException;
37 import java.security.Principal;
38 import java.security.Provider;
39 import java.security.PublicKey;
40 import java.security.SignatureException;
41 import java.security.cert.CertificateEncodingException;
42 import java.security.cert.CertificateException;
43 import java.security.cert.CertificateExpiredException;
44 import java.security.cert.CertificateNotYetValidException;
45 import java.security.cert.X509Certificate;
46 import java.util.Collection;
47 import java.util.Date;
48 import java.util.List;
49 import java.util.Set;
50 import jdk.test.lib.security.CertUtils;
51 
52 public class VerifyDefault {
53     private static final String TEST_CERT =
54         "-----BEGIN CERTIFICATE-----\n" +
55         "MIICvTCCAaWgAwIBAgIEGYqL9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRT\n" +
56         "ZWxmMB4XDTE3MDMyODE2NDcyNloXDTE3MDYyNjE2NDcyNlowDzENMAsGA1UEAxME\n" +
57         "U2VsZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1pfSJljFVSABOL\n" +
58         "tJbIVPEkz1+2AFgzY1hqwE0EH80lvhOEkiPPYCKwBE5VTZdyFfwFjpyx7eEeJMNT\n" +
59         "o7cixfmkQaiXHr/S1AS4BRTqLG/zgLzoJpVbzi45rnVEZc0oTm11KG3uUxkZTRr3\n" +
60         "5ORbYyZpkscKwHL2M0J/1GmnA1hmhQdwUQyIKxg4eKQwyE+/TdbFlCWVNnOlb+91\n" +
61         "eXvS11nIJ1oaBgn7u4qihuVmFmngLMxExnLYKV6AwdkwFD6pERObclRD9vAl5eUk\n" +
62         "+sM6zQYwfLdyC2i8e+ETBeOg1ijptM4KT5Uaq89zxjLR0DPH4S+aILp3gYHGrW5r\n" +
63         "eMxZAEMCAwEAAaMhMB8wHQYDVR0OBBYEFOME39JtbjzQaK3ufpKo/Pl4sZ8XMA0G\n" +
64         "CSqGSIb3DQEBCwUAA4IBAQCDcw0+Sf0yeVROVlb2/VV3oIblHkGQheXeIurW64k7\n" +
65         "tEzHtx9i8dnj5lzTZNH6hU4GRlyULbSDzjcM3P2XFRsM+0a/kEJZVqnLz5ji//7/\n" +
66         "ZXaRX0TiE2IfFOTGbO6LusO3yR4tOER/WHllz2H21C2SbW3+92Ou28glTZa42AAZ\n" +
67         "mUj9j+p6mZqD4/tUBqAEqqQoMIhw9CNjc46STNayBjt/0/+I2pfy6LagrMbjBzZ0\n" +
68         "A5kXg9WjnywGk8XFr/3RZz8DrUmCYs2qCYLCHQHsuCE6gCuf9wKhKyD51MFXXRr0\n" +
69         "cyG6LYQjrreMHYk4ZfN2NPC6lGjWxB5mIbV/DuikCnYu\n" +
70         "-----END CERTIFICATE-----";
71 
72     private static class TestX509Certificate extends X509Certificate {
73         private final X509Certificate cert;
TestX509Certificate(X509Certificate cert)74         TestX509Certificate(X509Certificate cert) {
75             this.cert = cert;
76         }
getCriticalExtensionOIDs()77         public Set<String> getCriticalExtensionOIDs() {
78            return cert.getCriticalExtensionOIDs();
79         }
getExtensionValue(String oid)80         public byte[] getExtensionValue(String oid) {
81             return cert.getExtensionValue(oid);
82         }
getNonCriticalExtensionOIDs()83         public Set<String> getNonCriticalExtensionOIDs() {
84             return cert.getNonCriticalExtensionOIDs();
85         }
hasUnsupportedCriticalExtension()86         public boolean hasUnsupportedCriticalExtension() {
87             return cert.hasUnsupportedCriticalExtension();
88         }
checkValidity()89         public void checkValidity() throws CertificateExpiredException,
90             CertificateNotYetValidException {
91             cert.checkValidity();
92         }
checkValidity(Date date)93         public void checkValidity(Date date) throws CertificateExpiredException,
94             CertificateNotYetValidException {
95             cert.checkValidity(date);
96         }
getVersion()97         public int getVersion() { return cert.getVersion(); }
getSerialNumber()98         public BigInteger getSerialNumber() { return cert.getSerialNumber(); }
getIssuerDN()99         public Principal getIssuerDN() { return cert.getIssuerDN(); }
getSubjectDN()100         public Principal getSubjectDN() { return cert.getSubjectDN(); }
getNotBefore()101         public Date getNotBefore() { return cert.getNotBefore(); }
getNotAfter()102         public Date getNotAfter() { return cert.getNotAfter(); }
getTBSCertificate()103         public byte[] getTBSCertificate() throws CertificateEncodingException {
104             return cert.getTBSCertificate();
105         }
getSignature()106         public byte[] getSignature() { return cert.getSignature(); }
getSigAlgName()107         public String getSigAlgName() { return cert.getSigAlgName(); }
getSigAlgOID()108         public String getSigAlgOID() { return cert.getSigAlgOID(); }
getSigAlgParams()109         public byte[] getSigAlgParams() { return cert.getSigAlgParams(); }
getIssuerUniqueID()110         public boolean[] getIssuerUniqueID() {
111             return cert.getIssuerUniqueID();
112         }
getSubjectUniqueID()113         public boolean[] getSubjectUniqueID() {
114             return cert.getSubjectUniqueID();
115         }
getKeyUsage()116         public boolean[] getKeyUsage() { return cert.getKeyUsage(); }
getBasicConstraints()117         public int getBasicConstraints() { return cert.getBasicConstraints(); }
getEncoded()118         public byte[] getEncoded() throws CertificateEncodingException {
119             return cert.getEncoded();
120         }
verify(PublicKey key)121         public void verify(PublicKey key) throws CertificateException,
122             InvalidKeyException, NoSuchAlgorithmException,
123             NoSuchProviderException, SignatureException {
124             cert.verify(key);
125         }
verify(PublicKey key, String sigProvider)126         public void verify(PublicKey key, String sigProvider) throws
127             CertificateException, InvalidKeyException, NoSuchAlgorithmException,
128             NoSuchProviderException, SignatureException {
129             cert.verify(key, sigProvider);
130         }
getPublicKey()131         public PublicKey getPublicKey() { return cert.getPublicKey(); }
toString()132         public String toString() { return cert.toString(); }
133     }
134 
main(String[] args)135     public static void main(String[] args) throws Exception {
136         X509Certificate cert = CertUtils.getCertFromString(TEST_CERT);
137         new TestX509Certificate(cert).verify(cert.getPublicKey(),
138                                              (Provider)null);
139     }
140 }
141