1 /*
   2  * Copyright (c) 2017, 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 ../../testlibrary
  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 
  51 public class VerifyDefault {
  52     private static final String TEST_CERT =
  53         "-----BEGIN CERTIFICATE-----\n" +
  54         "MIICvTCCAaWgAwIBAgIEGYqL9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRT\n" +
  55         "ZWxmMB4XDTE3MDMyODE2NDcyNloXDTE3MDYyNjE2NDcyNlowDzENMAsGA1UEAxME\n" +
  56         "U2VsZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1pfSJljFVSABOL\n" +
  57         "tJbIVPEkz1+2AFgzY1hqwE0EH80lvhOEkiPPYCKwBE5VTZdyFfwFjpyx7eEeJMNT\n" +
  58         "o7cixfmkQaiXHr/S1AS4BRTqLG/zgLzoJpVbzi45rnVEZc0oTm11KG3uUxkZTRr3\n" +
  59         "5ORbYyZpkscKwHL2M0J/1GmnA1hmhQdwUQyIKxg4eKQwyE+/TdbFlCWVNnOlb+91\n" +
  60         "eXvS11nIJ1oaBgn7u4qihuVmFmngLMxExnLYKV6AwdkwFD6pERObclRD9vAl5eUk\n" +
  61         "+sM6zQYwfLdyC2i8e+ETBeOg1ijptM4KT5Uaq89zxjLR0DPH4S+aILp3gYHGrW5r\n" +
  62         "eMxZAEMCAwEAAaMhMB8wHQYDVR0OBBYEFOME39JtbjzQaK3ufpKo/Pl4sZ8XMA0G\n" +
  63         "CSqGSIb3DQEBCwUAA4IBAQCDcw0+Sf0yeVROVlb2/VV3oIblHkGQheXeIurW64k7\n" +
  64         "tEzHtx9i8dnj5lzTZNH6hU4GRlyULbSDzjcM3P2XFRsM+0a/kEJZVqnLz5ji//7/\n" +
  65         "ZXaRX0TiE2IfFOTGbO6LusO3yR4tOER/WHllz2H21C2SbW3+92Ou28glTZa42AAZ\n" +
  66         "mUj9j+p6mZqD4/tUBqAEqqQoMIhw9CNjc46STNayBjt/0/+I2pfy6LagrMbjBzZ0\n" +
  67         "A5kXg9WjnywGk8XFr/3RZz8DrUmCYs2qCYLCHQHsuCE6gCuf9wKhKyD51MFXXRr0\n" +
  68         "cyG6LYQjrreMHYk4ZfN2NPC6lGjWxB5mIbV/DuikCnYu\n" +
  69         "-----END CERTIFICATE-----";
  70 
  71     private static class TestX509Certificate extends X509Certificate {
  72         private final X509Certificate cert;
  73         TestX509Certificate(X509Certificate cert) {
  74             this.cert = cert;
  75         }
  76         public Set<String> getCriticalExtensionOIDs() {
  77            return cert.getCriticalExtensionOIDs();
  78         }
  79         public byte[] getExtensionValue(String oid) {
  80             return cert.getExtensionValue(oid);
  81         }
  82         public Set<String> getNonCriticalExtensionOIDs() {
  83             return cert.getNonCriticalExtensionOIDs();
  84         }
  85         public boolean hasUnsupportedCriticalExtension() {
  86             return cert.hasUnsupportedCriticalExtension();
  87         }
  88         public void checkValidity() throws CertificateExpiredException,
  89             CertificateNotYetValidException {
  90             cert.checkValidity();
  91         }
  92         public void checkValidity(Date date) throws CertificateExpiredException,
  93             CertificateNotYetValidException {
  94             cert.checkValidity(date);
  95         }
  96         public int getVersion() { return cert.getVersion(); }
  97         public BigInteger getSerialNumber() { return cert.getSerialNumber(); }
  98         public Principal getIssuerDN() { return cert.getIssuerDN(); }
  99         public Principal getSubjectDN() { return cert.getSubjectDN(); }
 100         public Date getNotBefore() { return cert.getNotBefore(); }
 101         public Date getNotAfter() { return cert.getNotAfter(); }
 102         public byte[] getTBSCertificate() throws CertificateEncodingException {
 103             return cert.getTBSCertificate();
 104         }
 105         public byte[] getSignature() { return cert.getSignature(); }
 106         public String getSigAlgName() { return cert.getSigAlgName(); }
 107         public String getSigAlgOID() { return cert.getSigAlgOID(); }
 108         public byte[] getSigAlgParams() { return cert.getSigAlgParams(); }
 109         public boolean[] getIssuerUniqueID() {
 110             return cert.getIssuerUniqueID();
 111         }
 112         public boolean[] getSubjectUniqueID() {
 113             return cert.getSubjectUniqueID();
 114         }
 115         public boolean[] getKeyUsage() { return cert.getKeyUsage(); }
 116         public int getBasicConstraints() { return cert.getBasicConstraints(); }
 117         public byte[] getEncoded() throws CertificateEncodingException {
 118             return cert.getEncoded();
 119         }
 120         public void verify(PublicKey key) throws CertificateException,
 121             InvalidKeyException, NoSuchAlgorithmException,
 122             NoSuchProviderException, SignatureException {
 123             cert.verify(key);
 124         }
 125         public void verify(PublicKey key, String sigProvider) throws
 126             CertificateException, InvalidKeyException, NoSuchAlgorithmException,
 127             NoSuchProviderException, SignatureException {
 128             cert.verify(key, sigProvider);
 129         }
 130         public PublicKey getPublicKey() { return cert.getPublicKey(); }
 131         public String toString() { return cert.toString(); }
 132     }
 133 
 134     public static void main(String[] args) throws Exception {
 135         X509Certificate cert = CertUtils.getCertFromString(TEST_CERT);
 136         new TestX509Certificate(cert).verify(cert.getPublicKey(),
 137                                              (Provider)null);
 138     }
 139 }