1f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.jar; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.CodeSigner; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPath; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateException; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateFactory; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.X509Certificate; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.x500.X500Principal; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Represents a single file in a JAR archive together with the manifest 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attributes and digital signatures associated with it. 3557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * 3657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @see JarFile 3757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @see JarInputStream 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarEntry extends ZipEntry { 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Attributes attributes; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile parentJar; 4357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CodeSigner signers[]; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Cached factory used to build CertPath-s in <code>getCodeSigners()</code>. 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private CertificateFactory factory; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson private boolean isFactoryChecked = false; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code JarEntry} named name. 53f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The name of the new {@code JarEntry}. 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public JarEntry(String name) { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(name); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code JarEntry} using the values obtained from entry. 63f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param entry 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ZipEntry to obtain values from. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public JarEntry(ZipEntry entry) { 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(entry); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code Attributes} object associated with this entry or 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} if none exists. 74f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code Attributes} for this entry. 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IOException 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an error occurs obtaining the {@code Attributes}. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Attributes 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Attributes getAttributes() throws IOException { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (attributes != null || parentJar == null) { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return attributes; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = parentJar.getManifest(); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (manifest == null) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return attributes = manifest.getAttributes(getName()); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an array of {@code Certificate} Objects associated with this 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * entry or {@code null} if none exists. Make sure that the everything is 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from the input stream before calling this method, or else the method 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns {@code null}. 96f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate for this entry. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.security.cert.Certificate 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate[] getCertificates() { 101b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (parentJar == null) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarVerifier jarVerifier = parentJar.verifier; 105b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (jarVerifier == null) { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return jarVerifier.getCertificates(getName()); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void setAttributes(Attributes attrib) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes = attrib; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create a new {@code JarEntry} using the values obtained from the 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argument. 118f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param je 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The {@code JarEntry} to obtain values from. 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public JarEntry(JarEntry je) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(je); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parentJar = je.parentJar; 12557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson attributes = je.attributes; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signers = je.signers; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the code signers for the digital signatures associated with the 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JAR file. If there is no such code signer, it returns {@code null}. Make 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sure that the everything is read from the input stream before calling 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this method, or else the method returns {@code null}. 134f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson * 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the code signers for the JAR entry. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see CodeSigner 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CodeSigner[] getCodeSigners() { 139b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (signers == null) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signers = getCodeSigners(getCertificates()); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (signers == null) { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CodeSigner[] tmp = new CodeSigner[signers.length]; 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(signers, 0, tmp, 0, tmp.length); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return tmp; 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private CodeSigner[] getCodeSigners(Certificate[] certs) { 152b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (certs == null) { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project X500Principal prevIssuer = null; 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ArrayList<Certificate> list = new ArrayList<Certificate>(certs.length); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ArrayList<CodeSigner> asigners = new ArrayList<CodeSigner>(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Certificate element : certs) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(element instanceof X509Certificate)) { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Only X509Certificate-s are taken into account - see API spec. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project X509Certificate x509 = (X509Certificate) element; 166b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (prevIssuer != null) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project X500Principal subj = x509.getSubjectX500Principal(); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!prevIssuer.equals(subj)) { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Ok, this ends the previous chain, 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // so transform this one into CertPath ... 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project addCodeSigner(asigners, list); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // ... and start a new one 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list.clear(); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }// else { it's still the same chain } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prevIssuer = x509.getIssuerX500Principal(); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list.add(x509); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!list.isEmpty()) { 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project addCodeSigner(asigners, list); 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (asigners.isEmpty()) { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 'signers' is 'null' already 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CodeSigner[] tmp = new CodeSigner[asigners.size()]; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project asigners.toArray(tmp); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return tmp; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void addCodeSigner(ArrayList<CodeSigner> asigners, 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<Certificate> list) { 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CertPath certPath = null; 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isFactoryChecked) { 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 199f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes factory = CertificateFactory.getInstance("X.509"); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CertificateException ex) { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do nothing 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isFactoryChecked = true; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (factory == null) { 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certPath = factory.generateCertPath(list); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CertificateException ex) { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do nothing 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 214b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (certPath != null) { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project asigners.add(new CodeSigner(certPath, null)); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 219