diff options
Diffstat (limited to 'libraries/spongycastle/core/src/main/java/org/spongycastle/asn1/tsp/TSTInfo.java')
-rw-r--r-- | libraries/spongycastle/core/src/main/java/org/spongycastle/asn1/tsp/TSTInfo.java | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/libraries/spongycastle/core/src/main/java/org/spongycastle/asn1/tsp/TSTInfo.java b/libraries/spongycastle/core/src/main/java/org/spongycastle/asn1/tsp/TSTInfo.java new file mode 100644 index 000000000..71587414c --- /dev/null +++ b/libraries/spongycastle/core/src/main/java/org/spongycastle/asn1/tsp/TSTInfo.java @@ -0,0 +1,233 @@ +package org.spongycastle.asn1.tsp; + +import java.util.Enumeration; + +import org.spongycastle.asn1.ASN1Boolean; +import org.spongycastle.asn1.ASN1EncodableVector; +import org.spongycastle.asn1.ASN1GeneralizedTime; +import org.spongycastle.asn1.ASN1Integer; +import org.spongycastle.asn1.ASN1Object; +import org.spongycastle.asn1.ASN1ObjectIdentifier; +import org.spongycastle.asn1.ASN1Primitive; +import org.spongycastle.asn1.ASN1Sequence; +import org.spongycastle.asn1.ASN1TaggedObject; +import org.spongycastle.asn1.DERSequence; +import org.spongycastle.asn1.DERTaggedObject; +import org.spongycastle.asn1.x509.Extensions; +import org.spongycastle.asn1.x509.GeneralName; + +public class TSTInfo + extends ASN1Object +{ + private ASN1Integer version; + private ASN1ObjectIdentifier tsaPolicyId; + private MessageImprint messageImprint; + private ASN1Integer serialNumber; + private ASN1GeneralizedTime genTime; + private Accuracy accuracy; + private ASN1Boolean ordering; + private ASN1Integer nonce; + private GeneralName tsa; + private Extensions extensions; + + public static TSTInfo getInstance(Object o) + { + if (o instanceof TSTInfo) + { + return (TSTInfo)o; + } + else if (o != null) + { + return new TSTInfo(ASN1Sequence.getInstance(o)); + } + + return null; + } + + private TSTInfo(ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + // version + version = ASN1Integer.getInstance(e.nextElement()); + + // tsaPolicy + tsaPolicyId = ASN1ObjectIdentifier.getInstance(e.nextElement()); + + // messageImprint + messageImprint = MessageImprint.getInstance(e.nextElement()); + + // serialNumber + serialNumber = ASN1Integer.getInstance(e.nextElement()); + + // genTime + genTime = ASN1GeneralizedTime.getInstance(e.nextElement()); + + // default for ordering + ordering = ASN1Boolean.getInstance(false); + + while (e.hasMoreElements()) + { + ASN1Object o = (ASN1Object) e.nextElement(); + + if (o instanceof ASN1TaggedObject) + { + DERTaggedObject tagged = (DERTaggedObject) o; + + switch (tagged.getTagNo()) + { + case 0: + tsa = GeneralName.getInstance(tagged, true); + break; + case 1: + extensions = Extensions.getInstance(tagged, false); + break; + default: + throw new IllegalArgumentException("Unknown tag value " + tagged.getTagNo()); + } + } + else if (o instanceof ASN1Sequence || o instanceof Accuracy) + { + accuracy = Accuracy.getInstance(o); + } + else if (o instanceof ASN1Boolean) + { + ordering = ASN1Boolean.getInstance(o); + } + else if (o instanceof ASN1Integer) + { + nonce = ASN1Integer.getInstance(o); + } + + } + } + + public TSTInfo(ASN1ObjectIdentifier tsaPolicyId, MessageImprint messageImprint, + ASN1Integer serialNumber, ASN1GeneralizedTime genTime, + Accuracy accuracy, ASN1Boolean ordering, ASN1Integer nonce, + GeneralName tsa, Extensions extensions) + { + version = new ASN1Integer(1); + this.tsaPolicyId = tsaPolicyId; + this.messageImprint = messageImprint; + this.serialNumber = serialNumber; + this.genTime = genTime; + + this.accuracy = accuracy; + this.ordering = ordering; + this.nonce = nonce; + this.tsa = tsa; + this.extensions = extensions; + } + + public ASN1Integer getVersion() + { + return version; + } + + public MessageImprint getMessageImprint() + { + return messageImprint; + } + + public ASN1ObjectIdentifier getPolicy() + { + return tsaPolicyId; + } + + public ASN1Integer getSerialNumber() + { + return serialNumber; + } + + public Accuracy getAccuracy() + { + return accuracy; + } + + public ASN1GeneralizedTime getGenTime() + { + return genTime; + } + + public ASN1Boolean getOrdering() + { + return ordering; + } + + public ASN1Integer getNonce() + { + return nonce; + } + + public GeneralName getTsa() + { + return tsa; + } + + public Extensions getExtensions() + { + return extensions; + } + + /** + * <pre> + * + * TSTInfo ::= SEQUENCE { + * version INTEGER { v1(1) }, + * policy TSAPolicyId, + * messageImprint MessageImprint, + * -- MUST have the same value as the similar field in + * -- TimeStampReq + * serialNumber INTEGER, + * -- Time-Stamping users MUST be ready to accommodate integers + * -- up to 160 bits. + * genTime GeneralizedTime, + * accuracy Accuracy OPTIONAL, + * ordering BOOLEAN DEFAULT FALSE, + * nonce INTEGER OPTIONAL, + * -- MUST be present if the similar field was present + * -- in TimeStampReq. In that case it MUST have the same value. + * tsa [0] GeneralName OPTIONAL, + * extensions [1] IMPLICIT Extensions OPTIONAL } + * + * </pre> + */ + public ASN1Primitive toASN1Primitive() + { + ASN1EncodableVector seq = new ASN1EncodableVector(); + seq.add(version); + + seq.add(tsaPolicyId); + seq.add(messageImprint); + seq.add(serialNumber); + seq.add(genTime); + + if (accuracy != null) + { + seq.add(accuracy); + } + + if (ordering != null && ordering.isTrue()) + { + seq.add(ordering); + } + + if (nonce != null) + { + seq.add(nonce); + } + + if (tsa != null) + { + seq.add(new DERTaggedObject(true, 0, tsa)); + } + + if (extensions != null) + { + seq.add(new DERTaggedObject(false, 1, extensions)); + } + + return new DERSequence(seq); + } +} |