/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Boris Kuznetsov * @version $Revision$ */ package org.apache.harmony.security.pkcs7; import java.util.List; import org.apache.harmony.security.asn1.ASN1Implicit; import org.apache.harmony.security.asn1.ASN1Integer; import org.apache.harmony.security.asn1.ASN1Sequence; import org.apache.harmony.security.asn1.ASN1SetOf; import org.apache.harmony.security.asn1.ASN1Type; import org.apache.harmony.security.asn1.BerInputStream; import org.apache.harmony.security.x509.AlgorithmIdentifier; import org.apache.harmony.security.x509.Certificate; import org.apache.harmony.security.x509.CertificateList; /** * As defined in PKCS #7: Cryptographic Message Syntax Standard * (http://www.ietf.org/rfc/rfc2315.txt) * * SignedData ::= SEQUENCE { * version Version, * digestAlgorithms DigestAlgorithmIdentifiers, * contentInfo ContentInfo, * certificates * [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL, * crls * [1] IMPLICIT CertificateRevocationLists OPTIONAL, * signerInfos SignerInfos } */ public final class SignedData { private final int version; private final List<?> digestAlgorithms; private final ContentInfo contentInfo; private final List<Certificate> certificates; private final List<CertificateList> crls; private final List<SignerInfo> signerInfos; private SignedData(int version, List<?> digestAlgorithms, ContentInfo contentInfo, List<Certificate> certificates, List<CertificateList> crls, List<SignerInfo> signerInfos) { this.version = version; this.digestAlgorithms = digestAlgorithms; this.contentInfo = contentInfo; this.certificates = certificates; this.crls = crls; this.signerInfos = signerInfos; } public List<Certificate> getCertificates() { return certificates; } public List<CertificateList> getCRLs() { return crls; } public List<SignerInfo> getSignerInfos() { return signerInfos; } public int getVersion() { return version; } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("---- SignedData:"); res.append("\nversion: "); res.append(version); res.append("\ndigestAlgorithms: "); res.append(digestAlgorithms.toString()); res.append("\ncontentInfo: "); res.append(contentInfo.toString()); res.append("\ncertificates: "); if (certificates != null) { res.append(certificates.toString()); } res.append("\ncrls: "); if (crls != null) { res.append(crls.toString()); } res.append("\nsignerInfos:\n"); res.append(signerInfos.toString()); res.append("\n---- SignedData End\n]"); return res.toString(); } public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] { ASN1Integer.getInstance(), new ASN1SetOf(AlgorithmIdentifier.ASN1), ContentInfo.ASN1, new ASN1Implicit(0, new ASN1SetOf(Certificate.ASN1)), new ASN1Implicit(1, new ASN1SetOf(CertificateList.ASN1)), new ASN1SetOf(SignerInfo.ASN1) }) { { setOptional(3); // certificates is optional setOptional(4); // crls is optional } @Override protected void getValues(Object object, Object[] values) { SignedData sd = (SignedData) object; values[0] = new byte[] {(byte)sd.version}; values[1] = sd.digestAlgorithms; values[2] = sd.contentInfo; values[3] = sd.certificates; values[4] = sd.crls; values[5] = sd.signerInfos; } @Override protected Object getDecodedObject(BerInputStream in) { Object[] values = (Object[]) in.content; return new SignedData( ASN1Integer.toIntValue(values[0]), (List<?>) values[1], (ContentInfo) values[2], (List<Certificate>) values[3], (List<CertificateList>) values[4], (List<SignerInfo>) values[5] ); } }; }