2008-08-22 22:17:14 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The OpenID library's Diffie-Hellman implementation.
|
|
|
|
*
|
|
|
|
* PHP versions 4 and 5
|
|
|
|
*
|
|
|
|
* LICENSE: See the COPYING file included in this distribution.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
* @package OpenID
|
|
|
|
* @author JanRain, Inc. <openid@janrain.com>
|
|
|
|
* @copyright 2005-2008 Janrain, Inc.
|
|
|
|
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache
|
|
|
|
*/
|
|
|
|
|
|
|
|
require_once 'Auth/OpenID.php';
|
|
|
|
require_once 'Auth/OpenID/BigMath.php';
|
|
|
|
|
|
|
|
function Auth_OpenID_getDefaultMod()
|
|
|
|
{
|
|
|
|
return '155172898181473697471232257763715539915724801'.
|
|
|
|
'966915404479707795314057629378541917580651227423'.
|
|
|
|
'698188993727816152646631438561595825688188889951'.
|
|
|
|
'272158842675419950341258706556549803580104870537'.
|
|
|
|
'681476726513255747040765857479291291572334510643'.
|
|
|
|
'245094715007229621094194349783925984760375594985'.
|
|
|
|
'848253359305585439638443';
|
|
|
|
}
|
|
|
|
|
|
|
|
function Auth_OpenID_getDefaultGen()
|
|
|
|
{
|
|
|
|
return '2';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The Diffie-Hellman key exchange class. This class relies on
|
|
|
|
* {@link Auth_OpenID_MathLibrary} to perform large number operations.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
* @package OpenID
|
|
|
|
*/
|
|
|
|
class Auth_OpenID_DiffieHellman {
|
|
|
|
|
|
|
|
var $mod;
|
|
|
|
var $gen;
|
|
|
|
var $private;
|
|
|
|
var $lib = null;
|
|
|
|
|
|
|
|
function Auth_OpenID_DiffieHellman($mod = null, $gen = null,
|
|
|
|
$private = null, $lib = null)
|
|
|
|
{
|
|
|
|
if ($lib === null) {
|
2010-06-29 23:24:48 +09:00
|
|
|
$this->lib = Auth_OpenID_getMathLib();
|
2008-08-22 22:17:14 +09:00
|
|
|
} else {
|
2010-06-29 23:24:48 +09:00
|
|
|
$this->lib = $lib;
|
2008-08-22 22:17:14 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($mod === null) {
|
|
|
|
$this->mod = $this->lib->init(Auth_OpenID_getDefaultMod());
|
|
|
|
} else {
|
|
|
|
$this->mod = $mod;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($gen === null) {
|
|
|
|
$this->gen = $this->lib->init(Auth_OpenID_getDefaultGen());
|
|
|
|
} else {
|
|
|
|
$this->gen = $gen;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($private === null) {
|
|
|
|
$r = $this->lib->rand($this->mod);
|
|
|
|
$this->private = $this->lib->add($r, 1);
|
|
|
|
} else {
|
|
|
|
$this->private = $private;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->public = $this->lib->powmod($this->gen, $this->private,
|
|
|
|
$this->mod);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getSharedSecret($composite)
|
|
|
|
{
|
|
|
|
return $this->lib->powmod($composite, $this->private, $this->mod);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getPublicKey()
|
|
|
|
{
|
|
|
|
return $this->public;
|
|
|
|
}
|
|
|
|
|
|
|
|
function usingDefaultValues()
|
|
|
|
{
|
|
|
|
return ($this->mod == Auth_OpenID_getDefaultMod() &&
|
|
|
|
$this->gen == Auth_OpenID_getDefaultGen());
|
|
|
|
}
|
|
|
|
|
|
|
|
function xorSecret($composite, $secret, $hash_func)
|
|
|
|
{
|
|
|
|
$dh_shared = $this->getSharedSecret($composite);
|
|
|
|
$dh_shared_str = $this->lib->longToBinary($dh_shared);
|
|
|
|
$hash_dh_shared = $hash_func($dh_shared_str);
|
|
|
|
|
|
|
|
$xsecret = "";
|
|
|
|
for ($i = 0; $i < Auth_OpenID::bytes($secret); $i++) {
|
|
|
|
$xsecret .= chr(ord($secret[$i]) ^ ord($hash_dh_shared[$i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
return $xsecret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-29 23:24:48 +09:00
|
|
|
|