<?php
/**********************************************************\
|                                                          |
| The implementation of PHPRPC Protocol 3.0                |
|                                                          |
| dhparams.php                                             |
|                                                          |
| Release 3.0.1                                            |
| Copyright by Team-PHPRPC                                 |
|                                                          |
| WebSite:  http://www.phprpc.org/                         |
|           http://www.phprpc.net/                         |
|           http://www.phprpc.com/                         |
|           http://sourceforge.net/projects/php-rpc/       |
|                                                          |
| Authors:  Ma Bingyao <andot@ujn.edu.cn>                  |
|                                                          |
| This file may be distributed and/or modified under the   |
| terms of the GNU General Public License (GPL) version    |
| 2.0 as published by the Free Software Foundation and     |
| appearing in the included file LICENSE.                  |
|                                                          |
\**********************************************************/

/* Diffie-Hellman Parameters for PHPRPC.
 *
 * Copyright: Ma Bingyao <andot@ujn.edu.cn>
 * Version: 1.2
 * LastModified: Apr 12, 2010
 * This library is free.  You can redistribute it and/or modify it under GPL.
 */
class PHPRPC_DHParams
{
    var $len;
    var $dhParams;
    function getNearest($n, $a)
    {
        $j = 0;
        $m = abs($a[0] - $n);
        for ($i = 1; $i < count($a); $i++)
        {
            $t = abs($a[$i] - $n);
            if ($m > $t) {
                $m = $t;
                $j = $i;
            }
        }
        return $a[$j];
    }

    function __construct($len = 128)
    {
        if (extension_loaded('gmp'))
        {
            $a = array(96, 128, 160, 192, 256, 512, 768, 1024, 1536, 2048, 3072, 4096);
        }
        else if (extension_loaded('big_int'))
        {
            $a = array(96, 128, 160, 192, 256, 512, 768, 1024, 1536);
        }
        else if (extension_loaded('bcmath'))
        {
            $a = array(96, 128, 160, 192, 256, 512);
        }
        else
        {
            $a = array(96, 128, 160);
        }
        $this->len = $this->getNearest($len, $a);

        static $dhParamsData = array();
        if (!isset($dhParamsData[$this->len]))
        {
            $dhParams = unserialize(file_get_contents(dirname(__FILE__)."/dhparams/{$this->len}.dhp", true));
            $dhParamsData[$this->len] = $dhParams;
        }
        else
        {
            $dhParams = $dhParamsData[$this->len];
        }

        $this->dhParams = $dhParams[mt_rand(0, count($dhParams) - 1)];
    }
    function getL()
    {
        return $this->len;
    }
    function getP()
    {
        return $this->dhParams['p'];
    }
    function getG()
    {
        return $this->dhParams['g'];
    }
    function getDHParams()
    {
        return $this->dhParams;
    }
}
?>