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 Boris Kuznetsov
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.pkcs7;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Implicit;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Integer;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Sequence;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1SetOf;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x509.AlgorithmIdentifier;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x509.Certificate;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x509.CertificateList;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * As defined in PKCS #7: Cryptographic Message Syntax Standard
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (http://www.ietf.org/rfc/rfc2315.txt)
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * SignedData ::= SEQUENCE {
41f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *   version Version,
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   digestAlgorithms DigestAlgorithmIdentifiers,
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   contentInfo ContentInfo,
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   certificates
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *   crls
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     [1] IMPLICIT CertificateRevocationLists OPTIONAL,
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   signerInfos SignerInfos }
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
505c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class SignedData {
515c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final int version;
525c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final List<?> digestAlgorithms;
535c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final ContentInfo contentInfo;
545c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final List<Certificate> certificates;
555c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final List<CertificateList> crls;
565c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private final List<SignerInfo> signerInfos;
575c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson
585c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private SignedData(int version, List<?> digestAlgorithms, ContentInfo contentInfo,
595c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson            List<Certificate> certificates, List<CertificateList> crls,
605c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson            List<SignerInfo> signerInfos) {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.version = version;
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.digestAlgorithms = digestAlgorithms;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.contentInfo = contentInfo;
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.certificates = certificates;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.crls = crls;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.signerInfos = signerInfos;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
695c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public List<Certificate> getCertificates() {
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return certificates;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
735c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public List<CertificateList> getCRLs() {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return crls;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
775c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public List<SignerInfo> getSignerInfos() {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return signerInfos;
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getVersion() {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return version;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
855c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    @Override public String toString() {
862f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        StringBuilder res = new StringBuilder();
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("---- SignedData:");
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\nversion: ");
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        res.append(version);
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\ndigestAlgorithms: ");
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        res.append(digestAlgorithms.toString());
92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\ncontentInfo: ");
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        res.append(contentInfo.toString());
94f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\ncertificates: ");
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates != null) {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            res.append(certificates.toString());
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\ncrls: ");
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (crls != null) {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            res.append(crls.toString());
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\nsignerInfos:\n");
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        res.append(signerInfos.toString());
104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        res.append("\n---- SignedData End\n]");
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return res.toString();
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
109f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            ASN1Integer.getInstance(),
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ASN1SetOf(AlgorithmIdentifier.ASN1),
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ContentInfo.ASN1,
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ASN1Implicit(0, new ASN1SetOf(Certificate.ASN1)),
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ASN1Implicit(1, new ASN1SetOf(CertificateList.ASN1)),
114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ASN1SetOf(SignerInfo.ASN1)
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setOptional(3); // certificates is optional
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setOptional(4); // crls is optional
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1215c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        @Override protected void getValues(Object object, Object[] values) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SignedData sd = (SignedData) object;
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[0] = new byte[] {(byte)sd.version};
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[1] = sd.digestAlgorithms;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[2] = sd.contentInfo;
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[3] = sd.certificates;
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[4] = sd.crls;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            values[5] = sd.signerInfos;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1315c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        @Override protected Object getDecodedObject(BerInputStream in) {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object[] values = (Object[]) in.content;
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new SignedData(
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ASN1Integer.toIntValue(values[0]),
1355c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson                        (List<?>) values[1],
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        (ContentInfo) values[2],
1375c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson                        (List<Certificate>) values[3],
1385c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson                        (List<CertificateList>) values[4],
1395c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson                        (List<SignerInfo>) values[5]
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    );
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
145