public function XMLSecEnc::encryptNode in SAML SP 2.0 Single Sign On (SSO) - SAML Service Provider 7
Encrypt the selected node with the given key.
Parameters
XMLSecurityKey $objKey The encryption key and algorithm.:
bool $replace Whether the encrypted node should be replaced in the original tree. Default is true.:
Return value
DOMElement The <xenc:EncryptedData>-element.
Throws
Exception
1 call to XMLSecEnc::encryptNode()
- XMLSecEnc::encryptReferences in includes/
XMLSecurityKey.php
File
- includes/
XMLSecurityKey.php, line 1930
Class
Code
public function encryptNode($objKey, $replace = true) {
$data = '';
if (empty($this->rawNode)) {
throw new Exception('Node to encrypt has not been set');
}
if (!$objKey instanceof XMLSecurityKey) {
throw new Exception('Invalid Key');
}
$doc = $this->rawNode->ownerDocument;
$xPath = new DOMXPath($this->encdoc);
$objList = $xPath
->query('/xenc:EncryptedData/xenc:CipherData/xenc:CipherValue');
$cipherValue = $objList
->item(0);
if ($cipherValue == null) {
throw new Exception('Error locating CipherValue element within template');
}
switch ($this->type) {
case self::Element:
$data = $doc
->saveXML($this->rawNode);
$this->encdoc->documentElement
->setAttribute('Type', self::Element);
break;
case self::Content:
$children = $this->rawNode->childNodes;
foreach ($children as $child) {
$data .= $doc
->saveXML($child);
}
$this->encdoc->documentElement
->setAttribute('Type', self::Content);
break;
default:
throw new Exception('Type is currently not supported');
}
$encMethod = $this->encdoc->documentElement
->appendChild($this->encdoc
->createElementNS(self::XMLENCNS, 'xenc:EncryptionMethod'));
$encMethod
->setAttribute('Algorithm', $objKey
->getAlgorithm());
$cipherValue->parentNode->parentNode
->insertBefore($encMethod, $cipherValue->parentNode->parentNode->firstChild);
$strEncrypt = base64_encode($objKey
->encryptData($data));
$value = $this->encdoc
->createTextNode($strEncrypt);
$cipherValue
->appendChild($value);
if ($replace) {
switch ($this->type) {
case self::Element:
if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) {
return $this->encdoc;
}
$importEnc = $this->rawNode->ownerDocument
->importNode($this->encdoc->documentElement, true);
$this->rawNode->parentNode
->replaceChild($importEnc, $this->rawNode);
return $importEnc;
case self::Content:
$importEnc = $this->rawNode->ownerDocument
->importNode($this->encdoc->documentElement, true);
while ($this->rawNode->firstChild) {
$this->rawNode
->removeChild($this->rawNode->firstChild);
}
$this->rawNode
->appendChild($importEnc);
return $importEnc;
}
}
else {
return $this->encdoc->documentElement;
}
}