Subversion Repositories oidplus

Rev

Rev 846 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. /**
  4.  * secp192r1
  5.  *
  6.  * This is the NIST P-192 curve
  7.  *
  8.  * PHP version 5 and 7
  9.  *
  10.  * @category  Crypt
  11.  * @package   EC
  12.  * @author    Jim Wigginton <terrafrost@php.net>
  13.  * @copyright 2017 Jim Wigginton
  14.  * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
  15.  * @link      http://pear.php.net/package/Math_BigInteger
  16.  */
  17.  
  18. namespace phpseclib3\Crypt\EC\Curves;
  19.  
  20. use phpseclib3\Crypt\EC\BaseCurves\Prime;
  21. use phpseclib3\Math\BigInteger;
  22.  
  23. class secp192r1 extends Prime
  24. {
  25.     public function __construct()
  26.     {
  27.         $modulo = new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16);
  28.         $this->setModulo($modulo);
  29.  
  30.         // algorithm 2.27 from http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=66
  31.         /* in theory this should be faster than regular modular reductions save for one small issue.
  32.            to convert to / from base-2**8 with BCMath you have to call bcmul() and bcdiv() a lot.
  33.            to convert to / from base-2**8 with PHP64 you have to call base256_rshift() a lot.
  34.            in short, converting to / from base-2**8 is pretty expensive and that expense is
  35.            enough to offset whatever else might be gained by a simplified reduction algorithm.
  36.            now, if PHP supported unsigned integers things might be different. no bit-shifting
  37.            would be required for the PHP engine and it'd be a lot faster. but as is, BigInteger
  38.            uses base-2**31 or base-2**26 depending on whether or not the system is has a 32-bit
  39.            or a 64-bit OS.
  40.         */
  41.         /*
  42.         $m_length = $this->getLengthInBytes();
  43.         $this->setReduction(function($c) use ($m_length) {
  44.             $cBytes = $c->toBytes();
  45.             $className = $this->className;
  46.  
  47.             if (strlen($cBytes) > 2 * $m_length) {
  48.                 list(, $r) = $c->divide($className::$modulo);
  49.                 return $r;
  50.             }
  51.  
  52.             $c = str_pad($cBytes, 48, "\0", STR_PAD_LEFT);
  53.             $c = array_reverse(str_split($c, 8));
  54.  
  55.             $null = "\0\0\0\0\0\0\0\0";
  56.             $s1 = new BigInteger($c[2] . $c[1] . $c[0], 256);
  57.             $s2 = new BigInteger($null . $c[3] . $c[3], 256);
  58.             $s3 = new BigInteger($c[4] . $c[4] . $null, 256);
  59.             $s4 = new BigInteger($c[5] . $c[5] . $c[5], 256);
  60.  
  61.             $r = $s1->add($s2)->add($s3)->add($s4);
  62.             while ($r->compare($className::$modulo) >= 0) {
  63.                 $r = $r->subtract($className::$modulo);
  64.             }
  65.  
  66.             return $r;
  67.         });
  68.         */
  69.  
  70.         $this->setCoefficients(
  71.             new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16),
  72.             new BigInteger('64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1', 16)
  73.         );
  74.         $this->setBasePoint(
  75.             new BigInteger('188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012', 16),
  76.             new BigInteger('07192B95FFC8DA78631011ED6B24CDD573F977A11E794811', 16)
  77.         );
  78.         $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831', 16));
  79.     }
  80. }
  81.