¿Cuál es la canonicalización exclusiva adecuada para XML?

Estoy usandoxmlseclibs intentar firmar un documento SOAP, pero no parece canonizar las cosas de la misma manera, dependiendo de si estoy firmando o validando.

Te voy a dar un ejemplo. Este es el XML que estoy tratando de firmar:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

Obtuve un código que funciona en PHP para firmarlo usando una combinación de clave pública y certificados de clave privada, y parecía funcionar. Agregó el<ds:Signature> elemento con todas las cosas adecuadas, y se veía genial. Pero luego lo probé tratando de validarlo inmediatamente después de firmarlo, nuevamente con xmlseclibs (y el certificado de clave pública), pero la validación falló. Entonces, la misma biblioteca de códigos está firmando y validando, pero los dos procesos no están de acuerdo por alguna razón.

Agregué un código de depuración a xmlseclibs para averiguar qué está haciendo, y me di cuenta de que la razón por la que aparece la clave de firma y la clave de validación es diferente porque canonicaliza las cosas de manera diferente en las dos situaciones. Cuando le digo que firme el<samlp:Response> elemento, esta es la forma canónica que firma (he agregado nuevas líneas aquí para facilitar la lectura):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

Sin embargo, cuando se trata de validar la firma, esta es la forma canónica que calcula para validar (nuevamente, he agregado nuevas líneas aquí):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

Como puede ver, esta versión omite elxmlns:saml atributo de la<samlp:Response> elemento, mientras que el primero no. (Tenga en cuenta que esto es diferente de laxmlns:samlp atributo, que está incluido en ambos.) Esto parece bastante claro como un error en xmlseclibs, pero no obstante, sería uno que me complacería solucionar si supiera qué forma canónica es la correcta. ¿Debe ese atributo ser omitido por la canonicalización exclusiva? ¿O debería ser incluido? ¿Cuál es la forma canónica exclusiva correcta?

Respuestas a la pregunta(2)

Su respuesta a la pregunta