* @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ namespace phpseclib\Math; use phpseclib\Math\Common\FiniteField; use phpseclib\Math\PrimeField\Integer; /** * Prime Finite Fields * * @package Math * @author Jim Wigginton * @access public */ class PrimeField extends FiniteField { /** * Instance Counter * * @var int */ private static $instanceCounter = 0; /** * Keeps track of current instance * * @var int */ protected $instanceID; /** * Default constructor */ public function __construct(BigInteger $modulo) { //if (!$modulo->isPrime()) { // throw new \UnexpectedValueException('PrimeField requires a prime number be passed to the constructor'); //} $this->modulo = $modulo; $this->instanceID = self::$instanceCounter++; Integer::setModulo($this->instanceID, $modulo); Integer::setRecurringModuloFunction($this->instanceID, $modulo->createRecurringModuloFunction()); } /** * Use a custom defined modular reduction function */ public function setReduction(callable $func) { $this->reduce = $func->bindTo($this, $this); } /** * Returns an instance of a dynamically generated PrimeFieldInteger class * * @return object */ public function newInteger(BigInteger $num) { return new Integer($this->instanceID, $num); } /** * Returns an integer on the finite field between one and the prime modulo * * @return object */ public function randomInteger() { static $one; if (!isset($one)) { $one = new BigInteger(1); } return new Integer($this->instanceID, BigInteger::randomRange($one, Integer::getModulo($this->instanceID))); } /** * Returns the length of the modulo in bytes * * @return integer */ public function getLengthInBytes() { return Integer::getModulo($this->instanceID)->getLengthInBytes(); } /** * Returns the length of the modulo in bits * * @return integer */ public function getLength() { return Integer::getModulo($this->instanceID)->getLength(); } }