1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 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 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 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 Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexander Y. Kleymenov 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$ 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.x509; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1BitString; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Sequence; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BitString; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.utils.Array; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * The class encapsulates the ASN.1 DER encoding/decoding work 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the X.509 CRL. Its ASN notation is as follows 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (as specified in RFC 3280 - 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Internet X.509 Public Key Infrastructure. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Certificate and Certificate Revocation List (CRL) Profile. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.ietf.org/rfc/rfc3280.txt): 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CertificateList ::= SEQUENCE { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tbsCertList TBSCertList, 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * signatureAlgorithm AlgorithmIdentifier, 44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * signatureValue BIT STRING 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 485c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class CertificateList { 495c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of tbsCertList field of the structure */ 50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private final TBSCertList tbsCertList; 515c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of signatureAlgorithm field of the structure */ 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final AlgorithmIdentifier signatureAlgorithm; 535c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of signatureValue field of the structure */ 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final byte[] signatureValue; 555c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the ASN.1 encoded form of CertList */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] encoding; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public CertificateList(TBSCertList tbsCertList, 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project AlgorithmIdentifier signatureAlgorithm, 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] signatureValue) { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.tbsCertList = tbsCertList; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.signatureAlgorithm = signatureAlgorithm; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.signatureValue = new byte[signatureValue.length]; 64f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes System.arraycopy(signatureValue, 0, this.signatureValue, 0, 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signatureValue.length); 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private CertificateList(TBSCertList tbsCertList, 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project AlgorithmIdentifier signatureAlgorithm, 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] signatureValue, byte[] encoding) { 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(tbsCertList, signatureAlgorithm, signatureValue); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.encoding = encoding; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the value of tbsCertList field of the structure. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TBSCertList getTbsCertList() { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return tbsCertList; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the value of signatureValue field of the structure. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getSignatureValue() { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = new byte[signatureValue.length]; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(signatureValue, 0, result, 0, signatureValue.length); 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 915c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override public String toString() { 928216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes StringBuilder result = new StringBuilder(); 938216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes tbsCertList.dumpValue(result); 948216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes result.append("\nSignature Value:\n"); 958216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes result.append(Array.toString(signatureValue, "")); 968216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes return result.toString(); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns ASN.1 encoded form of this X.509 TBSCertList value. 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getEncoded() { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (encoding == null) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project encoding = CertificateList.ASN1.encode(this); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return encoding; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * X.509 CertList encoder/decoder. 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 112f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public static final ASN1Sequence ASN1 = 113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes new ASN1Sequence(new ASN1Type[] 114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes {TBSCertList.ASN1, AlgorithmIdentifier.ASN1, 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ASN1BitString.getInstance()}) { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1175c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override protected Object getDecodedObject(BerInputStream in) { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] values = (Object[]) in.content; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CertificateList( 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (TBSCertList) values[0], 121f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes (AlgorithmIdentifier) values[1], 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ((BitString) values[2]).bytes, // FIXME keep as BitString object 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.getEncoded() 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1275c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override protected void getValues(Object object, Object[] values) { 1285c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson CertificateList certificateList = (CertificateList) object; 1295c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson values[0] = certificateList.tbsCertList; 1305c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson values[1] = certificateList.signatureAlgorithm; 1315c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson values[2] = new BitString(certificateList.signatureValue, 0); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 135