﻿// Archivo JScript
  // CAPICOM constants
  var CAPICOM_STORE_OPEN_READ_ONLY = 0;
  var CAPICOM_CURRENT_USER_STORE = 2;
  var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
  var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
  var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
  var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
  var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
  var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
  var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
  var CAPICOM_ENCODE_BASE64 = 0;
  var CAPICOM_E_CANCELLED = -2138568446;
  var CERT_KEY_SPEC_PROP_ID = 6;
  var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME	= 1


  function firmar()
  {

  var sw = 0;
  var nodos = document.getElementById("form1").getElementsByTagName("input");

  for (var i = 0; i != nodos.length; i++)
  {
  if (nodos[i].getAttribute("type") == "hidden" )
  //if (nodos[i].getAttribute("firma") == "si" )
  {
    sw = 1;
  }
  }
  
 if (sw == 0) return
 

 try {
 
  // crear los objeto almacen y certificados
  var Almacen = new ActiveXObject("CAPICOM.Store");
  // abrir almacen de certificados
 
  Almacen.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
  // establecer el filtro
  var FilteredCertificates = Almacen.Certificates.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE,CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE)
  // cuadro de dialogo de posibles certificados
  var SelectedCertificate = FilteredCertificates.Select();
  // crear objeto para datos
  var SignedData    = new ActiveXObject("CAPICOM.SignedData");
  // crear objeto para firmat
  var Signer        = new ActiveXObject("CAPICOM.Signer");
  // selecciona el primero
  Signer.Certificate = SelectedCertificate.Item(1);
  // poner los datos
  var nodos = document.getElementById("form1").getElementsByTagName("input");
    
  for (var i = 0; i != nodos.length; i++)
  {
  
  if (nodos[i].getAttribute("type") == "hidden" )
 // if (nodos[i].getAttribute("firma") == "si" )
      {
      
      
      var valor = nodos[i].getAttribute("value");
      var compo = nodos[i].getAttribute("name").split("_");
      if (compo.length == 4 && valor != "")
      {
          SignedData.Content = nodos[i].getAttribute("value");
          // firma detached. Crea un mensaje PKCS7 en base 64, tiene firma y certificado no datos (detached)
          nodos[i].setAttribute("value",    nodos[i].getAttribute("value") + "____" + SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64));
      }
      }
  }
  }
  catch (error)
  {
      alert("error en la firma " +  error.description);
      return "ko";
  }
}
  