Package

Source Code of Driver

import java.io.DataOutputStream;
import java.io.FileOutputStream;
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.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.tsp.TSPAlgorithms;
import org.bouncycastle.tsp.TSPException;
import org.bouncycastle.tsp.TSPValidationException;
import org.bouncycastle.tsp.TimeStampRequest;
import org.bouncycastle.tsp.TimeStampRequestGenerator;
import org.bouncycastle.tsp.TimeStampResponse;
import org.bouncycastle.util.encoders.Base64;

public class Driver {

  //**Fields
  private static String httpResponseError = TxtES.httpResponseError;
  private static String myString = TxtES.myString;
  private static String myFilePath = TxtES.myFilePath;
  private static String myFileResultPath = TxtES.myFileResultPath;
  private static String myUrl = TxtES.myUrl;
  private static String timeStampValidatedSuccess = TxtES.timeStampValidatedSuccess;
  private static String timeStampValidatedFailed = TxtES.timeStampValidatedFailed;
  private static String hashAlgorithm = TxtES.hashAlgorithm;
  private static Boolean authorization = true;

  // Se podr�a utilizar mensaje de prueba para solicitar estampado. De ser as� habr�a que utilizar m�todo para generar
  // digesti�n en CryptoEngine que acepte arreglo de bytes como argumento (computeByteArrayHash(byte[] myBytes, String hashAlgorithm)).
  @SuppressWarnings("unused")
  private static byte[] _TEST_MESSAGE_ = new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 };

  // Nuevo objeto de clase CryptoEngine para obtener acceso a m�todos cryptogr�ficos (hash, signature, etc.)
  private static CryptoEngine ce = new CryptoEngine();
  private static BCInstallTest myBCInstallTest = new BCInstallTest();

  /**
   * Punto de entrada principal
   * @param args
   */
  public static void main(String[] args) {

    // Confirmar versi�n de Java de m�quina
    System.out.println(System.getProperty("java.runtime.version"));

    // Agregar proveedor de BC al ambiente
    Security.addProvider(new BouncyCastleProvider());

    // Prueba de instalaci�n de BC
    myBCInstallTest.testBCInstall();

    // Probar m�tido de digesti�n para arreglo de bytes de _TEST_MESSAGE_
    testHashFromByteArray();

    // Probar m�todo de digesti�n para archivo.
    testHashFromFile();

    // Probar m�todo de digesti�n para string.
    testHashFromString();

    // Generaci�n de hash, objeto TimeStampRequestGenerator, objeto TimeStampRequest
    try {
      byte[] hash = ce.computeStringHash(myString, hashAlgorithm);
      TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
      reqGen.setCertReq(true);

      // Se podr�an agregar condiciones para cambiar los TSPAlgorithms a SHA256, SHA384, SHA512, etc.
      TimeStampRequest tsReq = reqGen.generate(TSPAlgorithms.SHA1, hash, BigInteger.valueOf(100));
      // Se convierte objeto de TimeStampRequest a arreglo de bytes.
      byte[] tsData = tsReq.getEncoded();

      // Leemos contenido con InputStreamReader
      // URL para abrir conexi�n
      URL url;
      try {
        url = new URL(myUrl);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        // Si el servidor pide autenticaci�n, mandar solicitud con credenciales.
        // No mandar en con HTTP, siempre con HTTPS!!
        if (authorization)
        {
          String userCredentials = TxtES.userCredentials;
          new Base64();
          String basicAuth = "Basic " + new String(Base64.encode(userCredentials.getBytes()));
          connection.setRequestProperty ("Authorization", basicAuth);
        }
        // M�todo de conexi�n con POST, ya que datos se mandan dentro del cuerpo del mensaje.
        connection.setRequestMethod("POST");
        // Encabezado para identificar solicitud como una de solicitud de estampado de tiempo.
        connection.setRequestProperty("Content-Type", "application/timestamp-query");
        // Mandar longitud de datos.
        connection.setRequestProperty("Content-Length", "" + Integer.toString(tsData.length));
        connection.setRequestProperty("Content-Language", "en-US");
        connection.setUseCaches(false);
        // setDoOutput(true) necesario para subir cuerpo de mensaje a servidor.
        connection.setDoOutput(true);
        // setDoInput(true) necesario para descargar cuerpo de respuesta de servidor.
        connection.setDoInput(true);

        // Subir cuerpo de solicitud. Escribir a output stream para subir al servidor.
        // Transmita datos regresados por by getOutputStream().
        DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
        wr.write(tsData, 0, tsData.length);
        // Limpieza de memoria
        wr.flush();
        wr.close();

        // Verificar que no exista error http
        int rc = connection.getResponseCode();
        if(rc==200)
        {
          // Si no hay errores, lee respuesta de estampado de tiempo.
          // Ahora podemos leer respuesta de servidor y escribir a buffer.
          // El cuerpo de la respuesta puede ser leido del stream regresado por getInputStream().

          // Asignaci�n de memoria para buffer
          byte[] buffer = new byte[8 * 1024];
          // Nombre de archivo para el resultado
          String filename = myFileResultPath;

          // Lee respuesta de servidor y escribe a archivo con FileOutputStream(String miArchivo).
          InputStream input = connection.getInputStream();
          try {
            OutputStream output = new FileOutputStream(filename);
            try {
              int bytesRead;
              // Leamos hasta el final del arreglo de bytes
              while ((bytesRead = input.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
              }
              // Limpieza de memoria
            } finally {
              output.close();
            }
            // Limpieza de memoria
          } finally {
            input.close();
          }

          try {
            TimeStampResponse timeStampResponse = new TimeStampResponse(buffer);
            timeStampResponse.validate(tsReq);
            System.out.println(timeStampValidatedSuccess);
          }
          catch (TSPValidationException e) {
            System.out.println(timeStampValidatedFailed);
            e.printStackTrace();
          }
          catch (TSPException e) {
            System.out.println(timeStampValidatedFailed);
            e.printStackTrace();
          }
        }
        else
        {
          System.out.println(httpResponseError + rc + "\n");
        }

        // Cierre de conexi�n
        connection.disconnect();

      } catch (IOException e) {
        e.printStackTrace();
      }

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * Prueba de la generaci�n de una digesti�n (hash) y escribe a consola
   */
  private static void testHashFromByteArray()
  {
    byte[] hash;
    hash = ce.computeByteArrayHash(_TEST_MESSAGE_, hashAlgorithm);
    String result = "";
    for ( byte b : hash ) {
      result += Integer.toHexString(b + 256) + " ";
    }
    System.out.println(TxtES.hashForByteArray + result);
  }


  /**
   * Prueba de la generaci�n de una digesti�n (hash) y escribe a consola
   */
  private static void testHashFromFile()
  {
    byte[] hash;
    try {
      hash = ce.computeFileHash(myFilePath, hashAlgorithm);
      String result = "";
      for ( byte b : hash ) {
        result += Integer.toHexString(b + 256) + " ";
      }
      System.out.println(TxtES.hashForFile + result);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
   * Prueba de la generaci�n de una digesti�n (hash) y escribe a consola
   */
  private static void testHashFromString()
  {
    byte[] hash = ce.computeStringHash(myString, hashAlgorithm);

    String result = "";
    for ( byte b : hash ) {
      result += Integer.toHexString(b + 256) + " ";
    }
    System.out.println(TxtES.hashForString + result);
  }
}
TOP

Related Classes of Driver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.