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);
}
}