001package org.apache.commons.ssl.org.bouncycastle.asn1.cms;
002
003import java.io.IOException;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1SequenceParser;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1SetParser;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObjectParser;
012import org.apache.commons.ssl.org.bouncycastle.asn1.BERTags;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
014
015/**
016 * Parse {@link AuthenticatedData} stream.
017 * <pre>
018 * AuthenticatedData ::= SEQUENCE {
019 *       version CMSVersion,
020 *       originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
021 *       recipientInfos RecipientInfos,
022 *       macAlgorithm MessageAuthenticationCodeAlgorithm,
023 *       digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
024 *       encapContentInfo EncapsulatedContentInfo,
025 *       authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
026 *       mac MessageAuthenticationCode,
027 *       unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
028 *
029 * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
030 *
031 * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
032 *
033 * MessageAuthenticationCode ::= OCTET STRING
034 * </pre>
035 */
036public class AuthenticatedDataParser
037{
038    private ASN1SequenceParser seq;
039    private ASN1Integer version;
040    private ASN1Encodable nextObject;
041    private boolean originatorInfoCalled;
042
043    public AuthenticatedDataParser(
044        ASN1SequenceParser seq)
045        throws IOException
046    {
047        this.seq = seq;
048        this.version = ASN1Integer.getInstance(seq.readObject());
049    }
050
051    public ASN1Integer getVersion()
052    {
053        return version;
054    }
055
056    public OriginatorInfo getOriginatorInfo()
057        throws IOException
058    {
059        originatorInfoCalled = true;
060
061        if (nextObject == null)
062        {
063            nextObject = seq.readObject();
064        }
065
066        if (nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)nextObject).getTagNo() == 0)
067        {
068            ASN1SequenceParser originatorInfo = (ASN1SequenceParser) ((ASN1TaggedObjectParser)nextObject).getObjectParser(BERTags.SEQUENCE, false);
069            nextObject = null;
070            return OriginatorInfo.getInstance(originatorInfo.toASN1Primitive());
071        }
072
073        return null;
074    }
075
076    public ASN1SetParser getRecipientInfos()
077        throws IOException
078    {
079        if (!originatorInfoCalled)
080        {
081            getOriginatorInfo();
082        }
083
084        if (nextObject == null)
085        {
086            nextObject = seq.readObject();
087        }
088
089        ASN1SetParser recipientInfos = (ASN1SetParser)nextObject;
090        nextObject = null;
091        return recipientInfos;
092    }
093
094    public AlgorithmIdentifier getMacAlgorithm()
095        throws IOException
096    {
097        if (nextObject == null)
098        {
099            nextObject = seq.readObject();
100        }
101
102        if (nextObject != null)
103        {
104            ASN1SequenceParser o = (ASN1SequenceParser)nextObject;
105            nextObject = null;
106            return AlgorithmIdentifier.getInstance(o.toASN1Primitive());
107        }
108
109        return null;
110    }
111
112    public AlgorithmIdentifier getDigestAlgorithm()
113        throws IOException
114    {
115        if (nextObject == null)
116        {
117            nextObject = seq.readObject();
118        }
119
120        if (nextObject instanceof ASN1TaggedObjectParser)
121        {
122            AlgorithmIdentifier obj = AlgorithmIdentifier.getInstance((ASN1TaggedObject)nextObject.toASN1Primitive(), false);
123            nextObject = null;
124            return obj;
125        }
126
127        return null;
128    }
129
130    /**
131     * @deprecated use getEncapsulatedContentInfo()
132     */
133    public ContentInfoParser getEnapsulatedContentInfo()
134        throws IOException
135    {
136        return getEncapsulatedContentInfo();
137    }
138
139    public ContentInfoParser getEncapsulatedContentInfo()
140        throws IOException
141    {
142        if (nextObject == null)
143        {
144            nextObject = seq.readObject();
145        }
146
147        if (nextObject != null)
148        {
149            ASN1SequenceParser o = (ASN1SequenceParser)nextObject;
150            nextObject = null;
151            return new ContentInfoParser(o);
152        }
153
154        return null;
155    }
156
157    public ASN1SetParser getAuthAttrs()
158        throws IOException
159    {
160        if (nextObject == null)
161        {
162            nextObject = seq.readObject();
163        }
164
165        if (nextObject instanceof ASN1TaggedObjectParser)
166        {
167            ASN1Encodable o = nextObject;
168            nextObject = null;
169            return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false);
170        }
171
172        return null;
173    }
174
175    public ASN1OctetString getMac()
176        throws IOException
177    {
178        if (nextObject == null)
179        {
180            nextObject = seq.readObject();
181        }
182
183        ASN1Encodable o = nextObject;
184        nextObject = null;
185
186        return ASN1OctetString.getInstance(o.toASN1Primitive());
187    }
188
189    public ASN1SetParser getUnauthAttrs()
190        throws IOException
191    {
192        if (nextObject == null)
193        {
194            nextObject = seq.readObject();
195        }
196
197        if (nextObject != null)
198        {
199            ASN1Encodable o = nextObject;
200            nextObject = null;
201            return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false);
202        }
203
204        return null;
205    }
206}