package eu.tpmusielak.securephoto.verification; import eu.tpmusielak.bouncy.tsp.*; import eu.tpmusielak.securephoto.container.SPImage; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.URL; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; /** * Created by IntelliJ IDEA. * User: Tomasz P. Musielak * Date: 09.02.12 * Time: 03:11 */ public class RFC3161Timestamp extends BasicVerifier { private final String timestampServerAddress; public RFC3161Timestamp(String timestampServerAddress) { this.timestampServerAddress = timestampServerAddress; } @Override protected VerifierState onInitialize() { return VerifierState.INIT_SUCCESS; } @Override public VerificationFactorData onCapture(SPImage image) { // TODO: add error handling byte[] frameHash = image.getFrameHash(); byte[] request = null; byte[] response = null; try { TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator(); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); BigInteger nonce = BigInteger.valueOf(secureRandom.nextLong()); TimeStampRequest timeStampRequest = reqGen.generate(TSPAlgorithms.SHA1, frameHash, nonce); request = timeStampRequest.getEncoded(); URL netAddress = new URL(timestampServerAddress); HttpURLConnection connection = (HttpURLConnection) netAddress.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("ContentType", "application/timestamp-query"); connection.setRequestProperty("ContentLength", String.valueOf(request.length)); connection.setDoOutput(true); connection.connect(); OutputStream stream = connection.getOutputStream(); stream.write(request, 0, request.length); stream.close(); InputStream responseStream = new BufferedInputStream(connection.getInputStream()); TimeStampResponse timeStampResponse = new TimeStampResponse(responseStream); response = timeStampResponse.getEncoded(); responseStream.close(); } catch (IOException e) { e.printStackTrace(); } catch (TSPException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return new TimestampData(request, response); } @Override public String toString() { return "RFC3161 Timestamp"; } }