public static function Utilities::validateElement in SAML SP 2.0 Single Sign On (SSO) - SAML Service Provider 8
2 calls to Utilities::validateElement()
- SAML2_Assertion::parseSignature in src/SAML2_Assertion.php
- Parse signature on assertion.
- SAML2_Response::__construct in src/SAML2_Response.php
- Constructor for SAML 2 response messages.
File
- src/Utilities.php, line 367
Class
- Utilities
- This file is part of miniOrange SAML plugin.
Namespace
Drupal\miniorange_saml
Code
public static function validateElement(DOMElement $root) {
$objXMLSecDSig = new XMLSecurityDSig();
$objXMLSecDSig->idKeys[] = 'ID';
$signatureElement = self::xpQuery($root, './ds:Signature');
if (count($signatureElement) === 0) {
return FALSE;
}
elseif (count($signatureElement) > 1) {
echo sprintf("XMLSec: more than one signature element in root.");
}
$signatureElement = $signatureElement[0];
$objXMLSecDSig->sigNode = $signatureElement;
$objXMLSecDSig
->canonicalizeSignedInfo();
if (!$objXMLSecDSig
->validateReference()) {
echo sprintf("XMLsec: digest validation failed");
exit;
}
$rootSigned = FALSE;
foreach ($objXMLSecDSig
->getValidatedNodes() as $signedNode) {
if ($signedNode
->isSameNode($root)) {
$rootSigned = TRUE;
break;
}
elseif ($root->parentNode instanceof DOMElement && $signedNode
->isSameNode($root->ownerDocument)) {
$rootSigned = TRUE;
break;
}
}
if (!$rootSigned) {
echo sprintf("XMLSec: The root element is not signed.");
exit;
}
$certificates = array();
foreach (self::xpQuery($signatureElement, './ds:KeyInfo/ds:X509Data/ds:X509Certificate') as $certNode) {
$certData = trim($certNode->textContent);
$certData = str_replace(array(
"\r",
"\n",
"\t",
' ',
), '', $certData);
$certificates[] = $certData;
}
$ret = array(
'Signature' => $objXMLSecDSig,
'Certificates' => $certificates,
);
return $ret;
}