xmlseclibs 4.0.0
PHP 8.0+ and phpseclib/phpseclib ~3.0 required; OpenSSL is optional.
Highlights
- Crypto moved to phpseclib (symmetric, RSA, RSA-OAEP, X.509); RSA-PSS (
RSA_SHA256_MGF1) supported - Safe-by-default
verifyDocument()— pinned key, algorithm allowlists, validated node set enableLegacyMode()for temporary pre-4.0 interop while migrating peers- Compact templates via
stripWhitespace;omit_urifor references without a URI; extensibility via protected members (#152)
Security (breaking defaults)
- DOCTYPE rejected on signature verify (entity-ref / Id bypass; same class of issue as CVE-2025-23369); also rejected in decrypted XML
- XPath Filtering Transforms rejected on verify by default (pre-auth DoS); capped when enabled
- RSA-1.5 key transport denied on decrypt by default; uniform decrypt errors (no padding oracle)
verify()always binds SignatureMethod to the supplied key; HMAC cannot be loaded from certs/PEM- References fail closed (unknown transforms, external/duplicate-Id URIs, unknown C14N)
- SSRF hardening on
add509Cert()URL fetch; EncryptedKey/RetrievalMethod depth caps;hash_equalsfor digests/HMAC
Other
- Configurable transforms element;
setSignatureId(); clearer throws when signature context is missing - Interop: whitespace-stripped signature/EncryptedData templates for C# SignedXml / Python signxml-style peers
- PHP 8 / static-analysis hardening; PHP 8.5 deprecation fix in
makeAsnSegment()
Migration
Prefer verifyDocument() with a pinned key. Use enableLegacyMode() only while updating peers — it restores DOCTYPE-on-verify, XPath transforms, and RSA-1.5; it does not undo algorithm/key binding, uniform decrypt errors, or decrypted-XML DOCTYPE rejection. Prefer RSA-OAEP and AES-GCM for new deployments.
Full detail: CHANGELOG.txt (4.0.0) and the “Breaking changes (3.1 → 4.0)” section in README.md.
Full Changelog: 3.1.5...4.0.0