Java Implementation of time stamp protocol

5.4k views Asked by At

We currently using openssl for timestamping. I wonder, is there a Java implementation of Time stamp protocol (RFC 3161).

2

There are 2 answers

3
Tomasz Nurkiewicz On BEST ANSWER

What about Bouncy Castle and its TSP support?

0
Beto Pacheco On

In the example below we have a request time stamp using the BouncyCastle 1.49 libraries. Hope that helps.

package br.gov.frameworkdemoiselle;

import java.io.*;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.tsp.TimeStampResp;
import org.bouncycastle.tsp.TSPAlgorithms;
import org.bouncycastle.tsp.TimeStampRequest;
import org.bouncycastle.tsp.TimeStampRequestGenerator;
import org.bouncycastle.tsp.TimeStampResponse;

public class Example {

private final static Logger logger = Logger.getLogger(Example.class.getName());

public static void main(String[] args) {
    new Example().stamp();
}

private void stamp() {

    String ocspUrl = "http://timestamping.edelweb.fr/service/tsp";
    OutputStream out = null;
    HttpURLConnection con = null;

    try {

        TimeStampRequestGenerator timeStampRequestGenerator = new TimeStampRequestGenerator();
        timeStampRequestGenerator.setReqPolicy(new ASN1ObjectIdentifier("1.3.6.1.4.1.13762.3"));
        TimeStampRequest timeStampRequest = timeStampRequestGenerator.generate(TSPAlgorithms.SHA1, new byte[20], BigInteger.valueOf(100));
        byte request[] = timeStampRequest.getEncoded();

        URL url = new URL(ocspUrl);
        con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        con.setDoInput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-type", "application/timestamp-query");
        con.setRequestProperty("Content-length", String.valueOf(request.length));
        out = con.getOutputStream();
        out.write(request);
        out.flush();

        if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
            throw new IOException("Received HTTP error: " + con.getResponseCode() + " - " + con.getResponseMessage());
        } else {
            logger.log(Level.INFO, "Response Code: ".concat(Integer.toString(con.getResponseCode())));
        }
        InputStream in = con.getInputStream();
        TimeStampResp resp = TimeStampResp.getInstance(new ASN1InputStream(in).readObject());
        TimeStampResponse response = new TimeStampResponse(resp);
        response.validate(timeStampRequest);

        logger.log(Level.INFO, "Status = {0}", response.getStatusString());

        if (response.getFailInfo()
                != null) {

            switch (response.getFailInfo().intValue()) {
                case 0: {
                    logger.log(Level.INFO, "unrecognized or unsupported Algorithm Identifier");
                    return;
                }

                case 2: {
                    logger.log(Level.INFO, "transaction not permitted or supported");
                    return;
                }

                case 5: {
                    logger.log(Level.INFO, "the data submitted has the wrong format");
                    return;
                }

                case 14: {
                    logger.log(Level.INFO, "the TSA’s time source is not available");
                    return;
                }

                case 15: {
                    logger.log(Level.INFO, "the requested TSA policy is not supported by the TSA");
                    return;
                }
                case 16: {
                    logger.log(Level.INFO, "the requested extension is not supported by the TSA");
                    return;
                }

                case 17: {
                    logger.log(Level.INFO, "the additional information requested could not be understood or is not available");
                    return;
                }

                case 25: {
                    logger.log(Level.INFO, "the request cannot be handled due to system failure");
                    return;
                }
            }
        }

        logger.log(Level.INFO, "Timestamp: {0}", response.getTimeStampToken().getTimeStampInfo().getGenTime());
        logger.log(Level.INFO, "TSA: {0}", response.getTimeStampToken().getTimeStampInfo().getTsa());
        logger.log(Level.INFO, "Serial number: {0}", response.getTimeStampToken().getTimeStampInfo().getSerialNumber());
        logger.log(Level.INFO, "Policy: {0}", response.getTimeStampToken().getTimeStampInfo().getPolicy());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}