Source for file DiffieHellman.php

Documentation is available at DiffieHellman.php

  1. <?php
  2. /**
  3.  * OpenID_Association_DiffieHellman
  4.  * 
  5.  * PHP Version 5.2.0+
  6.  * 
  7.  * @category  Auth
  8.  * @package   OpenID
  9.  * @author    Bill Shupp <hostmaster@shupp.org>
  10.  * @copyright 2009 Bill Shupp
  11.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  12.  * @link      http://pearopenid.googlecode.com
  13.  */
  14.  
  15. require_once 'Crypt/DiffieHellman.php';
  16. require_once 'OpenID/Association/Exception.php';
  17. require_once 'OpenID/Message.php';
  18.  
  19. /**
  20.  * OpenID_Association_DiffieHellman
  21.  * 
  22.  * Segregates the DiffieHellman specific parts of an association request.  This is
  23.  * aimed at folks that don't want to use DH for associations.
  24.  * 
  25.  * @category  Auth
  26.  * @package   OpenID
  27.  * @author    Bill Shupp <hostmaster@shupp.org>
  28.  * @copyright 2009 Bill Shupp
  29.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  30.  * @link      http://pearopenid.googlecode.com
  31.  */
  32. {
  33.     /**
  34.      * DiffieHellman specific constants
  35.      */
  36.     const DH_DEFAULT_MODULUS '155172898181473697471232257763715539915724801966915404479707795314057629378541917580651227423698188993727816152646631438561595825688188889951272158842675419950341258706556549803580104870537681476726513255747040765857479291291572334510643245094715007229621094194349783925984760375594985848253359305585439638443';
  37.  
  38.     const DH_DEFAULT_GENERATOR '2';
  39.  
  40.     /**
  41.      * The OpenID_Message being used in the request
  42.      * 
  43.      * @var OpenID_Message 
  44.      */
  45.     protected $message = null;
  46.  
  47.     /**
  48.      * The instance of Crypt_DiffieHellman.  May be passed into the constructor if
  49.      * you want to use custom keys.
  50.      * 
  51.      * @var Crypt_DiffieHellman 
  52.      */
  53.     protected $cdh = null;
  54.  
  55.     /**
  56.      * Whether or not the sharedSecretKey has been computed or not
  57.      * 
  58.      * @see getSharedSecretKey()
  59.      * @var int 
  60.      */
  61.     protected $sharedKeyComputed = 0;
  62.  
  63.     /**
  64.      * Sets the instance of OpenID_Message being used, and also an optional
  65.      * instance of Crypt_DiffieHellman
  66.      * 
  67.      * @param OpenID_Message      $message The request OpenID_Message
  68.      * @param Crypt_DiffieHellman $cdh     Optional instance of Crypt_DiffieHellman
  69.      * 
  70.      * @return void 
  71.      */
  72.     public function __construct(OpenID_Message $message$cdh null)
  73.     {
  74.         $this->message = $message;
  75.         if ($cdh instanceof Crypt_DiffieHellman{
  76.             $this->cdh = $cdh;
  77.         }
  78.     }
  79.  
  80.     /**
  81.      * Initialize the diffie-hellman parameters for the association request.
  82.      * 
  83.      * @return void 
  84.      */
  85.     public function init()
  86.     {
  87.         if ($this->cdh === null{
  88.             $this->cdh = new Crypt_DiffieHellman(self::DH_DEFAULT_MODULUS,
  89.                                                 self::DH_DEFAULT_GENERATOR);
  90.             $this->cdh->generateKeys();
  91.         }
  92.  
  93.         // Set public key
  94.         $this->message->set('openid.dh_consumer_public',
  95.             base64_encode($this->cdh->getPublicKey(Crypt_DiffieHellman::BTWOC)));
  96.  
  97.         // Set modulus
  98.         $prime $this->cdh->getPrime(Crypt_DiffieHellman::BTWOC);
  99.         $this->message->set('openid.dh_modulus'base64_encode($prime));
  100.  
  101.         // Set prime
  102.         $gen $this->cdh->getGenerator(Crypt_DiffieHellman::BTWOC);
  103.         $this->message->set('openid.dh_gen'base64_encode($gen));
  104.     }
  105.  
  106.     /**
  107.      * Gets the shared secret out of a response
  108.      * 
  109.      * @param array $response The response in array format
  110.      * @param array &$params  The parameters being build for
  111.      *                         OpenID_Association_Reqequest::buildAssociation()
  112.      * 
  113.      * @return void 
  114.      */
  115.     public function getSharedSecret(array $responsearray &$params)
  116.     {
  117.         if (!isset($response['dh_server_public'])) {
  118.             throw new OpenID_Association_Exception(
  119.                 'Missing dh_server_public parameter in association response'
  120.             );
  121.         }
  122.  
  123.         $pubKey       base64_decode($response['dh_server_public']);
  124.         $sharedSecret $this->getSharedSecretKey($pubKey);
  125.  
  126.         $opSecret       base64_decode($response['enc_mac_key']);
  127.         $bytes          mb_strlen(bin2hex($opSecret)'8bit'2;
  128.         $algo           str_replace('HMAC-'''$params['assocType']);
  129.         $hash_dh_shared hash($algo$sharedSecrettrue);
  130.  
  131.         $xsecret '';
  132.         for ($i 0$i $bytes$i++{
  133.             $xsecret .= chr(ord($opSecret[$i]ord($hash_dh_shared[$i]));
  134.         }
  135.  
  136.         $params['sharedSecret'base64_encode($xsecret);
  137.     }
  138.  
  139.     /**
  140.      * Gets the shared secret key in BTWOC format.  Computes the key if it has not
  141.      * been computed already.
  142.      * 
  143.      * @param string $publicKey Public key of the OP
  144.      * 
  145.      * @return BTWOC representation of the number
  146.      */
  147.     public function getSharedSecretKey($publicKey)
  148.     {
  149.         if ($this->sharedKeyComputed == 0{
  150.             $this->cdh->computeSecretKey($publicKeyCrypt_DiffieHellman::BINARY);
  151.             $this->sharedKeyComputed 1;
  152.         }
  153.         return $this->cdh->getSharedSecretKey(Crypt_DiffieHellman::BTWOC);
  154.     
  155. }
  156. ?>

Documentation generated on Tue, 15 Dec 2009 19:00:52 -0800 by phpDocumentor 1.4.3