All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bouncycastle.asn1.tsp.ArchiveTimeStamp Maven / Gradle / Ivy

Go to download

The Bouncy Castle Java APIs for ASN.1 extension and utility APIs used to support bcpkix and bctls. This jar contains APIs for JDK 1.8 and up.

There is a newer version: 1.78.1
Show newest version
package org.bouncycastle.asn1.tsp;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.cms.Attributes;
import org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.SignedData;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;

/**
 * Implementation of the Archive Timestamp type defined in RFC4998.
 * {@see RFC 4998}
 * 

* ASN.1 Archive Timestamp *

* ArchiveTimeStamp ::= SEQUENCE { * digestAlgorithm [Ø] AlgorithmIdentifier OPTIONAL, * attributes [1] Attributes OPTIONAL, * reducedHashtree [2] SEQUENCE OF PartialHashtree OPTIONAL, * timeStamp ContentInfo} *

* PartialHashtree ::= SEQUENCE OF OCTET STRING *

* Attributes ::= SET SIZE (1..MAX) OF Attribute */ public class ArchiveTimeStamp extends ASN1Object { private final AlgorithmIdentifier digestAlgorithm; private final Attributes attributes; private final ASN1Sequence reducedHashTree; private final ContentInfo timeStamp; /** * Return an ArchiveTimestamp from the given object. * * @param obj the object we want converted. * @return an ArchiveTimestamp instance, or null. * @throws IllegalArgumentException if the object cannot be converted. */ public static ArchiveTimeStamp getInstance(final Object obj) { if (obj instanceof ArchiveTimeStamp) { return (ArchiveTimeStamp)obj; } else if (obj != null) { return new ArchiveTimeStamp(ASN1Sequence.getInstance(obj)); } return null; } public ArchiveTimeStamp( AlgorithmIdentifier digestAlgorithm, PartialHashtree[] reducedHashTree, ContentInfo timeStamp) { this(digestAlgorithm, null, reducedHashTree, timeStamp); } public ArchiveTimeStamp( ContentInfo timeStamp) { this(null, null, null, timeStamp); } public ArchiveTimeStamp( AlgorithmIdentifier digestAlgorithm, Attributes attributes, PartialHashtree[] reducedHashTree, ContentInfo timeStamp) { this.digestAlgorithm = digestAlgorithm; this.attributes = attributes; if (reducedHashTree != null) { this.reducedHashTree = new DERSequence(reducedHashTree); } else { this.reducedHashTree = null; } this.timeStamp = timeStamp; } private ArchiveTimeStamp(final ASN1Sequence sequence) { if (sequence.size() < 1 || sequence.size() > 4) { throw new IllegalArgumentException("wrong sequence size in constructor: " + sequence.size()); } AlgorithmIdentifier digAlg = null; Attributes attrs = null; ASN1Sequence rHashTree = null; for (int i = 0; i < sequence.size() - 1; i++) { Object obj = sequence.getObjectAt(i); if (obj instanceof ASN1TaggedObject) { ASN1TaggedObject taggedObject = ASN1TaggedObject.getInstance(obj); switch (taggedObject.getTagNo()) { case 0: digAlg = AlgorithmIdentifier.getInstance(taggedObject, false); break; case 1: attrs = Attributes.getInstance(taggedObject, false); break; case 2: rHashTree = ASN1Sequence.getInstance(taggedObject, false); break; default: throw new IllegalArgumentException("invalid tag no in constructor: " + taggedObject.getTagNo()); } } } digestAlgorithm = digAlg; attributes = attrs; reducedHashTree = rHashTree; timeStamp = ContentInfo.getInstance(sequence.getObjectAt(sequence.size() - 1)); } public AlgorithmIdentifier getDigestAlgorithmIdentifier() { if (digestAlgorithm != null) { return digestAlgorithm; } else { return getTimeStampInfo().getMessageImprint().getHashAlgorithm(); } } public byte[] getTimeStampDigestValue() { return getTimeStampInfo().getMessageImprint().getHashedMessage(); } private TSTInfo getTimeStampInfo() { if (timeStamp.getContentType().equals(CMSObjectIdentifiers.signedData)) { SignedData tsData = SignedData.getInstance(timeStamp.getContent()); if (tsData.getEncapContentInfo().getContentType().equals(PKCSObjectIdentifiers.id_ct_TSTInfo)) { TSTInfo tstData = TSTInfo.getInstance( ASN1OctetString.getInstance(tsData.getEncapContentInfo().getContent()).getOctets()); return tstData; } else { throw new IllegalStateException("cannot parse time stamp"); } } else { throw new IllegalStateException("cannot identify algorithm identifier for digest"); } } /** * Return the contents of the digestAlgorithm field - null if not set. * * @return the contents of the digestAlgorithm field, or null if not set. */ public AlgorithmIdentifier getDigestAlgorithm() { return digestAlgorithm; } /** * Return the first node in the reduced hash tree which contains the leaf node. * * @return the node containing the data hashes, null if no reduced hash tree is present. */ public PartialHashtree getHashTreeLeaf() { if (reducedHashTree == null) { return null; } return PartialHashtree.getInstance(reducedHashTree.getObjectAt(0)); } public PartialHashtree[] getReducedHashTree() { if (reducedHashTree == null) { return null; } PartialHashtree[] rv = new PartialHashtree[reducedHashTree.size()]; for (int i = 0; i != rv.length; i++) { rv[i] = PartialHashtree.getInstance(reducedHashTree.getObjectAt(i)); } return rv; } public ContentInfo getTimeStamp() { return timeStamp; } public ASN1Primitive toASN1Primitive() { ASN1EncodableVector v = new ASN1EncodableVector(4); if (digestAlgorithm != null) { v.add(new DERTaggedObject(false, 0, digestAlgorithm)); } if (attributes != null) { v.add(new DERTaggedObject(false, 1, attributes)); } if (reducedHashTree != null) { v.add(new DERTaggedObject(false, 2, reducedHashTree)); } v.add(timeStamp); return new DERSequence(v); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy