wiki:actividades_2018_pruebas_cer_dig_lib_hwcrypto

Version 2 (modified by pbuitrago, 6 years ago) (diff)

--

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.

{{ <!doctype html> <html> <head> <meta charset="utf-8">

<title>Javascript firma p12 Demo</title> <script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript" src="gitversion.js"></script> <script type="text/javascript" src="hwcrypto-legacy.js"></script> <script type="text/javascript" src="hwcrypto.js"></script> <script type="text/javascript" src="hex2base.js"></script> <script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript" src="forge.min.js"></script> <script type="text/javascript" src="ramda.min.js"></script>

</head>

<script>

variable globales

var pkcs12 = null; var pkcs12Der = null; var pkcs12B64 = null; var digestToSignB64 = ""; var privateKey = null; var certP12bag = null; var certBytesHex = null; var signatureHEX = ""; var signatureBytesHEX = ""; var certCount = 0; var certpem = ""; var asn1Cert = null; var p12Der = null; var cerToDer = null; var p12Asn = null; var certT = null;

Funciones de conversión function transfCert() {

console.log("transfCert"); 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); console.log(badass); P12aSN = badass;

/*Cert = ({

"hex":certBytesHex, "encoded":badass,

}); */

}

function stringToArrayBuffer(data)

{ var arrBuff = new ArrayBuffer?(data.length); var writer = new Uint8Array(arrBuff); for (var i = 0, len = data.length; i < len; i++)

{ writer[i] = data.charCodeAt(i); }

return arrBuff; }

function arrayBufferToString( buffer )

{ var binary = ; var bytes = new Uint8Array( buffer ); var len = bytes.byteLength; for (var i = 0; i < len; i++)

{ binary += String.fromCharCode( bytes[ i ] ); }

return binary; }

From Private Key to a PKCS#8 function privateKeyToPkcs8(privateKey)

{

var rsaPrivateKey = forge.pki.privateKeyToAsn1(privateKey); var privateKeyInfo = forge.pki.wrapRsaPrivateKey(rsaPrivateKey); var privateKeyInfoDer = forge.asn1.toDer(privateKeyInfo).getBytes(); var privateKeyInfoDerBuff = stringToArrayBuffer(privateKeyInfoDer); return privateKeyInfoDerBuff; }

Create a CryptoKey? from from a PKCS#12 Private Key function importCryptoKeyPkcs8(privateKey,extractable)

{ var privateKeyInfoDerBuff = privateKeyToPkcs8(privateKey); Importa la clave en la webcrypto return crypto.subtle.importKey(

'pkcs8', privateKeyInfoDerBuff, { name: "RSASSA-PKCS1-v1_5", hash:{name:"SHA-256"}}, extractable, sign?);

}

function que obtengo la clave privada y el certificado del archivo .p12 function getCertificate(e)

{ console.log("*... getCertificate ...*"); Get PFX var fileInput = document.getElementById('pfx'); var file = fileInput.files[0]; Read it var reader = new FileReader?(); reader.onload = function(e) {

console.log("*.... cargo el archivo .p12 ....*"); var contents = e.target.result; pkcs12Der = arrayBufferToString(contents) pkcs12B64 = forge.util.encode64(pkcs12Der); var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der); var password = $('#pfxp').val(); var password = "123456";

pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, password); load keys for(var sci = 0; sci < pkcs12.safeContents.length; ++sci)

{ var safeContents = pkcs12.safeContents[sci]; for(var sbi = 0; sbi < safeContents.safeBags.length; ++sbi)

{ var safeBag = safeContents.safeBags[sbi]; if(safeBag.type === forge.pki.oids.keyBag)

{ Found plain private key privateKey = safeBag.key; }

else if(safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag)

{ found encrypted private key privateKey = safeBag.key; }

else if(safeBag.type === forge.pki.oids.certBag)

{ this bag has a certificate... certCount = certCount +1; console.log("GET_CERTIFICATE_"+ certCount + "...certBag Ok");

if(certP12bag == null)

{ certP12bag = safeBag.cert; cerToDer = forge.pki.certificateToDer(certP12bag); certpem = forge.pki.certificateToPem(certP12bag); certBytesHex = forge.util.bytesToHex(certpem); var derkey = forge.util.decode64(certP12bag); p12Der = forge.util.decode64(certP12bag); get p12 as ASN.1 object p12Asn1 = forge.asn1.fromDer(p12Der); asn1Cert = forge.pki.certificateToAsn1(certP12bag); p12Der = forge.asn1.toDer(asn1Cert).getBytes(); var p12Asn1 = forge.asn1.fromDer(certP12bag,false); console.log("* Pedro "); console.log(p12Asn1); console.log("/ p12Asn1 "); console.log(asn1Cert); console.log("/ asn1Cert /"); console.log(p12Der); console.log("/ p12Der /"); console.log(certpem); console.log(" certpem "); console.log(certP12bag); console.log(" certP12bag "); console.log(certBytesHex); console.log(" Pedro *"); transfCert(); window.hwcrypto.getCertificate({lang: "en"}).then(function(response) {

certT = response; console.log("/ certT /"); console.log(certT);

console.log("/ certT /");

certT.hex = certBytesHex; certT.encoded = P12aSN; console.log(certT);

})

}

}

}

}

} reader.readAsArrayBuffer(file);

}

Función que firmar el hash que devuelve el servicio Murachí function SingFile?()

{ console.log("*.... SingFile? ....*"); importCryptoKeyPkcs8(privateKey,true).then(function(cryptoKey)

{ var digestToSign = forge.util.decode64(digestToSignB64); var digestToSignBuf = stringToArrayBuffer(digestToSign); crypto.subtle.sign(

{name: "RSASSA-PKCS1-v1_5"}, cryptoKey, digestToSignBuf) .then(function(signature){

sign = arrayBufferToString(signature); signatureB64 = forge.util.encode64(sign); signatureHEX = forge.util.bytesToHex(signatureB64); signatureBytesHex = forge.util.bytesToHex(signature); hash firmado

});

});

}

funcion que ejecuta el proceso de firma electrónica usando el servicio Murachí function SignFilePDF() {

cargar el archivo .p12 console.log("*.... SignFilePDF ....*"); getCertificate();

console.log("luego de getCertificate"); var fileInput = document.getElementById("file-sign"); var list = fileInput.files; var form = $('firmar')[0]; var data = new FormData?(); data.append('upload', $("#file-sign")[0].files[0]); $.ajax({

url: "https://murachi.cenditel.gob.ve/Murachi/0.1/archivos", type: "post", dataType: "json", data: data, cache: false, contentType: false, processData: false, xhrFields: {withCredentials: true}, headers: {"Authorization":"Basic YWRtaW46YWRtaW4="}, success: function(response) {

var responseString = JSON.stringify(response); document.getElementById("seccion1").innerHTML = responseString; var fileId = response.fileId.toString(); alert("antes de leer el certificado"); if(certBytesHex != null) {

console.log("tengo certificado");

var cert = certBytesHex; console.log("certGet:"+ cert); var parameters = JSON.stringify({

"fileId":fileId, "certificate":cert, "reason":"Certificado", "location":"CENDITEL", "contact":"582746574336", "signatureVisible":"true"

}); console.log("cert...3"); $.ajax({

type: 'POST', contentType: 'application/json', url:"https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs", dataType: "json", data: parameters, xhrFields: {withCredentials: true}, headers: {"Authorization":"Basic YWRtaW46YWRtaW4="}, success: function(data, textStatus, jqXHR) { var responseString = JSON.stringify(data); document.getElementById("seccion2").innerHTML = responseString; digestToSignB64 = responseString; SingFile(); var signature = signatureBytesHEX; var json_x = data; var hash = json_xhash?; alert("hash recibido del servidor " + hash);

/*window.hwcrypto.getCertificate({lang: "en"}).then(function(response) {

certT = response; console.log("/ certT /"); console.log(certT); console.log("/ certT /"); certT.hex = certBytesHex; certT.encoded = P12aSN; console.log(certT);

*/

var hashtype = "SHA-256"; var lang = "eng"; console.log("antes del window.hwcrypto.sign"); window.hwcrypto.sign(certT, {type: hashtype, hex: hash}, {lang: lang}); window.hwcrypto.sign(certT, {type: hashtype, hex: hash}, {lang: lang}).then(function(signature) {

console.log("entro.......");

$.ajax({

type: 'POST', contentType: 'application/json', url:"https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs/resenas", dataType: 'json', data: JSON.stringify({"signature":signature.hex}), xhrFields: {withCredentials: true}, headers: {"Authorization":"Basic YWRtaW46YWRtaW4="}, success: function(data, textStatus, jqXHR){

var responseString = JSON.stringify(data); document.getElementById("seccion3").innerHTML = responseString; alert('Archivo firmado correctamente: ' + datasignedFileId?); document.getElementById("seccion4").innerHTML = "Descargar archivo firmado: https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/descargas/" + datasignedFileId?;

}, error: function(jqXHR, textStatus, errorThrown){

alert('error en pdfs/resenas: ' + textStatus); $("#respuesta").html("error en pdfs/resenas: " + textStatus);

} repuesta del ajax 3

}) ajax 3

}) cierre del window.hwcrypto.sign()

}) cierre de window.getcertificate() } respuesta ajax 2

});ajax 2 console.log("cert 4");

}

} respuesta ajax 1

}) ajax 1

} </script> <div> <label for="pfx">Seleccione el archivo PFX / P12::</label><br> <input name="pfx" class="form-control" type="file" id="pfx" accept=".pfx,.p12" required /><br <label for="pfxp">Ingrese la contraseña de clave privada:</label><br> <input name="pfxp" class="form-control" type="password" id="pfxp" /><br> </div> <form enctype="multipart/form-data" method="post" id="firmar" name="SignFormat?">

<h2>Firmar electr&oacute;nica (PDF)</h2> <h3>Seleccione el archivo que va a firmar electr&oacute;nicamente</h2> <br> <input id="file-sign" class="file" type="file" data-min-file-count="1" name="upload" accept=".pdf" > <br>

</form> <button type="button" name="buttonsubmit3" id="buttonsubmit3" onclick="SignFilePDF();" class="btn btn-primary btn-lg">Firmar</button> <button type="reset" id="reset" class="btn btn-default">Limpiar</button> <br> <br> <div id="seccion1"> </div> <br> <div id="seccion2"> </div> <br> <div id="seccion3"> </div> <br> <div id="seccion4"> </div>

</body> </html> </body> }}

Attachments (2)

Download all attachments as: .zip