Documento técnico Manual de integración WebSigner Revisión: v 1.3 Fecha última versión: junio de 2006 Índice 1_ Introducción .................................................................................................... 3 1.1_ Descripción de plataforma ASF ..................................................................... 3 1.2_ Módulo WebSigner........................................................................................ 4 2_ Integración de WebSigner .............................................................................. 6 2.1_ Configuración de servidores web para Netscape........................................... 6 2.2_ Descripción de API........................................................................................ 6 2.3_ Orden lógico de invocación de procedimientos............................................ 43 2.4_ Integración de WebSigner en una página HTML ......................................... 46 3_ Anexo I: Firma Paralela de Formulario ........................................................ 48 4_ Anexo II: Cifrado de Formulario ................................................................... 57 Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 2 1_ Introducción Este documento tiene como finalidad recoger todos los aspectos relacionados con la integración del módulo cliente WebSigner perteneciente a la Plataforma de Firma Electrónica Avanzada ASF. Dicha plataforma es una solución completa para la integración de la Firma Electrónica Avanzada en la infraestructura informática de una entidad u organización. 1.1_ Descripción de plataforma ASF La Plataforma ASF es una solución completa para la integración de la Firma Electrónica Avanzada en una infraestructura informática de una entidad u organización. Una de sus características más diferenciadoras es el hecho de permitir la convivencia con más de una Autoridad de Certificación (CA), independizando completamente al resto de los sistemas de la complejidad añadida que supone la compatibilidad con más de una CA. Los principales aspectos que permite resolver la utilización de ASF en cualquier organización incluyen los siguientes: • Autenticación. Permite conocer la identidad de los usuarios remotos utilizando certificados X.509 como método de autenticación. • Integridad. La generación de documentos con firma electrónica avanzada permite la comprobación de que el documento no ha sido modificado por un tercero desde la generación del mismo. • No Repudio. El sistema almacena en una base de datos copias de los documentos firmados, de forma que puedan ser utilizados en caso de necesidad como prueba de autoría. • Confidencialidad. La generación de documentos cifrados permite garantizar que sólo los destinatarios de los mismos podrán acceder a su contenido. El entorno ASF establece una solución de principio a fin en la seguridad de las transmisiones con acciones para firmar, cifrar, fechar y transmitir todo tipo de documentos electrónicos de un modo seguro. ASF está compuesto de un conjunto de módulos que permiten abarcar de manera ágil y sencilla todos los aspectos relacionados con el proceso de implementación de Firma Electrónica Avanzada dentro de cualquier aplicativo. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 3 Cada módulo está especializado en una tarea específica, interactuando entre ellos para dar la solución completa. De esta forma las tareas habitualmente comunes de un entorno PKI están implementadas sólo en uno de los módulos de utilidad. Por ejemplo, cuando cualquiera de los módulos necesita conocer la validez de un certificado, interactúa con el módulo X509·Validator, quien le confirmará o le rechazará la validez del certificado. ASF contempla el ciclo de vida completo de utilización de certificados proporcionando herramientas para: • Constituir una autoridad de certificación • Creación de documentos firmados • Validación y control de documentos firmados • Cifrado de documentos • Validación de la vigencia de los certificados • Registro de información de la firma de documento, de cara al no repudio • Cifrado y descifrado de documentos • Establecer políticas de firma y cifrado a nivel de aplicaciones y/o operaciones 1.2_ Módulo WebSigner El módulo WebSigner está compuesto por una serie de componentes y tecnologías que permiten la generación de documentos firmados en formato PKCS#7, CMS y XMLDSIG en sistemas basados en tecnología web. Asimismo, permite el cifrado de documentos en formato PKCS#7 y CMS. WebSigner es el componente cliente de ASF diseñado para permitir a un usuario la firma y el cifrado de documentos y formularios web desde una página HTML para enviar al servidor, así como la verificación y descifrado de los mismos. La integración es posible en aplicaciones de diversa índole, tales como en mecanismos de identificación (autenticación de cliente) para el acceso a servicios web, como para la transmisión de documentos digitales o formularios firmados. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 4 Debido a que se trata de un componente cliente se han cuidado los aspectos de compatibilidad entre distintos navegadores y tecnologías así como la usabilidad de cara al usuario. WebSigner proporciona utilidades para permitir filtrados de certificados autorizados en cada proceso. WebSigner expone un Interfaz Javascript común, para la invocación de los componentes de firma y cifrado, y la independización de la tecnología utilizada. Para Internet Explorer, WebSigner basa su solución en la innovadora CAPICOM, un control ActiveX que proporciona una interfaz COM para la biblioteca criptográfica Microsoft CryptoAPI, para la firma XMLDSIG basa su solución en las librerias XERCES, XALAN y XSEC de Apache implementando el modulo en C++. Para Netscape 6.x o superior, la solución está basada en un applet Java que accede al almacén de certificados propietario de Netscape y realiza las operaciones de firma a través de JSSP/NSS. Este mismo applet es la solución adoptada para el uso de Websigner en Mozilla desde las version 1.x, teniendo en cuenta que para algunas versiones de este navegador será necesario descargar el JDK. En el caso del applet existen dos versiones, una versión “ligera”, que no soporta el formato XMLDSig, y una versión completa, de tamaño mucho mayor, que soporta XMLDSig. La versión completa está basada en las librerias XERCES, XALAN y XSEC de Apache. Las funcionalidades incluidas en WebSigner son las siguientes: Título: Revisión: Fecha: • Uso de firma única o múltiple (mancomunada) en formato PKCS#7, CMS o XMLDSig. Este módulo ha sido diseñado para permitir la firma de un documento o formulario por más de una persona. • Firma de cualquier tipo de documentos y formulario. Gracias a la implementación de WebSigner es posible firmar cualquier tipo de documento o formulario que deseemos enviar al servidor, permitiendo su integración en cualquier aplicación. • Filtrado de certificados autorizados para el proceso. Esta funcionalidad permite facilitar al usuario la selección del certificado que puede utilizar, en función de las políticas de confianza definidas para el proceso en el servidor. • Cifrado y descifrado de un formulario o un documento. Gracias a la implementación de WebSigner es posible cifrar cualquier tipo de documento o formulario que deseemos enviar al servidor. Manual de integración WebSigner v 1.3 junio de 2006 5 2_ Integración de WebSigner A continuación se describe el API del componente WebSigner, así como el orden lógico de llamadas al mismo a la hora de integrarlo en una página HTML. 2.1_ Configuración de servidores web para Netscape Para la descarga inicial de WebSigner en Netscape, es necesario que el servidor asocie ficheros con la extensión “.xpi” al MIME type “application/xxpinstall”. En muchos servidores web (o servidores de aplicaciones con funciones de servidor web como Tomcat) ya viene definido este tipo MIME. En un servidor apache, por ejemplo, seria necesario añadir la sigueinte línea al fichero httpd.conf: AddType application/x-xpinstall .xpi O asegurarse de que este tipo MIME viene definido en el fichero mime.types. 2.2_ Descripción de API El componente no visual de generación de firma tiene los siguientes métodos en su interfaz: initWebSigner(sOnlyWithPrivateKey) Obtiene del almacén de certificados del navegador la lista de certificados emitidos por una serie de autoridades de certificación y cuyos campos cumplen la retriccion pasada por parámetro. En NetScape, esta función solo hace comprobaciones de uso, simpre se cargan todos los certificados de los almacenes independientemente del valor del parámetro de entrada. El Usuario podrá limitar los certificados a mostrar con el uso de la función getCertificates(). Entrada • sOnlyWithPrivateKey: String que identifica si se deben de cargar los certificados que contienen clave privada o no. Valores posibles: ST_PRI_KEY (certificados con clave privada), ST_PUB_KEY (certificados sin clave privada), ST_ALL_KEY (todos). Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 6 Salida Devolvera un booleano indicando si la carga se ha realizado correctamente o no y cargará una constante array con los certificados que continen los diversos almacenes de certificados. getCertificates (bFilterCAs, arrCAs, sOnlyWithPrivateKey, bOnlyNotExpired, sCertificateFieldPart) arrRestrictions, sCertificateField, Obtiene un array que contiene los certificados contenidos en la constante array que ha sido inicializada por initWebSigner y cuyos campos cumplen una serie de restricciones indicadas por cada parametro Entrada • bFilterCAs Parámetro booleano que indica si se recuperan todos los certificados (false) o solo los que el campo issuer sea similar al del arrCAs que se indica igualmente como parámetro. • arrCAs Array que contiene las CAs de confianza, este parámetro sólo se tiene en cuenta cuando el campo bFilterCAs (anteriormente citado) es true. • arrRestrictions Este parámetro es un array. Cada componente es a su vez un array de dos posiciones (campo y patrón) que indica las restricciones que ha de cumplir la CA que está en esa misma posición en el array indicado en el parámetro arrCAs. En caso de no tener que cumplir ninguna restricción la posición correspondiente del array de restricciones tendrá dos componentes iguales a “” (cadena vacía). Este campo se ha de tener en cuenta sólo en el caso de que el parámetro bFilterCAs sea true. • sOnlyWithPrivateKey String que indica si se desean cargar los certificados con clave privada, publica o todos. Valores posibles: ST_PRI_KEY (certificados con clave privada), ST_PUB_KEY (certificados sin clave privada), ST_ALL_KEY (todos). Este parámetro estará supeditado al tipo de inicialización establecida al ejecutar initWebSigner(). Si se inicializó websigner con el parámetro ST_PUB_KEY, este parámetro no puede tomar el valor de ST_PRI_KEY. Lo mismo a la inversa. En cambio si se inicializó websigner con el valor Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 7 ST_ALL_KEY, este parámetro puede tomar cualquiera de los tres posibles valores. • bOnlyNotExpired Booleano que indica si se ha de tener en cuenta para la carga de certificados los certificados que están caducados o no. • sCertificateField String que indica qué campo del certificado se ha de devolver en cada posición del array de certificados. Valores posibles: CERTIFICATE_SUBJECT, CERTIFICATE_ISSUER, CERTIFICATE_SERIALNUMBER, CERTIFICATE_DATE_FROM, CERTIFICATE_DATE_TO, CERTIFICATE_SUBJECT_KEY_IDENTIFIER, CERTIFICATE_AUTHORITY_KEY_IDENTIFIER. • sCertificateFieldPart String que indica qué parte del campo sCertificateField se ha de devolver en cada posición del array de certificados. Valores posibles: CERTIFICATE_ALL, CERTIFICATE_CN, CERTIFICATE_OU, CERTIFICATE_O, CERTIFICATE_C, CERTIFICATE_E. Salida Devolverá un array con los certificados que han cumplido los parámetros de entrada especificados. signByIssuerAndSerialNumber (sIssuer, sSerialNumber, sData, bDetached, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSingDate, sIdCert) Realiza la firma de un documento o un formulario por emisor y número de serie del certificado seleccionado para la misma. Entrada • sIssuer String que contiene el campo emisor del certificado con el que se desea firmar. • Título: Revisión: Fecha: sSerialNumber Manual de integración WebSigner v 1.3 junio de 2006 8 String que contiene el campo número de serie del certificado con el que se desea firmar. • sData String que contiene los datos a firmar • bDetached Booleano que marca si la firma va a ser detached o attached. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping, este parámetro se ha de tener en cuenta si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • Título: Revisión: Fecha: sIdCert Manual de integración WebSigner v 1.3 junio de 2006 9 Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en Base64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar) si la funcion ha funcionado correctamente y null en caso contrario. signByIndex (iCertificatePos, sData, bDetached, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Firma un formulario mediante el identificador de la posicion del certificado de firma en el array de certificados cargado con getCertificates. Entrada • iCertificatePos Entero que indica la posicion en el array de certificados del certificado seleccionado para firmar el fichero. • sData String que contiene los datos a firmar. • bDetached Booleano que identifica si la firma es detached o no. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 10 • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en Base64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar) si la funcion ha funcionado correctamente y null en caso contrario. signFileByIndex(iCertificatePos, bDetached, sFormat, sHashAlgorithm, sContent, envelopetype, signElement, parent, bSignDate, sIdCert) Firma un fichero mediante el identificador de la posicion del certificado de firma en el array de certificados cargado con getCertificates. Los datos a firmar deben pasarse en base64, la función los decodifica antes de firmarlos. Entrada Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 11 • iCertificatePos Entero que indica la posicion en el array de certificados del certificado seleccionado para firmar el fichero. • bDetached Booleano que identifica si la firma es detached o no. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • sContent String que contiene los datos del fichero a firmar, codificados en base64. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 12 • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en Base64 si la funcion ha funcionado correctamente y null en caso contrario. signFileByIssuerAndSerialNumber(sIssuer,sSerialNumber, bDetached, sFormat, sHashAlgorithm, sContent, envelopetype, signElement, parent, bSignDate, sIdCert) Firma un fichero indicando el emisor y el número de serie del certificado de firma. Los datos a firmar deben pasarse en base64, la función los decodifica antes de firmarlos. Entrada • sIssuer String que guarda el emisor del certificado seleccionado para la firma. • sSerialNumber String que guarda el número de serie del certificado seleccionado para la firma. • bDetached Booleano que identifica si la firma es detached o no. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 13 • sContent String que contiene los datos del fichero a firmar, codificados en base64. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en Base64 si la función ha funcionado correctamente y null en caso contrario. signFileByIndexOneStep(iCertificatePos, bDetached, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert, sPathDocument) Firma un fichero mediante el identificador de la posicion del certificado de firma en el array de certificados cargado con getCertificates. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 14 Entrada • iCertificatePos Entero que indica la posicion en el array de certificados del certificado seleccionado para firmar el fichero. • bDetached Booleano que identifica si la firma es detached o no. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • Título: Revisión: Fecha: sIdCert Manual de integración WebSigner v 1.3 junio de 2006 15 Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. • sPathDocument Indica la ruta del documento a firmar. Este parámetro es opcional, si no se pasa ruta la función abrirá un explorador para que el usuario seleccione el archivo deseado. Salida La función devolverá los datos firmados codificados en Base64 si la funcion ha funcionado correctamente y null en caso contrario. signFileByIssuerAndSerialNumberOneStep(sIssuer,sSerialNumber, bDetached, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert, sPathDocument) Firma un fichero indicando el emisor y el número de serie del certificado de firma. Entrada • sIssuer String que guarda el emisor del certificado seleccionado para la firma. • sSerialNumber String que guarda el número de serie del certificado seleccionado para la firma. • bDetached Booleano que identifica si la firma es detached o no. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • Título: Revisión: Fecha: sHashAlgorithm Manual de integración WebSigner v 1.3 junio de 2006 16 String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. • sPathDocument Indica la ruta del documento a firmar. Este parámetro es opcional, si no se pasa ruta la función abrirá un explorador para que el usuario seleccione el archivo deseado. Salida La función devolverá los datos firmados codificados en Base64 si la función ha funcionado correctamente y null en caso contrario. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 17 addNestedSignByIndex (iCertificatePos, sSourceSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Función que añade una nueva firma al formulario o al documento seleccionado, mediante una posición en el array de certificados. Esta función añade la nueva firma de forma secuencial. Entrada • iCertificatePos Entero que indica la posición del certificado (dentro del array de certificados) seleccionado para firmar. • sSourceSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma en formato XMLDSIG y además es de tipo Enveloped. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 18 • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en base 64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar), o null si se ha producido algún error. addNestedSignByIssuerAndSerialNumber (sIssuer, sSerialNumber, sSourceSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Función que añade una nueva firma al formulario o al documento seleccionado, especificando el certificado de firma por emisor y número de serie. Esta función añade la nueva firma de forma secuencial. Entrada • sIssuer String que guarda el emisor del certificado seleccionado para la firma. • sSerialNumber String que guarda el número de serie del certificado seleccionado para la firma. • sSourceSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 19 • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma de formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en base 64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar), o null si se ha producido algún error. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 20 cosignByIndex(iCertificatePos, sSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Funcion utilizada para realizar una firma paralela sobre unos datos ya firmados, especificando la posición del certificado de firma. Entrada • iCertificatePos Entero que indica la posición del certificado (dentro del array de certificados) seleccionado para firmar. • sSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma en formato XMLDSIG y además es de tipo Enveloped. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 21 • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en base 64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar), o null si se ha producido algún error. cosignFileByIndex(iCertificatePos, sSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Funcion que añade una firma en paralelo a los datos ya firmados, especificando la posición del certificado de firma. Los datos a firmar (parámetro sDetachedData) deben pasarse en base64, la función los decodifica antes de firmarlos. Entrada • iCertificatePos Entero que indica la posición del certificado (dentro del array de certificados) seleccionado para firmar. • sSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 22 • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma en formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados en base 64, o null si se ha producido algún error. cosignByIssuerAndSerialNumber(sIssuer,sSerialNumber, sSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Funcion que añade una firma en paralelo a los datos ya firmados, especificando el certificado de firma por emisor y número de serie. Entrada • Título: Revisión: Fecha: sIssuer Manual de integración WebSigner v 1.3 junio de 2006 23 String que contiene el emisor del certificado • sSerialNumber String que contiene el número de serie del certificado • sSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma en formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • Título: Revisión: Fecha: sIdCert Manual de integración WebSigner v 1.3 junio de 2006 24 Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados codificados en base 64 (salvo en caso de firma XML, en el que se devuelve el XML resultado de la firma, sin codificar), o null si se ha producido algún error. cosignFileByIssuerAndSerialNumber(sIssuer,sSerialNumber, sSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Funcion que añade una firma en paralelo a los datos ya firmados, especificando el certificado de firma por emisor y número de serie. Los datos a firmar (parámetro sDetachedData) deben pasarse en base64, la función los decodifica antes de firmarlos. Entrada • sIssuer String que contiene el emisor del certificado • sSerialNumber String que contiene el número de serie del certificado • sSignedData String que contiene los datos firmados a los que se les va a añadir una firma. • sFormat String que da el formato de la firma. Posibles valores: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 25 • envelopetype String que indica si la firma es Enveloped o Enveloping. Este parámetro se ha de tener en cuenta sólo si la firma es de formato XMLDSIG. Valores posibles: “Enveloped”, “Enveloping”. • signElement Indica el elemento XML a firmar (id del documento XML). Este parámetro sólo se tendrá en cuenta si la firma a realizar es en formato XMLDSIG. • parent Indica el elemento padre del elemento a firmar (ruta XPath del elemento a firmar). Este elemento se tendrá en cuenta si es firma en formato XMLDSIG y además es de tipo Enveloped. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica si se va a firmar por Issuer and Serial Number o por Subject Key Identifier. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devolverá los datos firmados en base 64, o null si se ha producido algún error. verify (sSignedData, bDetached, sDetachedData, sFormat) Función que verifica si los datos firmados son correctos. Entrada • sSignedData String con los datos firmados. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 26 • bDetached Booleano que identifica si la firma es detached o attached. • sDetachedData String que contiene los datos que se firmaron. Este parámetro sólo se utiliza en caso de que la selección de firma sea bDetached=true. • sFormat String que indica el formato de la firma. Valores posibles: MT_PKCS7, MT_CMS, MT_XMLDSIG. Salida La función devuelve un array con n componentes asignados a cada una de las firmas. Cada componente es a su vez un array de dos posiciones: - Código de error - Subject del certificado que ha firmado, si pudo extraerse de la firma verifyFile(sSignedData, bDetached, sDetachedData, sFormat) Función que verifica si la firma de un fichero se ha realizado correctamente. Los datos que se firmaron (parámetro sDetachedData) deben pasarse en base64, la función los decodifica antes de verificar la firma a partir de ellos. Entrada • sSignedData String con los datos firmados. • bDetached Booleano que identifica si la firma es detached o attached. • sDetachedData String que contiene los datos que se firmaron en base64. Este parámetro sólo se utiliza en caso de que la selección de firma sea bDetached=true. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 27 • sFormat String que indica el formato de la firma. Valores posibles: MT_PKCS7, MT_CMS, MT_XMLDSIG. Salida La función devuelve un array con n componentes asignados a cada una de las firmas. Cada componente es a su vez un array de dos posiciones: - Código de error - Subject del certificado que ha firmado, si pudo extraerse de la firma getInfoByIndex (iCertificatePos) Función que devuelve un array con información del certificado solicitado mediante su identificador de posición en el array de certificados. Entrada • iCertificatePos Entero que identifica la posición dentro del array del certificado que se desea obtener. Salida Devuelve una array con información del certificado solicitado si la función ha ido correctamente, y null en caso contrario. El array devuelto contiene la siguiente información (por este orden): - Emisor - Asunto - Número de serie - Fecha de inicio de validez - Fecha de fin de validez - Certificado en base64 Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 28 - Booleano indicando si existe clave privada asociada al certificado. getInfoByIssuerAndSerialNumber(sIssuer,sSerialNumber) Función que devuelve un array con información del certificado solicitado mediante su emisor y su número de serie. Entrada • sIssuer String que identifica el emisor del certificado • sSerialNumber String que identifica el número de serie del certificado Salida Devuelve una array con información del certificado solicitado si la función ha ido correctamente, y null en caso contrario. El array devuelto contiene la siguiente información (por este orden): - Emisor - Asunto - Número de serie - Fecha de inicio de validez - Fecha de fin de validez - Certificado en base64 - Booleano indicando si existe clave privada asociada al certificado. encryptByIndex (arrCertificatePos,sData,sSimmetricAlgorithm, sFormat, sIdCert) Funcion que cifra un texto con los certificados especificados Entrada Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 29 • arrCertificatePos Array con las posiciones en el array de certificados de los certificados a usar para cifrar. • sData String con los datos a cifrar. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptFileByIndex(arrCertificatePos,sData,sSimmetricAlgorithm, sFormat, sIdCert) Función que cifra con los certificados especificados. Los datos a cifrar deben estar en base64, se decodificarán antes de cifrarse. Entrada • arrCertificatePos Array con las posiciones en el array de certificados de los certificados a usar para cifrar. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 30 • sData String con los datos a cifrar en base64. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptByIssuerAndSerialNumber (sIssuer, sSerialNumber, sData, sSimmetricAlgorithm, sFormat, sIdCert) Función que cifra un texto con el certificado especificado mediante emisor y número de serie. Entrada • sIsuuer String que identifica el emisor del certificado • sSerialNumber String que guarda el numero de serie del certificado con el que se va ha cifrar Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 31 • sData String con los datos a cifrar. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. . Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptFileByIssuerAndSerialNumber (sIssuer, sSerialNumber, sData, sSimmetricAlgorithm, sFormat, sIdCert) Función que cifra un texto con el certificado especificado mediante emisor y número de serie. Los datos a cifrar deben estar en base64, se decodificarán antes de cifrarse. Entrada • sIsuuer String que identifica el emisor del certificado • sSerialNumber String que guarda el numero de serie del certificado con el que se va ha cifrar Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 32 • sData String con los datos a cifrar en base64. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptByCert (aCertificates,sData,sSimmetricAlgorithm, sFormat, sIdCert) Funcion que cifra un texto con los certificados especificados en el array aCertificates Entrada • aCertificates Array con los certificados (en Base64) a usar para cifrar. • sData String con los datos a cifrar. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 33 • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptFileByCert(aCertificates,sData,sSimmetricAlgorithm, sFormat, sIdCert) Función que cifra con los certificados especificados en el array aCertificates. Los datos a cifrar deben estar en base64, se decodificarán antes de cifrarse. Entrada • aCertificates Array con los certificados (en Base64) a usar para cifrar. • sData String con los datos a cifrar en base64. • Título: Revisión: Fecha: sSimmetricAlgorithm Manual de integración WebSigner v 1.3 junio de 2006 34 String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. decrypt (sEncryptedData) Función que descifra los datos cifrados que recibe como parámetro. Entrada • sEncryptedData String con los datos cifrados en formato Base64 Salida La función devolverá los datos originales que habían sido cifrados si todo el proceso se ha realizado correctamente, en caso contrario devolverá null. decryptFile (sEncryptedData) Función que descifra un fichero cifrado que recibe como parámetro. Entrada • sEncryptedData String con los datos del fichero cifrados en formato Base64 Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 35 Salida La función devolverá los datos originales que habían sido cifrados codificados en base64 si todo el proceso se ha realizado correctamente, en caso contrario devolverá null. signAndEncryptByIndex (iSignerCertificatePos, sData, bDetached, sFormat, sHashAlgorithm, sSimmetricAlgorithm, arrTargetCertificatePos, bSignDate, sIdCert) Firma y cifra un texto mediante un certificado del cual ha sido especificada su posición dentro del array de certificados. Entrada • iSignerCertificatePos Entero que especifica la posición del certificado con el que se va a firmar el texto. • sData String con los datos a firmar • bDetached Booleano que identifica si la firma es detached o attached. • sFormat String que indica el formato de la firma. Valores posibles: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • sSimmetricAlgorithm String que contiene el algoritmo simétrico usado para cifrar el texto firmado. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • Título: Revisión: Fecha: arrTargetCertificatePos Manual de integración WebSigner v 1.3 junio de 2006 36 Array con la posición de los certificados con los que se va a cifrar el texto firmado. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos firmados y cifrados, o null si se produce algún error. signAndEncryptByIssuerAndSerialNumber (sIssuer, sSerialNumber, sData, bDetached, sFormat, sHashAlgorithm, sSimmetricAlgorithm, arrTargetCertificatePos, bSignDate, sIdCert) Función que firma un texto con el certificado especificado por emisor y numero de serie y lo cifra con los certificados especificados por posición. Entrada • sIssuer String que especifica el emisor del certificado • sSerialNumber String que especifica el número de serie del certificado. • sData String con los datos a firmar. • bDetached Booleano que identifica si la firma es detached o attached. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 37 • sFormat String que indica el formato de la firma. Valores posibles: MT_PKCS7, MT_CMS, MT_XMLDSIG. • sHashAlgorithm String que contiene el tipo de algoritmo hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • sSimmetricAlgorithm String que contiene el algoritmo simétrico usado para cifrar el texto firmado. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • arrTargetCertificatePos Array con laa posiciones de los certificados con los que se va a cifrar el texto firmado. • bSignDate Indica si se desea incluir como atributo de firma la fecha. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos firmados y cifrados. encryptByCert (aCertificates,sData,sSimmetricAlgorithm, sFormat, sIdCert) Funcion que cifra un texto con los certificados especificados, proporcionados explícitamente y que no deben estar previamente almacenados en las bases de datos del navegador. Entrada Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 38 • arrCertificatePos Array con los certificados a usar para cifrar, codificados en PEM (base 64 con cabecera y pie). • sData String con los datos a cifrar. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. • sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. encryptFileByCert(aCertificates,sData,sSimmetricAlgorithm, sFormat, sIdCert) Función que cifra con los certificados especificados, proporcionados explícitamente y que no deben estar previamente almacenados en las bases de datos del navegador. Los datos a cifrar deben estar en base64, se decodificarán antes de cifrarse. Entrada • Título: Revisión: Fecha: arrCertificatePos Manual de integración WebSigner v 1.3 junio de 2006 39 Array con los certificados a usar para cifrar, codificados en PEM (base 64 con cabecera y pie). • sData String con los datos a cifrar en base64. • sSimmetricAlgorithm String que contiene el algoritmo simétrico a utilizar para cifrar. Valores posibles: SCA_DES, SCA_3DES, SCA_RC2, SCA_RC4, SCA_AES_128_CBC, SCA_AES_192_CBC, SCA_AES_256_CBC. sFormat String que indica el formato del cifrado. Valores posibles: MT_PKCS7, MT_CMS. • sIdCert Indentifica el atributo del certificado mediante el cual se va ha realizar el cifrado. Posibles valores: PARAMETER_ISSUER_AND_SERIAL_NUMBER, PARAMETER_SUBJECT_KEY_IDENTIFIER. Salida La función devuelve los datos cifrados en Base64 si en el procedimiento no se ha producido ningún error, en caso contrario devuelve null. getFile() Función carga el fichero que posteriormente se va a firmar. Salida La función devuelve los datos contenidos en el fichero codificados en Base 64. getFileByPath(path) Funcion que carga el fichero mediante el path indicado, para posteriormente ser firmado. Entrada Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 40 • Path: Path absoluto del fichero que se desea cargar. Salida La función devuelve los datos contenidos en el fichero codificados en Base 64. setFile(content) Función guarda el contenido de la variable en un fichero. Entrada • content Contenedor de los datos codificados en base 64 que se va ha proceder a guardar. Salida Path completo del fichero guardado. hashText(sData, sHashAlgorithm, sEncoding) Codifica el texto recibido como parámetro según el parámetro sEncoding (si no se especifica dicho texto es codificado en ISO-8859-1), una vez codificado aplica el algoritmo hash recibido como parámetro, una vez realizado el hash codifica el resultado en Base64. Entrada • sData String que contiene los datos a los que hay que aplicar la función hash. • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • Título: Revisión: Fecha: sEncoding Manual de integración WebSigner v 1.3 junio de 2006 41 String que contiene el tipo de codificación a aplicar a los datos antes de que les sean aplicados la función hash. Posibles valores: US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16 Salida La función devolverá el hash de los datos en Base64 si la función ha funcionado correctamente y null en caso contrario. hashDocument(sHashAlgorithm, sPathDocument) Aplica el algoritmo hash recibido como parámetro al contenido del documento, una vez realizado el hash codifica el resultado en Base64. Entrada • sHashAlgorithm String que contiene el tipo de algoritmo de hash para la firma. Posibles valores: HASH_MD2, HASH_MD4, HASH_MD5, HASH_SHA1. • sPathDocument Indica la ruta del documento a firmar. Este parámetro es opcional, si no se pasa ruta la función abrirá un explorador para que el usuario seleccione el archivo deseado. Salida La función devolverá el hash del contenido del fichero en Base64 si la función ha funcionado correctamente y null en caso contrario. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 42 2.3_ Orden lógico de invocación de procedimientos Este punto recoge el orden lógico de invocación de los procedimientos anteriores: 1. Inicialización de controles y librerías Para ello es necesario invocar a la siguiente función: initWebSigner (sOnlyWithPrivateKey) La función recibe un parámetro que indica si se van a seleccionar los certificados con clave privada o no. Esto permite establecer un filtro a WebSigner a la hora de obtener los certificados del almacén. Estos certificados los almacena una variable global de tipo array. 2. Obtención de certificados para firmar getCertificates(bFilterCAs, arrCAs, sOnlyWithPrivateKey, bOnlyNotExpired, sCertificateFieldPart) arrRestrictions, sCertificateField, Esta funcion devuelve un array con los certificados que se van a seleccionar para ser mostrados más adelante en un combo en las paginas HTML. 3. A partir de aquí, la función a invocar depende de la funcionalidad requerida: Firma de datos Para la firma de datos se pueden utilizar las siguientes funciones, dependiendo de si se firma un formulario o un fichero y si se especifica el certificado con el que se firma a partir de un índice respecto a la lista de certificados o a partir del emisor y el número de serie del certificado: Título: Revisión: Fecha: signByIssuerAndSerialNumber(sIssuer, bDetached, sFormat, sHashAlgorithm, parent, bSignDate, sIdCert) signByIndex(iCertificatePos, sHashAlgorithm, envelopetype, sIdCert) getFile() Manual de integración WebSigner v 1.3 junio de 2006 sSerialNumber, sData, envelopetype, signElement, sData, bDetached, signElement, parent, sFormat, bSignDate, 43 La función getFile() tiene como cometido seleccionar el fichero que luego se va firmar. signFileByIndex(iCertificatePos, bDetached, sHashAlgorithm, sContent, envelopetype, signElement, bSignDate, sIdCert) sFormat, parent, signFileByIssuerAndSerialNumber(sIssuer,sSerialNumber, bDetached, sFormat, sHashAlgorithm, sContent, envelopetype, signElement, parent, bSignDate, sIdCert) Para añadir firmantes de forma secuencial a firmas ya generadas usaremos las siguientes funciones: • • addNestedSignByIndex(iCertificatePos,sSourceSignedData, sFormat,sHashAlgorithm,envelopetype, signElement, bSignDate, sIdCert) parent, addNestedSignByIssuerAndSerialNumber(sIssuer,sSerialNumber, sSourceSignedData,sFormat,sHashAlgorithm,envelopetype, signElement, parent, bSignDate, sIdCert) Para añadir firmantes de forma paralela a firmas ya generadas usaremos las siguientes funciones: • cosignByIndex(iCertificatePos, sHashAlgorithm, envelopetype, sIdCert) sSignedData, signElement, parent, sFormat, bSignDate, • cosignFileByIndex(iCertificatePos, sSignedData, sHashAlgorithm, envelopetype, signElement, parent, sIdCert) sFormat, bSignDate, • cosignByIssuerAndSerialNumber(sIssuer, sSerialNumber, sSignedData, sFormat, sHashAlgorithm, envelopetype, signElement, parent, bSignDate, sIdCert) Verificación de firma Para la verificación de la firma se pueden utilizar las siguientes funciones, dependiendo de si se verifica la firma de un formulario o de un fichero. • verifyFile(sSignedData,bDetached, sDetachedData, sFormat) • verify(sSignedData,bDetached, sDetachedData, sFormat) Cifrado de datos Para el cifrado de datos se pueden utilizar las siguientes funciones, dependiendo de si se cifra un formulario o un fichero y si se especifica el certificado con el que se cifra a partir de un Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 44 índice respecto a la lista de certificados o a partir del emisor y el número de serie del certificado • encryptFileByIndex(arrCertificatePos,sData,sSimmetricAlgorithm, sFormat, sIdCert) • encryptByIndex(arrCertificatePos,sData,sSimmetricAlgorithm, sFormat, sIdCert) • encryptByIssuerAndSerialNumber(sIssuer,sSerialNumber, arrCertificatePos, sData, sSimmetricAlgorithm, sFormat, sIdCert) • encryptFileByIssuerAndSerialNumber(sIssuer,sSerialNumber, arrCertificatePos, sData, sSimmetricAlgorithm, sFormat, sIdCert) setFile() La función setFile() tiene como cometido guardar el documento que ha sifo cifrado. Descifrado de datos cifrados con anterioridad Para el descifrado de datos cifrados se pueden utilizar las siguientes funciones, dependiendo de si ha de descifrar un texto cifrado o un fichero cifrado. • decrypt(sEncryptedData) • decryptFile(sEncryptedData) Firma y cifrado de datos. Para la firma y el cifrado de datos se pueden utilizar las siguientes funciones dependiendo de si se especifica el certificado con el que se firma a partir de un índice respecto a la lista de certificados o a partir del emisor y el número de serie del certificado Título: Revisión: Fecha: • signAndEncryptByIndex(iSignerCertificatePos, sFormat, sHashAlgorithm, arrTargetCertificatePos, bSignDate, sIdCert) • signAndEncryptByIssuerAndSerialNumber(sIssuer,sSerialNumber,sData, bDetached, sFormat, sHashAlgorithm, sSimmetricAlgorithm, arrTargetCertificatePos, bSignDate, sIdCert) Manual de integración WebSigner v 1.3 junio de 2006 sData, bDetached, sSimmetricAlgorithm, 45 2.4_ Integración de WebSigner en una página HTML 1. Incluir el script WS.js (o WS_Full.js, si se desea disponer de la funcionalidad de firma y verificación XMLDSig en el applet, es decir, para utilizar el applet completo), que discrimina el tipo de navegador usado y en base a esto introduce la referencia correcta al interfaz de WebSigner, en la cabecera de la página: <script language="javascript" src="http://ASF.tbsolutions.com:8080/ASF/js/WS.js" type="text/javascript"></script> En el caso de que el navegador utilizado sea Internet Explorer, WS.js introducirá: <object id="oWebSigner_Crypto" style="position:absolute;top:50;left=-3" codebase="'+_WEBSIGNER_LOCATION+'WebSignerCOM.cab#Version='+_WEBSIGN ER_VERSION+'" classid="CLSID:04521414-1636-464C-BFEE-6348EDD34BCD" VIEWASTEXT> </object> <object id="oCAPICOM" style="position:absolute;top:-25;left=-3" codeBase="' + _WEBSIGNER_LOCATION + 'capicom.cab#version=2,0,0,0" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT> </object> <script language="JavaScript" src="' + jsURL + 'WSIE.js"></script> <script language="JavaScript" src="' + jsURL + src="' + jsURL + 'WSIE_const.js"></script> <script language="JavaScript" 'WSIE_utils.js"></script> En el caso de que el navegador utilizado sea Nestcape o Mozilla introducirá : WS.js <script language="JavaScript" src="' + jsURL + 'WSNN.js"></script> <script language="JavaScript" src="' + jsURL + 'WSNN_const.js"></script> <script language="JavaScript" src="' + jsURL + 'WSNN_util.js"></script> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 46 2. Seguir los pasos indicados en el punto Orden lógico de invocación de procedimientos En los anexos se adjuntan ejemplos de integración en una página html para todas las acciones posibles indicadas con anterioridad en este documento. Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 47 3_ Anexo I: Firma Paralela de Formulario A continuación se adjunta el código fuente de una página HTML donde se integra WebSigner para la firma paralela de formularios: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page import = " jfactory.exchange.ResultInfo, java.util.ArrayList, com.tbsolutions.asf.demo.util.Util, com.tbsolutions.asf.policymanager.sa.CertAppOperationRestrictionsInfoSet, com.tbsolutions.asf.policymanager.sa.CertAppOperationRestrictionsInfo, com.tbsolutions.asf.policymanager.sa.RestrictionInfo, com.tbsolutions.asf.policymanager.sa.CertTypeInfo, com.tbsolutions.asf.securityagent.*" contentType="text/html; charset=iso-8859-1"%> <%! //Filtra la cadena pasada como parámetro, sustituyendo \ por \\ y " por \" public static String Filter(String cadena) { String filtered = ""; for (int i = 0; i < cadena.length(); i ++) { if (cadena.charAt(i) == '\\') { filtered += "\\\\"; } else if (cadena.charAt(i) == '"') { filtered += "\\\""; } else { filtered += cadena.charAt(i); } } return filtered; } %> <% String gsURL = Util.getPropertyAsString(Util.ASF_URL); boolean ssoEnabled = Util.getPropertyAsBool(Util.SSO_ENABLED_PROP); boolean advancedDemo = false; try { advancedDemo = Util.getPropertyAsBool(Util.ADVANCED_DEMO); } catch (Exception e) { } %> <html> <head> <title>Firma Texto Paralelo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link href="estilos.css" rel="stylesheet" type="text/css"> <script language="javascript" src="<%=gsURL%>js/WS.js" type="text/javascript"></script> <script language="javascript" src="utils.js" type="text/javascript"></script> <script language="javascript"> <!-var var var var var var var var Título: Revisión: Fecha: iCertificatePos; iSerialNumber; iIssuer; sFormat; sHashAlgorithm; bDetached; bSignDate; bIdentifyBySubjectKI = "1"; Manual de integración WebSigner v 1.3 junio de 2006 48 <% if(ssoEnabled){ %> recargarMenu(); <% } %> function readFilterValues(){ iCertificatePos = document.formData.selCertificate.value; <% if(advancedDemo){ %> iSerialNumber = document.formData.selSerialNumber.value; iIssuer = document.formData.selIssuer.value; bSignDate = document.formData.signDate.checked; <% } %> if (document.formData.formato[0].checked){ sFormat = MT_PKCS7; } if (document.formData.formato[1].checked){ sFormat = MT_CMS; bIdentifyBySubjectKI = document.formData.identifyBy.value; } bDetached = document.formData.tipo[1].checked; sHashAlgorithm = document.formData.hashAlgorithm.value; } function resetValues(){ document.formData.firmatexto.disabled = false; document.formData.afirmatexto1.disabled = true; document.formData.vfirmatexto.disabled = false; document.formData.datos.value = "Texto a fimar"; document.formData.datosfirmados.value = ""; document.formData.datosverificar.value=""; document.formData.formato[0].disabled = false; document.formData.formato[1].disabled = false; document.formData.tipo[0].disabled = false; document.formData.tipo[1].disabled = false; if (nn || nn6) { resetFirmaNN(); } } function radioChanged(radio) { if(radio[1].checked) { document.formData.identifyBy.disabled = false; } else { document.formData.identifyBy.disabled = true; } } function firmatexto_onclick(){ readFilterValues(); //firmar if (document.formData.datos.value!=null document.formData.datos.value!="") { var sData = document.formData.datos.value; var sSignedData = null; && <% if(advancedDemo){ %> if(document.formData.selType[0].checked == true){ Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 49 sSignedData = signByIndex(iCertificatePos, sData, bDetached, sFormat, sHashAlgorithm, null, null, null, bSignDate, bIdentifyBySubjectKI); } else { sSignedData = signByIssuerAndSerialNumber(iIssuer, iSerialNumber, sData, bDetached, sFormat, sHashAlgorithm, null, null, null, bSignDate, bIdentifyBySubjectKI); } <% } else { %> sSignedData = signByIndex(iCertificatePos, sData, bDetached, sFormat, sHashAlgorithm, null, null, null, false, bIdentifyBySubjectKI); <% } %> if (sSignedData!=null) { document.formData.datosfirmados.value = sSignedData; document.formData.firmatexto.disabled = true; document.formData.afirmatexto1.disabled = false; document.formData.vfirmatexto.disabled = false; document.formData.vfirmatextoser.disabled=false; document.formData.formato[0].disabled = true; document.formData.formato[1].disabled = true; } else { alert("Se ha producido algún error al firmar"); } } else { alert("Debe de introducir un texto para poder firmar."); } } function afirmatexto1_onclick(){ readFilterValues(); //firmar if (document.formData.datosfirmados.value!=null document.formData.datosfirmados.value!="") { var sDetachedData = document.formData.datos.value; var sSignedData = document.formData.datosfirmados.value; && <% if(advancedDemo){ %> if(document.formData.selType[0].checked == true){ sSignedData = cosignByIndex(iCertificatePos, sSignedData, bDetached, sDetachedData, sFormat, sHashAlgorithm, null, null, null, bSignDate, bIdentifyBySubjectKI); } else { sSignedData = cosignByIssuerAndSerialNumber(iIssuer, iSerialNumber, sSignedData, bDetached, sDetachedData, sFormat, sHashAlgorithm); } <% } else { %> sSignedData = cosignByIndex(iCertificatePos, sSignedData, bDetached, sDetachedData, sFormat, sHashAlgorithm, null, null, null, false, bIdentifyBySubjectKI); <% } %> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 50 if (sSignedData!=null) { document.formData.datosfirmados.value = sSignedData; } else { alert("Se ha producido algún error al añadir una firma paralela"); } } else { alert("Debe de haber firmado un texto anteriormente para poder añadir una nueva firma."); } } function vfirmatexto_onclick() { readFilterValues(); if (document.formData.datosfirmados.value!=null document.formData.datosfirmados.value!="") { var sResult = null; var arrResult = null; && arrResult = verify(document.formData.datosfirmados.value, bDetached, document.formData.datos.value,sFormat); sResult = "RESULTADO DE LA VERIFICACIÓN\n"; sResult += "--------------------------------------------\n"; if (arrResult!=null){ for (var i=0;i < arrResult.length;i++){ var iVerifyResult = arrResult[i][ERROR_VERIFY_INDEX]; var sVerifyResult = "\n-Error desconocido\n"; var sSigner = arrResult[i][SIGNER_VERIFY_INDEX]; if (iVerifyResult == VERIFY_OK) sVerifyResult = "\n-Firma Correcta "; if (iVerifyResult == VERIFY_BAD_SIGNATURE) sVerifyResult = "\n-Firma Incorrecta "; if (iVerifyResult == VERIFY_BAD_CERT_CHAIN) sVerifyResult = "\n-El certificado no ha podido ser verificado, falta cadena de certificación "; if (iVerifyResult == VERIFY_BAD_SIGNATURE_AND_CERT) sVerifyResult = "\n-Firma incorrecta y certificado no ha podido ser verificado "; if (iVerifyResult == VERIFY_ALGORITHM_NOT_DEFINED) sVerifyResult = "\n-Firma incorrecta, algoritmo de firma no definido "; if (iVerifyResult == CERTIFICATE_NOT_FOUND) sVerifyResult = "\n-Firma incorrecta, certificado no encontrado "; if (iVerifyResult == VERIFY_BAD_CERT_USAGE) sVerifyResult = "\n-Firma incorrecta y uso de certificado no válido para la firma "; if (iVerifyResult == VERIFY_BAD_CERT_VALIDITY) sVerifyResult = "\n-Firma incorrecta, certificado caducado "; if (iVerifyResult == INVALID_SIGNATURE_FORMAT) sVerifyResult = "\n-Firma incorrecta, formato de firma incorrecto"; if (sSigner != "") sVerifyResult += ":" + sSigner; sVerifyResult += "\n"; sResult += sVerifyResult; } alert(sResult); } } else { alert("Debe haber datos firmados para poder realizar la verificacion."); } Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 51 } function vfirmatextoserv_onclick() { if (document.formData.datosfirmados.value!="") { document.formData.action="VerifyServidorP.jsp"; document.formData.submit(); } else { alert("Debe firmar para poder realizar la verificación."); } } function addOption(list,optionText,optionValue){ list.options[list.options.length] Option(optionText,optionValue); } = new <% if(advancedDemo){ %> function selType_onclick(){ if(document.formData.selType[0].checked == true){ document.formData.selIssuer.disabled = true; document.formData.selSerialNumber.disabled = true; document.formData.selCertificate.disabled = false; } else { document.formData.selCertificate.disabled = true; document.formData.selIssuer.disabled = false; document.formData.selSerialNumber.disabled = false; } } <% } %> function initAlgorithms(list){ list.options.length=0; addOption(list,"HASH_SHA1",HASH_SHA1); addOption(list,"HASH_MD5",HASH_MD5); addOption(list,"HASH_MD2", HASH_MD2); } function init(){ var bFilterCAs = true; if (bFilterCAs) { <% CertAppOperationRestrictionsInfoSet listaCAs=null; String applicationID="1"; String operationID="1"; listaCAs=SecurityAgentPM.getValidCAsSignS(applicationID, operationID, "1"); %> var arrCAs = new Array(<%=listaCAs.getArrayList().size()%>); var arrRestrictions = new Array(<%=listaCAs.getArrayList().size()%>); <% for (int i=0; i < listaCAs.getArrayList().size(); i++) { CertAppOperationRestrictionsInfo info = (CertAppOperationRestrictionsInfo) listaCAs.getArrayList().get(i); CertTypeInfo CA = info.getCertTypeInfo(); %> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 52 arrCAs[<%=i%>] = "<%=Filter(CA.getIssuer())%>"; arrRestrictions[<%=i%>] = new Array("<%=Filter(info.getRestrictionFields())%>","<%=Filter(info.getRestri ctionPatterns())%>"); <% }%> } else { var arrCAs=new Array(); var arrRestrictions=new Array(); } var sCertificateField = CERTIFICATE_SUBJECT; var sCertificateFieldPart = CERTIFICATE_CN; var sOnlyWithPrivateKey = ST_PRI_KEY; var bOnlyNotExpired = false; var arrCertificates = new Array(); var arrIssuers = new Array(); var arrSNs = new Array(); if (initWebSigner(ST_ALL_KEY)){ arrCertificates = getCertificates(bFilterCAs, arrCAs, arrRestrictions, sOnlyWithPrivateKey, bOnlyNotExpired, sCertificateField, sCertificateFieldPart); //Load certificate list with array document.formData.selCertificate.options.length=0; for (var i=0;i< arrCertificates.length;i++){ if (arrCertificates[i] != null) { if (arrCertificates[i] != ""){ addOption(document.formData.selCertificate,arrCertificates[i][1],arrCerti ficates[i][0]); } } } <% if(advancedDemo){ %> arrIssuers = getCertificates(bFilterCAs, arrCAs, arrRestrictions, sOnlyWithPrivateKey, bOnlyNotExpired, CERTIFICATE_ISSUER, ""); document.formData.selIssuer.options.length=0; for (var i=0;i< arrIssuers.length;i++){ if (arrIssuers[i] != null) { if (arrIssuers[i] != "") { var issuerSt = new String(arrIssuers[i][1]); var arrayAtrib = new Array(); arrayAtrib = issuerSt.split(","); addOption(document.formData.selIssuer, arrayAtrib[0], arrIssuers[i][1]); } } } arrSNs = getCertificates(bFilterCAs, arrCAs, arrRestrictions, sOnlyWithPrivateKey, bOnlyNotExpired, CERTIFICATE_SERIALNUMBER, ""); document.formData.selSerialNumber.options.length=0; for (var i=0;i< arrSNs.length;i++){ if (arrSNs[i] != null) { if (arrSNs[i] != "") { addOption(document.formData.selSerialNumber, arrSNs[i][1], arrSNs[i][1]); } } Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 53 } selType_onclick(); <% } %> } //init hash algorithm list initAlgorithms(document.formData.hashAlgorithm); } //--> </script> </head> <body onload="init()"> <form name="formData" id="formData" method="post"> <input type="hidden" name="origen" value="SignTextP.jsp"> <table width="100%" border="0" cellspacing="16" cellpadding="0"> <tr> <th colspan="4">Firma y verificaci&oacute;n en paralelo de un texto</th> </tr> <tr> <td>Formato:</td> <td> <input type="radio" name="formato" value="1" checked onClick="javascript:radioChanged(document.formData.formato);" onKeyPress="javascript:radioChanged(document.formData.formato);">PKCS#7 <input type="radio" name="formato" value="2" onClick="javascript:radioChanged(document.formData.formato);" onKeyPress="javascript:radioChanged(document.formData.formato);">CMS </td> <td>Identificador de usuario a incluir: </td> <td> <select disabled name="identifyBy"> <option value="1">Issuer + Serial Number</option> <option value="2">Subject Key Identifier</option> </select> </td> </tr> <tr> <td>Tipo:</td> <td> <input name="tipo" type="radio" value="1" checked>Attached <input type="radio" name="tipo" value="2">Detached </td> <td>Algoritmo de resumen:</td> <td> <select name="hashAlgorithm" id="select"> </select> </td> </tr> <% if(advancedDemo) { %> <tr> <td colspan="4"> <input type="checkbox" name="signDate"/> Firmar el Atributo Fecha </td> </tr> <tr> <td>Seleccion de Certificado:</td> <td colspan="3" > <input type="radio" name="selType" value="1" checked onclick="javascript:selType_onclick()">Por posicion Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 54 <input type="radio" name="selType" value="2" onclick="javascript:selType_onclick()">Por Issuer y SN </td> </tr> <% } %> <tr> <td>Certificado:</td> <td colspan="3"><select name="selCertificate" id="select3"> </select></td> </tr> <% if(advancedDemo) { %> <tr> <td>Issuer and SN:</td> <td colspan="3"> <select name="selIssuer" id="selIssuer"></select> <select name="selSerialNumber" id="selSerialNumber"></select> </td> </tr> <% } %> <tr> <td height="24" colspan="4">Introduzca el texto que desea firmar:</td> </tr> <tr> <td colspan="2"> <textarea name="datos" cols="80" rows="5" id="datos">Texto a firmar</textarea> </td> <td colspan="2" valign="bottom"> <p> <input name="setValue" type=button class="boton" id="setValue2" onClick="javascript:resetValues();" value="Reiniciar"> </p> <p> <input class="boton" name="firmatexto" type=button onClick="javascript:firmatexto_onclick();" value="Firmar"> <input class="boton" name="afirmatexto1" type=button onClick="javascript:afirmatexto1_onclick();" disabled="true" value="A&ntilde;adir firma Paralela"> </p></td> </tr> <tr> <td colspan="4">Resultado de la firma (en BASE64) :</td> </tr> <tr> <td colspan="2"> <%String Dato=""; if (request.getParameter("datosfirmados")!="" && request.getParameter("datosfirmados")!=null) { Dato=request.getParameter("datosfirmados"); } %> <textarea name="datosfirmados" cols="80" rows="5" id="datosfirmados"><%=Dato%></textarea> </td> <td colspan="2" valign="bottom"><p> <input class="boton" name="vfirmatexto" type=button onClick="javascript:vfirmatexto_onclick();" value="Verificar Firma"> </p> </td> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 55 </tr> <tr> <td colspan="2"> <%String mensaje=""; if (request.getParameter("mensaje")!="" && request.getParameter("mensaje")!=null) { mensaje=request.getParameter("mensaje"); } %> <textarea name="datosverificar" cols="80" rows="5" id="datosverificar"><%=mensaje%></textarea> </td> <td colspan="2" valign="bottom"><p> <input class="boton" name="vfirmatextoser" type=button onClick="javascript:vfirmatextoserv_onclick();" value="Verificar Firma en Servidor"> </p> </td> </tr> </table> <br> <center> <input name="back" type="button" class="boton" id="back2" onClick="window.location.href='indexFormulario.html'" value="Volver"> </center> </form> </body> </html> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 56 4_ Anexo II: Cifrado de Formulario A continuación se adjunta el código fuente de una página HTML donde se integra WebSigner para el cifrado de un formulario: <%@ page import = "jfactory.exchange.ResultInfo, java.util.ArrayList, com.tbsolutions.asf.policymanager.sa.*, com.tbsolutions.asf.demo.util.Util, com.tbsolutions.asf.securityagent.*" contentType="text/html; charset=iso-8859-1"%> <%! //Filtra la cadena pasada como parámetro, sustituyendo \ por \\ y " por \" public static String Filter(String cadena) { String filtered = ""; for (int i = 0; i < cadena.length(); i ++) { if (cadena.charAt(i) == '\\') { filtered += "\\\\"; } else if (cadena.charAt(i) == '"') { filtered += "\\\""; } else { filtered += cadena.charAt(i); } } return filtered; } public static String GetName(String issuer) { int index, index2, prefix; String issuerAux = issuer.toUpperCase(); index = issuerAux.indexOf("CN="); if (index == -1) { //No hay CN => buscamos la OU más externa index = issuerAux.indexOf("OU="); if (index == -1) { //No hay OU => buscamos la O index = issuerAux.indexOf("O="); if (index == -1) { return ""; } else { prefix = 2; } } else { prefix = 3; } } else { prefix = 3; } //Hay que comprobar que el valor del campo no está entre comillas if (issuerAux.charAt(index + prefix) != '"') { index2 = issuerAux.indexOf(",", index + prefix); if (index2 == -1) { return issuer.substring(index + prefix, issuer.length()); } else { Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 57 return issuer.substring(index + prefix, index2); } } else { index2 = issuerAux.indexOf("\"", index + prefix + 1); if (index2 == -1) { //Error, no hay comilla de cierre return ""; } else { return issuer.substring(index + prefix + 1, index2); } } } public static String parseaTexto(String original) { StringBuffer resultado = new StringBuffer(""); int length = original.length(); for (int i = 0; i < length; i++) { if (original.charAt(i) == 0x0A){ resultado.append(0x0A); }else{ resultado.append(original.charAt(i)); } } return resultado.toString(); } %> <% boolean ssoEnabled = Util.getPropertyAsBool(Util.SSO_ENABLED_PROP); String gsURL = Util.getPropertyAsString(Util.ASF_URL); String certificateSeparator Util.getPropertyAsString(Util.CERTIFICATE_SEPARATOR); boolean advancedDemo = false; try { advancedDemo = Util.getPropertyAsBool(Util.ADVANCED_DEMO); } catch (Exception e){} = // "true" si ya ha sido definido. String profileDefined = (String) request.getSession().getAttribute("USER_N6_PROFILE"); if (profileDefined == null) { profileDefined = ""; } // Establecemos para el resto de paginas que el perfil ya ha sido definido request.getSession().setAttribute("USER_N6_PROFILE", new String("true")); %> <html> <head> <title>Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" href="estilos.css"> <script language="javascript" src="<%=gsURL%>js/WS.js" type="text/javascript"></script> <script language="javascript" src="utils.js" type="text/javascript"></script> <script language="Javascript"> <!-<% if(ssoEnabled){ Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 58 %> recargarMenu(); <% } %> function enviarFormularioACifrar() { if (document.formData.file.value.length == 0) { alert("Introduzca el texto a cifrar"); return false; } if (formData.SelecCertificate.value.length==0 && formData.SelecAliases.value.length==0 && formData.SelecIssuer.value.length==0 && formData.SelecAttributes.value.length==0) { alert("Introduzca los certificados para cifrar como destinatarios"); return false; } if (!formData.SelecCertificate.disabled) document.formData.tarjectCertificates.value = getInfoByIndex(document.formData.SelecCertificate.value)[5]; if (!formData.SelecAliases.disabled) document.formData.tarjectAliases.value = document.formData.SelecAliases.value; if (!formData.SelecAttributes.disabled) document.formData.tarjectAttributes.value = document.formData.SelecAttributes[document.formData.SelecAttributes.select edIndex].text; document.formData.action = "CipherServidor.jsp"; document.formData.submit(); return false; } function enviarFormularioADescifrar() { if (document.formData.selAlias.value.length==0) { alert("Introduzca el certificado para descifrar. "); return false; } else { document.formData.tarjectselAlias.value=document.formData.selAlias.value; } if (document.formData.datoscifrados.value==null || document.formData.datoscifrados.value=="") { alert("Para realizar el descifrado debe haber datos cifrados. "); return false; } document.formData.action = "DecryptionServidor.jsp"; document.formData.submit(); return false; } function borrarCertificado() { return false; } function addOption(list,optionText,optionValue){ list.options[list.options.length] Option(optionText,optionValue); } Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 = new 59 <% CertAppOperationRestrictionsEncInfoSet listaCAs=null; %> function initAlgorithms(list) { list.options.length=0; addOption(list,"DES",SCA_DES); addOption(list,"3DES-CBC",SCA_3DES); addOption(list,"RC2", SCA_RC2); } function checkChanged(checkBox) { if(checkBox.checked){ checkBox.value = "true"; } else { checkBox.value = "false"; } } function verifCertChange() { checkChanged(document.formData.verifCert); if(document.formData.verifCert.value == "false") { document.formData.noRep.disabled = true; document.formData.cache.disabled = true; } else { document.formData.noRep.disabled = false; document.formData.cache.disabled = false; } } function initAlgorithmsAsy(list) //algoritmos asymetricos { list.options.length=0; addOption(list,"RSA",RSA); addOption(list,"DH",DH); } function init() { <% String dcifrados=(String)session.getAttribute("datoscifrados"); String ddescifrados=(String)session.getAttribute("datosdescifrados"); String resultcif=(String)session.getAttribute("resultadocif"); String resultdescif=(String)session.getAttribute("resultadodescif"); if (dcifrados!="" && dcifrados!=null) { session.setAttribute("datoscifrados",null); %> document.formData.datoscifrados.value="<%=parseaTexto(dcifrados)%>"; <% if (resultcif!="" && resultcif!=null) { session.setAttribute("resultadocif",null); %> document.formData.resultcifrado.value="<%=resultcif%>"; <% } } else { String mensaje=""; if (request.getParameter("mensaje")!="" request.getParameter("mensaje")!=null) { mensaje=request.getParameter("mensaje"); } Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 && 60 %> document.formData.resultcifrado.value=document.formData.resultcifrado.valu e+" <%=mensaje%>"; <% } if (ddescifrados!="" && ddescifrados!=null) { session.setAttribute("datosdescifrados",null); %> document.formData.datosdescifrados.value="<%=parseaTexto(ddescifrados)%>" ; <% if (resultdescif!="" && resultdescif!=null) { session.setAttribute("resultadodescif",null); %> document.formData.resultdescifrado.value="<%=resultdescif%>"; <% } } else { String mensaje2=""; if (request.getParameter("mensaje2")!="" request.getParameter("mensaje2")!=null) { mensaje2=request.getParameter("mensaje2"); } %> & document.formData.resultdescifrado.value=document.formData.resultdescifra do.value+" <%=mensaje2%>"; <% } %> initAlgorithms(document.formData.hashAlgorithm); <% String applicationID="1"; String operationID="3"; %> var bFilterCAs = true; if (bFilterCAs) { <% listaCAs=SecurityAgentPM.getValidCAsEncS(applicationID, operationID, "1"); %> var arrCAs = new Array(<%=listaCAs.getArrayList().size()%>); var arrCert = new Array(<%=listaCAs.getArrayList().size()%>); var arrRestrictions = new Array(<%=listaCAs.getArrayList().size()%>); <% for (int i=0; i < listaCAs.getArrayList().size(); i++) { CertAppOperationRestrictionsEncInfo info = (CertAppOperationRestrictionsEncInfo) listaCAs.getArrayList().get(i); CertTypeEncInfo CA = info.getCertTypeEncInfo(); %> arrCAs[<%=i%>] = "<%=GetName(Filter(CA.getIssuer()))%>"; arrCert[<%=i%>] = "<%=CA.getCertTypeId()%>"; arrRestrictions[<%=i%>] = new Array("<%=Filter(info.getRestrictionFields())%>","<%=Filter(info.getRestri ctionPatterns())%>"); Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 61 <% }%> } else { var arrCAs=new Array(); var arrRestrictions=new Array(); } var sCertificateField = CERTIFICATE_SUBJECT; var sCertificateFieldPart = CERTIFICATE_CN; var sOnlyWithPrivateKey = ST_PRI_KEY; var bOnlyNotExpired = true; var arrCertificates = new Array(); if (initWebSigner(ST_ALL_KEY)){ arrCertificates = getCertificates(bFilterCAs, arrRestrictions,sOnlyWithPrivateKey, bOnlyNotExpired,sCertificateField,sCertificateFieldPart); //Load certificate list with array document.formData.SelecCertificate.options.length=0; for (var i=0;i< arrCertificates.length;i++){ if (arrCertificates[i] != null) { if (arrCertificates[i] != ""){ arrCAs, addOption(document.formData.SelecCertificate,arrCertificates[i][1],arrCert ificates[i][0]); } } } } <% CertificateAliasInfoSet certif=new CertificateAliasInfoSet(); Long oper=new Long(com.tbsolutions.asf.util.Constants.ENCRYPTION_OPERATION); certif=SecurityAgentPM.getCertificateAlisesS(oper, "1"); ArrayList arrCertif=certif.getArrayList(); %> var aliases = new Array(<%=certif.getArrayList().size()%>); <% for (int i=0; i < arrCertif.size(); i++) { CertificateAliasInfo info = (CertificateAliasInfo) arrCertif.get(i); out.println("aliases[" + i + "]=\"" + info.getNickname() + "\";"); } %> modo(); var i; var el; document.getElementsByName("SelecIssuer")[0].options.length = 0; for (i = 0; i < arrCAs.length; i ++) { document.getElementsByName("SelecIssuer")[0].options.length = i + 1; el = document.getElementsByName("SelecIssuer")[0].options.item(i); el.text =arrCAs[i]; el.value = arrCert[i]; } document.getElementsByName("SelecAliases")[0].options.length = 0; for (i = 0; i < aliases.length; i ++) { document.getElementsByName("SelecAliases")[0].options.length = i + 1; el = document.getElementsByName("SelecAliases")[0].options.item(i); el.text = aliases[i]; el.value = aliases[i]; } //DESCIFRADO Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 62 initAlgorithmsAsy(document.formData.asiAlgorithm); <% AppOpeCertAliasInfoSet Alias=null; String appli="1"; String operation="4"; Long Long(com.tbsolutions.asf.util.Constants.DECRYPTION_OPERATION); Alias=SecurityAgentPM.getAppOpeCertAliasesS(appli, "1"); operD=new operation, operD, ArrayList arrAlias=Alias.getArrayList(); CertificateAliasInfoSet certifi=SecurityAgentPM.getCertificateAlisesS(operD, "1"); ArrayList arrCertifi=certifi.getArrayList(); for (int a=0;a< arrAlias.size() ;a++){ if (arrAlias.get(a) != null) { if (arrAlias.get(a) != ""){ AppOpeCertAliasInfo infoCertAlias=(AppOpeCertAliasInfo)arrAlias.get(a); for (int c=0; c<arrCertifi.size(); c++) { if (arrCertifi.get(c)!=null) { if (arrCertifi.get(c) !="") { CertificateAliasInfo infoCertAlias2=(CertificateAliasInfo)arrCertifi.get(c); if (infoCertAlias.getCertAliasId()==infoCertAlias2.getCertificateAliasId()) { %> addOption(document.formData.selAlias,"<%=infoCertAlias2.getNickname()%>"," <%=infoCertAlias2.getNickname()%>"); <% } } } } } } } %> } function entidad_onChange() { var c=document.formData.SelecIssuer.value; document.formData.SelecAttributes.options.length = 0; <% // Remote invocation for (int j = 0; j < listaCAs.getArrayList().size(); j++) { ArrayList allowedAttributes = new ArrayList(); CertAppOperationRestrictionsEncInfo infoca (CertAppOperationRestrictionsEncInfo) listaCAs.getArrayList().get(j); CertTypeEncInfo CA2 = infoca.getCertTypeEncInfo(); %> if (c=="<%=CA2.getCertTypeId()%>") { Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 = 63 <% Long certId=new Long((long)CA2.getCertTypeId()); LdapAttributeInfoSet ldapAttributeInfoSet=SecurityAgentPM.getValidLdapSearchAliasesS(certId, "1"); allowedAttributes.addAll(ldapAttributeInfoSet.getArrayList()); for (int k=0; k<allowedAttributes.size(); k++) { LdapAttributeInfo attinfo=(LdapAttributeInfo) allowedAttributes.get(k); if (attinfo.getAlias()!="" && attinfo.getAlias()!=null) { %> addOption(document.formData.SelecAttributes,"<%=attinfo.getAlias()%>","<%= attinfo.getLdapAttributeId()%>"); <% } } %>} <% } %> } function modo(){ if (formData.Seleccionar[0].checked) { formData.SelecCertificate.disabled=false; formData.SelecAliases.disabled=true; formData.SelecIssuer.disabled=true; formData.SelecAttributes.disabled=true; formData.attValue.disabled=true; if (document.formData.tarjectCertificates.value.length == 0) { document.formData.tarjectCertificates.value getInfoByIndex(document.formData.SelecCertificate.value); } } else if (formData.Seleccionar[1].checked) { formData.SelecCertificate.disabled=true; formData.SelecAliases.disabled=false; formData.SelecIssuer.disabled=true; formData.SelecAttributes.disabled=true; formData.attValue.disabled=true; } else if (formData.Seleccionar[2].checked) { formData.SelecCertificate.disabled=true; formData.SelecAliases.disabled=true; formData.SelecIssuer.disabled=false; formData.SelecAttributes.disabled=false; formData.attValue.disabled=false; } } = function resetValues(){ document.formData.resutlcifrado.value=""; document.formData.datoscifrados.value=""; document.formData.formato[0].disabled = false; document.formData.formato[1].disabled = false; document.formData.datosdescifrados.value=""; document.formData.resultdescifrado.value=""; } Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 64 //--> </script> </head> <BODY onload="init()"> <form name="formData" method="post" action=""> <TABLE width="100%" border="0" cellspacing="16" cellpadding="0"> <tr> <th colspan=4>Cifrado/Descifrado</th> </tr> <tr> <td >Texto a cifrar: </TD> <td colspan="2"><input type="text" value="Texto a cifrar" name="file" size="50"> </TD> </tr> <tr> <td>Formato:</td> <td colspan="2"> <input name="formato" type="radio" value="1" checked>PKCS#7 <input type="radio" name="formato" value="2">CMS </td> </tr> <tr> <td>Algoritmo sim&eacute;trico de cifrado: </td> <td colspan="2"> <select name="hashAlgorithm" id="select"></select> </td> </tr> <!-- Esta Fila de la tabla servirá para definir tb los certificados por alias (otra muy parecida) --> <tr> <td>Certificados de Usuario: </td> <td colspan="2"> <select disabled name="SelecCertificate"></select> <input type=radio name=Seleccionar onClick="modo()" value=1>Seleccionar CU <script language="JavaScript"> if (esNN6 && "true" != "<%=profileDefined%>") { document.write('<select name="SelecUserNN"></select>'); document.write('<input type=button name=SetProfile class=boton value="Establecer" onClick="setUserProfileNT(document.formData.SelecUserNN.value);return false;">'); showProfileListNT("SelecUserNN",""); } </script> </td> </tr> <tr> <td>Certificados en BD: </td> <td colspan="2"> <select disabled name="SelecAliases"></select> <input type=radio name=Seleccionar checked="true" onClick="modo()" value=2>Seleccionar BD </td> </tr> <tr> <td>Entidad emisora: </td> <td width="43%"> <select disabled name="SelecIssuer" onChange="entidad_onChange()"></select> </td> <td width="27%" rowspan="3"> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 65 <input type=radio name=Seleccionar onClick="modo()" value=3>Seleccionar LDAP </td> </tr> <tr> <td>Atributo: </td> <td> <select disabled name="SelecAttributes"> <script language="JavaScript"> var i; if (document.getElementsByName("SelecAttributes")[0].options!=null) { document.getElementsByName("SelecAttributes")[0].options.length = 0; } </script> </select> </td> </tr> <TR> <TD>Valor: </TD> <TD><input disabled type="text" name="attValue" size=50></TD> </TR> <% if(advancedDemo) { %> <tr> <td> <input type="checkbox" name="verifCert" onclick="javascript:verifCertChange();" onkeypress="javascript:verifCertChange();">Verificar el estado de revocacion </td> <td colspan="2" > <input type="checkbox" name="noRep" disabled="true" value="false" onClick="javascript:checkChanged(document.formData.noRep);" onKeyPress="javascript:checkChanged(document.formData.noRep);"/> Registrar No Repudio <input type="checkbox" name="cache" disabled="true" value="false" onClick="javascript:checkChanged(document.formData.cache);" onKeyPress="javascript:checkChanged(document.formData.cache);"/> Usar Caches </td> </tr> <% } %> <tr> <td colspan="3">Resultado del cifrado:</td> </tr> <tr> <td colspan="2"> <textarea name="datoscifrados" cols="80" rows="5" id="datoscifrados"></textarea> </td> <td valign="bottom"> <input name="button" type="button" class=boton onClick="javascript:enviarFormularioACifrar();" value="Cifrar"> </td> </tr> <tr> <td colspan="2"> <textarea name="resultcifrado" cols="80" rows="3" id="resutlcifrado"></textarea> </td> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 66 <td valign="bottom"> <input type=button class=boton name=borrar value="Borrar" onClick="resetValues()"> </td> </tr> <tr> <td>Algoritmo asim&eacute;trico de descifrado: </td> <td colspan="2"> <select name="asiAlgorithm" id="select"></select> </td> </tr> <!-- Esta Fila de la tabla servirá para definir tb los certificados por alias (otra muy parecida) --> <tr> <td>Certificados en BD: </td> <td colspan="2"> <select name="selAlias"></select> </td> </tr> <tr> <td colspan="3">Resultado del descifrado:</td> </tr> <tr> <td colspan="2"> <textarea name="datosdescifrados" cols="80" rows="5" id="datosdescifrados"></textarea> </td> <td valign="bottom"> <input name="button" type="button" class=boton onClick="javascript:enviarFormularioADescifrar();" value="Descifrar"> </td> </tr> <tr> <td colspan="2"> <textarea name="resultdescifrado" cols="80" rows="3" id="resutldescifrado"></textarea> </td> </tr> </TABLE> <input type="hidden" name="tarjectCertificates" value=""> <input type="hidden" name="tarjectAliases" value=""> <input type="hidden" name="tarjectAttributes" value=""> <input type="hidden" name="tarjectselAlias" value=""> </form> <div id="cargando" method="post" style="top: 517px;left: 96px; position: absolute; z-index:13;visibility:hidden;"> <form name="formHidden" ENCTYPE="multipart/form-data" method="post" action=""> <input type="hidden" name="tarjectValues" value=""> <input type="hidden" name="tarjectIssuer" value=""> <input type="hidden" name="data" value=""> <input type="hidden" name="pageOperation" value=""> </form> </div> </body> </html> Título: Revisión: Fecha: Manual de integración WebSigner v 1.3 junio de 2006 67