001package org.apache.commons.ssl.org.bouncycastle.asn1.cms; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Boolean; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERUTF8String; 011 012/** 013 * <a href="http://tools.ietf.org/html/rfc5544">RFC 5544</a>: 014 * Binding Documents with Time-Stamps; MetaData object. 015 * <p> 016 * <pre> 017 * MetaData ::= SEQUENCE { 018 * hashProtected BOOLEAN, 019 * fileName UTF8String OPTIONAL, 020 * mediaType IA5String OPTIONAL, 021 * otherMetaData Attributes OPTIONAL 022 * } 023 * </pre> 024 */ 025public class MetaData 026 extends ASN1Object 027{ 028 private ASN1Boolean hashProtected; 029 private DERUTF8String fileName; 030 private DERIA5String mediaType; 031 private Attributes otherMetaData; 032 033 public MetaData( 034 ASN1Boolean hashProtected, 035 DERUTF8String fileName, 036 DERIA5String mediaType, 037 Attributes otherMetaData) 038 { 039 this.hashProtected = hashProtected; 040 this.fileName = fileName; 041 this.mediaType = mediaType; 042 this.otherMetaData = otherMetaData; 043 } 044 045 private MetaData(ASN1Sequence seq) 046 { 047 this.hashProtected = ASN1Boolean.getInstance(seq.getObjectAt(0)); 048 049 int index = 1; 050 051 if (index < seq.size() && seq.getObjectAt(index) instanceof DERUTF8String) 052 { 053 this.fileName = DERUTF8String.getInstance(seq.getObjectAt(index++)); 054 } 055 if (index < seq.size() && seq.getObjectAt(index) instanceof DERIA5String) 056 { 057 this.mediaType = DERIA5String.getInstance(seq.getObjectAt(index++)); 058 } 059 if (index < seq.size()) 060 { 061 this.otherMetaData = Attributes.getInstance(seq.getObjectAt(index++)); 062 } 063 } 064 065 /** 066 * Return a MetaData object from the given object. 067 * <p> 068 * Accepted inputs: 069 * <ul> 070 * <li> null → null 071 * <li> {@link MetaData} object 072 * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with MetaData structure inside 073 * </ul> 074 * 075 * @param obj the object we want converted. 076 * @exception IllegalArgumentException if the object cannot be converted. 077 */ 078 public static MetaData getInstance(Object obj) 079 { 080 if (obj instanceof MetaData) 081 { 082 return (MetaData)obj; 083 } 084 else if (obj != null) 085 { 086 return new MetaData(ASN1Sequence.getInstance(obj)); 087 } 088 089 return null; 090 } 091 092 public ASN1Primitive toASN1Primitive() 093 { 094 ASN1EncodableVector v = new ASN1EncodableVector(); 095 096 v.add(hashProtected); 097 098 if (fileName != null) 099 { 100 v.add(fileName); 101 } 102 103 if (mediaType != null) 104 { 105 v.add(mediaType); 106 } 107 108 if (otherMetaData != null) 109 { 110 v.add(otherMetaData); 111 } 112 113 return new DERSequence(v); 114 } 115 116 public boolean isHashProtected() 117 { 118 return hashProtected.isTrue(); 119 } 120 121 public DERUTF8String getFileName() 122 { 123 return this.fileName; 124 } 125 126 public DERIA5String getMediaType() 127 { 128 return this.mediaType; 129 } 130 131 public Attributes getOtherMetaData() 132 { 133 return otherMetaData; 134 } 135}