'''Pruebas con la librería "hwcrypto"''' La librería hwcrypto es la que se utiliza para gestionar la información en los dispositivos criptográfico necesaria para realizar el proceso de firma electrónica en el servicio Murachí. El problema que se esta presentando es en el momento de firmar el hash, respuesta de este proceso no corresponde al hash del documento a firmar. Como esta es la librería que se utiliza para dispositivo criptográfico la prueba consiste en tratar de usar la función de firma de esta librería para firmar el hash obtenido. Para esta prueba se requiere tener instalado el complemento de firma del navegador y tener instalado un certificado y configurado en apache para poder usar https. La función sign de la librería hwcripto firma el hash con la clave privada asociada con el certificado. Esta función requiere el certificado, el hash a firmar {{{ //cert -> certificado del firmante //hash -> hash a firmar con la clave asociada al certificado //signature -> resultado de la operación (hash firmado) window.hwcrypto.sign(cert, {type: hashtype, hex: hash}, {lang: lang}).then(function(signature) { } }}} El certificado que requiere la función sign es un objeto y tiene la siguiente forma: [[Image(certificado-campos-desplegado-portal-murachi.png)]] [[BR]] Cuyo objeto de certificado es obtenido por la función hwcripto getCertificate. Ahora esta función solo funciona para dispositivo criptográfico, por lo que se intento construir el objeto de certificado con los datos del certificado firmante del .p12, se uso la librería javascript Ramda en la siguiente función: {{{ //certBytesHex -> certificado firmante extraído del .p12 certifiedObject() { const hexadecimalToUint8Array = string => new Uint8Array(R.map(byte => parseInt(byte, 16), R.splitEvery(2, string))) const uint8ArrayToHexadecimal = array => R.reduce((string, byte) => string + byte.toString(16), '', array) const badass = hexadecimalToUint8Array(certBytesHex); Cert = ({ "hex":certBytesHex, "encoded":badass, }); } }}} El objeto certificado construido quedo de la siguiente manera: [[Image(certificado-(obtenido usando ramda)-campos-desplegados-.png)]] Pero no es reconocido por la función hash. al parecer es un objeto especifico construido por la función getCertificate y para probar esto se procedió a realizar al siguiente prueba, cargar tanto el certificado del archivo .p12 usando la librería Forge como el certificado extraído de un dispositivo criptografía usando la función getCerticate de la librería hwcripto, una vez obtenido el objeto de certificado, modificarlo colocando la información del certificado de software y firmar el hash. {{{ Javascript firma p12 Demo


Ingrese la contraseña de clave privada:

Firmar electrónica (PDF)

Seleccione el archivo que va a firmar electrónicamente








}}} LA prueba resulta positivo se logro firmar usando el certificado firmante del archivo .p12, claro esta, en esta prueba se debe usar un dispositivo criptográfico y hacer la debida manipulación para que termine firmando con .p12