1<?php 2 3/** 4 * Modular Exponentiation Engine 5 * 6 * PHP version 5 and 7 7 * 8 * @category Math 9 * @package BigInteger 10 * @author Jim Wigginton <terrafrost@php.net> 11 * @copyright 2017 Jim Wigginton 12 * @license http://www.opensource.org/licenses/mit-license.html MIT License 13 * @link http://pear.php.net/package/Math_BigInteger 14 */ 15 16namespace phpseclib3\Math\BigInteger\Engines\BCMath; 17 18use phpseclib3\Math\BigInteger\Engines\BCMath; 19 20/** 21 * Sliding Window Exponentiation Engine 22 * 23 * @package PHP 24 * @author Jim Wigginton <terrafrost@php.net> 25 * @access public 26 */ 27abstract class Base extends BCMath 28{ 29 /** 30 * Cache constants 31 * 32 * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. 33 * 34 * @access private 35 */ 36 const VARIABLE = 0; 37 /** 38 * $cache[self::DATA] contains the cached data. 39 * 40 * @access private 41 */ 42 const DATA = 1; 43 44 /** 45 * Test for engine validity 46 * 47 * @return bool 48 */ 49 public static function isValidEngine() 50 { 51 return static::class != __CLASS__; 52 } 53 54 /** 55 * Performs modular exponentiation. 56 * 57 * @param BCMath $x 58 * @param BCMath $e 59 * @param BCMath $n 60 * @param string $class 61 * @return BCMath 62 */ 63 protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n, $class) 64 { 65 if (empty($e->value)) { 66 $temp = new $class(); 67 $temp->value = '1'; 68 return $x->normalize($temp); 69 } 70 71 return $x->normalize(static::slidingWindow($x, $e, $n, $class)); 72 } 73 74 /** 75 * Modular reduction preparation 76 * 77 * @param string $x 78 * @param string $n 79 * @param string $class 80 * @see self::slidingWindow() 81 * @return string 82 */ 83 protected static function prepareReduce($x, $n, $class) 84 { 85 return static::reduce($x, $n); 86 } 87 88 /** 89 * Modular multiply 90 * 91 * @param string $x 92 * @param string $y 93 * @param string $n 94 * @param string $class 95 * @see self::slidingWindow() 96 * @return string 97 */ 98 protected static function multiplyReduce($x, $y, $n, $class) 99 { 100 return static::reduce(bcmul($x, $y), $n); 101 } 102 103 /** 104 * Modular square 105 * 106 * @param string $x 107 * @param string $n 108 * @param string $class 109 * @see self::slidingWindow() 110 * @return string 111 */ 112 protected static function squareReduce($x, $n, $class) 113 { 114 return static::reduce(bcmul($x, $x), $n); 115 } 116} 117