001package org.apache.commons.ssl.org.bouncycastle.asn1.cms; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString; 012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 013 014/** 015 * <a href="http://tools.ietf.org/html/rfc5652#section-7">RFC 5652</a> DigestedData object. 016 * <pre> 017 * DigestedData ::= SEQUENCE { 018 * version CMSVersion, 019 * digestAlgorithm DigestAlgorithmIdentifier, 020 * encapContentInfo EncapsulatedContentInfo, 021 * digest Digest } 022 * </pre> 023 */ 024public class DigestedData 025 extends ASN1Object 026{ 027 private ASN1Integer version; 028 private AlgorithmIdentifier digestAlgorithm; 029 private ContentInfo encapContentInfo; 030 private ASN1OctetString digest; 031 032 public DigestedData( 033 AlgorithmIdentifier digestAlgorithm, 034 ContentInfo encapContentInfo, 035 byte[] digest) 036 { 037 this.version = new ASN1Integer(0); 038 this.digestAlgorithm = digestAlgorithm; 039 this.encapContentInfo = encapContentInfo; 040 this.digest = new DEROctetString(digest); 041 } 042 043 private DigestedData( 044 ASN1Sequence seq) 045 { 046 this.version = (ASN1Integer)seq.getObjectAt(0); 047 this.digestAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); 048 this.encapContentInfo = ContentInfo.getInstance(seq.getObjectAt(2)); 049 this.digest = ASN1OctetString.getInstance(seq.getObjectAt(3)); 050 } 051 052 /** 053 * Return a DigestedData object from a tagged object. 054 * 055 * @param ato the tagged object holding the object we want. 056 * @param isExplicit true if the object is meant to be explicitly 057 * tagged false otherwise. 058 * @exception IllegalArgumentException if the object held by the 059 * tagged object cannot be converted. 060 */ 061 public static DigestedData getInstance( 062 ASN1TaggedObject ato, 063 boolean isExplicit) 064 { 065 return getInstance(ASN1Sequence.getInstance(ato, isExplicit)); 066 } 067 068 /** 069 * Return a DigestedData object from the given object. 070 * <p> 071 * Accepted inputs: 072 * <ul> 073 * <li> null → null 074 * <li> {@link DigestedData} object 075 * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats 076 * </ul> 077 * 078 * @param obj the object we want converted. 079 * @exception IllegalArgumentException if the object cannot be converted. 080 */ 081 public static DigestedData getInstance( 082 Object obj) 083 { 084 if (obj instanceof DigestedData) 085 { 086 return (DigestedData)obj; 087 } 088 089 if (obj != null) 090 { 091 return new DigestedData(ASN1Sequence.getInstance(obj)); 092 } 093 094 return null; 095 } 096 097 public ASN1Integer getVersion() 098 { 099 return version; 100 } 101 102 public AlgorithmIdentifier getDigestAlgorithm() 103 { 104 return digestAlgorithm; 105 } 106 107 public ContentInfo getEncapContentInfo() 108 { 109 return encapContentInfo; 110 } 111 112 public ASN1Primitive toASN1Primitive() 113 { 114 ASN1EncodableVector v = new ASN1EncodableVector(); 115 116 v.add(version); 117 v.add(digestAlgorithm); 118 v.add(encapContentInfo); 119 v.add(digest); 120 121 return new BERSequence(v); 122 } 123 124 public byte[] getDigest() 125 { 126 return digest.getOctets(); 127 } 128}