You are here

private function SAML2_Assertion::addEncryptedAttributeStatement in SAML SP 2.0 Single Sign On (SSO) - SAML Service Provider 8

Add an EncryptedAttribute Statement-node to the assertion.

Parameters

DOMElement $root The assertion element we should add the Encrypted Attribute Statement to.:

1 call to SAML2_Assertion::addEncryptedAttributeStatement()
SAML2_Assertion::toXML in src/SAML2_Assertion.php
Convert this assertion to an XML element.

File

src/SAML2_Assertion.php, line 817

Class

SAML2_Assertion

Namespace

Drupal\miniorange_saml

Code

private function addEncryptedAttributeStatement(DOMElement $root) {
  if ($this->requiredEncAttributes == FALSE) {
    return;
  }
  $document = $root->ownerDocument;
  $attributeStatement = $document
    ->createElementNS('urn:oasis:names:tc:SAML:2.0:assertion', 'saml:AttributeStatement');
  $root
    ->appendChild($attributeStatement);
  foreach ($this->attributes as $name => $values) {
    $document2 = new DOMDocument();
    $attribute = $document2
      ->createElementNS('urn:oasis:names:tc:SAML:2.0:assertion', 'saml:Attribute');
    $attribute
      ->setAttribute('Name', $name);
    $document2
      ->appendChild($attribute);
    if ($this->nameFormat !== 'urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified') {
      $attribute
        ->setAttribute('NameFormat', $this->nameFormat);
    }
    foreach ($values as $value) {
      if (is_string($value)) {
        $type = 'xs:string';
      }
      elseif (is_int($value)) {
        $type = 'xs:integer';
      }
      else {
        $type = NULL;
      }
      $attributeValue = $document2
        ->createElementNS('urn:oasis:names:tc:SAML:2.0:assertion', 'saml:AttributeValue');
      $attribute
        ->appendChild($attributeValue);
      if ($type !== NULL) {
        $attributeValue
          ->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xsi:type', $type);
      }
      if ($value instanceof DOMNodeList) {
        for ($i = 0; $i < $value->length; $i++) {
          $node = $document2
            ->importNode($value
            ->item($i), TRUE);
          $attributeValue
            ->appendChild($node);
        }
      }
      else {
        $attributeValue
          ->appendChild($document2
          ->createTextNode($value));
      }
    }

    /*Once the attribute nodes are built, the are encrypted*/
    $EncAssert = new XMLSecEnc();
    $EncAssert
      ->setNode($document2->documentElement);
    $EncAssert->type = 'http://www.w3.org/2001/04/xmlenc#Element';

    /*
     * Attributes are encrypted with a session key and this one with
     * $EncryptionKey
     */
    $symmetricKey = new XMLSecurityKey(XMLSecurityKey::AES256_CBC);
    $symmetricKey
      ->generateSessionKey();
    $EncAssert
      ->encryptKey($this->encryptionKey, $symmetricKey);
    $EncrNode = $EncAssert
      ->encryptNode($symmetricKey);
    $EncAttribute = $document
      ->createElementNS('urn:oasis:names:tc:SAML:2.0:assertion', 'saml:EncryptedAttribute');
    $attributeStatement
      ->appendChild($EncAttribute);
    $n = $document
      ->importNode($EncrNode, TRUE);
    $EncAttribute
      ->appendChild($n);
  }
}