You are here

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

XMLSecEnc

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;
  }
}