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}