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