/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.harmony.security.x509.tsp;
import java.math.BigInteger;
import org.apache.harmony.security.asn1.ASN1Boolean;
import org.apache.harmony.security.asn1.ASN1Implicit;
import org.apache.harmony.security.asn1.ASN1Integer;
import org.apache.harmony.security.asn1.ASN1Oid;
import org.apache.harmony.security.asn1.ASN1Sequence;
import org.apache.harmony.security.asn1.ASN1Type;
import org.apache.harmony.security.asn1.BerInputStream;
import org.apache.harmony.security.asn1.ObjectIdentifier;
import org.apache.harmony.security.x509.Extensions;
/**
* As defined in Time-Stamp Protocol (TSP)
* (http://www.ietf.org/rfc/rfc3161.txt)
*
* TimeStampReq ::= SEQUENCE {
* version INTEGER { v1(1) },
* messageImprint MessageImprint,
* --a hash algorithm OID and the hash value of the data to be
* --time-stamped
* reqPolicy TSAPolicyId OPTIONAL,
* nonce INTEGER OPTIONAL,
* certReq BOOLEAN DEFAULT FALSE,
* extensions [0] IMPLICIT Extensions OPTIONAL
* }
*
* TSAPolicyId ::= OBJECT IDENTIFIER
*/
public class TimeStampReq {
private final int version;
private final MessageImprint messageImprint;
private final String reqPolicy;
private final BigInteger nonce;
private final Boolean certReq;
private final Extensions extensions;
private byte [] encoding;
public TimeStampReq(int version, MessageImprint messageImprint,
String reqPolicy, BigInteger nonce, Boolean certReq,
Extensions extensions) {
this.version = version;
this.messageImprint = messageImprint;
this.reqPolicy = reqPolicy;
this.nonce = nonce;
this.certReq = certReq;
this.extensions = extensions;
}
private TimeStampReq(int version, MessageImprint messageImprint,
String reqPolicy, BigInteger nonce, Boolean certReq,
Extensions extensions, byte [] encoding) {
this (version, messageImprint, reqPolicy, nonce, certReq, extensions);
this.encoding = encoding;
}
public String toString() {
StringBuilder res = new StringBuilder();
res.append("-- TimeStampReq:");
res.append("\nversion : ");
res.append(version);
res.append("\nmessageImprint: ");
res.append(messageImprint);
res.append("\nreqPolicy: ");
res.append(reqPolicy);
res.append("\nnonce: ");
res.append(nonce);
res.append("\ncertReq: ");
res.append(certReq);
res.append("\nextensions: ");
res.append(extensions);
res.append("\n-- TimeStampReq End\n");
return res.toString();
}
/**
* Returns ASN.1 encoded form of this TimeStampReq.
* @return a byte array containing ASN.1 encoded form.
*/
public byte [] getEncoded(){
if (encoding == null) {
encoding = ASN1.encode(this);
}
return encoding;
}
/**
* @return Returns the certReq.
*/
public Boolean getCertReq() {
return certReq;
}
/**
* @return Returns the extensions.
*/
public Extensions getExtensions() {
return extensions;
}
/**
* @return Returns the messageImprint.
*/
public MessageImprint getMessageImprint() {
return messageImprint;
}
/**
* @return Returns the nonce.
*/
public BigInteger getNonce() {
return nonce;
}
/**
* @return Returns the reqPolicy.
*/
public String getReqPolicy() {
return reqPolicy;
}
/**
* @return Returns the version.
*/
public int getVersion() {
return version;
}
public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
ASN1Integer.getInstance(), // version
MessageImprint.ASN1, // messageImprint
ASN1Oid.getInstance(), // reqPolicy
ASN1Integer.getInstance(), // nonce
ASN1Boolean.getInstance(), // certReq
new ASN1Implicit(0, Extensions.ASN1)}) {// extensions
{
setDefault(Boolean.FALSE, 4);
setOptional(2);
setOptional(3);
setOptional(5);
}
protected Object getDecodedObject(BerInputStream in) {
Object[] values = (Object[]) in.content;
String objID = (values[2] == null) ? null : ObjectIdentifier
.toString((int[]) values[2]);
BigInteger nonce = (values[3] == null) ? null : new BigInteger(
(byte[]) values[3]);
if (values[5] == null) {
return new TimeStampReq(
ASN1Integer.toIntValue(values[0]),
(MessageImprint) values[1],
objID,
nonce,
(Boolean) values[4],
null,
in.getEncoded()
);
} else {
return new TimeStampReq(
ASN1Integer.toIntValue(values[0]),
(MessageImprint) values[1],
objID,
nonce,
(Boolean) values[4],
(Extensions) values[5],
in.getEncoded()
);
}
}
protected void getValues(Object object, Object[] values) {
TimeStampReq req = (TimeStampReq) object;
values[0] = ASN1Integer.fromIntValue(req.version);
values[1] = req.messageImprint;
values[2] = (req.reqPolicy == null) ? null : ObjectIdentifier
.toIntArray(req.reqPolicy);
values[3] = (req.nonce == null) ? null : req.nonce.toByteArray();
values[4] = (req.certReq == null) ? Boolean.FALSE : req.certReq;
values[5] = req.extensions;
}
};
}