Beispiel #1
0
 /**
  * @param SAML2_EncryptedAssertion $assertion
  *
  * @return SAML2_Assertion
  */
 public function decrypt(SAML2_EncryptedAssertion $assertion)
 {
     $decryptionKeys = $this->privateKeyLoader->loadDecryptionKeys($this->identityProvider, $this->serviceProvider);
     $blacklistedKeys = $this->identityProvider->getBlacklistedAlgorithms();
     if (is_null($blacklistedKeys)) {
         $blacklistedKeys = $this->serviceProvider->getBlacklistedAlgorithms();
     }
     // reflects the simplesamlphp behaviour for BC, see
     // https://github.com/simplesamlphp/simplesamlphp/blob/3d735912342767d391297cc5e13272a76730aca0/modules/saml/lib/Message.php#L369
     foreach ($decryptionKeys as $index => $key) {
         try {
             $decryptedAssertion = $assertion->getAssertion($key, $blacklistedKeys);
             $this->logger->debug(sprintf('Decrypted Assertion with key "#%d"', $index));
             return $decryptedAssertion;
         } catch (Exception $e) {
             $this->logger->debug(sprintf('Could not decrypt assertion with key "#%d", "%s" thrown: "%s"', $index, get_class($e), $e->getMessage()));
         }
     }
     throw new SAML2_Assertion_Exception_NotDecryptedException(sprintf('Could not decrypt the assertion, tried with "%d" keys. See the debug log for more information', count($decryptionKeys)));
 }
Beispiel #2
0
 /**
  * Encrypt an assertion.
  *
  * This function takes in a SAML2_Assertion and encrypts it if encryption of
  * assertions are enabled in the metadata.
  *
  * @param SimpleSAML_Configuration $idpMetadata  The metadata of the IdP.
  * @param SimpleSAML_Configuration $spMetadata  The metadata of the SP.
  * @param SAML2_Assertion $assertion  The assertion we are encrypting.
  * @return SAML2_Assertion|SAML2_EncryptedAssertion  The assertion.
  */
 private static function encryptAssertion(SimpleSAML_Configuration $idpMetadata, SimpleSAML_Configuration $spMetadata, SAML2_Assertion $assertion)
 {
     $encryptAssertion = $spMetadata->getBoolean('assertion.encryption', NULL);
     if ($encryptAssertion === NULL) {
         $encryptAssertion = $idpMetadata->getBoolean('assertion.encryption', FALSE);
     }
     if (!$encryptAssertion) {
         /* We are _not_ encrypting this assertion, and are therefore done. */
         return $assertion;
     }
     $sharedKey = $spMetadata->getString('sharedkey', NULL);
     if ($sharedKey !== NULL) {
         $key = new XMLSecurityKey(XMLSecurityKey::AES128_CBC);
         $key->loadKey($sharedKey);
     } else {
         $keys = $spMetadata->getPublicKeys('encryption', TRUE);
         $key = $keys[0];
         switch ($key['type']) {
             case 'X509Certificate':
                 $pemKey = "-----BEGIN CERTIFICATE-----\n" . chunk_split($key['X509Certificate'], 64) . "-----END CERTIFICATE-----\n";
                 break;
             default:
                 throw new SimpleSAML_Error_Exception('Unsupported encryption key type: ' . $key['type']);
         }
         /* Extract the public key from the certificate for encryption. */
         $key = new XMLSecurityKey(XMLSecurityKey::RSA_OAEP_MGF1P, array('type' => 'public'));
         $key->loadKey($pemKey);
     }
     $ea = new SAML2_EncryptedAssertion();
     $ea->setAssertion($assertion, $key);
     return $ea;
 }
Beispiel #3
0
 /**
  * Decrypt an assertion.
  *
  * This function takes in a SAML2_Assertion and decrypts it if it is encrypted.
  * If it is unencrypted, and encryption is enabled in the metadata, an exception
  * will be throws.
  *
  * @param SimpleSAML_Configuration $srcMetadata  The metadata of the sender (IdP).
  * @param SimpleSAML_Configuration $dstMetadata  The metadata of the recipient (SP).
  * @param SAML2_Assertion|SAML2_EncryptedAssertion $assertion  The assertion we are decrypting.
  * @return SAML2_Assertion  The assertion.
  */
 private static function decryptAssertion(SimpleSAML_Configuration $srcMetadata, SimpleSAML_Configuration $dstMetadata, $assertion)
 {
     assert('$assertion instanceof SAML2_Assertion || $assertion instanceof SAML2_EncryptedAssertion');
     if ($assertion instanceof SAML2_Assertion) {
         $encryptAssertion = $srcMetadata->getBoolean('assertion.encryption', NULL);
         if ($encryptAssertion === NULL) {
             $encryptAssertion = $dstMetadata->getBoolean('assertion.encryption', FALSE);
         }
         if ($encryptAssertion) {
             /* The assertion was unencrypted, but we have encryption enabled. */
             throw new Exception('Received unencrypted assertion, but encryption was enabled.');
         }
         return $assertion;
     }
     try {
         $keys = self::getDecryptionKeys($srcMetadata, $dstMetadata);
     } catch (Exception $e) {
         throw new SimpleSAML_Error_Exception('Error decrypting assertion: ' . $e->getMessage());
     }
     $blacklist = self::getBlacklistedAlgorithms($srcMetadata, $dstMetadata);
     $lastException = NULL;
     foreach ($keys as $i => $key) {
         try {
             $ret = $assertion->getAssertion($key, $blacklist);
             SimpleSAML_Logger::debug('Decryption with key #' . $i . ' succeeded.');
             return $ret;
         } catch (Exception $e) {
             SimpleSAML_Logger::debug('Decryption with key #' . $i . ' failed with exception: ' . $e->getMessage());
             $lastException = $e;
         }
     }
     throw $lastException;
 }
Beispiel #4
0
 /**
  * Decrypt an assertion.
  *
  * This function takes in a SAML2_Assertion and decrypts it if it is encrypted.
  * If it is unencrypted, and encryption is enabled in the metadata, an exception
  * will be throws.
  *
  * @param SimpleSAML_Configuration $srcMetadata  The metadata of the sender (IdP).
  * @param SimpleSAML_Configuration $dstMetadata  The metadata of the recipient (SP).
  * @param SAML2_Assertion|SAML2_EncryptedAssertion $assertion  The assertion we are decrypting.
  * @return SAML2_Assertion  The assertion.
  */
 private static function decryptAssertion(SimpleSAML_Configuration $srcMetadata, SimpleSAML_Configuration $dstMetadata, $assertion)
 {
     assert('$assertion instanceof SAML2_Assertion || $assertion instanceof SAML2_EncryptedAssertion');
     if ($assertion instanceof SAML2_Assertion) {
         $encryptAssertion = $srcMetadata->getBoolean('assertion.encryption', NULL);
         if ($encryptAssertion === NULL) {
             $encryptAssertion = $dstMetadata->getBoolean('assertion.encryption', FALSE);
         }
         if ($encryptAssertion) {
             /* The assertion was unencrypted, but we have encryption enabled. */
             throw new Exception('Received unencrypted assertion, but encryption was enabled.');
         }
         return $assertion;
     }
     try {
         $key = self::getDecryptionKey($srcMetadata, $dstMetadata);
     } catch (Exception $e) {
         throw new SimpleSAML_Error_Exception('Error decrypting assertion: ' . $e->getMessage());
     }
     return $assertion->getAssertion($key);
 }