Pega un SAMLResponse/SAMLRequest — la URL entera de un binding Redirect, el valor en base64 de un binding POST, o el XML ya decodificado — y lo decodifica y audita: firma, algoritmos, caducidad, audiencia y el patrón clásico de ataque XML Signature Wrapping (XSW). Nada sale del navegador.
Si pegas el certificado de firma del IdP (en PEM, en base64 como va en el metadata, o el metadata entero), comprueba cada firma de verdad: que lo firmado no ha cambiado (el digest) y que lo firmó la clave de ese certificado. Nunca con el certificado que viene dentro del mensaje, en KeyInfo: ese lo pone quien firma, y un atacante pone el suyo. Una firma válida no basta: además tiene que cubrir la aserción que lee tu aplicación, y eso lo mira la regla de XSW. Verifica con xmldsigjs, contrastado con respuestas firmadas por IdPs reales.
No descifra aserciones cifradas (haría falta la clave privada del proveedor de servicios, y no debería pegarse en ningún sitio), no comprueba la cadena del certificado del IdP (en SAML se confía en él por estar en el metadata, no por quién lo emitió) y no sabe qué ID lee de verdad tu aplicación: si tu código elige la aserción de otra forma, el XSW puede seguir colándose.
XML Signature Wrapping: un atacante inyecta un elemento nuevo (con el mismo ID que el original, o distinto) para que el código que valida la firma mire una cosa y el código que lee los datos mire otra. Sigue rompiendo implementaciones de SSO en producción — PortSwigger lo documentó de nuevo en 2025.