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.ASN1EncodableVector; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetStringParser; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1SequenceParser; 012import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence; 013import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String; 014 015/** 016 * Parser for <a href="http://tools.ietf.org/html/rfc5544">RFC 5544</a>: 017 * {@link TimeStampedData} object. 018 * <p> 019 * <pre> 020 * TimeStampedData ::= SEQUENCE { 021 * version INTEGER { v1(1) }, 022 * dataUri IA5String OPTIONAL, 023 * metaData MetaData OPTIONAL, 024 * content OCTET STRING OPTIONAL, 025 * temporalEvidence Evidence 026 * } 027 * </pre> 028 */ 029public class TimeStampedDataParser 030{ 031 private ASN1Integer version; 032 private DERIA5String dataUri; 033 private MetaData metaData; 034 private ASN1OctetStringParser content; 035 private Evidence temporalEvidence; 036 private ASN1SequenceParser parser; 037 038 private TimeStampedDataParser(ASN1SequenceParser parser) 039 throws IOException 040 { 041 this.parser = parser; 042 this.version = ASN1Integer.getInstance(parser.readObject()); 043 044 ASN1Encodable obj = parser.readObject(); 045 046 if (obj instanceof DERIA5String) 047 { 048 this.dataUri = DERIA5String.getInstance(obj); 049 obj = parser.readObject(); 050 } 051 if (obj instanceof MetaData || obj instanceof ASN1SequenceParser) 052 { 053 this.metaData = MetaData.getInstance(obj.toASN1Primitive()); 054 obj = parser.readObject(); 055 } 056 if (obj instanceof ASN1OctetStringParser) 057 { 058 this.content = (ASN1OctetStringParser)obj; 059 } 060 } 061 062 public static TimeStampedDataParser getInstance(Object obj) 063 throws IOException 064 { 065 if (obj instanceof ASN1Sequence) 066 { 067 return new TimeStampedDataParser(((ASN1Sequence)obj).parser()); 068 } 069 if (obj instanceof ASN1SequenceParser) 070 { 071 return new TimeStampedDataParser((ASN1SequenceParser)obj); 072 } 073 074 return null; 075 } 076 077 public DERIA5String getDataUri() 078 { 079 return dataUri; 080 } 081 082 public MetaData getMetaData() 083 { 084 return metaData; 085 } 086 087 public ASN1OctetStringParser getContent() 088 { 089 return content; 090 } 091 092 public Evidence getTemporalEvidence() 093 throws IOException 094 { 095 if (temporalEvidence == null) 096 { 097 temporalEvidence = Evidence.getInstance(parser.readObject().toASN1Primitive()); 098 } 099 100 return temporalEvidence; 101 } 102 103 /** 104 * <pre> 105 * TimeStampedData ::= SEQUENCE { 106 * version INTEGER { v1(1) }, 107 * dataUri IA5String OPTIONAL, 108 * metaData MetaData OPTIONAL, 109 * content OCTET STRING OPTIONAL, 110 * temporalEvidence Evidence 111 * } 112 * </pre> 113 * @return 114 * @deprecated will be removed 115 */ 116 public ASN1Primitive toASN1Primitive() 117 { 118 ASN1EncodableVector v = new ASN1EncodableVector(); 119 120 v.add(version); 121 122 if (dataUri != null) 123 { 124 v.add(dataUri); 125 } 126 127 if (metaData != null) 128 { 129 v.add(metaData); 130 } 131 132 if (content != null) 133 { 134 v.add(content); 135 } 136 137 v.add(temporalEvidence); 138 139 return new BERSequence(v); 140 } 141}