CC-2166: Packaging Improvements. Moved the Zend app into airtime_mvc. It is now installed to /var/www/airtime. Storage is now set to /srv/airtime/stor. Utils are now installed to /usr/lib/airtime/utils/. Added install/airtime-dircheck.php as a simple test to see if everything is install/uninstalled correctly.

This commit is contained in:
Paul Baranowski 2011-04-14 18:55:04 -04:00
parent 514777e8d2
commit b11cbd8159
4546 changed files with 138 additions and 51 deletions

View file

@ -0,0 +1,79 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Default.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Adapter_Interface
*/
require_once 'Zend/InfoCard/Adapter/Interface.php';
/**
* The default InfoCard component Adapter which serves as a pass-thru placeholder
* for developers. Initially developed to provide a callback mechanism to store and retrieve
* assertions as part of the validation process it can be used anytime callback facilities
* are necessary
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Adapter_Default implements Zend_InfoCard_Adapter_Interface
{
/**
* Store the assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The specific assertion ID
* @param array $conditions An array of claims to store associated with the assertion
* @return bool Always returns true (would return false on store failure)
*/
public function storeAssertion($assertionURI, $assertionID, $conditions)
{
return true;
}
/**
* Retrieve an assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to retrieve
* @return mixed False if the assertion ID was not found for that URI, or an array of
* conditions associated with that assertion if found (always returns false)
*/
public function retrieveAssertion($assertionURI, $assertionID)
{
return false;
}
/**
* Remove an assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to remove
* @return bool Always returns true (false on removal failure)
*/
public function removeAssertion($assertionURI, $assertionID)
{
return null;
}
}

View file

@ -0,0 +1,37 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* @see Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Adapter_Exception extends Zend_InfoCard_Exception
{
}

View file

@ -0,0 +1,64 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* The interface required by all Zend_InfoCard Adapter classes to implement. It represents
* a series of callback methods used by the component during processing of an information card
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Adapter_Interface
{
/**
* Store the assertion's claims in persistent storage
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The specific assertion ID
* @param array $conditions An array of claims to store associated with the assertion
* @return bool True on success, false on failure
*/
public function storeAssertion($assertionURI, $assertionID, $conditions);
/**
* Retrieve the claims of a given assertion from persistent storage
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to retrieve
* @return mixed False if the assertion ID was not found for that URI, or an array of
* conditions associated with that assertion if found in the same format
* provided
*/
public function retrieveAssertion($assertionURI, $assertionID);
/**
* Remove the claims of a given assertion from persistent storage
*
* @param string $asserionURI The assertion type URI
* @param string $assertionID The assertion ID to remove
* @return bool True on success, false on failure
*/
public function removeAssertion($asserionURI, $assertionID);
}

View file

@ -0,0 +1,99 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Cipher.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Provides an abstraction for encryption ciphers used in an Information Card
* implementation
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher
{
/**
* AES 256 Encryption with CBC
*/
const ENC_AES256CBC = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc';
/**
* AES 128 Encryption with CBC
*/
const ENC_AES128CBC = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc';
/**
* RSA Public Key Encryption with OAEP Padding
*/
const ENC_RSA_OAEP_MGF1P = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p';
/**
* RSA Public Key Encryption with no padding
*/
const ENC_RSA = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5';
/**
* Constructor (disabled)
*
* @return void
* @codeCoverageIgnoreStart
*/
protected function __construct()
{
}
// @codeCoverageIgnoreEnd
/**
* Returns an instance of a cipher object supported based on the URI provided
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $uri The URI of the encryption method wantde
* @return mixed an Instance of Zend_InfoCard_Cipher_Symmetric_Interface or Zend_InfoCard_Cipher_Pki_Interface
* depending on URI
*/
static public function getInstanceByURI($uri)
{
switch($uri) {
case self::ENC_AES256CBC:
include_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php';
return new Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc();
case self::ENC_AES128CBC:
include_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php';
return new Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc();
case self::ENC_RSA_OAEP_MGF1P:
include_once 'Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php';
return new Zend_InfoCard_Cipher_Pki_Adapter_Rsa(Zend_InfoCard_Cipher_Pki_Adapter_Rsa::OAEP_PADDING);
break;
case self::ENC_RSA:
include_once 'Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php';
return new Zend_InfoCard_Cipher_Pki_Adapter_Rsa(Zend_InfoCard_Cipher_Pki_Adapter_Rsa::NO_PADDING);
break;
default:
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Unknown Cipher URI");
}
}
}

View file

@ -0,0 +1,38 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Exception extends Zend_InfoCard_Exception
{
}

View file

@ -0,0 +1,88 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Pki_Interface
*/
require_once 'Zend/InfoCard/Cipher/Pki/Interface.php';
/**
* An abstract class for public-key ciphers
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Cipher_Pki_Adapter_Abstract implements Zend_InfoCard_Cipher_Pki_Interface
{
/**
* OAEP Padding public key encryption
*/
const OAEP_PADDING = 1;
/**
* No padding public key encryption
*/
const NO_PADDING = 2;
/**
* The type of padding to use
*
* @var integer one of the padding constants in this class
*/
protected $_padding;
/**
* Set the padding of the public key encryption
*
* @throws Zend_InfoCard_Cipher_Exception
* @param integer $padding One of the constnats in this class
* @return Zend_InfoCard_Pki_Adapter_Abstract
*/
public function setPadding($padding)
{
switch($padding) {
case self::OAEP_PADDING:
case self::NO_PADDING:
$this->_padding = $padding;
break;
default:
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Invalid Padding Type Provided");
break;
}
return $this;
}
/**
* Retruns the public-key padding used
*
* @return integer One of the padding constants in this class
*/
public function getPadding()
{
return $this->_padding;
}
}

View file

@ -0,0 +1,120 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Rsa.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Pki_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php';
/**
* Zend_InfoCard_Cipher_Pki_Rsa_Interface
*/
require_once 'Zend/InfoCard/Cipher/Pki/Rsa/Interface.php';
/**
* RSA Public Key Encryption Cipher Object for the InfoCard component. Relies on OpenSSL
* to implement the RSA algorithm
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Pki_Adapter_Rsa
extends Zend_InfoCard_Cipher_Pki_Adapter_Abstract
implements Zend_InfoCard_Cipher_Pki_Rsa_Interface
{
/**
* Object Constructor
*
* @param integer $padding The type of Padding to use
*/
public function __construct($padding = Zend_InfoCard_Cipher_Pki_Adapter_Abstract::NO_PADDING)
{
// Can't test this..
// @codeCoverageIgnoreStart
if(!extension_loaded('openssl')) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Use of this PKI RSA Adapter requires the openssl extension loaded");
}
// @codeCoverageIgnoreEnd
$this->setPadding($padding);
}
/**
* Decrypts RSA encrypted data using the given private key
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $privateKey The private key in binary format
* @param string $password The private key passphrase
* @param integer $padding The padding to use during decryption (of not provided object value will be used)
* @return string The decrypted data
*/
public function decrypt($encryptedData, $privateKey, $password = null, $padding = null)
{
$private_key = openssl_pkey_get_private(array($privateKey, $password));
if(!$private_key) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Failed to load private key");
}
if($padding !== null) {
try {
$this->setPadding($padding);
} catch(Exception $e) {
openssl_free_key($private_key);
throw $e;
}
}
switch($this->getPadding()) {
case self::NO_PADDING:
$openssl_padding = OPENSSL_NO_PADDING;
break;
case self::OAEP_PADDING:
$openssl_padding = OPENSSL_PKCS1_OAEP_PADDING;
break;
}
$result = openssl_private_decrypt($encryptedData, $decryptedData, $private_key, $openssl_padding);
openssl_free_key($private_key);
if(!$result) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Unable to Decrypt Value using provided private key");
}
if($this->getPadding() == self::NO_PADDING) {
$decryptedData = substr($decryptedData, 2);
$start = strpos($decryptedData, 0) + 1;
$decryptedData = substr($decryptedData, $start);
}
return $decryptedData;
}
}

View file

@ -0,0 +1,33 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Empty Interface represents a Pki cipher object
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Pki_Interface
{
}

View file

@ -0,0 +1,50 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_PKI_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php';
/**
* The interface which defines the RSA Public-key encryption object
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Pki_Rsa_Interface
{
/**
* Decrypts RSA encrypted data using the given private key
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $privateKey The private key in binary format
* @param string $password The private key passphrase
* @param integer $padding The padding to use during decryption (of not provided object value will be used)
* @return string The decrypted data
*/
public function decrypt($encryptedData, $privateKey, $password = null, $padding = Zend_InfoCard_Cipher_Pki_Adapter_Abstract::NO_PADDING);
}

View file

@ -0,0 +1,38 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Interface.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
implements Zend_InfoCard_Cipher_Symmetric_Interface
{
}

View file

@ -0,0 +1,40 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Aes128cbc.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php';
/**
* Implements AES128 with CBC encryption implemented using the mCrypt extension
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc
extends Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
{
}

View file

@ -0,0 +1,111 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Aes256cbc.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php';
/**
* Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php';
/**
* Implements AES256 with CBC encryption implemented using the mCrypt extension
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
extends Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
implements Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
/**
* The MCRYPT Cipher constant for this encryption
*/
const MCRYPT_CIPHER = MCRYPT_RIJNDAEL_128;
/**
* The MCRYPT Mode constant for this encryption
*/
const MCRYPT_MODE = MCRYPT_MODE_CBC;
/**
* The default length of the IV to use
*/
const IV_LENGTH = 16;
/**
* The object constructor
*
* @throws Zend_InfoCard_Cipher_Exception
*/
public function __construct()
{
// Can't test for this
// @codeCoverageIgnoreStart
if(!extension_loaded('mcrypt')) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Use of the AES256CBC Cipher requires the mcrypt extension");
}
// @codeCoveregIgnoreEnd
}
/**
* Decrypts data using the AES Algorithm using the mCrypt extension
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $decryptionKey The decryption key
* @param integer $iv_length The IV length to use
* @return string the decrypted data with any terminating nulls removed
*/
public function decrypt($encryptedData, $decryptionKey, $iv_length = null)
{
$iv_length = ($iv_length === null) ? self::IV_LENGTH : $iv_length;
$mcrypt_iv = null;
if($iv_length > 0) {
$mcrypt_iv = substr($encryptedData, 0, $iv_length);
$encryptedData = substr($encryptedData, $iv_length);
}
$decrypted = mcrypt_decrypt(self::MCRYPT_CIPHER, $decryptionKey, $encryptedData, self::MCRYPT_MODE, $mcrypt_iv);
if(!$decrypted) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Failed to decrypt data using AES256CBC Algorithm");
}
$decryptedLength = strlen($decrypted);
$paddingLength = substr($decrypted, $decryptedLength -1, 1);
$decrypted = substr($decrypted, 0, $decryptedLength - ord($paddingLength));
return rtrim($decrypted, "\0");
}
}

View file

@ -0,0 +1,38 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Aes128cbc_Interface
extends Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
}

View file

@ -0,0 +1,33 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
public function decrypt($encryptedData, $decryptionKey, $iv_length = null);
}

View file

@ -0,0 +1,32 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Interface
{
}

View file

@ -0,0 +1,307 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Claims.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Result value of the InfoCard component, contains any error messages and claims
* from the processing of an information card.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Claims
{
/**
* Successful validation and extraion of claims
*/
const RESULT_SUCCESS = 1;
/**
* Indicates there was an error processing the XML document
*/
const RESULT_PROCESSING_FAILURE = 2;
/**
* Indicates that the signature values within the XML document failed verification
*/
const RESULT_VALIDATION_FAILURE = 3;
/**
* The default namespace to assume in these claims
*
* @var string
*/
protected $_defaultNamespace = null;
/**
* A boolean indicating if the claims should be consider "valid" or not based on processing
*
* @var bool
*/
protected $_isValid = true;
/**
* The error message if any
*
* @var string
*/
protected $_error = "";
/**
* An array of claims taken from the information card
*
* @var array
*/
protected $_claims;
/**
* The result code of processing the information card as defined by the constants of this class
*
* @var integer
*/
protected $_code;
/**
* Override for the safeguard which ensures that you don't use claims which failed validation.
* Used in situations when there was a validation error you'd like to ignore
*
* @return Zend_InfoCard_Claims
*/
public function forceValid()
{
trigger_error("Forcing Claims to be valid although it is a security risk", E_USER_WARNING);
$this->_isValid = true;
return $this;
}
/**
* Retrieve the PPI (Private Personal Identifier) associated with the information card
*
* @return string the private personal identifier
*/
public function getCardID()
{
return $this->getClaim('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier');
}
/**
* Retrieves the default namespace used in this information card. If a default namespace was not
* set, it figures out which one to consider 'default' by taking the first namespace sorted by use-count
* in claims
*
* @throws Zend_InfoCard_Exception
* @return string The default namespace
*/
public function getDefaultNamespace()
{
if($this->_defaultNamespace === null) {
$namespaces = array();
$leader = '';
foreach($this->_claims as $claim) {
if(!isset($namespaces[$claim['namespace']])) {
$namespaces[$claim['namespace']] = 1;
} else {
$namespaces[$claim['namespace']]++;
}
if(empty($leader) || ($namespaces[$claim['namespace']] > $leader)) {
$leader = $claim['namespace'];
}
}
if(empty($leader)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Failed to determine default namespace");
}
$this->setDefaultNamespace($leader);
}
return $this->_defaultNamespace;
}
/**
* Set the default namespace, overriding any existing default
*
* @throws Zend_InfoCard_Exception
* @param string $namespace The default namespace to use
* @return Zend_InfoCard_Claims
*/
public function setDefaultNamespace($namespace)
{
foreach($this->_claims as $claim) {
if($namespace == $claim['namespace']) {
$this->_defaultNamespace = $namespace;
return $this;
}
}
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("At least one claim must exist in specified namespace to make it the default namespace");
}
/**
* Indicates if this claim object contains validated claims or not
*
* @return bool
*/
public function isValid()
{
return $this->_isValid;
}
/**
* Set the error message contained within the claims object
*
* @param string $error The error message
* @return Zend_InfoCard_Claims
*/
public function setError($error)
{
$this->_error = $error;
$this->_isValid = false;
return $this;
}
/**
* Retrieve the error message contained within the claims object
*
* @return string The error message
*/
public function getErrorMsg()
{
return $this->_error;
}
/**
* Set the claims for the claims object. Can only be set once and is done
* by the component itself. Internal use only.
*
* @throws Zend_InfoCard_Exception
* @param array $claims
* @return Zend_InfoCard_Claims
*/
public function setClaims(Array $claims)
{
if($this->_claims !== null) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
$this->_claims = $claims;
return $this;
}
/**
* Set the result code of the claims object.
*
* @throws Zend_InfoCard_Exception
* @param int $code The result code
* @return Zend_InfoCard_Claims
*/
public function setCode($code)
{
switch($code) {
case self::RESULT_PROCESSING_FAILURE:
case self::RESULT_SUCCESS:
case self::RESULT_VALIDATION_FAILURE:
$this->_code = $code;
return $this;
}
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Attempted to set unknown error code");
}
/**
* Gets the result code of the claims object
*
* @return integer The result code
*/
public function getCode()
{
return $this->_code;
}
/**
* Get a claim by providing its complete claim URI
*
* @param string $claimURI The complete claim URI to retrieve
* @return mixed The claim matching that specific URI or null if not found
*/
public function getClaim($claimURI)
{
if($this->claimExists($claimURI)) {
return $this->_claims[$claimURI]['value'];
}
return null;
}
/**
* Indicates if a specific claim URI exists or not within the object
*
* @param string $claimURI The complete claim URI to check
* @return bool true if the claim exists, false if not found
*/
public function claimExists($claimURI)
{
return isset($this->_claims[$claimURI]);
}
/**
* Magic helper function
* @throws Zend_InfoCard_Exception
*/
public function __unset($k)
{
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
/**
* Magic helper function
*/
public function __isset($k)
{
return $this->claimExists("{$this->getDefaultNamespace()}/$k");
}
/**
* Magic helper function
*/
public function __get($k)
{
return $this->getClaim("{$this->getDefaultNamespace()}/$k");
}
/**
* Magic helper function
* @throws Zend_InfoCard_Exception
*/
public function __set($k, $v)
{
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
}

View file

@ -0,0 +1,43 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
if (class_exists("Zend_Exception")) {
abstract class Zend_InfoCard_Exception_Abstract extends Zend_Exception
{
}
} else {
abstract class Zend_InfoCard_Exception_Abstract extends Exception
{
}
}
/**
* Base Exception class for the InfoCard component
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Exception extends Zend_InfoCard_Exception_Abstract
{
}

View file

@ -0,0 +1,88 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Assertion.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Assertion_Interface
*/
require_once 'Zend/InfoCard/Xml/Assertion/Interface.php';
/**
* Factory object to retrieve an Assertion object based on the type of XML document provided
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
final class Zend_InfoCard_Xml_Assertion
{
/**
* The namespace for a SAML-formatted Assertion document
*/
const TYPE_SAML = 'urn:oasis:names:tc:SAML:1.0:assertion';
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of a InfoCard Assertion object based on the XML data provided
*
* @throws Zend_InfoCard_Xml_Exception
* @param string $xmlData The XML-Formatted Assertion
* @return Zend_InfoCard_Xml_Assertion_Interface
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
$namespaces = $sxe->getDocNameSpaces();
foreach($namespaces as $namespace) {
switch($namespace) {
case self::TYPE_SAML:
include_once 'Zend/InfoCard/Xml/Assertion/Saml.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_Assertion_Saml', null);
}
}
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Unable to determine Assertion type by Namespace");
}
}

View file

@ -0,0 +1,69 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* The Interface required by any InfoCard Assertion Object implemented within the component
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Assertion_Interface
{
/**
* Get the Assertion ID of the assertion
*
* @return string The Assertion ID
*/
public function getAssertionID();
/**
* Return an array of attributes (claims) contained within the assertion
*
* @return array An array of attributes / claims within the assertion
*/
public function getAttributes();
/**
* Get the Assertion URI for this type of Assertion
*
* @return string the Assertion URI
*/
public function getAssertionURI();
/**
* Return an array of conditions which the assertions are predicated on
*
* @return array an array of conditions
*/
public function getConditions();
/**
* Validate the conditions array returned from the getConditions() call
*
* @param array $conditions An array of condtions for the assertion taken from getConditions()
* @return mixed Boolean true on success, an array of condition, error message on failure
*/
public function validateConditions(Array $conditions);
}

View file

@ -0,0 +1,284 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Saml.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_Assertion_Interface
*/
require_once 'Zend/InfoCard/Xml/Assertion/Interface.php';
/**
* A Xml Assertion Document in SAML Token format
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Assertion_Saml
extends Zend_InfoCard_Xml_Element
implements Zend_InfoCard_Xml_Assertion_Interface
{
/**
* Audience Restriction Condition
*/
const CONDITION_AUDIENCE = 'AudienceRestrictionCondition';
/**
* The URI for a 'bearer' confirmation
*/
const CONFIRMATION_BEARER = 'urn:oasis:names:tc:SAML:1.0:cm:bearer';
/**
* The amount of time in seconds to buffer when checking conditions to ensure
* that differences between client/server clocks don't interfer too much
*/
const CONDITION_TIME_ADJ = 3600; // +- 5 minutes
protected function _getServerName() {
return $_SERVER['SERVER_NAME'];
}
protected function _getServerPort() {
return $_SERVER['SERVER_PORT'];
}
/**
* Validate the conditions array returned from the getConditions() call
*
* @param array $conditions An array of condtions for the assertion taken from getConditions()
* @return mixed Boolean true on success, an array of condition, error message on failure
*/
public function validateConditions(Array $conditions)
{
$currentTime = time();
if(!empty($conditions)) {
foreach($conditions as $condition => $conditionValue) {
switch(strtolower($condition)) {
case 'audiencerestrictioncondition':
$serverName = $this->_getServerName();
$serverPort = $this->_getServerPort();
$self_aliases[] = $serverName;
$self_aliases[] = "{{$serverName}:{$serverPort}";
$found = false;
if(is_array($conditionValue)) {
foreach($conditionValue as $audience) {
list(,,$audience) = explode('/', $audience);
if(in_array($audience, $self_aliases)) {
$found = true;
break;
}
}
}
if(!$found) {
return array($condition, 'Could not find self in allowed audience list');
}
break;
case 'notbefore':
$notbeforetime = strtotime($conditionValue);
if($currentTime < $notbeforetime) {
if($currentTime + self::CONDITION_TIME_ADJ < $notbeforetime) {
return array($condition, 'Current time is before specified window');
}
}
break;
case 'notonorafter':
$notonoraftertime = strtotime($conditionValue);
if($currentTime >= $notonoraftertime) {
if($currentTime - self::CONDITION_TIME_ADJ >= $notonoraftertime) {
return array($condition, 'Current time is after specified window');
}
}
break;
}
}
}
return true;
}
/**
* Get the Assertion URI for this type of Assertion
*
* @return string the Assertion URI
*/
public function getAssertionURI()
{
return Zend_InfoCard_Xml_Assertion::TYPE_SAML;
}
/**
* Get the Major Version of the SAML Assertion
*
* @return integer The major version number
*/
public function getMajorVersion()
{
return (int)(string)$this['MajorVersion'];
}
/**
* The Minor Version of the SAML Assertion
*
* @return integer The minor version number
*/
public function getMinorVersion()
{
return (int)(string)$this['MinorVersion'];
}
/**
* Get the Assertion ID of the assertion
*
* @return string The Assertion ID
*/
public function getAssertionID()
{
return (string)$this['AssertionID'];
}
/**
* Get the Issuer URI of the assertion
*
* @return string the URI of the assertion Issuer
*/
public function getIssuer()
{
return (string)$this['Issuer'];
}
/**
* Get the Timestamp of when the assertion was issued
*
* @return integer a UNIX timestamp representing when the assertion was issued
*/
public function getIssuedTimestamp()
{
return strtotime((string)$this['IssueInstant']);
}
/**
* Return an array of conditions which the assertions are predicated on
*
* @throws Zend_InfoCard_Xml_Exception
* @return array an array of conditions
*/
public function getConditions()
{
list($conditions) = $this->xpath("//saml:Conditions");
if(!($conditions instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the saml:Conditions block");
}
$retval = array();
foreach($conditions->children('urn:oasis:names:tc:SAML:1.0:assertion') as $key => $value) {
switch($key) {
case self::CONDITION_AUDIENCE:
foreach($value->children('urn:oasis:names:tc:SAML:1.0:assertion') as $audience_key => $audience_value) {
if($audience_key == 'Audience') {
$retval[$key][] = (string)$audience_value;
}
}
break;
}
}
$retval['NotBefore'] = (string)$conditions['NotBefore'];
$retval['NotOnOrAfter'] = (string)$conditions['NotOnOrAfter'];
return $retval;
}
/**
* Get they KeyInfo element for the Subject KeyInfo block
*
* @todo Not Yet Implemented
* @ignore
*/
public function getSubjectKeyInfo()
{
/**
* @todo Not sure if this is part of the scope for now..
*/
if($this->getConfirmationMethod() == self::CONFIRMATION_BEARER) {
throw new Zend_InfoCard_Xml_Exception("Cannot get Subject Key Info when Confirmation Method was Bearer");
}
}
/**
* Return the Confirmation Method URI used in the Assertion
*
* @return string The confirmation method URI
*/
public function getConfirmationMethod()
{
list($confirmation) = $this->xPath("//saml:ConfirmationMethod");
return (string)$confirmation;
}
/**
* Return an array of attributes (claims) contained within the assertion
*
* @return array An array of attributes / claims within the assertion
*/
public function getAttributes()
{
$attributes = $this->xPath('//saml:Attribute');
$retval = array();
foreach($attributes as $key => $value) {
$retkey = (string)$value['AttributeNamespace'].'/'.(string)$value['AttributeName'];
$retval[$retkey]['name'] = (string)$value['AttributeName'];
$retval[$retkey]['namespace'] = (string)$value['AttributeNamespace'];
list($aValue) = $value->children('urn:oasis:names:tc:SAML:1.0:assertion');
$retval[$retkey]['value'] = (string)$aValue;
}
return $retval;
}
}

View file

@ -0,0 +1,107 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Element.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element_Interface
*/
require_once 'Zend/InfoCard/Xml/Element/Interface.php';
/**
* An abstract class representing a an XML data block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_Element
extends SimpleXMLElement
implements Zend_InfoCard_Xml_Element_Interface
{
/**
* Convert the object to a string by displaying its XML content
*
* @return string an XML representation of the object
*/
public function __toString()
{
return $this->asXML();
}
/**
* Converts an XML Element object into a DOM object
*
* @throws Zend_InfoCard_Xml_Exception
* @param Zend_InfoCard_Xml_Element $e The object to convert
* @return DOMElement A DOMElement representation of the same object
*/
static public function convertToDOM(Zend_InfoCard_Xml_Element $e)
{
$dom = dom_import_simplexml($e);
if(!($dom instanceof DOMElement)) {
// Zend_InfoCard_Xml_Element exntes SimpleXMLElement, so this should *never* fail
// @codeCoverageIgnoreStart
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Failed to convert between SimpleXML and DOM");
// @codeCoverageIgnoreEnd
}
return $dom;
}
/**
* Converts a DOMElement object into the specific class
*
* @throws Zend_InfoCard_Xml_Exception
* @param DOMElement $e The DOMElement object to convert
* @param string $classname The name of the class to convert it to (must inhert from Zend_InfoCard_Xml_Element)
* @return Zend_InfoCard_Xml_Element a Xml Element object from the DOM element
*/
static public function convertToObject(DOMElement $e, $classname)
{
if (!class_exists($classname)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($classname);
}
$reflection = new ReflectionClass($classname);
if(!$reflection->isSubclassOf('Zend_InfoCard_Xml_Element')) {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("DOM element must be converted to an instance of Zend_InfoCard_Xml_Element");
}
$sxe = simplexml_import_dom($e, $classname);
if(!($sxe instanceof Zend_InfoCard_Xml_Element)) {
// Since we just checked to see if this was a subclass of Zend_infoCard_Xml_Element this shoudl never fail
// @codeCoverageIgnoreStart
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Failed to convert between DOM and SimpleXML");
// @codeCoverageIgnoreEnd
}
return $sxe;
}
}

View file

@ -0,0 +1,44 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* The Interface used to represent an XML Data Type
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Element_Interface
{
/**
* Return the data within the object as an XML document
*/
public function asXML();
/**
* Magic function which allows us to treat the object as a string to return XML
* (same as the asXML() method)
*/
public function __toString();
}

View file

@ -0,0 +1,75 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EncryptedData.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* A factory class for producing Zend_InfoCard_Xml_EncryptedData objects based on
* the type of XML document provided
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
final class Zend_InfoCard_Xml_EncryptedData
{
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of the class
*
* @param string $xmlData The XML EncryptedData String
* @return Zend_InfoCard_Xml_EncryptedData_Abstract
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
switch($sxe['Type']) {
case 'http://www.w3.org/2001/04/xmlenc#Element':
include_once 'Zend/InfoCard/Xml/EncryptedData/XmlEnc.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_EncryptedData_XmlEnc');
default:
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Unknown EncryptedData type found");
break;
}
}
}

View file

@ -0,0 +1,92 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_KeyInfo
*/
require_once 'Zend/InfoCard/Xml/KeyInfo.php';
/**
* An abstract class representing a generic EncryptedData XML block. This class is extended
* into a specific type of EncryptedData XML block (i.e. XmlEnc) as necessary
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_EncryptedData_Abstract extends Zend_InfoCard_Xml_Element
{
/**
* Returns the KeyInfo Block
*
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
*/
public function getKeyInfo()
{
return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo[0]);
}
/**
* Return the Encryption method used to encrypt the assertion document
* (the symmetric cipher)
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The URI of the Symmetric Encryption Method used
*/
public function getEncryptionMethod()
{
/**
* @todo This is pretty hacky unless we can always be confident that the first
* EncryptionMethod block is the correct one (the AES or compariable symetric algorithm)..
* the second is the PK method if provided.
*/
list($encryption_method) = $this->xpath("//enc:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:EncryptionMethod symmetric encryption block");
}
$dom = self::convertToDOM($encryption_method);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the value of the encrypted block
*
* @return string the value of the encrypted CipherValue block
*/
abstract function getCipherValue();
}

View file

@ -0,0 +1,64 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlEnc.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_EncryptedData/Abstract.php
*/
require_once 'Zend/InfoCard/Xml/EncryptedData/Abstract.php';
/**
* An XmlEnc formatted EncryptedData XML block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_EncryptedData_XmlEnc extends Zend_InfoCard_Xml_EncryptedData_Abstract
{
/**
* Returns the Encrypted CipherValue block from the EncryptedData XML document
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The value of the CipherValue block base64 encoded
*/
public function getCipherValue()
{
$this->registerXPathNamespace('enc', 'http://www.w3.org/2001/04/xmlenc#');
list(,$cipherdata) = $this->xpath("//enc:CipherData");
if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:CipherData block");
}
list(,$ciphervalue) = $cipherdata->xpath("//enc:CipherValue");
if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block");
}
return (string)$ciphervalue;
}
}

View file

@ -0,0 +1,174 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EncryptedKey.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_EncryptedKey
*/
require_once 'Zend/InfoCard/Xml/EncryptedKey.php';
/**
* Zend_InfoCard_Xml_KeyInfo_Interface
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Interface.php';
/**
* An object representing an Xml EncryptedKEy block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_EncryptedKey
extends Zend_InfoCard_Xml_Element
implements Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Return an instance of the object based on input XML Data
*
* @throws Zend_InfoCard_Xml_Exception
* @param string $xmlData The EncryptedKey XML Block
* @return Zend_InfoCard_Xml_EncryptedKey
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
if($sxe->getName() != "EncryptedKey") {
throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for EncryptedKey");
}
return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_EncryptedKey");
}
/**
* Returns the Encyption Method Algorithm URI of the block
*
* @throws Zend_InfoCard_Xml_Exception
* @return string the Encryption method algorithm URI
*/
public function getEncryptionMethod()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryption_method) = $this->xpath("//e:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block");
}
$dom = self::convertToDOM($encryption_method);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the Digest Method Algorithm URI used
*
* @throws Zend_InfoCard_Xml_Exception
* @return string the Digest Method Algorithm URI
*/
public function getDigestMethod()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryption_method) = $this->xpath("//e:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block");
}
if(!($encryption_method->DigestMethod instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the DigestMethod block");
}
$dom = self::convertToDOM($encryption_method->DigestMethod);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the digest algorithm for the symmetric Keyinfo");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the KeyInfo block object
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
*/
public function getKeyInfo()
{
if(isset($this->KeyInfo)) {
return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo);
}
throw new Zend_InfoCard_Xml_Exception("Unable to locate a KeyInfo block");
}
/**
* Return the encrypted value of the block in base64 format
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The Value of the CipherValue block in base64 format
*/
public function getCipherValue()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($cipherdata) = $this->xpath("//e:CipherData");
if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:CipherData block");
}
$cipherdata->registerXPathNameSpace('enc', 'http://www.w3.org/2001/04/xmlenc#');
list($ciphervalue) = $cipherdata->xpath("//enc:CipherValue");
if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block");
}
return (string)$ciphervalue;
}
}

View file

@ -0,0 +1,37 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Exception extends Zend_InfoCard_Exception
{
}

View file

@ -0,0 +1,90 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: KeyInfo.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Factory class to return a XML KeyInfo block based on input XML
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo
{
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of KeyInfo object based on the input KeyInfo XML block
*
* @param string $xmlData The KeyInfo XML Block
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
$namespaces = $sxe->getDocNameSpaces();
if(!empty($namespaces)) {
foreach($sxe->getDocNameSpaces() as $namespace) {
switch($namespace) {
case 'http://www.w3.org/2000/09/xmldsig#':
include_once 'Zend/InfoCard/Xml/KeyInfo/XmlDSig.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_XmlDSig');
default:
throw new Zend_InfoCard_Xml_Exception("Unknown KeyInfo Namespace provided");
// We are ignoring these lines, as XDebug reports each as a "non executed" line
// which breaks my coverage %
// @codeCoverageIgnoreStart
}
}
}
// @codeCoverageIgnoreEnd
include_once 'Zend/InfoCard/Xml/KeyInfo/Default.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_Default');
}
}

View file

@ -0,0 +1,37 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_KeyInfo_Abstract extends Zend_InfoCard_Xml_Element
{
}

View file

@ -0,0 +1,64 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Default.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_KeyInfo_Abstract
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Abstract.php';
/**
* Zend_InfoCard_Xml_SecurityTokenReference
*/
require_once 'Zend/InfoCard/Xml/SecurityTokenReference.php';
/**
* An object representation of a XML <KeyInfo> block which doesn't provide a namespace
* In this context, it is assumed to mean that it is the type of KeyInfo block which
* contains the SecurityTokenReference
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo_Default extends Zend_InfoCard_Xml_KeyInfo_Abstract
{
/**
* Returns the object representation of the SecurityTokenReference block
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_SecurityTokenReference
*/
public function getSecurityTokenReference()
{
$this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
list($sectokenref) = $this->xpath('//o:SecurityTokenReference');
if(!($sectokenref instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception('Could not locate the Security Token Reference');
}
return Zend_InfoCard_Xml_SecurityTokenReference::getInstance($sectokenref);
}
}

View file

@ -0,0 +1,38 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Return an object representing a KeyInfo data type
*
* @return Zend_InfoCard_Xml_KeyInfo
*/
public function getKeyInfo();
}

View file

@ -0,0 +1,76 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlDSig.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_KeyInfo_Abstract
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Abstract.php';
/**
* Zend_InfoCard_Xml_EncryptedKey
*/
require_once 'Zend/InfoCard/Xml/EncryptedKey.php';
/**
* Zend_InfoCard_Xml_KeyInfo_Interface
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Interface.php';
/**
* Represents a Xml Digital Signature XML Data Block
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo_XmlDSig
extends Zend_InfoCard_Xml_KeyInfo_Abstract
implements Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Returns an instance of the EncryptedKey Data Block
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_EncryptedKey
*/
public function getEncryptedKey()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryptedkey) = $this->xpath('//e:EncryptedKey');
if(!($encryptedkey instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Failed to retrieve encrypted key");
}
return Zend_InfoCard_Xml_EncryptedKey::getInstance($encryptedkey);
}
/**
* Returns the KeyInfo Block within the encrypted key
*
* @return Zend_InfoCard_Xml_KeyInfo_Default
*/
public function getKeyInfo()
{
return $this->getEncryptedKey()->getKeyInfo();
}
}

View file

@ -0,0 +1,305 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Security.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Security_Transform
*/
require_once 'Zend/InfoCard/Xml/Security/Transform.php';
/**
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security
{
/**
* ASN.1 type INTEGER class
*/
const ASN_TYPE_INTEGER = 0x02;
/**
* ASN.1 type BIT STRING class
*/
const ASN_TYPE_BITSTRING = 0x03;
/**
* ASN.1 type SEQUENCE class
*/
const ASN_TYPE_SEQUENCE = 0x30;
/**
* The URI for Canonical Method C14N Exclusive
*/
const CANONICAL_METHOD_C14N_EXC = 'http://www.w3.org/2001/10/xml-exc-c14n#';
/**
* The URI for Signature Method SHA1
*/
const SIGNATURE_METHOD_SHA1 = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1';
/**
* The URI for Digest Method SHA1
*/
const DIGEST_METHOD_SHA1 = 'http://www.w3.org/2000/09/xmldsig#sha1';
/**
* The Identifier for RSA Keys
*/
const RSA_KEY_IDENTIFIER = '300D06092A864886F70D0101010500';
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Validates the signature of a provided XML block
*
* @param string $strXMLInput An XML block containing a Signature
* @return bool True if the signature validated, false otherwise
* @throws Zend_InfoCard_Xml_Security_Exception
*/
static public function validateXMLSignature($strXMLInput)
{
if(!extension_loaded('openssl')) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("You must have the openssl extension installed to use this class");
}
$sxe = simplexml_load_string($strXMLInput);
if(!isset($sxe->Signature)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Could not identify XML Signature element");
}
if(!isset($sxe->Signature->SignedInfo)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignedInfo block");
}
if(!isset($sxe->Signature->SignatureValue)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignatureValue block");
}
if(!isset($sxe->Signature->KeyInfo)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyInfo block");
}
if(!isset($sxe->Signature->KeyInfo->KeyValue)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyValue block");
}
switch((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']) {
case self::CANONICAL_METHOD_C14N_EXC:
$cMethod = (string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported CanonicalizationMethod Requested");
break;
}
switch((string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']) {
case self::SIGNATURE_METHOD_SHA1:
$sMethod = (string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported SignatureMethod Requested");
break;
}
switch((string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']) {
case self::DIGEST_METHOD_SHA1:
$dMethod = (string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported DigestMethod Requested");
break;
}
$base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>=');
if ($base64DecodeSupportsStrictParam) {
$dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue, true);
} else {
$dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue);
}
if ($base64DecodeSupportsStrictParam) {
$signatureValue = base64_decode((string)$sxe->Signature->SignatureValue, true);
} else {
$signatureValue = base64_decode((string)$sxe->Signature->SignatureValue);
}
$transformer = new Zend_InfoCard_Xml_Security_Transform();
foreach($sxe->Signature->SignedInfo->Reference->Transforms->children() as $transform) {
$transformer->addTransform((string)$transform['Algorithm']);
}
$transformed_xml = $transformer->applyTransforms($strXMLInput);
$transformed_xml_binhash = pack("H*", sha1($transformed_xml));
if($transformed_xml_binhash != $dValue) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Locally Transformed XML does not match XML Document. Cannot Verify Signature");
}
$public_key = null;
switch(true) {
case isset($sxe->Signature->KeyInfo->KeyValue->X509Certificate):
$certificate = (string)$sxe->Signature->KeyInfo->KeyValue->X509Certificate;
$pem = "-----BEGIN CERTIFICATE-----\n" .
wordwrap($certificate, 64, "\n", true) .
"\n-----END CERTIFICATE-----";
$public_key = openssl_pkey_get_public($pem);
if(!$public_key) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unable to extract and prcoess X509 Certificate from KeyValue");
}
break;
case isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue):
if(!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus) ||
!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("RSA Key Value not in Modulus/Exponent form");
}
$modulus = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus);
$exponent = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent);
$pem_public_key = self::_getPublicKeyFromModExp($modulus, $exponent);
$public_key = openssl_pkey_get_public ($pem_public_key);
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unable to determine or unsupported representation of the KeyValue block");
}
$transformer = new Zend_InfoCard_Xml_Security_Transform();
$transformer->addTransform((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']);
// The way we are doing our XML processing requires that we specifically add this
// (even though it's in the <Signature> parent-block).. otherwise, our canonical form
// fails signature verification
$sxe->Signature->SignedInfo->addAttribute('xmlns', 'http://www.w3.org/2000/09/xmldsig#');
$canonical_signedinfo = $transformer->applyTransforms($sxe->Signature->SignedInfo->asXML());
if(@openssl_verify($canonical_signedinfo, $signatureValue, $public_key)) {
return (string)$sxe->Signature->SignedInfo->Reference['URI'];
}
return false;
}
/**
* Transform an RSA Key in Modulus/Exponent format into a PEM encoding and
* return an openssl resource for it
*
* @param string $modulus The RSA Modulus in binary format
* @param string $exponent The RSA exponent in binary format
* @return string The PEM encoded version of the key
*/
static protected function _getPublicKeyFromModExp($modulus, $exponent)
{
$modulusInteger = self::_encodeValue($modulus, self::ASN_TYPE_INTEGER);
$exponentInteger = self::_encodeValue($exponent, self::ASN_TYPE_INTEGER);
$modExpSequence = self::_encodeValue($modulusInteger . $exponentInteger, self::ASN_TYPE_SEQUENCE);
$modExpBitString = self::_encodeValue($modExpSequence, self::ASN_TYPE_BITSTRING);
$binRsaKeyIdentifier = pack( "H*", self::RSA_KEY_IDENTIFIER );
$publicKeySequence = self::_encodeValue($binRsaKeyIdentifier . $modExpBitString, self::ASN_TYPE_SEQUENCE);
$publicKeyInfoBase64 = base64_encode( $publicKeySequence );
$publicKeyString = "-----BEGIN PUBLIC KEY-----\n";
$publicKeyString .= wordwrap($publicKeyInfoBase64, 64, "\n", true);
$publicKeyString .= "\n-----END PUBLIC KEY-----\n";
return $publicKeyString;
}
/**
* Encode a limited set of data types into ASN.1 encoding format
* which is used in X.509 certificates
*
* @param string $data The data to encode
* @param const $type The encoding format constant
* @return string The encoded value
* @throws Zend_InfoCard_Xml_Security_Exception
*/
static protected function _encodeValue($data, $type)
{
// Null pad some data when we get it (integer values > 128 and bitstrings)
if( (($type == self::ASN_TYPE_INTEGER) && (ord($data) > 0x7f)) ||
($type == self::ASN_TYPE_BITSTRING)) {
$data = "\0$data";
}
$len = strlen($data);
// encode the value based on length of the string
// I'm fairly confident that this is by no means a complete implementation
// but it is enough for our purposes
switch(true) {
case ($len < 128):
return sprintf("%c%c%s", $type, $len, $data);
case ($len < 0x0100):
return sprintf("%c%c%c%s", $type, 0x81, $len, $data);
case ($len < 0x010000):
return sprintf("%c%c%c%c%s", $type, 0x82, $len / 0x0100, $len % 0x0100, $data);
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Could not encode value");
}
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Invalid code path");
}
}

View file

@ -0,0 +1,37 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Exception
*/
require_once 'Zend/InfoCard/Xml/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Exception extends Zend_InfoCard_Xml_Exception
{
}

View file

@ -0,0 +1,116 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Transform.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* A class to create a transform rule set based on XML URIs and then apply those rules
* in the correct order to a given XML input
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform
{
/**
* A list of transforms to apply
*
* @var array
*/
protected $_transformList = array();
/**
* Returns the name of the transform class based on a given URI
*
* @throws Zend_InfoCard_Xml_Security_Exception
* @param string $uri The transform URI
* @return string The transform implementation class name
*/
protected function _findClassbyURI($uri)
{
switch($uri) {
case 'http://www.w3.org/2000/09/xmldsig#enveloped-signature':
return 'Zend_InfoCard_Xml_Security_Transform_EnvelopedSignature';
case 'http://www.w3.org/2001/10/xml-exc-c14n#':
return 'Zend_InfoCard_Xml_Security_Transform_XmlExcC14N';
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or Unsupported Transformation Requested");
}
}
/**
* Add a Transform URI to the list of transforms to perform
*
* @param string $uri The Transform URI
* @return Zend_InfoCard_Xml_Security_Transform
*/
public function addTransform($uri)
{
$class = $this->_findClassbyURI($uri);
$this->_transformList[] = array('uri' => $uri,
'class' => $class);
return $this;
}
/**
* Return the list of transforms to perform
*
* @return array The list of transforms
*/
public function getTransformList()
{
return $this->_transformList;
}
/**
* Apply the transforms in the transform list to the input XML document
*
* @param string $strXmlDocument The input XML
* @return string The XML after the transformations have been applied
*/
public function applyTransforms($strXmlDocument)
{
foreach($this->_transformList as $transform) {
if (!class_exists($transform['class'])) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($transform['class']);
}
$transformer = new $transform['class'];
// We can't really test this check because it would require logic changes in the component itself
// @codeCoverageIgnoreStart
if(!($transformer instanceof Zend_InfoCard_Xml_Security_Transform_Interface)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Transforms must implement the Transform Interface");
}
// @codeCoverageIgnoreEnd
$strXmlDocument = $transformer->transform($strXmlDocument);
}
return $strXmlDocument;
}
}

View file

@ -0,0 +1,60 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EnvelopedSignature.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Security_Transform_Interface
*/
require_once 'Zend/InfoCard/Xml/Security/Transform/Interface.php';
/**
* A object implementing the EnvelopedSignature XML Transform
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_EnvelopedSignature
implements Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transforms the XML Document according to the EnvelopedSignature Transform
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXMLData The input XML data
* @return string the transformed XML data
*/
public function transform($strXMLData)
{
$sxe = simplexml_load_string($strXMLData);
if(!$sxe->Signature) {
require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php';
throw new Zend_InfoCard_Xml_Security_Transform_Exception("Unable to locate Signature Block for EnvelopedSignature Transform");
}
unset($sxe->Signature);
return $sxe->asXML();
}
}

View file

@ -0,0 +1,37 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Security_Exception
*/
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_Exception extends Zend_InfoCard_Xml_Security_Exception
{
}

View file

@ -0,0 +1,43 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Interface for XML Security Transforms
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transform the given XML string according to the transform rules
* implemented by the object using this interface
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXmlData the input XML
* @return string the output XML
*/
public function transform($strXmlData);
}

View file

@ -0,0 +1,59 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlExcC14N.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Security_Transform_Interface
*/
require_once 'Zend/InfoCard/Xml/Security/Transform/Interface.php';
/**
* A Transform to perform C14n XML Exclusive Canonicalization
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_XmlExcC14N
implements Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transform the input XML based on C14n XML Exclusive Canonicalization rules
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXMLData The input XML
* @return string The output XML
*/
public function transform($strXMLData)
{
$dom = new DOMDocument();
$dom->loadXML($strXMLData);
if(method_exists($dom, 'C14N')) {
return $dom->C14N(true, false);
}
require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php';
throw new Zend_InfoCard_Xml_Security_Transform_Exception("This transform requires the C14N() method to exist in the DOM extension");
}
}

View file

@ -0,0 +1,173 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: SecurityTokenReference.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Represents a SecurityTokenReference XML block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_SecurityTokenReference extends Zend_InfoCard_Xml_Element
{
/**
* Base64 Binary Encoding URI
*/
const ENCODING_BASE64BIN = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
/**
* Return an instance of the object based on the input XML
*
* @param string $xmlData The SecurityTokenReference XML Block
* @return Zend_InfoCard_Xml_SecurityTokenReference
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
if($sxe->getName() != "SecurityTokenReference") {
throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for SecurityTokenReference");
}
return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_SecurityTokenReference");
}
/**
* Return the Key Identifier XML Object
*
* @return Zend_InfoCard_Xml_Element
* @throws Zend_InfoCard_Xml_Exception
*/
protected function _getKeyIdentifier()
{
$this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
list($keyident) = $this->xpath('//o:KeyIdentifier');
if(!($keyident instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Failed to retrieve Key Identifier");
}
return $keyident;
}
/**
* Return the Key URI identifying the thumbprint type used
*
* @return string The thumbprint type URI
* @throws Zend_InfoCard_Xml_Exception
*/
public function getKeyThumbprintType()
{
$keyident = $this->_getKeyIdentifier();
$dom = self::convertToDOM($keyident);
if(!$dom->hasAttribute('ValueType')) {
throw new Zend_InfoCard_Xml_Exception("Key Identifier did not provide a type for the value");
}
return $dom->getAttribute('ValueType');
}
/**
* Return the thumbprint encoding type used as a URI
*
* @return string the URI of the thumbprint encoding used
* @throws Zend_InfoCard_Xml_Exception
*/
public function getKeyThumbprintEncodingType()
{
$keyident = $this->_getKeyIdentifier();
$dom = self::convertToDOM($keyident);
if(!$dom->hasAttribute('EncodingType')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the encoding type for the key identifier");
}
return $dom->getAttribute('EncodingType');
}
/**
* Get the key reference data used to identify the public key
*
* @param bool $decode if true, will return a decoded version of the key
* @return string the key reference thumbprint, either in binary or encoded form
* @throws Zend_InfoCard_Xml_Exception
*/
public function getKeyReference($decode = true)
{
$keyIdentifier = $this->_getKeyIdentifier();
$dom = self::convertToDOM($keyIdentifier);
$encoded = $dom->nodeValue;
if(empty($encoded)) {
throw new Zend_InfoCard_Xml_Exception("Could not find the Key Reference Encoded Value");
}
if($decode) {
$decoded = "";
switch($this->getKeyThumbprintEncodingType()) {
case self::ENCODING_BASE64BIN:
if(version_compare(PHP_VERSION, "5.2.0", ">=")) {
$decoded = base64_decode($encoded, true);
} else {
$decoded = base64_decode($encoded);
}
break;
default:
throw new Zend_InfoCard_Xml_Exception("Unknown Key Reference Encoding Type: {$this->getKeyThumbprintEncodingType()}");
}
if(!$decoded || empty($decoded)) {
throw new Zend_InfoCard_Xml_Exception("Failed to decode key reference");
}
return $decoded;
}
return $encoded;
}
}