- Mitigate the xmlseclibs advisories published in August 2026 (GHSA-7mf5-fjj8-mvjc, GHSA-39hg-wfcm-v4wv, GHSA-7h47-29x2-r2gc, GHSA-m5mw-mr39-66vp, GHSA-w5f2-cpgp-pg76, GHSA-7hf8-fh6v-wmm6, GHSA-9wcx-p7hr-f935) while keeping the bundled xmlseclibs 3.x, as xmlseclibs 4.x requires PHP 8
- Validate received Signatures before xmlseclibs processes them: no DOCTYPE, a single SignedInfo, CanonicalizationMethod, SignatureMethod, Reference, DigestValue and SignatureValue, only the Transforms and canonicalization algorithms used by SAML (XPath Transforms were evaluated before any cryptographic check), a Reference URI that identifies exactly one element of the same document and no RetrievalMethod/EncryptedKey in the KeyInfo
- Reject unsupported SigAlg values on the HTTP-Redirect binding also when several IdP signing certificates are configured
- OneLogin_Saml2_Utils::castKey keeps the X.509 certificate of the key
- Validate received encrypted elements before decrypting them: supported data and accepted key transport algorithms, and no nested EncryptedKey/RetrievalMethod references (they were followed without limit, exhausting the memory)
- Add the 'allowRSA15KeyTransport' security setting (true by default) to reject rsa-1_5 key transport
- Add the $allowRSA15KeyTransport parameter (true by default) to OneLogin_Saml2_LogoutRequest::getNameIdData() and OneLogin_Saml2_LogoutRequest::getNameId()
- Encrypted NameIDs are now always generated with rsa-oaep-mgf1p key transport (rsa-1_5 was used)
- Report every decryption failure with the same error (OneLogin_Saml2_ValidationError::DECRYPTION_FAILED) and replace invalid encrypted keys by a deterministic key (RFC 3218), with the same work whatever the padding of the encrypted key
- In strict mode, verify the signature of a signed Response with an EncryptedAssertion before decrypting it, and with 'wantMessagesSigned' do not decrypt an unsigned one (if it is not signed or the signature is invalid the assertion is not decrypted and isValid() reports the cause, so OneLogin_Saml2_Auth::processResponse() keeps reporting an invalid_response instead of raising an exception). The EncryptedID of a LogoutRequest is decrypted after its signature is verified, applying the new setting
- Load XML documents with LIBXML_NONET
- Fix the decryption of an EncryptedID inside an EncryptedAssertion (it failed with an algorithm mismatch, and on PHP 5 because of a scalar type declaration)
- Reject decrypted EncryptedID content that is not an element (a text node made OneLogin_Saml2_LogoutRequest::getNameIdData fail with a fatal error)
- Do not raise the E_DEPRECATED notices of mcrypt (deprecated as of PHP 7.1), used by the bundled xmlseclibs for the block ciphers: error handlers that convert them to exceptions made every encryption and decryption fail
- Remove PHP 5.3 and 5.4 from CI
- Use strict === and !== at string comparison
- OneLogin_Saml2_Utils::getSelfPort now returns an integer (null if the port is not valid)
- When the protocol (from setSelfProtocol or $_SERVER['HTTP_X_FORWARDED_PROTO']) is an array, now the first value is used by OneLogin_Saml2_Utils::getSelfProtocol (true is https, and a value that is not a string is http)
- Fix OneLogin_Saml2_Utils::validateSign when the signature has no certificate and the IdP is identified by fingerprint (the fingerprint of the missing certificate was calculated, raising a failed assertion warning)
- Added clarification on reverse-proxy scenario (Path Prefix)
- #648 Fix empty responseUrl bypassing SLO URL fallback
- #649 Update error message for missing InResponseTo
- #637 Fix incorrect @phpstan-return annotation on processSLO method (it returns null when it processes a Logout Response or an invalid Logout Request)
- Fix bug on setSchemasPath method from OneLogin_Saml2_Auth class (the path was not passed to the settings, so it was not used). Also see #635
- #631 Allow to require Destination: add the 'requireDestination' security setting (false by default) to reject SAMLResponses without a Destination attribute
- Add OneLogin_Saml2_Auth::getLastErrorException() and the getErrorException() method to OneLogin_Saml2_Response, OneLogin_Saml2_LogoutRequest and OneLogin_Saml2_LogoutResponse: they return the Exception of the last validation error, whose code identifies the error (getLastErrorReason() and getError() still return its message)
- Fix tests that passed without executing their assertions and Test the redirections without $stay with a PHP built-in web server