Este ejemplo tiene com objetivo actualizar una firma con sello de tiempo de un documento XML hacia un formato de firma longeva mediante el servicio actualización de firmas de TrustedX con evidencias de no repudio.

Para poder probar este ejemplo se debe descargar el archivo sampleAxis8.zip y seguir las instrucciones que se encuentran en Configuración del entorno.

La firma a actualizar es la generada por el ejemplo Generación de una firma XML con sello de tiempo. El archivo descargado ya contiene una firma para actualizar, pero si lo desea puede cambiar este archivo por el generado en el anterior ejemplo para comprobar que funciona correctamente.

Para la actualización de una firma se debe realizar una petición de verificación con un objeto de tipo VerifyRequest, indicando a diferencia de los otros ejemplos, que se debe utilizar el perfil de firma de NONREP (o no repudio) y no el de verificación.

VerifyRequest vr = new VerifyRequest();
vr.setProfile(new URI(PROF_NO_REP));

En la petición se deben incluir los datos de la firma, en este caso como Base64 dentro de un objeto SignatureObject.

SignatureObject sobj = new SignatureObject();
Base64Binary b64bin = new Base64Binary();
b64bin.set_value(Util.readBinaryFile(path_in + filename));
sobj.setBase64XMLSignature(b64bin);
vr.setSignatureObject(sobj);

Además se indicara el formato del documento a retornar y el formato de la firma actualizada que será ES-A. Este formato dotará a la firma de una duración longeva más allá del periodo de validez del material criptográfico utilizado en su generación. Para indicar que se quiere actualizar la firma se debe crear un objeto de tipo ReturnUpdatedSignature e incluir el formato de la nueva firma.

OptionalInputs opt = new OptionalInputs();
opt.setReturnBase64XML("");
ReturnUpdatedSignature rus = new ReturnUpdatedSignature();
rus.setType(new URI(SIGN_TYPE_ESA));
opt.setReturnUpdatedSignature(rus);

En esta petición se han añadido también las llamadas a los métodos setAddCertificateValues(), setAddRevocationValues() y setAddTimeStampValues(), que harán que en la respuesta se devuelva información acerca de los certificados, listas de revocación y sellos de tiempo. Estas llamadas se realizan desde el objeto OptionalInputs creado anteriormente. Además se indica que estos parámetros deben incluirse en la respuesta en formato binario.

AddCertificateValuesType acv = new AddCertificateValuesType();
acv.setBinary(true);
opt.setAddCertificateValues(acv);
AddRevocationValuesType arvt = new AddRevocationValuesType();
acv.setBinary(true);
opt.setAddRevocationValues(arvt);
AddTimeStampValues atsv = new AddTimeStampValues();
atsv.setBinary(true);
opt.setAddTimeStampValues(atsv);
vr.setOptionalInputs(opt);

Una vez se han introducido todos los datos en la petición se invoca la operación update() que envía la petición obteniendo un objeto VerifyResponse.

VerifyResponse vrs = bindingDr.update(vr);

Una vez envidada la petición se puede comprobar si ésta se ha procesado correctamente consultando los parámetros de la respuesta. Para ello se usan las funciones de la clase auxiliar UtilTrustedX. Si todo va bien se recupera la firma de la respuesta. La firma actualizada está contenida dentro de un objeto de tipo OptionalOutputs, que contiene un objeto de tipo UpdatedSignature con la firma.

if (UtilTrustedXAxis.check(vrs.getResult(), bindingDr)) {								
   byte[] data = vrs.getOptionalOutputs().getUpdatedSignature().getSignatureObject().getBase64XMLSignature().get_value();
   String destFilename = path_out + filename.substring(0, filename.lastIndexOf("."))
         + "Archive.xml";
   Util.writeBinaryFile(destFilename, data);
               
   UtilTrustedXAxis.printResponse(vrs);
   System.out.println("\n\n\n ** SOAP Response ** \n---------------------\n");
   UtilTrustedXAxis.printResponse(bindingDr);
}

Después de ejecutar el ejemplo se obtiene una respuesta como la siguiente y un archivo con la firma actualizada.

** RESPONSE **
---------------------
Major: urn:oasis:names:tc:dss:1.0:resultmajor:Success
Minor: urn:oasis:names:tc:dss:1.0:resultminor:ValidSignature_OnAllDocuments
DN: CN=Dave, OU=Demo, O=TrustedX, C=ES
Issuer Trust Level: 0
Issuer Trust Label: Administration

Adicionalmente para este ejemplo una vez se ejecute el ejemplo se mostrará el contenido de la respuesta, donde se podrá observar toda la información adicional que se incluye, dado que se ha pedido en la petición.