001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: /**
019: * @author Boris Kuznetsov
020: * @version $Revision$
021: */package org.apache.harmony.security.pkcs7;
022:
023: import java.util.List;
024:
025: import org.apache.harmony.security.asn1.ASN1Any;
026: import org.apache.harmony.security.asn1.ASN1Implicit;
027: import org.apache.harmony.security.asn1.ASN1Integer;
028: import org.apache.harmony.security.asn1.ASN1Sequence;
029: import org.apache.harmony.security.asn1.ASN1SetOf;
030: import org.apache.harmony.security.asn1.ASN1Type;
031: import org.apache.harmony.security.asn1.BerInputStream;
032: import org.apache.harmony.security.x509.AlgorithmIdentifier;
033: import org.apache.harmony.security.x509.Certificate;
034: import org.apache.harmony.security.x509.CertificateList;
035:
036: /**
037: * As defined in PKCS #7: Cryptographic Message Syntax Standard
038: * (http://www.ietf.org/rfc/rfc2315.txt)
039: *
040: * SignedData ::= SEQUENCE {
041: * version Version,
042: * digestAlgorithms DigestAlgorithmIdentifiers,
043: * contentInfo ContentInfo,
044: * certificates
045: * [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
046: * crls
047: * [1] IMPLICIT CertificateRevocationLists OPTIONAL,
048: * signerInfos SignerInfos }
049: *
050: */
051:
052: public class SignedData {
053:
054: private int version;
055:
056: private List digestAlgorithms;
057: private ContentInfo contentInfo;
058: private List certificates;
059: private List crls;
060: private List signerInfos;
061:
062: public SignedData(int version, List digestAlgorithms,
063: ContentInfo contentInfo, List certificates, List crls,
064: List signerInfos) {
065: this .version = version;
066: this .digestAlgorithms = digestAlgorithms;
067: this .contentInfo = contentInfo;
068: this .certificates = certificates;
069: this .crls = crls;
070: this .signerInfos = signerInfos;
071: }
072:
073: public List getCertificates() {
074: return certificates;
075: }
076:
077: public List getCRLs() {
078: return crls;
079: }
080:
081: public List getSignerInfos() {
082: return signerInfos;
083: }
084:
085: /**
086: * @return Returns the contentInfo.
087: */
088: public ContentInfo getContentInfo() {
089: return contentInfo;
090: }
091:
092: /**
093: * @return Returns the digestAlgorithms.
094: */
095: public List getDigestAlgorithms() {
096: return digestAlgorithms;
097: }
098:
099: /**
100: * @return Returns the version.
101: */
102: public int getVersion() {
103: return version;
104: }
105:
106: public String toString() {
107: StringBuffer res = new StringBuffer();
108: res.append("---- SignedData:"); //$NON-NLS-1$
109: res.append("\nversion: "); //$NON-NLS-1$
110: res.append(version);
111: res.append("\ndigestAlgorithms: "); //$NON-NLS-1$
112: res.append(digestAlgorithms.toString());
113: res.append("\ncontentInfo: "); //$NON-NLS-1$
114: res.append(contentInfo.toString());
115: res.append("\ncertificates: "); //$NON-NLS-1$
116: if (certificates != null) {
117: res.append(certificates.toString());
118: }
119: res.append("\ncrls: "); //$NON-NLS-1$
120: if (crls != null) {
121: res.append(crls.toString());
122: }
123: res.append("\nsignerInfos:\n"); //$NON-NLS-1$
124: res.append(signerInfos.toString());
125: res.append("\n---- SignedData End\n]"); //$NON-NLS-1$
126: return res.toString();
127: }
128:
129: public static final ASN1Sequence ASN1 = new ASN1Sequence(
130: new ASN1Type[] {
131: ASN1Integer.getInstance(),
132: new ASN1SetOf(AlgorithmIdentifier.ASN1),
133: ContentInfo.ASN1,
134: new ASN1Implicit(0, new ASN1SetOf(Certificate.ASN1)),
135: new ASN1Implicit(1, new ASN1SetOf(
136: CertificateList.ASN1)),
137: new ASN1SetOf(SignerInfo.ASN1) }) {
138: {
139: setOptional(3); // certificates is optional
140: setOptional(4); // crls is optional
141: }
142:
143: protected void getValues(Object object, Object[] values) {
144: SignedData sd = (SignedData) object;
145: values[0] = new byte[] { (byte) sd.version };
146: values[1] = sd.digestAlgorithms;
147: values[2] = sd.contentInfo;
148: values[3] = sd.certificates;
149: values[4] = sd.crls;
150: values[5] = sd.signerInfos;
151: }
152:
153: protected Object getDecodedObject(BerInputStream in) {
154: Object[] values = (Object[]) in.content;
155: return new SignedData(ASN1Integer.toIntValue(values[0]),
156: (List) values[1], (ContentInfo) values[2],
157: (List) values[3], (List) values[4],
158: (List) values[5]);
159: }
160: };
161:
162: }
|