diff options
Diffstat (limited to 'core/src/main/java/org/spongycastle/asn1/dvcs/DVCSRequestInformationBuilder.java')
-rw-r--r-- | core/src/main/java/org/spongycastle/asn1/dvcs/DVCSRequestInformationBuilder.java | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/core/src/main/java/org/spongycastle/asn1/dvcs/DVCSRequestInformationBuilder.java b/core/src/main/java/org/spongycastle/asn1/dvcs/DVCSRequestInformationBuilder.java new file mode 100644 index 00000000..8815fe37 --- /dev/null +++ b/core/src/main/java/org/spongycastle/asn1/dvcs/DVCSRequestInformationBuilder.java @@ -0,0 +1,224 @@ +package org.spongycastle.asn1.dvcs; + +import java.math.BigInteger; + +import org.spongycastle.asn1.ASN1Encodable; +import org.spongycastle.asn1.ASN1EncodableVector; +import org.spongycastle.asn1.ASN1Integer; +import org.spongycastle.asn1.DERSequence; +import org.spongycastle.asn1.DERTaggedObject; +import org.spongycastle.asn1.x509.Extensions; +import org.spongycastle.asn1.x509.GeneralName; +import org.spongycastle.asn1.x509.GeneralNames; +import org.spongycastle.asn1.x509.PolicyInformation; +import org.spongycastle.util.BigIntegers; + +/** + * <pre> + * DVCSRequestInformation ::= SEQUENCE { + * version INTEGER DEFAULT 1 , + * service ServiceType, + * nonce Nonce OPTIONAL, + * requestTime DVCSTime OPTIONAL, + * requester [0] GeneralNames OPTIONAL, + * requestPolicy [1] PolicyInformation OPTIONAL, + * dvcs [2] GeneralNames OPTIONAL, + * dataLocations [3] GeneralNames OPTIONAL, + * extensions [4] IMPLICIT Extensions OPTIONAL + * } + * </pre> + */ +public class DVCSRequestInformationBuilder +{ + private int version = DEFAULT_VERSION; + + private final ServiceType service; + private DVCSRequestInformation initialInfo; + + private BigInteger nonce; + private DVCSTime requestTime; + private GeneralNames requester; + private PolicyInformation requestPolicy; + private GeneralNames dvcs; + private GeneralNames dataLocations; + private Extensions extensions; + + private static final int DEFAULT_VERSION = 1; + private static final int TAG_REQUESTER = 0; + private static final int TAG_REQUEST_POLICY = 1; + private static final int TAG_DVCS = 2; + private static final int TAG_DATA_LOCATIONS = 3; + private static final int TAG_EXTENSIONS = 4; + + public DVCSRequestInformationBuilder(ServiceType service) + { + this.service = service; + } + + public DVCSRequestInformationBuilder(DVCSRequestInformation initialInfo) + { + this.initialInfo = initialInfo; + this.service = initialInfo.getService(); + this.version = initialInfo.getVersion(); + this.nonce = initialInfo.getNonce(); + this.requestTime = initialInfo.getRequestTime(); + this.requestPolicy = initialInfo.getRequestPolicy(); + this.dvcs = initialInfo.getDVCS(); + this.dataLocations = initialInfo.getDataLocations(); + } + + public DVCSRequestInformation build() + { + ASN1EncodableVector v = new ASN1EncodableVector(); + + if (version != DEFAULT_VERSION) + { + v.add(new ASN1Integer(version)); + } + v.add(service); + if (nonce != null) + { + v.add(new ASN1Integer(nonce)); + } + if (requestTime != null) + { + v.add(requestTime); + } + + int[] tags = new int[]{ + TAG_REQUESTER, + TAG_REQUEST_POLICY, + TAG_DVCS, + TAG_DATA_LOCATIONS, + TAG_EXTENSIONS + }; + ASN1Encodable[] taggedObjects = new ASN1Encodable[]{ + requester, + requestPolicy, + dvcs, + dataLocations, + extensions + }; + for (int i = 0; i < tags.length; i++) + { + int tag = tags[i]; + ASN1Encodable taggedObject = taggedObjects[i]; + if (taggedObject != null) + { + v.add(new DERTaggedObject(false, tag, taggedObject)); + } + } + + return DVCSRequestInformation.getInstance(new DERSequence(v)); + } + + public void setVersion(int version) + { + if (initialInfo != null) + { + throw new IllegalStateException("cannot change version in existing DVCSRequestInformation"); + } + + this.version = version; + } + + public void setNonce(BigInteger nonce) + { + // RFC 3029, 9.1: The DVCS MAY modify the fields + // 'dvcs', 'requester', 'dataLocations', and 'nonce' of the ReqInfo structure + + // RFC 3029, 9.1: The only modification + // allowed to a 'nonce' is the inclusion of a new field if it was not + // present, or to concatenate other data to the end (right) of an + // existing value. + if (initialInfo != null) + { + if (initialInfo.getNonce() == null) + { + this.nonce = nonce; + } + else + { + byte[] initialBytes = initialInfo.getNonce().toByteArray(); + byte[] newBytes = BigIntegers.asUnsignedByteArray(nonce); + byte[] nonceBytes = new byte[initialBytes.length + newBytes.length]; + + System.arraycopy(initialBytes, 0, nonceBytes, 0, initialBytes.length); + System.arraycopy(newBytes, 0, nonceBytes, initialBytes.length, newBytes.length); + + this.nonce = new BigInteger(nonceBytes); + } + } + + this.nonce = nonce; + } + + public void setRequestTime(DVCSTime requestTime) + { + if (initialInfo != null) + { + throw new IllegalStateException("cannot change request time in existing DVCSRequestInformation"); + } + + this.requestTime = requestTime; + } + + public void setRequester(GeneralName requester) + { + this.setRequester(new GeneralNames(requester)); + } + + public void setRequester(GeneralNames requester) + { + // RFC 3029, 9.1: The DVCS MAY modify the fields + // 'dvcs', 'requester', 'dataLocations', and 'nonce' of the ReqInfo structure + + this.requester = requester; + } + + public void setRequestPolicy(PolicyInformation requestPolicy) + { + if (initialInfo != null) + { + throw new IllegalStateException("cannot change request policy in existing DVCSRequestInformation"); + } + + this.requestPolicy = requestPolicy; + } + + public void setDVCS(GeneralName dvcs) + { + this.setDVCS(new GeneralNames(dvcs)); + } + + public void setDVCS(GeneralNames dvcs) + { + // RFC 3029, 9.1: The DVCS MAY modify the fields + // 'dvcs', 'requester', 'dataLocations', and 'nonce' of the ReqInfo structure + + this.dvcs = dvcs; + } + + public void setDataLocations(GeneralName dataLocation) + { + this.setDataLocations(new GeneralNames(dataLocation)); + } + + public void setDataLocations(GeneralNames dataLocations) + { + // RFC 3029, 9.1: The DVCS MAY modify the fields + // 'dvcs', 'requester', 'dataLocations', and 'nonce' of the ReqInfo structure + + this.dataLocations = dataLocations; + } + + public void setExtensions(Extensions extensions) + { + if (initialInfo != null) + { + throw new IllegalStateException("cannot change extensions in existing DVCSRequestInformation"); + } + + this.extensions = extensions; + } +} |