14a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin/*
24a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * Copyright (C) 2015 The Android Open Source Project
34a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin *
44a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License");
54a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * you may not use this file except in compliance with the License.
64a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * You may obtain a copy of the License at
74a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin *
84a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin *      http://www.apache.org/licenses/LICENSE-2.0
94a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin *
104a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * Unless required by applicable law or agreed to in writing, software
114a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS,
124a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * See the License for the specific language governing permissions and
144a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin * limitations under the License.
154a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin */
164a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
174a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinpackage android.security.keystore;
184a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
194a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.math.BigInteger;
204a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.InvalidKeyException;
214a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.NoSuchAlgorithmException;
224a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.NoSuchProviderException;
234a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.Principal;
244a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.PublicKey;
254a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.SignatureException;
264a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.CertificateEncodingException;
274a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.CertificateException;
284a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.CertificateExpiredException;
294a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.CertificateNotYetValidException;
304a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.CertificateParsingException;
314a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.security.cert.X509Certificate;
324a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.util.Collection;
334a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.util.Date;
344a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.util.List;
354a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport java.util.Set;
364a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
374a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinimport javax.security.auth.x500.X500Principal;
384a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
394a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubinclass DelegatingX509Certificate extends X509Certificate {
404a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    private final X509Certificate mDelegate;
414a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
424a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    DelegatingX509Certificate(X509Certificate delegate) {
434a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        mDelegate = delegate;
444a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
454a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
464a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
474a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Set<String> getCriticalExtensionOIDs() {
484a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getCriticalExtensionOIDs();
494a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
504a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
514a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
524a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public byte[] getExtensionValue(String oid) {
534a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getExtensionValue(oid);
544a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
554a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
564a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
574a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Set<String> getNonCriticalExtensionOIDs() {
584a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getNonCriticalExtensionOIDs();
594a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
604a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
614a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
624a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public boolean hasUnsupportedCriticalExtension() {
634a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.hasUnsupportedCriticalExtension();
644a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
654a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
664a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
674a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public void checkValidity() throws CertificateExpiredException,
684a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            CertificateNotYetValidException {
694a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        mDelegate.checkValidity();
704a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
714a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
724a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
734a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public void checkValidity(Date date) throws CertificateExpiredException,
744a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            CertificateNotYetValidException {
754a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        mDelegate.checkValidity(date);
764a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
774a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
784a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
794a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public int getBasicConstraints() {
804a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getBasicConstraints();
814a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
824a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
834a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
844a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Principal getIssuerDN() {
854a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getIssuerDN();
864a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
874a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
884a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
894a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public boolean[] getIssuerUniqueID() {
904a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getIssuerUniqueID();
914a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
924a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
934a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
944a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public boolean[] getKeyUsage() {
954a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getKeyUsage();
964a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
974a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
984a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
994a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Date getNotAfter() {
1004a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getNotAfter();
1014a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1024a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1034a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1044a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Date getNotBefore() {
1054a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getNotBefore();
1064a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1074a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1084a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1094a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public BigInteger getSerialNumber() {
1104a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSerialNumber();
1114a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1124a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1134a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1144a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public String getSigAlgName() {
1154a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSigAlgName();
1164a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1174a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1184a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1194a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public String getSigAlgOID() {
1204a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSigAlgOID();
1214a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1224a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1234a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1244a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public byte[] getSigAlgParams() {
1254a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSigAlgParams();
1264a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1274a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1284a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1294a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public byte[] getSignature() {
1304a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSignature();
1314a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1324a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1334a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1344a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Principal getSubjectDN() {
1354a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSubjectDN();
1364a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1374a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1384a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1394a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public boolean[] getSubjectUniqueID() {
1404a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSubjectUniqueID();
1414a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1424a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1434a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1444a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public byte[] getTBSCertificate() throws CertificateEncodingException {
1454a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getTBSCertificate();
1464a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1474a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1484a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1494a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public int getVersion() {
1504a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getVersion();
1514a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1524a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1534a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1544a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public byte[] getEncoded() throws CertificateEncodingException {
1554a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getEncoded();
1564a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1574a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1584a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1594a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public PublicKey getPublicKey() {
1604a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getPublicKey();
1614a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1624a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1634a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1644a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public String toString() {
1654a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.toString();
1664a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1674a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1684a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1694a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public void verify(PublicKey key)
1704a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            throws CertificateException,
1714a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            NoSuchAlgorithmException,
1724a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            InvalidKeyException,
1734a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            NoSuchProviderException,
1744a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            SignatureException {
1754a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        mDelegate.verify(key);
1764a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1774a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1784a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1794a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public void verify(PublicKey key, String sigProvider)
1804a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            throws CertificateException,
1814a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            NoSuchAlgorithmException,
1824a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            InvalidKeyException,
1834a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            NoSuchProviderException,
1844a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin            SignatureException {
1854a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        mDelegate.verify(key, sigProvider);
1864a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1874a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1884a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1894a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public List<String> getExtendedKeyUsage() throws CertificateParsingException {
1904a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getExtendedKeyUsage();
1914a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1924a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1934a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1944a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Collection<List<?>> getIssuerAlternativeNames() throws CertificateParsingException {
1954a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getIssuerAlternativeNames();
1964a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
1974a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
1984a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
1994a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public X500Principal getIssuerX500Principal() {
2004a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getIssuerX500Principal();
2014a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
2024a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
2034a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
2044a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public Collection<List<?>> getSubjectAlternativeNames() throws CertificateParsingException {
2054a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSubjectAlternativeNames();
2064a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
2074a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin
2084a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    @Override
2094a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    public X500Principal getSubjectX500Principal() {
2104a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin        return mDelegate.getSubjectX500Principal();
2114a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin    }
2124a0ff7ca984d29bd34b02e54441957cad65e8b53Alex Klyubin}
213