Index: pruebas_web_crypto_api/FirmandoConMurachiModificado.html
===================================================================
--- pruebas_web_crypto_api/FirmandoConMurachiModificado.html	(revision 520961ff4e16b3d6ec64f0058d0ef94834f2920b)
+++ pruebas_web_crypto_api/FirmandoConMurachiModificado.html	(revision 520961ff4e16b3d6ec64f0058d0ef94834f2920b)
@@ -0,0 +1,292 @@
+<!--  Prueba: Simulando el proceso de firma de murachí en el cual dentro de la función que gestiona el certificado se realiza el llamado al servicio a murachi enviando el certificado y luego la firma del hash recibido para terminar de completar la firma del archivo pdf todo realizado dentro del llamado a función getCertificate hicimos lo mismo en esta prueba pero gestionando la información requerida para la firma en el archivo .p12
+-->
+<!DOCTYPE html>
+<html lang="es">
+<head>
+  <meta charset="UTF-8">
+  <title>Firma electrónica con Web Crypto API</title>
+<body>
+
+  <main>
+    <form enctype="multipart/form-data" method="post" id="firmar" name="SignFormat">
+      <h1>Firmar un PDF con un pkcs12 y Murachí REST</h1>
+      <p>Seleccione el archivo que va a firmar electrónicamente</p>
+      <input id="file-sign" class="file" type="file" data-min-file-count="1" name="upload" accept=".pdf" >
+      <input id="inputCertificadoPKCS12" type="file" name="inputinputCertificadoPKCS12" accept=".p12"/>
+      <!-- <button type="button" name="buttonsubmit3" id="buttonsubmit3">Firmar</button> -->
+    </form>
+    <section id="resultados">
+      <div id="seccion1"></div>
+      <div id="seccion2"></div>
+      <div id="seccion3"></div>
+      <div id="seccion4"></div>
+    </section>
+  </main>
+
+  <!-- Forge 0.7.0 -->
+  <script src="./forge.min.js"></script>
+  <script src="./jquery.min.js"></script>
+  <script>
+
+  // Variables globales
+  var
+      reader = new FileReader(),
+      certificado = "",
+      password = "123456",
+      inputCertificadoPKCS12 = document.querySelector("#inputCertificadoPKCS12"),
+      fileP12 = null,
+      buttonsubmit3 = document.querySelector("#buttonsubmit3"),
+      decodificado = null,
+      certP12bag = null,
+      certificadoHexadecimal = null,
+      privateKey = null,
+      importarLlave = null;
+
+
+
+  /* ----- Funciones ----- */
+    // Función para convertir el certificado de ArrayBuffer a String
+    function convertirArrayBufferAString ( buffer ) {
+      let _certificadoEnString = '';      
+      let _bytes = new Uint8Array( buffer );
+      let _longitudDeCadena = _bytes.byteLength;
+      for (let i = 0; i < _longitudDeCadena; i++) {
+        _certificadoEnString += String.fromCharCode( _bytes[ i ] );
+      }
+      return _certificadoEnString;
+    }
+
+    // Función para convertir el certificado de String a ArrayBuffer 
+    function convertirStringArrayBuffer ( data ) {
+      let _arrayBuffer = new ArrayBuffer ( data.length );
+      let writer = new Uint8Array ( _arrayBuffer );
+      for (let i = 0, len = data.length; i < len; i++) {
+        writer[i] = data.charCodeAt ( i );
+      }
+      return _arrayBuffer;
+    }
+
+    // Función para decodificar el .p12 convertido en string
+    function decodificarPKCS12 ( stringBase64 ) {
+      let pkcs12Asn1 = forge.asn1.fromDer( stringBase64 );
+      let pkcs12 = forge.pkcs12.pkcs12FromAsn1( pkcs12Asn1, false, password );
+      return pkcs12;
+    }
+
+    // Función para buscar la llave privada del PKCS#12
+    function buscarLlavePrivada ( pkcs12 ) {
+      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 ) {
+            privateKey = safeBag.key;
+          } else if ( safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag ) {
+            privateKey = safeBag.key;
+          }
+        }
+      }
+      return privateKey;
+    }
+
+    // Función para convertir la llave privada a PKCS#8
+    function privateKeyToPkcs8 ( privateKeyP12 ) {
+      var rsaPrivateKey = forge.pki.privateKeyToAsn1(privateKeyP12);
+      var privateKeyInfo = forge.pki.wrapRsaPrivateKey(rsaPrivateKey);
+      var privateKeyInfoDer = forge.asn1.toDer(privateKeyInfo).getBytes();
+      var privateKeyInfoDerBuff = convertirStringArrayBuffer(privateKeyInfoDer);
+      return privateKeyInfoDerBuff;
+    }
+
+    // Función para convertir un Array Buffer a Hexadecimal
+    function buf2hex ( buffer ) {
+      return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
+    }
+
+    // Función para importar la llave privada
+    function importarLlavePrivada ( llavePrivada ) {
+      var qweasd = crypto.subtle.importKey(
+        "pkcs8", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only)
+        llavePrivada,
+        {   //these are the algorithm options
+          name: "RSASSA-PKCS1-v1_5",
+          hash: { name: "SHA-256" }, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
+        },
+        false, //whether the key is extractable (i.e. can be used in exportKey)
+        ["sign"] //"verify" for public key import, "sign" for private key imports
+      ).then(function(publicKey){
+        //returns a publicKey (or privateKey if you are importing a private key)
+        console.log(publicKey);
+        privateKey = publicKey;
+      })
+      .catch(function(err){
+        console.error(err);
+      });
+    }
+
+    // Función para convertir el certificado .p12 en hexadecimal
+    function convertirPKCS12aHexadecimal ( pkcs12 ) {
+      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) {
+            privateKey = safeBag.key;
+          } else if(safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) {
+            privateKey = safeBag.key;
+          } else if(safeBag.type === forge.pki.oids.certBag) {
+            if(certP12bag == null) {
+              certP12bag = safeBag.cert;
+              var certpem = forge.pki.certificateToPem(certP12bag);
+              console.log("*****************certpem");
+              console.log(certpem);
+              console.log("*****************certpem");
+              var certBytesHex = forge.util.bytesToHex(certpem);
+              console.log("*****************certBytesHex");
+              console.log(certBytesHex);
+              console.log("*****************certBytesHex");
+            }
+          } 
+        }
+      }
+      return certBytesHex;
+    }
+
+    function SignFileAll() {
+      // Paso 1. Obtener el pdf
+      	console.log("function SignFileAll");
+      	fileP12 = this.files[0];
+      	console.log(fileP12);
+      	var archivoPDF = document.getElementById("file-sign");
+      	var list = archivoPDF.files;
+      	var data = new FormData();
+      	data.append('upload', $("#file-sign")[0].files[0]);
+      	// Paso 2. Primera consulta - Se sube el certificado a Murachí
+      	$.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=" },
+        	// Paso 2.1. Se evalua la respuesta de la consulta a Murachí 
+        	success: function(response) {
+          		var responseString = JSON.stringify(response);
+          		document.getElementById("seccion1").innerHTML = responseString;
+          		var fileId = response.fileId.toString();
+          		//Sección para conseguir el certificado
+          		console.log("Antes del leerCertificadoPKCS12");
+          		//leerCertificadoPKCS12();
+          		let archivoAdjuntado = fileP12;
+          		//Función que gestiona la información requerida en el archivo .p12
+      			reader.onload = function(e) {
+      				console.log("Entro a reader.onload = function(e)");
+        			var
+          			contents = e.target.result,
+         			pkcs12Der = convertirArrayBufferAString( contents ),
+          			pkcs12B64 = forge.util.encode64( pkcs12Der );
+        			decodificado = decodificarPKCS12( pkcs12Der );
+        			certificadoHexadecimal = convertirPKCS12aHexadecimal(decodificado);
+        			var
+          			llavePrivada = buscarLlavePrivada(decodificado),
+          			convertirAPKCS8 = privateKeyToPkcs8(llavePrivada);
+          			importarLlavePrivada(convertirAPKCS8);
+
+          			if(certificadoHexadecimal != null) 
+          			{
+            			// -- CERTIFICADO
+            			var cert = certificadoHexadecimal;
+            			// console.log(cert);
+            			// -- Parámetros para la segunda consulta
+            			parameters = JSON.stringify({
+              				"fileId": fileId,
+              				"certificate": cert,
+              				"reason": "Certificado",
+              				"location": "CENDITEL",
+              				"contact": "582746574336",
+              				"signatureVisible": "true"
+            			});
+            			// Paso 3. Segunda consulta
+            			$.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=" },
+              				// Paso 3.1. Se evalua la respuesta de la consulta a Murachí
+              				success: function(data, textStatus, jqXHR) {
+                				// data - Objeto obtenido de Murachí que contienen el hash
+                				// Estado de la consulta -- success
+                				// Objeto de donde se saca el hash para firmar en pasos posteriores
+                				var responseString = JSON.stringify(data);
+                				document.getElementById("seccion2").innerHTML = responseString;
+                				// Paso 4. Se obtiene el HASH para el firmado	
+                				hash = data['hash'];
+                  				var digestToSign = hash;
+                  				var digestToSignBuf = convertirStringArrayBuffer(digestToSign);
+                  				var signatureDure = null;
+                  				crypto.subtle.sign(
+                    				{ name: "RSASSA-PKCS1-v1_5"},
+                    				privateKey,
+                    				digestToSignBuf 
+                    			)
+                    			.then ( function ( signature ) {
+                      				importarLlave = signature;
+                      				console.log(signature);
+                      				var firmaEnArray8 = new Uint8Array(signature);
+                      				importarLlave = buf2hex(firmaEnArray8);
+                      				console.log("sign()" + importarLlave);
+                      				$.ajax({
+                        				url:"https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs/resenas",
+                        				type: 'POST',
+                        				dataType: 'json',
+                        				data: JSON.stringify({'signature':importarLlave}),
+                        				contentType: 'application/json',
+                        				headers: {"Authorization":"Basic YWRtaW46YWRtaW4="},
+                        				xhrFields: { withCredentials: true },
+                        				success: function(data, textStatus, jqXHR){
+                          					var responseString = JSON.stringify(data);
+                          					document.getElementById("seccion3").innerHTML = responseString;
+                          					alert('Archivo firmado correctamente: ' + data['signedFileId']);
+                          					document.getElementById("seccion4").innerHTML = "Descargar archivo firmado: https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/descargas/" + data['signedFileId'];
+                        				}, //respuesta del ajax 3 sin error
+                        				error: function(jqXHR, textStatus, errorThrown){
+                          					console.log(jqXHR);
+                          					console.log(textStatus);
+                          					console.log(errorThrown);
+                          					alert('error en pdfs/resenas: ' + textStatus);
+                          					$("#respuesta").html("error en pdfs/resenas: " + textStatus);
+                        				} // repuesta del ajax 3 con error
+                      				}); //ajax 3
+                    			})
+                    			.catch(function(err){
+                      				console.error(err);
+                    			});
+              				} // ajax 2
+            			}); // Paso 3. Segunda consulta
+          			} //sin de la pregunta si el tiene certificado 
+          			else {  //fin de la condición si tiene certificado
+            			console.log("No se pudo obtener el certificado");
+        			}
+      			} //función del llamado a buscar el certificado
+      			console.log("Luego de la linea de reader.onload = function(e)");
+      			reader.readAsArrayBuffer(archivoAdjuntado);	
+			} //ajax 1
+      	}); //cierre del llamado ajax 1
+    } //Cierre de la función
+
+  /* ----- Eventos ----- */
+    // 1. Al adjuntar el archivo .p12 se ejecuta la función que lo lee y se extrae su información
+    //inputCertificadoPKCS12.addEventListener('change', leerCertificadoPKCS12, false);
+    inputCertificadoPKCS12.addEventListener('change', SignFileAll, false);
+  /* ----- Eventos ----- */
+  </script>
+</body>
+</html>
