/**
* LICENCIA LGPL:
*
* Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo
* bajo los términos de la GNU Lesser General Public License (LGPL)
* tal y como ha sido publicada por la Free Software Foundation; o
* bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior.
*
* Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA
* GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN
* PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más
* detalles
*
* Usted debe recibir una copia de la GNU Lesser General Public License (LGPL)
* junto con esta librería; si no es así, escriba a la Free Software Foundation Inc.
* 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte
* <http://www.gnu.org/licenses/>.
*
* Copyright 2007 Ministerio de Industria, Turismo y Comercio
*
*/
package es.mityc.firmaJava.ejemplos.xades;
/**
* Clase de ejemplo para la generación de una firma digital XAdES
* utilizando la librería XADES
*
* @author Ministerio de Industria, Turismo y Comercio
* @version 0.9 beta
*/
public class EjemploXADESFirma {
// private Vector<X509Certificate> listCertificates = null;
// private X509Certificate certificadoParaFirmar = null;
// final private static String NOMBRE_FICHERO_A_FIRMAR = "FicheroAFirmar.xml";
// final private static String NOMBRE_FICHERO_FIRMADO = "FicheroFirmado.xml";
//
// public static void main(String[] args) {
// EjemploXADESFirma p = new EjemploXADESFirma();
// p.firmaXADES();
// }
//
// @SuppressWarnings("unchecked")
// private void firmaXADES() {
// // Accedemos al almacén de certificados de Mozilla Firefox
// InterfazFirma si = UtilidadFirmaElectronica.getSignatureInstance(EnumAlmacenCertificados.ALMACEN_MOZILLA);
// try {
// listCertificates = si.getAllCertificates("/home/borillo/.mozilla/firefox/zhy933al.default");
// } catch (FirmaXMLError e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
//
// System.out.println("Hay " + listCertificates.size() + " certificados");
// mostrarInformacionCertificados(listCertificates);
// //recogemos el certificado para firmar
// if ( listCertificates.size() != 0){
// //Seleccionamos el primero de los certificados para firmar
// certificadoParaFirmar = (X509Certificate) listCertificates.get(0);
// try {
// finalizarFirma();
// } catch (Exception e) {
// e.printStackTrace();
// }
// } else {
// System.err.println("No hay ningún certificado disponible");
// }
// }
//
// private void finalizarFirma() throws Exception {
//
// // Instanciamos la estructura de datos que almacenará el resultado de la firma
// byte[] resultadoFirma = null;
//
// // Instanciamos la clase Configuracion de Libreriaconfiguracion
// Configuracion configuracion = new Configuracion();
// // Cargamos el valor de los parámetros contenidos en el fichero SignXML.properties
// configuracion.cargarConfiguracion();
//
// // Validacion OCSP. Es usual chequear, previo a la firma, que el certificado es válido.
// // Se realiza la validación OCSP del certificado, sin proxy
// /*
// RespuestaOCSP respuesta = new RespuestaOCSP();
// try {
// String ocspServer = "http://ocsp.ctpa.mityc.es:80";
// es.mityc.firmaJava.ocsp.OCSPCliente ocspCliente = new OCSPCliente(ocspServer);
// respuesta = ocspCliente.validateCert(cert);
// } catch (OCSPClienteError ex) {
// System.err.println("El certificado no ha superado la validación OCSP");
// ex.printStackTrace();
// } catch (Exception ex) {
// System.err.println("Error en la validación OCSP");
// ex.printStackTrace();
// }
//
// if (respuesta.getNroRespuesta() != es.mityc.firmaJava.ocsp.OCSPCliente.GOOD) {
// System.err.println("El certificado no ha superado la validación OCSP");
// return;
// }
// */
// //Fin Validacion OCSP
//
// // Se lee el fichero a firmar
// String rutaFicheroAFirmar = System.getProperty("user.dir") + "/" + NOMBRE_FICHERO_A_FIRMAR;
// BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(rutaFicheroAFirmar), "UTF-8"));
//
// // Atención!!! aquí cambiamos los saltos de carro del fichero original para facilitar la lectura del ejemplo
// // Si se ha de firmar exactamente el mismo fichero de entrada la lectura no ha de modificar el resultado.
// StringBuffer xmlToSign = new StringBuffer();
// while (in.ready()) {
// xmlToSign.append(in.readLine());
// }
//
// // Nodos que contendrán las firmas del fichero (se incluye Certificate1 porque será donde irá el certificado de firma)
// String nodesToSign = "Certificate1,fichero";
// configuracion.setValor("xmlNodeToSign", nodesToSign);
//
// // Para firmar con un certificado del almacén de Internet Explorer
//// InterfazObjetoDeFirma soi = UtilidadFirmaElectronica.getSignatureObject(EnumAlmacenCertificados.ALMACEN_EXPLORER,
//// certificadoParaFirmar,
//// "",
//// configuracion);
//
// // Para firmar con un certificado del almacén de Mozilla
// InterfazObjetoDeFirma soi = UtilidadFirmaElectronica.getSignatureObject(EnumAlmacenCertificados.ALMACEN_MOZILLA,
// certificadoParaFirmar,
// "/home/borillo/.mozilla/firefox/zhy933al.default",
// configuracion);
//
// // Se prepara e inicializa el interfaz de firma
// try {
// soi.initSign();
// } catch (ClienteError e1) {
// e1.printStackTrace();
// }
//
// // Se realiza la firma
// try {
// resultadoFirma = soi.sign(xmlToSign.toString());
// } catch (ClienteError e) {
// e.printStackTrace();
// }
//
// if (resultadoFirma != null) {
// System.out.println("\n\nLa firma se creo correctamente. Se salva con el nombre " + NOMBRE_FICHERO_FIRMADO);
//
// // Una vez finalizada la firma, escribimos el resultado en el fichero de salida
// grabarAFichero(resultadoFirma);
//
// // Si se quiere continuar realizando validaciones o firmas es necesario inicializar esta estructura
// ParametrosFirmaXML.initialize();
// } else
// System.out.println("\n\nLa firma NO se creo correctamente");
// }
//
// /**
// * Método que guarda a fichero un array de bytes
// * @param firmaXADESByte
// */
// private void grabarAFichero(byte[] firmaXADESByte) {
//
// FileOutputStream fos = null;
// try {
// String rutaFicheroFirmado = System.getProperty("user.dir") + "/" + NOMBRE_FICHERO_FIRMADO;
// fos = new FileOutputStream(rutaFicheroFirmado);
// fos.write(firmaXADESByte);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// try {
// fos.flush();
// fos.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
//
// /**
// * Método que muestra por consola la informacion sobre los certificados pasados
// * @param listCertificates
// */
// private void mostrarInformacionCertificados(Vector<X509Certificate> listCertificates) {
//
// for (int a = 0; a < listCertificates.size(); a++) {
// X509Certificate certTemp = (X509Certificate) listCertificates.get(a);
//
// System.out.println("-----------------------------");
// //Emitido para
// System.out.println("Subject --> "
// + UtilidadDNIe.getCN(certTemp, UtilidadDNIe.SUBJECT_OR_ISSUER.SUBJECT));
//
// //Emitido por
// System.out.println("Issuer -->"
// + UtilidadDNIe.getCN(certTemp, UtilidadDNIe.SUBJECT_OR_ISSUER.ISSUER));
//
// //Fecha de emisión y de caducidad
// SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
// String emision = formateador.format(certTemp.getNotBefore());
// System.out.println("Not Before -->" + emision);
// String caducidad = formateador.format(certTemp.getNotAfter());
// System.out.println("Not After -->" + caducidad);
//
// /*Usos permitidos del certificado
// Recogemos el keyUsage
//
// KeyUsage ::= BIT STRING {
// digitalSignature (0),
// nonRepudiation (1),
// keyEncipherment (2),
// dataEncipherment (3),
// keyAgreement (4),
// keyCertSign (5),
// cRLSign (6),
// encipherOnly (7),
// decipherOnly (8) }
//
// Usos del certificado:
// F Firma digital,N no repudio, Cc cifrado de claves,
// Cd cifrado de datos, Ac Acuerdo de claves, Fc Firma de certificados,
// Fcrl Firma de CRL, Sc Solo cifrado, Sf solo firma
//
// */
//
// String claveUsoString = "";
// String[] claveUsoArray = { "F", "N", "Cc", "Cd", "Ac", "Fc",
// "Fcrl", "Sc", "Sf" };
// boolean[] claveUso = certTemp.getKeyUsage();
// if (claveUso != null) {
// for (int z = 0; z < claveUso.length; z++) {
// if (claveUso[z]) {
// claveUsoString = claveUsoString + claveUsoArray[z] + ",";
// }
// }
// } else {
// claveUsoString = "No definido ";
// }
// System.out.println("Key Usage -->"
// + claveUsoString.substring(0, claveUsoString.length() - 1));
// System.out.println("-----------------------------");
// }
// }
}