W3C

Nota del Traductor:

Esta traducción fue hecha por Oscar Manrique Andrade y se terminó el 19 de Enero del 2004. Es la primera edición de la traducción del documento XML-Signature XPath Filter 2.0. El documento de Errata asociado a esta recomendación (http://www.w3.org/2002/11/xpath-filter2-errata.html) está vacío a la fecha, por lo cual su traducción no se ha incluido. Los documentos originales del W3C son la única referencia oficial válida y normativa. El presente documento puede contener errores debido a su traducción.
Los términos "node-set" y "namespace" no se han traducido ya que tienen un significado específico definido dentro del contexto de este documento. Igualmente no se han traducido términos como "union", "intersection", "substraction", "here" cuando el contexto se refiere a valores de atributos o funciones específicas que exigen sean en inglés.

Firma XML del Filtro XPath 2.0

W3C Recomendación 08 Noviembre de 2002

Esta versión:
http://www.w3.org/TR/2002/REC-xmldsig-filter2-20021108/
Ultima versión:
http://www.w3.org/TR/xmldsig-filter2/
Versión anterior:
http://www.w3.org/TR/2002/PR-xmldsig-filter2-20020827/
Autores/Editores:
John Boyer, PureEdge Solutions Inc., <jboyer@PureEdge.com>
Merlin Hughes, Baltimore Technologies Ltd., <merlin@baltimore.ie>
Joseph Reagle, W3C, <reagle@w3.org>
Traductor:
Oscar Manrique Andrade, <MEGAtrans@uk2.net>

Favor mirar la fe de errata de este documento, que puede incluir correcciones normativas Ver también traducciones.


Resumen

La Firma XML [XML-DSig] recomienda un procedimiento estándar para especificar el contenido de la información que se va a firmar digitalmente y para establecer las tales firmas que resulten en XML. Algunas aplicaciones exigen la capacidad de definir parte de un documento XML específico como el contenido que se va a autenticar. La especificación de la Firma XML usa la transformada XPath para cumplir con este requisito. Sin embargo, con la tecnología que existe actualmente, una implementación eficiente de esta transformada puede ser difícil. Esta especificación define una nueva transformada de Firma XML para facilitar el desarrollo de implementaciones eficientes de documentos parciales que pueden interactuar bajo perfiles similares de operación.

Estado de este Documento

Este documento es la Firma XML del Filtro XPath 2.0 producido por W3C Recomendación. Este documento ha sido revisado por miembros de W3C y otras partes interesadas y ha sido aprobado por el Director como una Recomendación de W3C. Este es un documento estable y puede ser usado como material de referencia o ser citado como una referencia normativa desde otro documento. El rol de W3C en la creación de la Recomendación es llamar la atención sobre esta especificación y promover su amplio despliegue, con el fin de aumentar la riqueza funcional de la Web y su interoperabilidad.

Esta especificación fue creada por los grupos IETF/W3C Grupo de Trabajo de la Firma XML (W3C Activity Statement) quienes creen que la especificación es suficiente para la creación de implementaciones ínter operables independientes como se ha demostrado en el Informe de Interoperabilidad.

Los detalles de la Patente para esta especificación se pueden ver en la página Web del Grupo de Trabajo detalles de patente, de acuerdo con políticas de W3C, y en la Página de Aviso de Derechos de Propiedad Intelectual del IETF, de acuerdo con políticas de IETF. No existen declaraciones específicas a este documento al momento de su publicación.

Favor reportar errores en este documento a w3c-ietf-xmldsig@w3.org (archivo)

La lista de los errores identificados en esta especificación está disponible en http://www.w3.org/2002/11/xpath-filter2-errata.

La versión en inglés de esta especificación es la única versión normativa. La información sobre traducciones de este documento (si existen) está disponible en http://www.w3.org/2002/06/xmlbase-translations.

En http://www.w3.org/TR/ se puede encontrar una lista actualizada de Informes Técnicos de W3C.

Tabla de Contenido

  1. Introducción
    1. Agradecimientos
  2. Terminología
  3. Especificación de la Firma de la Transformada del Filtro
    1. Identificador del Algoritmo
    2. Sintaxis de la Firma de la Transformada del Filtro
    3. Entrada y evaluación contextual de la Firma de la Transformada del Filtro
    4. Modelo de procesamiento de la Firma de la Transformada del Filtro
  4. Ejemplos de Firma de la Transformada del Filtro
  5. Referencias

1 Introducción

La Recomendación XML [XML] especifica la sintaxis de una clase de objetos llamada documentos XML. La Recomendación de Namespaces en XML [XML-NS] especifica sintaxis y semántica adicionales para documentos XML. La Recomendación de Firma XML [XML-DSig] define métodos estándar para especificar el contenido de la información que va a ser firmada digitalmente, lo que incluye la capacidad de seleccionar parte de un documento XML que se va a firmar utilizando una Transformada XPath.

Esta especificación describe una nueva firma de la Transformada del filtro que, al igual que XPath transform [XML-DSig, sección 6.6.3], proporciona un método para calcular una porción del documento que se va a firmar. Para simplificar la creación de implementaciones eficientes, la arquitectura de esta transformada no se basa en la evaluación de una expresión [XPath] por cada nodo del árbol de análisis de XML (de acuerdo a lo definido en el modelo de datos de [XPath]). En cambio, se usa una secuencia de expresiones XPath para seleccionar las raíces de los documentos subárboles — en el lenguaje de [XPointer], conjuntos de ubicación— que se combinan usando las operaciones de conjuntos intersección, substracción y unión para ser luego utilizados en el filtro del node-set de entrada. Las diferencias principales con la transformada XPath son:

Tal como en la transformada XPath original, el propósito principal de esta transformada es asegurar que solamente cambios definidos específicamente al documento de entrada XML sean permitidos luego de haberse estampado la firma. Esto se puede obtener excluyendo exactamente aquellos nodos a los que se les permite cambiar una vez estampada la firma, incluyendo también en la salida, todos los otros nodos de entrada. El creador de la firma de la transformada del filtro es responsable de asegurar que no se excluyan nodos que pudiesen afectar la interpretación de la salida de la transformada en el contexto de la aplicación.

Considere el escenario donde una aplicación desea estampar dos firmas auto-contenidas en el documento; cualquier cambio adicional en el documento tiene que causar que la firma quede sin validez. Cuando la aplicación crea la primera firma, ésta queda automáticamente omitida de sus propias operaciones internas. Sin embargo, también será necesario excluir el elemento firma subsiguiente (segunda) de las operaciones internas de la primera firma. Esta especificación se puede usar para satisfacer eficientemente este requisito utilizando la operación substracción de conjuntos.

Esta transformada también incluye la capacidad de especificar un conjunto de nodos que se incluirán en una firma, excluyendo todos los nodos no especificados. Esta característica es útil para separar una porción de un documento, tal como un capítulo o la carga útil en un mensaje de protocolo y se puede expresar utilizando la operación intersección de conjuntos.

Se necesita un buen conocimiento de la primera Firma XML XPath Transform [XML-DSig, sección 6.6.3].

1.1. Agradecimientos (Informativo)

Las siguientes personas proporcionaron información valiosa que mejoró la calidad de esta especificación:

2. Terminología

Las palabras clave "DEBE" (MUST, SHALL), "NO DEBE" (MUST NOT, SHALL NOT), "DEBERIA" (SHOULD), "NO DEBERIA" (SHOULD NOT), "RECOMENDADO" (RECOMMENDED), "REQUERIDO" (REQUIRED), "PUEDE" (MAY), y "OPCIONAL" (OPTIONAL) en este documento deben ser interpretados como está descrito en RFC 2119 [Palabras clave].

La Recomendación XPath 1.0 [XPath] define el término node-set como "una colección de nodos sin organización y sin duplicados" y define un modelo de datos para representar un documento XML de entrada como un conjunto de nodos de varios tipos (elemento, atributo, namespace, texto, comentario, instrucciones de ejecución, y raíz).

Un documento de entrada es el documento que contiene todos los nodos disponibles para ser procesados por esta transformada. Un documento parcial es una porción de un documento XML definido por un node-ser de XPath, que puede no incluir todos los nodos del documento. Por ejemplo, el node-set de entrada es una colección de nodos XPath del documento de entrada que se pasa como parámetro a esta transformada. Un subárbol con raíz en un nodo específico es un documento parcial que contiene el nodo dado y todos los nodos que tienen tal nodo como su ascendente. Extender un Subárbol es el proceso de extender un node-set hasta incluir todos subárboles que tienen raíz en cualquier nodo en el node-set. Por ejemplo, la extensión del subárbol de un node-set que consiste de un solo nodo elemento sería un node-set que contiene ese elemento, sus nodos atributo, namespace, y todos sus descendientes con sus respectivos nodos atributo y nodos namespace.

La Recomendación Firma XML [XML-DSig] define una referencia como una secuencia de pasos que se ejecutan para obtener una cadena octal a ser firmada digitalmente. Una transformada es un algoritmo específico que se usa como un paso en el modelo de ejecución de la referencia. Una transformada toma una cadena octal o node-set de XPath como entrada y produce una salida similar (cadena octal o node-set de XPath) (el modelo de ejecución de la referencia convierte automáticamente la salida final en una cadena octal si se trata de un node-set de XPath)

3. Especificación de la Firma de la Transformada del Filtro

La transformada funciona calculando un node-set que se usa para filtrar el node-set de entrada: El node-set de salida consiste solamente en aquellos nodos comunes en los node-sets de entrada y del filtro. En otras palabras, el node-set de salida es la intersección del node-set de entrada con el node-set calculado del filtro.

El node-set del filtro se calcula evaluando una secuencia de expresiones XPath y combinando sus resultados. Inicialmente, un node-set se calcula incluyendo todo el documento de entrada. Seguidamente, se evaluá cada expresión XPath en secuencia, subárbol-extendido, lo que luego se utiliza para trasformar el node-set del filtro según una operación de conjuntos determinada: intersección, substracción o unión. Luego de que todos los XPaths han sido procesados, el node-set resultante se usa como el node-set del filtro.

3.1 Identificador del Algoritmo

La Recomendación de la Firma XML [XML-DSig] utiliza un [URI] para identificar cada algoritmo que se ejecuta al momento de crear o validar una firma. La firma de la transformada del filtro se identifica así:

Identificador del Algoritmo
http://www.w3.org/2002/06/xmldsig-filter2

3.2 Sintaxis de la Firma de la Transformada del Filtro

La firma de la transformada del filtro se representará por una secuencia de uno o más elementos llamados XPath. XPath contiene datos de tipo alfanumérico que definen una expresión XPath. El XPath contiene un atributo llamado Filter cuyos valores permitidos son intersect, subtract, y union. Cuando se calcula el node-set del filtro, el atributo Filter indica la operación de conjunto que se ejecuta con el node-set resultado. A continuación se muestra un ejemplo de codificación para una firma de filtro que rubrica el node-set de entrada completo a excepción de los elementos con identificador foo y bar (y todos los nodos que tienen como ascendente uno de estos elementos):

   <XPath Filter="subtract"
    xmlns="http://www.w3.org/2002/06/xmldsig-filter2">
      id("foo bar")
   </XPath>
   Definición del Esquema:  

   <?xml version="1.0" encoding="utf-8"?>
   <!DOCTYPE schema
    PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
   [
     <!ATTLIST schema
       xmlns:xf CDATA #FIXED 'http://www.w3.org/2002/06/xmldsig-filter2'>
     <!ENTITY xf 'http://www.w3.org/2002/06/xmldsig-filter2'>
     <!ENTITY % p ''>
     <!ENTITY % s ''>
    ]>

   <schema xmlns="http://www.w3.org/2001/XMLSchema"
           xmlns:xf="http://www.w3.org/2002/06/xmldsig-filter2"
           targetNamespace="http://www.w3.org/2002/06/xmldsig-filter2"
           version="0.1" elementFormDefault="qualified">

   <element name="XPath"
            type="xf:XPathType"/>

   <complexType name="XPathType">
    <simpleContent>
      <extension base="string">
        <attribute name="Filter">
           <simpleType>
             <restriction base="string">
               <enumeration value="intersect"/>
               <enumeration value="subtract"/>
               <enumeration value="union"/>
             </restriction>
           </simpleType>
        </attribute>
      </extension>
    </simpleContent>
   </complexType>

   </schema>
   DTD:
   <!ELEMENT XPath    (#PCDATA) >
   <!ATTLIST XPath
      Filter         (intersect|subtract|union) #REQUIRED >

3.3 Entrada y Contexto de Evaluación de la Firma de la Transformada del Filtro

La entrada requerida por esta transformada es un node-set XPath sobre la base del documento de entrada. Si el documento de entrada es una cadena octal, la aplicación DEBE convertir la cadena octal a un node-set XPath que contenga todos los nodos del documento (incluyendo los nodos comentario) El contexto de evaluación para la expresión XPath en la transformada de filtro será:

La función here() se define como sigue:

Función: node-set here()

La función here() devuelve un node-set que contiene el atributo o nodo instrucción de ejecución o el elemento paterno del nodo texto que conlleva directamente la expresión XPath. En la transformada, este será el elemento XPath. Esta expresión genera un error si la expresión XPath que la contiene no se encuentra en el mismo documento XML, sobre el cual se está evaluando la expresión XPath.

3.4 Modelo de procesamiento de la Firma de la transformada del Filtro

Utilizando el contexto de evaluación mencionado anteriormente, la firma de la transformada del filtro evalúa la expresión XPath que aparece en el contexto de elementos XPath y los utiliza para calcular un node-set de filtro F, el cual se usa para filtrar el node-set de entrada I el que genera un node-set de salida O:

En este modelo de ejecución se describe detalladamente la conversión de una interpretación de subárbol de la expresión XPath a un node-set que contiene todos los nodos que deben ser utilizados durante la operación de conjunto, además del resultado final de tal operación. Los usuarios de este modelo, TIENEN QUE notar que es posible calcular el resultado efectivo de esta operación en un solo paso, a través del documento de entrada sin necesidad de expandir los subárboles ni cualquier operación de conjuntos.

Los usuarios de este modelo, PUEDEN adicionalmente observar que si a esta transformada le sigue una operación canónica (p.e., [XML-C14N]), el cálculo del filtro descrito se puede mezclar eficientemente con el proceso de la operación canónica del orden del documento.

4. Ejemplos de Firma de la Transformada del Filtro

El siguiente ejemplo muestra una manera de crear una firma auto-contenida dentro de la firma de la transformada del filtro. La función here() identifica el elemento XPath, y en la ubicación siguiente se obtiene el elemento Signature del ascendente más cercano. Debido al valor subtract del atributo Filter, la salida de la firma de la transformada del filtro es un node-set que contiene todos los nodos del node-set de entrada exceptuando los nodos en el subárbol con raíz en el elemento Signature que contiene aquí el ejemplo de firma de la transformada del filtro.

   <XPath Filter="subtract"
    xmlns="http://www.w3.org/2002/06/xmldsig-filter2"
    xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
      here()/ancestor::dsig:Signature[1]
   </XPath>

Una firma de referencia URI apta para ser utilizada en este filtro de substracción sería URI="" (Todo el documento firma, sin los comentarios), URI="#xpointer(/)" (Todo el documento firma, con los comentarios) o cualquier referencia al mismo documento, que incluya la propia firma.

Un ejemplo de un filtro de intersección es una firma que comparte autenticidad con otra firma. En este ejemplo, un elemento Signature identificado por PrimaryBorrowSig debe ser firmado. La expresión XPath obtiene el nodo del elemento, y la transformada extiende el node-set de salida para abarcar todos los nodos del node-set de entrada que también se encuentran en el subárbol con raíz en el nodo del elemento.

   <XPath Filter="intersect"
    xmlns="http://www.w3.org/2002/06/xmldsig-filter2">
      id("PrimaryBorrowerSig")
   </XPath>

Este tipo de filtro de intersección es útil para firmar eficientemente porciones de un documento, ya se trate del mismo documento de la firma o un documento externo. Por ejemplo, si la referencia URI de la firma es URI="document.xml", el documento será automáticamente analizado y solamente serán firmados el documento identificado y sus descendientes.

Los filtros de unión, por si solos no son de uso particular: El node-set del filtro inicial consiste en el documento de entrada completo, cualquier unión con éste, no tendrá ningún efecto, así que la salida de la transformada será idéntica a la entrada. Para permitir eliminar un subárbol, la operación unión pretende seguir una operación substracción, con excepción del subárbol más bajo, el cual se incluye en la salida.

Considérese el documento siguiente, que tiene una referencia a una firma auto-contenida en el mismo documento con un filtro XPath que incluye tres operaciones XPath:

   <Document>
     <ToBeSigned>
       <!-- comment -->
       <Data />
       <NotToBeSigned>
         <ReallyToBeSigned>
           <!-- comment -->
           <Data />
         </ReallyToBeSigned>
       </NotToBeSigned>
     </ToBeSigned>
     <ToBeSigned>
       <Data />
       <NotToBeSigned>
         <Data />
       </NotToBeSigned>
     </ToBeSigned>
     <dsig:Signature
      xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
      xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2">
       <dsig:SignedInfo>
         ...
         <dsig:Reference URI="">
           <dsig:Transforms>
             <dsig:Transform 
              Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
               <dsig-xpath:XPath Filter="intersect"> //ToBeSigned </dsig-xpath:XPath>
               <dsig-xpath:XPath Filter="subtract"> //NotToBeSigned </dsig-xpath:XPath>
               <dsig-xpath:XPath Filter="union"> //ReallyToBeSigned </dsig-xpath:XPath>
             </dsig:Transform>
           </dsig:Transforms>
           ...
         </dsig:Reference>
       </dsig:SignedInfo>
       ...
     </dsig:Signature>
   </Document>

La operación intersección calcula la intersección de los subárboles seleccionados por XPath con el node-set del filtro. En este caso, el node-set del filtro contiene inicialmente todo el documento de entrada, y la expresión XPath se evalúa con los dos elementos ToBeSigned; los cuales se extienden para incluir todos sus descendientes y luego intersecados con el node-set del filtro, lo cual produce lo siguiente:

     <ToBeSigned>
       <!-- comment -->
       <Data />
       <NotToBeSigned>
         <ReallyToBeSigned>
           <!-- comment -->
           <Data />
         </ReallyToBeSigned>
       </NotToBeSigned>
     </ToBeSigned><ToBeSigned>
       <Data />
       <NotToBeSigned>
         <Data />
       </NotToBeSigned>
     </ToBeSigned>

El filtro substracción calcula la intersección de los subárboles seleccionados por XPath del node-set del filtro. En este caso, la expresión XPath se evaluá con los dos elementos NotToBeSigned; los cuales se extienden para incluir todos sus descendientes, los que luego se substraen del node-set del filtro:

   <ToBeSigned>
       <!-- comment -->
       <Data />
       
     </ToBeSigned><ToBeSigned>
       <Data />
      
   </ToBeSigned>

Seguidamente, el filtro unión calcula la unión de los subárboles seleccionados por XPath con el node-set del filtro. En este caso, la expresión XPath se evaluá con los dos elementos ReallyToBeSigned; los cuales se extienden para incluir todos sus descendientes, los que luego se adicionan al node-set del filtro:

   <ToBeSigned>
       <!-- comment -->
       <Data />
       <ReallyToBeSigned>
           <!-- comment -->
           <Data />
         </ReallyToBeSigned>
     </ToBeSigned><ToBeSigned>
       <Data />
      
   </ToBeSigned>

Finalmente, este node-set resultante se usa para transformar el node-set de entrada. En este ejemplo, el node-set de entrada es el documento completo, sin los comentarios. Por consiguiente, el node-set transformado incluirá todos aquellos nodos del documento de entrada, menos los comentarios, que también existen en el node-set del filtro.

   <ToBeSigned>
       
       <Data />
       <ReallyToBeSigned>
           
           <Data />
         </ReallyToBeSigned>
     </ToBeSigned><ToBeSigned>
       <Data />
      
   </ToBeSigned>

Nótese que el resultado no incluye ningún nodo que no pertenecía al node-set de entrada. Aunque el node-set del filtro incluye comentarios, éstos no existían en el node-set de entrada, por lo que no están incluidos en el node-set de salida.

Esta firma de filtro no estipula ninguna capacidad adicional comparada con la transformada XPath original. Por ejemplo, esta referencia podría ser copiada usando la transformada XPath, de la forma siguiente:

   <dsig:Reference URI="">
     <dsig:Transforms>
       <dsig:Transform 
        Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
         <dsig:XPath>
           (ancestor-or-self::ToBeSigned and
            not (ancestor-or-self::NotToBeSigned))
           or ancestor-or-self::ReallyToBeSigned
         </dsig:XPath>
       </dsig:Transform>
     </dsig:Transforms>
     ...
   </dsig:Reference>

La ventaja de la firma de la transformada del filtro sobre la transformada XPath es que esta última necesita evaluar una expresión que puede ser potencialmente compleja para cada nodo en el conjunto de entrada, lo cual se ha demostrado en muchas operaciones, ser costoso en la práctica. El filtro de esta especificación requiere la evaluación de expresiones XPath simples y luego la ejecución de unas operaciones de conjuntos básicas o su equivalente, las que pueden ser implementadas mucho más eficientemente.

5. Referencias

Palabras clave
RFC 2119: Palabras claves para usar en RFCs que indican Niveles de Requisitos. S. Bradner. Best Current Practice, March 1997.
http://www.ietf.org/rfc/rfc2119.txt
URI
RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax. T. Berners-Lee, R. Fielding, and L. Masinter. Standards Track, August 1998.
http://www.ietf.org/rfc/rfc2396.txt
XML
Extensible Markup Language (XML) 1.0 (Segunda Edición). T. Bray, E. Maler, J. Paoli, and C. M. Sperberg-McQueen. Recomendación W3C , Octubre 2000.
http://www.w3.org/TR/2000/REC-xml-20001006 .
XML-C14N
Canonical XML. J. Boyer. W3C Recommendation, March 2001.
http://www.w3.org/TR/2001/REC-xml-c14n-20010315
http://www.ietf.org/rfc/rfc3076.txt
XML DSig
XML-Signature Syntax and Processing. D. Eastlake, J. Reagle, and D. Solo. W3C Recommendation, February 2002.
http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/
XML-NS
Namespaces en X ML. T. Bray, D. Hollander, and A. Layman. W3C Recommendation, January 1999.
http://www.w3.org/TR/1999/REC-xml-names-19990114/
XPath
XML Path Language (XPath) Version 1.0. J. Clark, and S. DeRose. W3C Recommendation, November 1999.
http://www.w3.org/TR/1999/REC-xpath-19991116
XPointer
XML Pointer Language (XPointer). S. DeRose, R. Daniel, and E. Maler. W3C Candidate Recommendation, January 2001.
http://www.w3.org/TR/2001/CR-xptr-20010911/