コード例 #1
0
ファイル: Point.php プロジェクト: fpoirotte/pssht
 public static function add(\fpoirotte\Pssht\ECC\Curve $curve, \fpoirotte\Pssht\ECC\Point $P, \fpoirotte\Pssht\ECC\Point $Q)
 {
     $mod = $curve->getModulus();
     $xP = $P->coordinates['x'];
     $yP = $P->coordinates['y'];
     $xQ = $Q->coordinates['x'];
     $yQ = $Q->coordinates['y'];
     if (!gmp_cmp($xP, $xQ) && !gmp_cmp($yP, $yQ)) {
         $alphanum = gmp_add(gmp_mul('3', gmp_pow($xP, '2')), $curve->getA());
         $alphaden = gmp_mul('2', $yP);
     } else {
         $alphanum = gmp_sub($yQ, $yP);
         $alphaden = gmp_sub($xQ, $xP);
     }
     $bezout = gmp_gcdext($alphaden, $mod);
     $alpha = gmp_mod(gmp_mul($alphanum, $bezout['s']), $mod);
     $xR = gmp_sub(gmp_sub(gmp_pow($alpha, '2'), $xP), $xQ);
     $yR = gmp_sub(gmp_mul($alpha, gmp_sub($xP, $xR)), $yP);
     return new static(gmp_mod(gmp_add($xR, $mod), $mod), gmp_mod(gmp_add($yR, $mod), $mod));
 }