/htdocs/wp-includes/sodium_compat/src/Core32/Curve25519.php
https://gitlab.com/VTTE/sitios-vtte · PHP · 1270 lines · 837 code · 99 blank · 334 comment · 19 complexity · 1710a1f551e1724849b60c0170863a7f MD5 · raw file
- <?php
- if (class_exists('ParagonIE_Sodium_Core32_Curve25519', false)) {
- return;
- }
- /**
- * Class ParagonIE_Sodium_Core32_Curve25519
- *
- * Implements Curve25519 core functions
- *
- * Based on the ref10 curve25519 code provided by libsodium
- *
- * @ref https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c
- */
- abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core32_Curve25519_H
- {
- /**
- * Get a field element of size 10 with a value of 0
- *
- * @internal You should not use this directly from another application
- *
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_0()
- {
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array(
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32()
- )
- );
- }
- /**
- * Get a field element of size 10 with a value of 1
- *
- * @internal You should not use this directly from another application
- *
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_1()
- {
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array(
- ParagonIE_Sodium_Core32_Int32::fromInt(1),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32(),
- new ParagonIE_Sodium_Core32_Int32()
- )
- );
- }
- /**
- * Add two field elements.
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedAssignment
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_add(
- ParagonIE_Sodium_Core32_Curve25519_Fe $f,
- ParagonIE_Sodium_Core32_Curve25519_Fe $g
- ) {
- $arr = array();
- for ($i = 0; $i < 10; ++$i) {
- $arr[$i] = $f[$i]->addInt32($g[$i]);
- }
- /** @var array<int, ParagonIE_Sodium_Core32_Int32> $arr */
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($arr);
- }
- /**
- * Constant-time conditional move.
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
- * @param int $b
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedAssignment
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_cmov(
- ParagonIE_Sodium_Core32_Curve25519_Fe $f,
- ParagonIE_Sodium_Core32_Curve25519_Fe $g,
- $b = 0
- ) {
- /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
- $h = array();
- for ($i = 0; $i < 10; ++$i) {
- if (!($f[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
- throw new TypeError('Expected Int32');
- }
- if (!($g[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
- throw new TypeError('Expected Int32');
- }
- $h[$i] = $f[$i]->xorInt32(
- $f[$i]->xorInt32($g[$i])->mask($b)
- );
- }
- /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h);
- }
- /**
- * Create a copy of a field element.
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- */
- public static function fe_copy(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- $h = clone $f;
- return $h;
- }
- /**
- * Give: 32-byte string.
- * Receive: A field element object to use for internal calculations.
- *
- * @internal You should not use this directly from another application
- *
- * @param string $s
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws RangeException
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_frombytes($s)
- {
- if (self::strlen($s) !== 32) {
- throw new RangeException('Expected a 32-byte string.');
- }
- /** @var ParagonIE_Sodium_Core32_Int32 $h0 */
- $h0 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_4($s)
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h1 */
- $h1 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 4, 3)) << 6
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h2 */
- $h2 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 7, 3)) << 5
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h3 */
- $h3 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 10, 3)) << 3
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h4 */
- $h4 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 13, 3)) << 2
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h5 */
- $h5 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_4(self::substr($s, 16, 4))
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h6 */
- $h6 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 20, 3)) << 7
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h7 */
- $h7 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 23, 3)) << 5
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h8 */
- $h8 = ParagonIE_Sodium_Core32_Int32::fromInt(
- self::load_3(self::substr($s, 26, 3)) << 4
- );
- /** @var ParagonIE_Sodium_Core32_Int32 $h9 */
- $h9 = ParagonIE_Sodium_Core32_Int32::fromInt(
- (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2
- );
- $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
- $h0 = $h0->addInt32($carry9->mulInt(19, 5));
- $h9 = $h9->subInt32($carry9->shiftLeft(25));
- $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
- $h2 = $h2->addInt32($carry1);
- $h1 = $h1->subInt32($carry1->shiftLeft(25));
- $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
- $h4 = $h4->addInt32($carry3);
- $h3 = $h3->subInt32($carry3->shiftLeft(25));
- $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
- $h6 = $h6->addInt32($carry5);
- $h5 = $h5->subInt32($carry5->shiftLeft(25));
- $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
- $h8 = $h8->addInt32($carry7);
- $h7 = $h7->subInt32($carry7->shiftLeft(25));
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt32($carry0);
- $h0 = $h0->subInt32($carry0->shiftLeft(26));
- $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
- $h3 = $h3->addInt32($carry2);
- $h2 = $h2->subInt32($carry2->shiftLeft(26));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt32($carry4);
- $h4 = $h4->subInt32($carry4->shiftLeft(26));
- $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
- $h7 = $h7->addInt32($carry6);
- $h6 = $h6->subInt32($carry6->shiftLeft(26));
- $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
- $h9 = $h9->addInt32($carry8);
- $h8 = $h8->subInt32($carry8->shiftLeft(26));
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array($h0, $h1, $h2,$h3, $h4, $h5, $h6, $h7, $h8, $h9)
- );
- }
- /**
- * Convert a field element to a byte string.
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $h
- * @return string
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedAssignment
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_tobytes(ParagonIE_Sodium_Core32_Curve25519_Fe $h)
- {
- /**
- * @var ParagonIE_Sodium_Core32_Int64[] $f
- * @var ParagonIE_Sodium_Core32_Int64 $q
- */
- $f = array();
- for ($i = 0; $i < 10; ++$i) {
- $f[$i] = $h[$i]->toInt64();
- }
- $q = $f[9]->mulInt(19, 5)->addInt(1 << 14)->shiftRight(25)
- ->addInt64($f[0])->shiftRight(26)
- ->addInt64($f[1])->shiftRight(25)
- ->addInt64($f[2])->shiftRight(26)
- ->addInt64($f[3])->shiftRight(25)
- ->addInt64($f[4])->shiftRight(26)
- ->addInt64($f[5])->shiftRight(25)
- ->addInt64($f[6])->shiftRight(26)
- ->addInt64($f[7])->shiftRight(25)
- ->addInt64($f[8])->shiftRight(26)
- ->addInt64($f[9])->shiftRight(25);
- $f[0] = $f[0]->addInt64($q->mulInt(19, 5));
- $carry0 = $f[0]->shiftRight(26);
- $f[1] = $f[1]->addInt64($carry0);
- $f[0] = $f[0]->subInt64($carry0->shiftLeft(26));
- $carry1 = $f[1]->shiftRight(25);
- $f[2] = $f[2]->addInt64($carry1);
- $f[1] = $f[1]->subInt64($carry1->shiftLeft(25));
- $carry2 = $f[2]->shiftRight(26);
- $f[3] = $f[3]->addInt64($carry2);
- $f[2] = $f[2]->subInt64($carry2->shiftLeft(26));
- $carry3 = $f[3]->shiftRight(25);
- $f[4] = $f[4]->addInt64($carry3);
- $f[3] = $f[3]->subInt64($carry3->shiftLeft(25));
- $carry4 = $f[4]->shiftRight(26);
- $f[5] = $f[5]->addInt64($carry4);
- $f[4] = $f[4]->subInt64($carry4->shiftLeft(26));
- $carry5 = $f[5]->shiftRight(25);
- $f[6] = $f[6]->addInt64($carry5);
- $f[5] = $f[5]->subInt64($carry5->shiftLeft(25));
- $carry6 = $f[6]->shiftRight(26);
- $f[7] = $f[7]->addInt64($carry6);
- $f[6] = $f[6]->subInt64($carry6->shiftLeft(26));
- $carry7 = $f[7]->shiftRight(25);
- $f[8] = $f[8]->addInt64($carry7);
- $f[7] = $f[7]->subInt64($carry7->shiftLeft(25));
- $carry8 = $f[8]->shiftRight(26);
- $f[9] = $f[9]->addInt64($carry8);
- $f[8] = $f[8]->subInt64($carry8->shiftLeft(26));
- $carry9 = $f[9]->shiftRight(25);
- $f[9] = $f[9]->subInt64($carry9->shiftLeft(25));
- /** @var int $h0 */
- $h0 = $f[0]->toInt32()->toInt();
- /** @var int $h1 */
- $h1 = $f[1]->toInt32()->toInt();
- /** @var int $h2 */
- $h2 = $f[2]->toInt32()->toInt();
- /** @var int $h3 */
- $h3 = $f[3]->toInt32()->toInt();
- /** @var int $h4 */
- $h4 = $f[4]->toInt32()->toInt();
- /** @var int $h5 */
- $h5 = $f[5]->toInt32()->toInt();
- /** @var int $h6 */
- $h6 = $f[6]->toInt32()->toInt();
- /** @var int $h7 */
- $h7 = $f[7]->toInt32()->toInt();
- /** @var int $h8 */
- $h8 = $f[8]->toInt32()->toInt();
- /** @var int $h9 */
- $h9 = $f[9]->toInt32()->toInt();
- /**
- * @var array<int, int>
- */
- $s = array(
- (int) (($h0 >> 0) & 0xff),
- (int) (($h0 >> 8) & 0xff),
- (int) (($h0 >> 16) & 0xff),
- (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
- (int) (($h1 >> 6) & 0xff),
- (int) (($h1 >> 14) & 0xff),
- (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
- (int) (($h2 >> 5) & 0xff),
- (int) (($h2 >> 13) & 0xff),
- (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
- (int) (($h3 >> 3) & 0xff),
- (int) (($h3 >> 11) & 0xff),
- (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
- (int) (($h4 >> 2) & 0xff),
- (int) (($h4 >> 10) & 0xff),
- (int) (($h4 >> 18) & 0xff),
- (int) (($h5 >> 0) & 0xff),
- (int) (($h5 >> 8) & 0xff),
- (int) (($h5 >> 16) & 0xff),
- (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
- (int) (($h6 >> 7) & 0xff),
- (int) (($h6 >> 15) & 0xff),
- (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
- (int) (($h7 >> 5) & 0xff),
- (int) (($h7 >> 13) & 0xff),
- (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
- (int) (($h8 >> 4) & 0xff),
- (int) (($h8 >> 12) & 0xff),
- (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
- (int) (($h9 >> 2) & 0xff),
- (int) (($h9 >> 10) & 0xff),
- (int) (($h9 >> 18) & 0xff)
- );
- return self::intArrayToString($s);
- }
- /**
- * Is a field element negative? (1 = yes, 0 = no. Used in calculations.)
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return int
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_isnegative(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- $str = self::fe_tobytes($f);
- return (int) (self::chrToInt($str[0]) & 1);
- }
- /**
- * Returns 0 if this field element results in all NUL bytes.
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return bool
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_isnonzero(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- static $zero;
- if ($zero === null) {
- $zero = str_repeat("\x00", 32);
- }
- /** @var string $str */
- $str = self::fe_tobytes($f);
- /** @var string $zero */
- return !self::verify_32($str, $zero);
- }
- /**
- * Multiply two field elements
- *
- * h = f * g
- *
- * @internal You should not use this directly from another application
- *
- * @security Is multiplication a source of timing leaks? If so, can we do
- * anything to prevent that from happening?
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_mul(
- ParagonIE_Sodium_Core32_Curve25519_Fe $f,
- ParagonIE_Sodium_Core32_Curve25519_Fe $g
- ) {
- /**
- * @var ParagonIE_Sodium_Core32_Int32[] $f
- * @var ParagonIE_Sodium_Core32_Int32[] $g
- * @var ParagonIE_Sodium_Core32_Int64 $f0
- * @var ParagonIE_Sodium_Core32_Int64 $f1
- * @var ParagonIE_Sodium_Core32_Int64 $f2
- * @var ParagonIE_Sodium_Core32_Int64 $f3
- * @var ParagonIE_Sodium_Core32_Int64 $f4
- * @var ParagonIE_Sodium_Core32_Int64 $f5
- * @var ParagonIE_Sodium_Core32_Int64 $f6
- * @var ParagonIE_Sodium_Core32_Int64 $f7
- * @var ParagonIE_Sodium_Core32_Int64 $f8
- * @var ParagonIE_Sodium_Core32_Int64 $f9
- * @var ParagonIE_Sodium_Core32_Int64 $g0
- * @var ParagonIE_Sodium_Core32_Int64 $g1
- * @var ParagonIE_Sodium_Core32_Int64 $g2
- * @var ParagonIE_Sodium_Core32_Int64 $g3
- * @var ParagonIE_Sodium_Core32_Int64 $g4
- * @var ParagonIE_Sodium_Core32_Int64 $g5
- * @var ParagonIE_Sodium_Core32_Int64 $g6
- * @var ParagonIE_Sodium_Core32_Int64 $g7
- * @var ParagonIE_Sodium_Core32_Int64 $g8
- * @var ParagonIE_Sodium_Core32_Int64 $g9
- */
- $f0 = $f[0]->toInt64();
- $f1 = $f[1]->toInt64();
- $f2 = $f[2]->toInt64();
- $f3 = $f[3]->toInt64();
- $f4 = $f[4]->toInt64();
- $f5 = $f[5]->toInt64();
- $f6 = $f[6]->toInt64();
- $f7 = $f[7]->toInt64();
- $f8 = $f[8]->toInt64();
- $f9 = $f[9]->toInt64();
- $g0 = $g[0]->toInt64();
- $g1 = $g[1]->toInt64();
- $g2 = $g[2]->toInt64();
- $g3 = $g[3]->toInt64();
- $g4 = $g[4]->toInt64();
- $g5 = $g[5]->toInt64();
- $g6 = $g[6]->toInt64();
- $g7 = $g[7]->toInt64();
- $g8 = $g[8]->toInt64();
- $g9 = $g[9]->toInt64();
- $g1_19 = $g1->mulInt(19, 5); /* 2^4 <= 19 <= 2^5, but we only want 5 bits */
- $g2_19 = $g2->mulInt(19, 5);
- $g3_19 = $g3->mulInt(19, 5);
- $g4_19 = $g4->mulInt(19, 5);
- $g5_19 = $g5->mulInt(19, 5);
- $g6_19 = $g6->mulInt(19, 5);
- $g7_19 = $g7->mulInt(19, 5);
- $g8_19 = $g8->mulInt(19, 5);
- $g9_19 = $g9->mulInt(19, 5);
- /** @var ParagonIE_Sodium_Core32_Int64 $f1_2 */
- $f1_2 = $f1->shiftLeft(1);
- /** @var ParagonIE_Sodium_Core32_Int64 $f3_2 */
- $f3_2 = $f3->shiftLeft(1);
- /** @var ParagonIE_Sodium_Core32_Int64 $f5_2 */
- $f5_2 = $f5->shiftLeft(1);
- /** @var ParagonIE_Sodium_Core32_Int64 $f7_2 */
- $f7_2 = $f7->shiftLeft(1);
- /** @var ParagonIE_Sodium_Core32_Int64 $f9_2 */
- $f9_2 = $f9->shiftLeft(1);
- $f0g0 = $f0->mulInt64($g0, 27);
- $f0g1 = $f0->mulInt64($g1, 27);
- $f0g2 = $f0->mulInt64($g2, 27);
- $f0g3 = $f0->mulInt64($g3, 27);
- $f0g4 = $f0->mulInt64($g4, 27);
- $f0g5 = $f0->mulInt64($g5, 27);
- $f0g6 = $f0->mulInt64($g6, 27);
- $f0g7 = $f0->mulInt64($g7, 27);
- $f0g8 = $f0->mulInt64($g8, 27);
- $f0g9 = $f0->mulInt64($g9, 27);
- $f1g0 = $f1->mulInt64($g0, 27);
- $f1g1_2 = $f1_2->mulInt64($g1, 27);
- $f1g2 = $f1->mulInt64($g2, 27);
- $f1g3_2 = $f1_2->mulInt64($g3, 27);
- $f1g4 = $f1->mulInt64($g4, 30);
- $f1g5_2 = $f1_2->mulInt64($g5, 30);
- $f1g6 = $f1->mulInt64($g6, 30);
- $f1g7_2 = $f1_2->mulInt64($g7, 30);
- $f1g8 = $f1->mulInt64($g8, 30);
- $f1g9_38 = $g9_19->mulInt64($f1_2, 30);
- $f2g0 = $f2->mulInt64($g0, 30);
- $f2g1 = $f2->mulInt64($g1, 29);
- $f2g2 = $f2->mulInt64($g2, 30);
- $f2g3 = $f2->mulInt64($g3, 29);
- $f2g4 = $f2->mulInt64($g4, 30);
- $f2g5 = $f2->mulInt64($g5, 29);
- $f2g6 = $f2->mulInt64($g6, 30);
- $f2g7 = $f2->mulInt64($g7, 29);
- $f2g8_19 = $g8_19->mulInt64($f2, 30);
- $f2g9_19 = $g9_19->mulInt64($f2, 30);
- $f3g0 = $f3->mulInt64($g0, 30);
- $f3g1_2 = $f3_2->mulInt64($g1, 30);
- $f3g2 = $f3->mulInt64($g2, 30);
- $f3g3_2 = $f3_2->mulInt64($g3, 30);
- $f3g4 = $f3->mulInt64($g4, 30);
- $f3g5_2 = $f3_2->mulInt64($g5, 30);
- $f3g6 = $f3->mulInt64($g6, 30);
- $f3g7_38 = $g7_19->mulInt64($f3_2, 30);
- $f3g8_19 = $g8_19->mulInt64($f3, 30);
- $f3g9_38 = $g9_19->mulInt64($f3_2, 30);
- $f4g0 = $f4->mulInt64($g0, 30);
- $f4g1 = $f4->mulInt64($g1, 30);
- $f4g2 = $f4->mulInt64($g2, 30);
- $f4g3 = $f4->mulInt64($g3, 30);
- $f4g4 = $f4->mulInt64($g4, 30);
- $f4g5 = $f4->mulInt64($g5, 30);
- $f4g6_19 = $g6_19->mulInt64($f4, 30);
- $f4g7_19 = $g7_19->mulInt64($f4, 30);
- $f4g8_19 = $g8_19->mulInt64($f4, 30);
- $f4g9_19 = $g9_19->mulInt64($f4, 30);
- $f5g0 = $f5->mulInt64($g0, 30);
- $f5g1_2 = $f5_2->mulInt64($g1, 30);
- $f5g2 = $f5->mulInt64($g2, 30);
- $f5g3_2 = $f5_2->mulInt64($g3, 30);
- $f5g4 = $f5->mulInt64($g4, 30);
- $f5g5_38 = $g5_19->mulInt64($f5_2, 30);
- $f5g6_19 = $g6_19->mulInt64($f5, 30);
- $f5g7_38 = $g7_19->mulInt64($f5_2, 30);
- $f5g8_19 = $g8_19->mulInt64($f5, 30);
- $f5g9_38 = $g9_19->mulInt64($f5_2, 30);
- $f6g0 = $f6->mulInt64($g0, 30);
- $f6g1 = $f6->mulInt64($g1, 30);
- $f6g2 = $f6->mulInt64($g2, 30);
- $f6g3 = $f6->mulInt64($g3, 30);
- $f6g4_19 = $g4_19->mulInt64($f6, 30);
- $f6g5_19 = $g5_19->mulInt64($f6, 30);
- $f6g6_19 = $g6_19->mulInt64($f6, 30);
- $f6g7_19 = $g7_19->mulInt64($f6, 30);
- $f6g8_19 = $g8_19->mulInt64($f6, 30);
- $f6g9_19 = $g9_19->mulInt64($f6, 30);
- $f7g0 = $f7->mulInt64($g0, 30);
- $f7g1_2 = $g1->mulInt64($f7_2, 30);
- $f7g2 = $f7->mulInt64($g2, 30);
- $f7g3_38 = $g3_19->mulInt64($f7_2, 30);
- $f7g4_19 = $g4_19->mulInt64($f7, 30);
- $f7g5_38 = $g5_19->mulInt64($f7_2, 30);
- $f7g6_19 = $g6_19->mulInt64($f7, 30);
- $f7g7_38 = $g7_19->mulInt64($f7_2, 30);
- $f7g8_19 = $g8_19->mulInt64($f7, 30);
- $f7g9_38 = $g9_19->mulInt64($f7_2, 30);
- $f8g0 = $f8->mulInt64($g0, 30);
- $f8g1 = $f8->mulInt64($g1, 29);
- $f8g2_19 = $g2_19->mulInt64($f8, 30);
- $f8g3_19 = $g3_19->mulInt64($f8, 30);
- $f8g4_19 = $g4_19->mulInt64($f8, 30);
- $f8g5_19 = $g5_19->mulInt64($f8, 30);
- $f8g6_19 = $g6_19->mulInt64($f8, 30);
- $f8g7_19 = $g7_19->mulInt64($f8, 30);
- $f8g8_19 = $g8_19->mulInt64($f8, 30);
- $f8g9_19 = $g9_19->mulInt64($f8, 30);
- $f9g0 = $f9->mulInt64($g0, 30);
- $f9g1_38 = $g1_19->mulInt64($f9_2, 30);
- $f9g2_19 = $g2_19->mulInt64($f9, 30);
- $f9g3_38 = $g3_19->mulInt64($f9_2, 30);
- $f9g4_19 = $g4_19->mulInt64($f9, 30);
- $f9g5_38 = $g5_19->mulInt64($f9_2, 30);
- $f9g6_19 = $g6_19->mulInt64($f9, 30);
- $f9g7_38 = $g7_19->mulInt64($f9_2, 30);
- $f9g8_19 = $g8_19->mulInt64($f9, 30);
- $f9g9_38 = $g9_19->mulInt64($f9_2, 30);
- // $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
- $h0 = $f0g0->addInt64($f1g9_38)->addInt64($f2g8_19)->addInt64($f3g7_38)
- ->addInt64($f4g6_19)->addInt64($f5g5_38)->addInt64($f6g4_19)
- ->addInt64($f7g3_38)->addInt64($f8g2_19)->addInt64($f9g1_38);
- // $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
- $h1 = $f0g1->addInt64($f1g0)->addInt64($f2g9_19)->addInt64($f3g8_19)
- ->addInt64($f4g7_19)->addInt64($f5g6_19)->addInt64($f6g5_19)
- ->addInt64($f7g4_19)->addInt64($f8g3_19)->addInt64($f9g2_19);
- // $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
- $h2 = $f0g2->addInt64($f1g1_2)->addInt64($f2g0)->addInt64($f3g9_38)
- ->addInt64($f4g8_19)->addInt64($f5g7_38)->addInt64($f6g6_19)
- ->addInt64($f7g5_38)->addInt64($f8g4_19)->addInt64($f9g3_38);
- // $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
- $h3 = $f0g3->addInt64($f1g2)->addInt64($f2g1)->addInt64($f3g0)
- ->addInt64($f4g9_19)->addInt64($f5g8_19)->addInt64($f6g7_19)
- ->addInt64($f7g6_19)->addInt64($f8g5_19)->addInt64($f9g4_19);
- // $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
- $h4 = $f0g4->addInt64($f1g3_2)->addInt64($f2g2)->addInt64($f3g1_2)
- ->addInt64($f4g0)->addInt64($f5g9_38)->addInt64($f6g8_19)
- ->addInt64($f7g7_38)->addInt64($f8g6_19)->addInt64($f9g5_38);
- // $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
- $h5 = $f0g5->addInt64($f1g4)->addInt64($f2g3)->addInt64($f3g2)
- ->addInt64($f4g1)->addInt64($f5g0)->addInt64($f6g9_19)
- ->addInt64($f7g8_19)->addInt64($f8g7_19)->addInt64($f9g6_19);
- // $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38;
- $h6 = $f0g6->addInt64($f1g5_2)->addInt64($f2g4)->addInt64($f3g3_2)
- ->addInt64($f4g2)->addInt64($f5g1_2)->addInt64($f6g0)
- ->addInt64($f7g9_38)->addInt64($f8g8_19)->addInt64($f9g7_38);
- // $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19;
- $h7 = $f0g7->addInt64($f1g6)->addInt64($f2g5)->addInt64($f3g4)
- ->addInt64($f4g3)->addInt64($f5g2)->addInt64($f6g1)
- ->addInt64($f7g0)->addInt64($f8g9_19)->addInt64($f9g8_19);
- // $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38;
- $h8 = $f0g8->addInt64($f1g7_2)->addInt64($f2g6)->addInt64($f3g5_2)
- ->addInt64($f4g4)->addInt64($f5g3_2)->addInt64($f6g2)
- ->addInt64($f7g1_2)->addInt64($f8g0)->addInt64($f9g9_38);
- // $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ;
- $h9 = $f0g9->addInt64($f1g8)->addInt64($f2g7)->addInt64($f3g6)
- ->addInt64($f4g5)->addInt64($f5g4)->addInt64($f6g3)
- ->addInt64($f7g2)->addInt64($f8g1)->addInt64($f9g0);
- /**
- * @var ParagonIE_Sodium_Core32_Int64 $h0
- * @var ParagonIE_Sodium_Core32_Int64 $h1
- * @var ParagonIE_Sodium_Core32_Int64 $h2
- * @var ParagonIE_Sodium_Core32_Int64 $h3
- * @var ParagonIE_Sodium_Core32_Int64 $h4
- * @var ParagonIE_Sodium_Core32_Int64 $h5
- * @var ParagonIE_Sodium_Core32_Int64 $h6
- * @var ParagonIE_Sodium_Core32_Int64 $h7
- * @var ParagonIE_Sodium_Core32_Int64 $h8
- * @var ParagonIE_Sodium_Core32_Int64 $h9
- * @var ParagonIE_Sodium_Core32_Int64 $carry0
- * @var ParagonIE_Sodium_Core32_Int64 $carry1
- * @var ParagonIE_Sodium_Core32_Int64 $carry2
- * @var ParagonIE_Sodium_Core32_Int64 $carry3
- * @var ParagonIE_Sodium_Core32_Int64 $carry4
- * @var ParagonIE_Sodium_Core32_Int64 $carry5
- * @var ParagonIE_Sodium_Core32_Int64 $carry6
- * @var ParagonIE_Sodium_Core32_Int64 $carry7
- * @var ParagonIE_Sodium_Core32_Int64 $carry8
- * @var ParagonIE_Sodium_Core32_Int64 $carry9
- */
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
- $h2 = $h2->addInt64($carry1);
- $h1 = $h1->subInt64($carry1->shiftLeft(25));
- $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
- $h6 = $h6->addInt64($carry5);
- $h5 = $h5->subInt64($carry5->shiftLeft(25));
- $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
- $h3 = $h3->addInt64($carry2);
- $h2 = $h2->subInt64($carry2->shiftLeft(26));
- $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
- $h7 = $h7->addInt64($carry6);
- $h6 = $h6->subInt64($carry6->shiftLeft(26));
- $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
- $h4 = $h4->addInt64($carry3);
- $h3 = $h3->subInt64($carry3->shiftLeft(25));
- $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
- $h8 = $h8->addInt64($carry7);
- $h7 = $h7->subInt64($carry7->shiftLeft(25));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
- $h9 = $h9->addInt64($carry8);
- $h8 = $h8->subInt64($carry8->shiftLeft(26));
- $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
- $h0 = $h0->addInt64($carry9->mulInt(19, 5));
- $h9 = $h9->subInt64($carry9->shiftLeft(25));
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array(
- $h0->toInt32(),
- $h1->toInt32(),
- $h2->toInt32(),
- $h3->toInt32(),
- $h4->toInt32(),
- $h5->toInt32(),
- $h6->toInt32(),
- $h7->toInt32(),
- $h8->toInt32(),
- $h9->toInt32()
- )
- );
- }
- /**
- * Get the negative values for each piece of the field element.
- *
- * h = -f
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @psalm-suppress MixedAssignment
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_neg(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- $h = new ParagonIE_Sodium_Core32_Curve25519_Fe();
- for ($i = 0; $i < 10; ++$i) {
- $h[$i] = $h[$i]->subInt32($f[$i]);
- }
- return $h;
- }
- /**
- * Square a field element
- *
- * h = f * f
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- /** @var ParagonIE_Sodium_Core32_Int64 $f0 */
- $f0 = $f[0]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f1 */
- $f1 = $f[1]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f2 */
- $f2 = $f[2]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f3 */
- $f3 = $f[3]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f4 */
- $f4 = $f[4]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f5 */
- $f5 = $f[5]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f6 */
- $f6 = $f[6]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f7 */
- $f7 = $f[7]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f8 */
- $f8 = $f[8]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f9 */
- $f9 = $f[9]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f0_2 */
- $f0_2 = $f0->shiftLeft(1);
- $f1_2 = $f1->shiftLeft(1);
- $f2_2 = $f2->shiftLeft(1);
- $f3_2 = $f3->shiftLeft(1);
- $f4_2 = $f4->shiftLeft(1);
- $f5_2 = $f5->shiftLeft(1);
- $f6_2 = $f6->shiftLeft(1);
- $f7_2 = $f7->shiftLeft(1);
- $f5_38 = $f5->mulInt(38, 6);
- $f6_19 = $f6->mulInt(19, 5);
- $f7_38 = $f7->mulInt(38, 6);
- $f8_19 = $f8->mulInt(19, 5);
- $f9_38 = $f9->mulInt(38, 6);
- /** @var ParagonIE_Sodium_Core32_Int64 $f0f0*/
- $f0f0 = $f0->mulInt64($f0, 28);
- $f0f1_2 = $f0_2->mulInt64($f1, 28);
- $f0f2_2 = $f0_2->mulInt64($f2, 28);
- $f0f3_2 = $f0_2->mulInt64($f3, 28);
- $f0f4_2 = $f0_2->mulInt64($f4, 28);
- $f0f5_2 = $f0_2->mulInt64($f5, 28);
- $f0f6_2 = $f0_2->mulInt64($f6, 28);
- $f0f7_2 = $f0_2->mulInt64($f7, 28);
- $f0f8_2 = $f0_2->mulInt64($f8, 28);
- $f0f9_2 = $f0_2->mulInt64($f9, 28);
- $f1f1_2 = $f1_2->mulInt64($f1, 28);
- $f1f2_2 = $f1_2->mulInt64($f2, 28);
- $f1f3_4 = $f1_2->mulInt64($f3_2, 28);
- $f1f4_2 = $f1_2->mulInt64($f4, 28);
- $f1f5_4 = $f1_2->mulInt64($f5_2, 30);
- $f1f6_2 = $f1_2->mulInt64($f6, 28);
- $f1f7_4 = $f1_2->mulInt64($f7_2, 28);
- $f1f8_2 = $f1_2->mulInt64($f8, 28);
- $f1f9_76 = $f9_38->mulInt64($f1_2, 30);
- $f2f2 = $f2->mulInt64($f2, 28);
- $f2f3_2 = $f2_2->mulInt64($f3, 28);
- $f2f4_2 = $f2_2->mulInt64($f4, 28);
- $f2f5_2 = $f2_2->mulInt64($f5, 28);
- $f2f6_2 = $f2_2->mulInt64($f6, 28);
- $f2f7_2 = $f2_2->mulInt64($f7, 28);
- $f2f8_38 = $f8_19->mulInt64($f2_2, 30);
- $f2f9_38 = $f9_38->mulInt64($f2, 30);
- $f3f3_2 = $f3_2->mulInt64($f3, 28);
- $f3f4_2 = $f3_2->mulInt64($f4, 28);
- $f3f5_4 = $f3_2->mulInt64($f5_2, 30);
- $f3f6_2 = $f3_2->mulInt64($f6, 28);
- $f3f7_76 = $f7_38->mulInt64($f3_2, 30);
- $f3f8_38 = $f8_19->mulInt64($f3_2, 30);
- $f3f9_76 = $f9_38->mulInt64($f3_2, 30);
- $f4f4 = $f4->mulInt64($f4, 28);
- $f4f5_2 = $f4_2->mulInt64($f5, 28);
- $f4f6_38 = $f6_19->mulInt64($f4_2, 30);
- $f4f7_38 = $f7_38->mulInt64($f4, 30);
- $f4f8_38 = $f8_19->mulInt64($f4_2, 30);
- $f4f9_38 = $f9_38->mulInt64($f4, 30);
- $f5f5_38 = $f5_38->mulInt64($f5, 30);
- $f5f6_38 = $f6_19->mulInt64($f5_2, 30);
- $f5f7_76 = $f7_38->mulInt64($f5_2, 30);
- $f5f8_38 = $f8_19->mulInt64($f5_2, 30);
- $f5f9_76 = $f9_38->mulInt64($f5_2, 30);
- $f6f6_19 = $f6_19->mulInt64($f6, 30);
- $f6f7_38 = $f7_38->mulInt64($f6, 30);
- $f6f8_38 = $f8_19->mulInt64($f6_2, 30);
- $f6f9_38 = $f9_38->mulInt64($f6, 30);
- $f7f7_38 = $f7_38->mulInt64($f7, 28);
- $f7f8_38 = $f8_19->mulInt64($f7_2, 30);
- $f7f9_76 = $f9_38->mulInt64($f7_2, 30);
- $f8f8_19 = $f8_19->mulInt64($f8, 30);
- $f8f9_38 = $f9_38->mulInt64($f8, 30);
- $f9f9_38 = $f9_38->mulInt64($f9, 28);
- $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38);
- $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38);
- $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19);
- $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38);
- $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38);
- $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38);
- $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19);
- $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38);
- $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38);
- $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2);
- /**
- * @var ParagonIE_Sodium_Core32_Int64 $h0
- * @var ParagonIE_Sodium_Core32_Int64 $h1
- * @var ParagonIE_Sodium_Core32_Int64 $h2
- * @var ParagonIE_Sodium_Core32_Int64 $h3
- * @var ParagonIE_Sodium_Core32_Int64 $h4
- * @var ParagonIE_Sodium_Core32_Int64 $h5
- * @var ParagonIE_Sodium_Core32_Int64 $h6
- * @var ParagonIE_Sodium_Core32_Int64 $h7
- * @var ParagonIE_Sodium_Core32_Int64 $h8
- * @var ParagonIE_Sodium_Core32_Int64 $h9
- */
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
- $h2 = $h2->addInt64($carry1);
- $h1 = $h1->subInt64($carry1->shiftLeft(25));
- $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
- $h6 = $h6->addInt64($carry5);
- $h5 = $h5->subInt64($carry5->shiftLeft(25));
- $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
- $h3 = $h3->addInt64($carry2);
- $h2 = $h2->subInt64($carry2->shiftLeft(26));
- $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
- $h7 = $h7->addInt64($carry6);
- $h6 = $h6->subInt64($carry6->shiftLeft(26));
- $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
- $h4 = $h4->addInt64($carry3);
- $h3 = $h3->subInt64($carry3->shiftLeft(25));
- $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
- $h8 = $h8->addInt64($carry7);
- $h7 = $h7->subInt64($carry7->shiftLeft(25));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
- $h9 = $h9->addInt64($carry8);
- $h8 = $h8->subInt64($carry8->shiftLeft(26));
- $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
- $h0 = $h0->addInt64($carry9->mulInt(19, 5));
- $h9 = $h9->subInt64($carry9->shiftLeft(25));
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array(
- $h0->toInt32(),
- $h1->toInt32(),
- $h2->toInt32(),
- $h3->toInt32(),
- $h4->toInt32(),
- $h5->toInt32(),
- $h6->toInt32(),
- $h7->toInt32(),
- $h8->toInt32(),
- $h9->toInt32()
- )
- );
- }
- /**
- * Square and double a field element
- *
- * h = 2 * f * f
- *
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- * @psalm-suppress MixedMethodCall
- */
- public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
- {
- /** @var ParagonIE_Sodium_Core32_Int64 $f0 */
- $f0 = $f[0]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f1 */
- $f1 = $f[1]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f2 */
- $f2 = $f[2]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f3 */
- $f3 = $f[3]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f4 */
- $f4 = $f[4]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f5 */
- $f5 = $f[5]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f6 */
- $f6 = $f[6]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f7 */
- $f7 = $f[7]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f8 */
- $f8 = $f[8]->toInt64();
- /** @var ParagonIE_Sodium_Core32_Int64 $f9 */
- $f9 = $f[9]->toInt64();
- $f0_2 = $f0->shiftLeft(1);
- $f1_2 = $f1->shiftLeft(1);
- $f2_2 = $f2->shiftLeft(1);
- $f3_2 = $f3->shiftLeft(1);
- $f4_2 = $f4->shiftLeft(1);
- $f5_2 = $f5->shiftLeft(1);
- $f6_2 = $f6->shiftLeft(1);
- $f7_2 = $f7->shiftLeft(1);
- $f5_38 = $f5->mulInt(38, 6); /* 1.959375*2^30 */
- $f6_19 = $f6->mulInt(19, 5); /* 1.959375*2^30 */
- $f7_38 = $f7->mulInt(38, 6); /* 1.959375*2^30 */
- $f8_19 = $f8->mulInt(19, 5); /* 1.959375*2^30 */
- $f9_38 = $f9->mulInt(38, 6); /* 1.959375*2^30 */
- $f0f0 = $f0->mulInt64($f0, 28);
- $f0f1_2 = $f0_2->mulInt64($f1, 28);
- $f0f2_2 = $f0_2->mulInt64($f2, 28);
- $f0f3_2 = $f0_2->mulInt64($f3, 28);
- $f0f4_2 = $f0_2->mulInt64($f4, 28);
- $f0f5_2 = $f0_2->mulInt64($f5, 28);
- $f0f6_2 = $f0_2->mulInt64($f6, 28);
- $f0f7_2 = $f0_2->mulInt64($f7, 28);
- $f0f8_2 = $f0_2->mulInt64($f8, 28);
- $f0f9_2 = $f0_2->mulInt64($f9, 28);
- $f1f1_2 = $f1_2->mulInt64($f1, 28);
- $f1f2_2 = $f1_2->mulInt64($f2, 28);
- $f1f3_4 = $f1_2->mulInt64($f3_2, 29);
- $f1f4_2 = $f1_2->mulInt64($f4, 28);
- $f1f5_4 = $f1_2->mulInt64($f5_2, 29);
- $f1f6_2 = $f1_2->mulInt64($f6, 28);
- $f1f7_4 = $f1_2->mulInt64($f7_2, 29);
- $f1f8_2 = $f1_2->mulInt64($f8, 28);
- $f1f9_76 = $f9_38->mulInt64($f1_2, 29);
- $f2f2 = $f2->mulInt64($f2, 28);
- $f2f3_2 = $f2_2->mulInt64($f3, 28);
- $f2f4_2 = $f2_2->mulInt64($f4, 28);
- $f2f5_2 = $f2_2->mulInt64($f5, 28);
- $f2f6_2 = $f2_2->mulInt64($f6, 28);
- $f2f7_2 = $f2_2->mulInt64($f7, 28);
- $f2f8_38 = $f8_19->mulInt64($f2_2, 29);
- $f2f9_38 = $f9_38->mulInt64($f2, 29);
- $f3f3_2 = $f3_2->mulInt64($f3, 28);
- $f3f4_2 = $f3_2->mulInt64($f4, 28);
- $f3f5_4 = $f3_2->mulInt64($f5_2, 28);
- $f3f6_2 = $f3_2->mulInt64($f6, 28);
- $f3f7_76 = $f7_38->mulInt64($f3_2, 29);
- $f3f8_38 = $f8_19->mulInt64($f3_2, 29);
- $f3f9_76 = $f9_38->mulInt64($f3_2, 29);
- $f4f4 = $f4->mulInt64($f4, 28);
- $f4f5_2 = $f4_2->mulInt64($f5, 28);
- $f4f6_38 = $f6_19->mulInt64($f4_2, 29);
- $f4f7_38 = $f7_38->mulInt64($f4, 29);
- $f4f8_38 = $f8_19->mulInt64($f4_2, 29);
- $f4f9_38 = $f9_38->mulInt64($f4, 29);
- $f5f5_38 = $f5_38->mulInt64($f5, 29);
- $f5f6_38 = $f6_19->mulInt64($f5_2, 29);
- $f5f7_76 = $f7_38->mulInt64($f5_2, 29);
- $f5f8_38 = $f8_19->mulInt64($f5_2, 29);
- $f5f9_76 = $f9_38->mulInt64($f5_2, 29);
- $f6f6_19 = $f6_19->mulInt64($f6, 29);
- $f6f7_38 = $f7_38->mulInt64($f6, 29);
- $f6f8_38 = $f8_19->mulInt64($f6_2, 29);
- $f6f9_38 = $f9_38->mulInt64($f6, 29);
- $f7f7_38 = $f7_38->mulInt64($f7, 29);
- $f7f8_38 = $f8_19->mulInt64($f7_2, 29);
- $f7f9_76 = $f9_38->mulInt64($f7_2, 29);
- $f8f8_19 = $f8_19->mulInt64($f8, 29);
- $f8f9_38 = $f9_38->mulInt64($f8, 29);
- $f9f9_38 = $f9_38->mulInt64($f9, 29);
- $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38);
- $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38);
- $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19);
- $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38);
- $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38);
- $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38);
- $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19);
- $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38);
- $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38);
- $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2);
- /**
- * @var ParagonIE_Sodium_Core32_Int64 $h0
- * @var ParagonIE_Sodium_Core32_Int64 $h1
- * @var ParagonIE_Sodium_Core32_Int64 $h2
- * @var ParagonIE_Sodium_Core32_Int64 $h3
- * @var ParagonIE_Sodium_Core32_Int64 $h4
- * @var ParagonIE_Sodium_Core32_Int64 $h5
- * @var ParagonIE_Sodium_Core32_Int64 $h6
- * @var ParagonIE_Sodium_Core32_Int64 $h7
- * @var ParagonIE_Sodium_Core32_Int64 $h8
- * @var ParagonIE_Sodium_Core32_Int64 $h9
- */
- $h0 = $h0->shiftLeft(1);
- $h1 = $h1->shiftLeft(1);
- $h2 = $h2->shiftLeft(1);
- $h3 = $h3->shiftLeft(1);
- $h4 = $h4->shiftLeft(1);
- $h5 = $h5->shiftLeft(1);
- $h6 = $h6->shiftLeft(1);
- $h7 = $h7->shiftLeft(1);
- $h8 = $h8->shiftLeft(1);
- $h9 = $h9->shiftLeft(1);
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
- $h2 = $h2->addInt64($carry1);
- $h1 = $h1->subInt64($carry1->shiftLeft(25));
- $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
- $h6 = $h6->addInt64($carry5);
- $h5 = $h5->subInt64($carry5->shiftLeft(25));
- $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
- $h3 = $h3->addInt64($carry2);
- $h2 = $h2->subInt64($carry2->shiftLeft(26));
- $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
- $h7 = $h7->addInt64($carry6);
- $h6 = $h6->subInt64($carry6->shiftLeft(26));
- $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
- $h4 = $h4->addInt64($carry3);
- $h3 = $h3->subInt64($carry3->shiftLeft(25));
- $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
- $h8 = $h8->addInt64($carry7);
- $h7 = $h7->subInt64($carry7->shiftLeft(25));
- $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
- $h5 = $h5->addInt64($carry4);
- $h4 = $h4->subInt64($carry4->shiftLeft(26));
- $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
- $h9 = $h9->addInt64($carry8);
- $h8 = $h8->subInt64($carry8->shiftLeft(26));
- $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
- $h0 = $h0->addInt64($carry9->mulInt(19, 5));
- $h9 = $h9->subInt64($carry9->shiftLeft(25));
- $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
- $h1 = $h1->addInt64($carry0);
- $h0 = $h0->subInt64($carry0->shiftLeft(26));
- return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
- array(
- $h0->toInt32(),
- $h1->toInt32(),
- $h2->toInt32(),
- $h3->toInt32(),
- $h4->toInt32(),
- $h5->toInt32(),
- $h6->toInt32(),
- $h7->toInt32(),
- $h8->toInt32(),
- $h9->toInt32()
- )
- );
- }
- /**
- * @internal You should not use this directly from another application
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $Z
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_invert(ParagonIE_Sodium_Core32_Curve25519_Fe $Z)
- {
- $z = clone $Z;
- $t0 = self::fe_sq($z);
- $t1 = self::fe_sq($t0);
- $t1 = self::fe_sq($t1);
- $t1 = self::fe_mul($z, $t1);
- $t0 = self::fe_mul($t0, $t1);
- $t2 = self::fe_sq($t0);
- $t1 = self::fe_mul($t1, $t2);
- $t2 = self::fe_sq($t1);
- for ($i = 1; $i < 5; ++$i) {
- $t2 = self::fe_sq($t2);
- }
- $t1 = self::fe_mul($t2, $t1);
- $t2 = self::fe_sq($t1);
- for ($i = 1; $i < 10; ++$i) {
- $t2 = self::fe_sq($t2);
- }
- $t2 = self::fe_mul($t2, $t1);
- $t3 = self::fe_sq($t2);
- for ($i = 1; $i < 20; ++$i) {
- $t3 = self::fe_sq($t3);
- }
- $t2 = self::fe_mul($t3, $t2);
- $t2 = self::fe_sq($t2);
- for ($i = 1; $i < 10; ++$i) {
- $t2 = self::fe_sq($t2);
- }
- $t1 = self::fe_mul($t2, $t1);
- $t2 = self::fe_sq($t1);
- for ($i = 1; $i < 50; ++$i) {
- $t2 = self::fe_sq($t2);
- }
- $t2 = self::fe_mul($t2, $t1);
- $t3 = self::fe_sq($t2);
- for ($i = 1; $i < 100; ++$i) {
- $t3 = self::fe_sq($t3);
- }
- $t2 = self::fe_mul($t3, $t2);
- $t2 = self::fe_sq($t2);
- for ($i = 1; $i < 50; ++$i) {
- $t2 = self::fe_sq($t2);
- }
- $t1 = self::fe_mul($t2, $t1);
- $t1 = self::fe_sq($t1);
- for ($i = 1; $i < 5; ++$i) {
- $t1 = self::fe_sq($t1);
- }
- return self::fe_mul($t1, $t0);
- }
- /**
- * @internal You should not use this directly from another application
- *
- * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106
- *
- * @param ParagonIE_Sodium_Core32_Curve25519_Fe $z
- * @return ParagonIE_Sodium_Core32_Curve25519_Fe
- * @throws SodiumException
- * @throws TypeError
- */
- public static function fe_pow22523(ParagonIE_Sodium_Core32_Curve25519_Fe $z)
- {
- # fe_sq(t0, z);
- # fe_sq(t1, t0);
- # fe_sq(t1, t1);
- # fe_mul(t1, z, t1);
- # fe_mul(t0, t0, t1);
- # fe_sq(t0, t0);
- # fe_mul(t0, t1, t0);
- # fe_sq(t1, t0);
- $t0 = self::fe_sq($z);
- $t1 = self::fe_sq($t0);
- $t1 = self::fe_sq($t1);
- $t1 = self::fe_mul($z, $t1);
- $t0 = self::fe_mul($t0, $t1);
- $t0 = self::fe_sq($t0);
- $t0 = self::fe_mul($t1, $t0);
- $t1 = self::fe_sq($t0);
- # for (i = 1; i < 5; ++i) {
- # fe_sq(t1, t1);
- # }
- for ($i = 1; $i < 5; ++$i) {
- $t1 = self::fe_sq($t1);
- }
- # fe_mul(t0, t1, t0);
- # fe_sq(t1, t0);
- $t0 = self::fe_mul($t1, $t0);
- $t1 = self::fe_sq($t0);
- # for (i = 1; i < 10; ++i) {
- # fe_sq(t1, t1);
- # }
- for ($i = 1; $i < 10; ++$i) {
- $t1 =