You are here

public static function ParagonIE_Sodium_Core32_Curve25519::sc_muladd in Automatic Updates 8

Same name and namespace in other branches
  1. 7 vendor/paragonie/sodium_compat/src/Core32/Curve25519.php \ParagonIE_Sodium_Core32_Curve25519::sc_muladd()

Calculates (ab + c) mod l where l = 2^252 + 27742317777372353535851937790883648493

@internal You should not use this directly from another application

Parameters

string $a:

string $b:

string $c:

Return value

string

Throws

SodiumException

TypeError

1 call to ParagonIE_Sodium_Core32_Curve25519::sc_muladd()
ParagonIE_Sodium_Core32_Ed25519::sign_detached in vendor/paragonie/sodium_compat/src/Core32/Ed25519.php
@internal You should not use this directly from another application

File

vendor/paragonie/sodium_compat/src/Core32/Curve25519.php, line 2283

Class

ParagonIE_Sodium_Core32_Curve25519
Class ParagonIE_Sodium_Core32_Curve25519

Code

public static function sc_muladd($a, $b, $c) {
  $a0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 0, 3)));
  $a1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($a, 2, 4)) >> 5);
  $a2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 5, 3)) >> 2);
  $a3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($a, 7, 4)) >> 7);
  $a4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($a, 10, 4)) >> 4);
  $a5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 13, 3)) >> 1);
  $a6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($a, 15, 4)) >> 6);
  $a7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 18, 3)) >> 3);
  $a8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 21, 3)));
  $a9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($a, 23, 4)) >> 5);
  $a10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 26, 3)) >> 2);
  $a11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & self::load_4(self::substr($a, 28, 4)) >> 7);
  $b0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 0, 3)));
  $b1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($b, 2, 4)) >> 5);
  $b2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 5, 3)) >> 2);
  $b3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($b, 7, 4)) >> 7);
  $b4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($b, 10, 4)) >> 4);
  $b5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 13, 3)) >> 1);
  $b6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($b, 15, 4)) >> 6);
  $b7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 18, 3)) >> 3);
  $b8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 21, 3)));
  $b9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($b, 23, 4)) >> 5);
  $b10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 26, 3)) >> 2);
  $b11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & self::load_4(self::substr($b, 28, 4)) >> 7);
  $c0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 0, 3)));
  $c1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($c, 2, 4)) >> 5);
  $c2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 5, 3)) >> 2);
  $c3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($c, 7, 4)) >> 7);
  $c4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($c, 10, 4)) >> 4);
  $c5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 13, 3)) >> 1);
  $c6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($c, 15, 4)) >> 6);
  $c7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 18, 3)) >> 3);
  $c8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 21, 3)));
  $c9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_4(self::substr($c, 23, 4)) >> 5);
  $c10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 26, 3)) >> 2);
  $c11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & self::load_4(self::substr($c, 28, 4)) >> 7);

  /* Can't really avoid the pyramid here: */

  /**
   * @var ParagonIE_Sodium_Core32_Int64 $s0
   * @var ParagonIE_Sodium_Core32_Int64 $s1
   * @var ParagonIE_Sodium_Core32_Int64 $s2
   * @var ParagonIE_Sodium_Core32_Int64 $s3
   * @var ParagonIE_Sodium_Core32_Int64 $s4
   * @var ParagonIE_Sodium_Core32_Int64 $s5
   * @var ParagonIE_Sodium_Core32_Int64 $s6
   * @var ParagonIE_Sodium_Core32_Int64 $s7
   * @var ParagonIE_Sodium_Core32_Int64 $s8
   * @var ParagonIE_Sodium_Core32_Int64 $s9
   * @var ParagonIE_Sodium_Core32_Int64 $s10
   * @var ParagonIE_Sodium_Core32_Int64 $s11
   * @var ParagonIE_Sodium_Core32_Int64 $s12
   * @var ParagonIE_Sodium_Core32_Int64 $s13
   * @var ParagonIE_Sodium_Core32_Int64 $s14
   * @var ParagonIE_Sodium_Core32_Int64 $s15
   * @var ParagonIE_Sodium_Core32_Int64 $s16
   * @var ParagonIE_Sodium_Core32_Int64 $s17
   * @var ParagonIE_Sodium_Core32_Int64 $s18
   * @var ParagonIE_Sodium_Core32_Int64 $s19
   * @var ParagonIE_Sodium_Core32_Int64 $s20
   * @var ParagonIE_Sodium_Core32_Int64 $s21
   * @var ParagonIE_Sodium_Core32_Int64 $s22
   * @var ParagonIE_Sodium_Core32_Int64 $s23
   */
  $s0 = $c0
    ->addInt64($a0
    ->mulInt64($b0, 24));
  $s1 = $c1
    ->addInt64($a0
    ->mulInt64($b1, 24))
    ->addInt64($a1
    ->mulInt64($b0, 24));
  $s2 = $c2
    ->addInt64($a0
    ->mulInt64($b2, 24))
    ->addInt64($a1
    ->mulInt64($b1, 24))
    ->addInt64($a2
    ->mulInt64($b0, 24));
  $s3 = $c3
    ->addInt64($a0
    ->mulInt64($b3, 24))
    ->addInt64($a1
    ->mulInt64($b2, 24))
    ->addInt64($a2
    ->mulInt64($b1, 24))
    ->addInt64($a3
    ->mulInt64($b0, 24));
  $s4 = $c4
    ->addInt64($a0
    ->mulInt64($b4, 24))
    ->addInt64($a1
    ->mulInt64($b3, 24))
    ->addInt64($a2
    ->mulInt64($b2, 24))
    ->addInt64($a3
    ->mulInt64($b1, 24))
    ->addInt64($a4
    ->mulInt64($b0, 24));
  $s5 = $c5
    ->addInt64($a0
    ->mulInt64($b5, 24))
    ->addInt64($a1
    ->mulInt64($b4, 24))
    ->addInt64($a2
    ->mulInt64($b3, 24))
    ->addInt64($a3
    ->mulInt64($b2, 24))
    ->addInt64($a4
    ->mulInt64($b1, 24))
    ->addInt64($a5
    ->mulInt64($b0, 24));
  $s6 = $c6
    ->addInt64($a0
    ->mulInt64($b6, 24))
    ->addInt64($a1
    ->mulInt64($b5, 24))
    ->addInt64($a2
    ->mulInt64($b4, 24))
    ->addInt64($a3
    ->mulInt64($b3, 24))
    ->addInt64($a4
    ->mulInt64($b2, 24))
    ->addInt64($a5
    ->mulInt64($b1, 24))
    ->addInt64($a6
    ->mulInt64($b0, 24));
  $s7 = $c7
    ->addInt64($a0
    ->mulInt64($b7, 24))
    ->addInt64($a1
    ->mulInt64($b6, 24))
    ->addInt64($a2
    ->mulInt64($b5, 24))
    ->addInt64($a3
    ->mulInt64($b4, 24))
    ->addInt64($a4
    ->mulInt64($b3, 24))
    ->addInt64($a5
    ->mulInt64($b2, 24))
    ->addInt64($a6
    ->mulInt64($b1, 24))
    ->addInt64($a7
    ->mulInt64($b0, 24));
  $s8 = $c8
    ->addInt64($a0
    ->mulInt64($b8, 24))
    ->addInt64($a1
    ->mulInt64($b7, 24))
    ->addInt64($a2
    ->mulInt64($b6, 24))
    ->addInt64($a3
    ->mulInt64($b5, 24))
    ->addInt64($a4
    ->mulInt64($b4, 24))
    ->addInt64($a5
    ->mulInt64($b3, 24))
    ->addInt64($a6
    ->mulInt64($b2, 24))
    ->addInt64($a7
    ->mulInt64($b1, 24))
    ->addInt64($a8
    ->mulInt64($b0, 24));
  $s9 = $c9
    ->addInt64($a0
    ->mulInt64($b9, 24))
    ->addInt64($a1
    ->mulInt64($b8, 24))
    ->addInt64($a2
    ->mulInt64($b7, 24))
    ->addInt64($a3
    ->mulInt64($b6, 24))
    ->addInt64($a4
    ->mulInt64($b5, 24))
    ->addInt64($a5
    ->mulInt64($b4, 24))
    ->addInt64($a6
    ->mulInt64($b3, 24))
    ->addInt64($a7
    ->mulInt64($b2, 24))
    ->addInt64($a8
    ->mulInt64($b1, 24))
    ->addInt64($a9
    ->mulInt64($b0, 24));
  $s10 = $c10
    ->addInt64($a0
    ->mulInt64($b10, 24))
    ->addInt64($a1
    ->mulInt64($b9, 24))
    ->addInt64($a2
    ->mulInt64($b8, 24))
    ->addInt64($a3
    ->mulInt64($b7, 24))
    ->addInt64($a4
    ->mulInt64($b6, 24))
    ->addInt64($a5
    ->mulInt64($b5, 24))
    ->addInt64($a6
    ->mulInt64($b4, 24))
    ->addInt64($a7
    ->mulInt64($b3, 24))
    ->addInt64($a8
    ->mulInt64($b2, 24))
    ->addInt64($a9
    ->mulInt64($b1, 24))
    ->addInt64($a10
    ->mulInt64($b0, 24));
  $s11 = $c11
    ->addInt64($a0
    ->mulInt64($b11, 24))
    ->addInt64($a1
    ->mulInt64($b10, 24))
    ->addInt64($a2
    ->mulInt64($b9, 24))
    ->addInt64($a3
    ->mulInt64($b8, 24))
    ->addInt64($a4
    ->mulInt64($b7, 24))
    ->addInt64($a5
    ->mulInt64($b6, 24))
    ->addInt64($a6
    ->mulInt64($b5, 24))
    ->addInt64($a7
    ->mulInt64($b4, 24))
    ->addInt64($a8
    ->mulInt64($b3, 24))
    ->addInt64($a9
    ->mulInt64($b2, 24))
    ->addInt64($a10
    ->mulInt64($b1, 24))
    ->addInt64($a11
    ->mulInt64($b0, 24));
  $s12 = $a1
    ->mulInt64($b11, 24)
    ->addInt64($a2
    ->mulInt64($b10, 24))
    ->addInt64($a3
    ->mulInt64($b9, 24))
    ->addInt64($a4
    ->mulInt64($b8, 24))
    ->addInt64($a5
    ->mulInt64($b7, 24))
    ->addInt64($a6
    ->mulInt64($b6, 24))
    ->addInt64($a7
    ->mulInt64($b5, 24))
    ->addInt64($a8
    ->mulInt64($b4, 24))
    ->addInt64($a9
    ->mulInt64($b3, 24))
    ->addInt64($a10
    ->mulInt64($b2, 24))
    ->addInt64($a11
    ->mulInt64($b1, 24));
  $s13 = $a2
    ->mulInt64($b11, 24)
    ->addInt64($a3
    ->mulInt64($b10, 24))
    ->addInt64($a4
    ->mulInt64($b9, 24))
    ->addInt64($a5
    ->mulInt64($b8, 24))
    ->addInt64($a6
    ->mulInt64($b7, 24))
    ->addInt64($a7
    ->mulInt64($b6, 24))
    ->addInt64($a8
    ->mulInt64($b5, 24))
    ->addInt64($a9
    ->mulInt64($b4, 24))
    ->addInt64($a10
    ->mulInt64($b3, 24))
    ->addInt64($a11
    ->mulInt64($b2, 24));
  $s14 = $a3
    ->mulInt64($b11, 24)
    ->addInt64($a4
    ->mulInt64($b10, 24))
    ->addInt64($a5
    ->mulInt64($b9, 24))
    ->addInt64($a6
    ->mulInt64($b8, 24))
    ->addInt64($a7
    ->mulInt64($b7, 24))
    ->addInt64($a8
    ->mulInt64($b6, 24))
    ->addInt64($a9
    ->mulInt64($b5, 24))
    ->addInt64($a10
    ->mulInt64($b4, 24))
    ->addInt64($a11
    ->mulInt64($b3, 24));
  $s15 = $a4
    ->mulInt64($b11, 24)
    ->addInt64($a5
    ->mulInt64($b10, 24))
    ->addInt64($a6
    ->mulInt64($b9, 24))
    ->addInt64($a7
    ->mulInt64($b8, 24))
    ->addInt64($a8
    ->mulInt64($b7, 24))
    ->addInt64($a9
    ->mulInt64($b6, 24))
    ->addInt64($a10
    ->mulInt64($b5, 24))
    ->addInt64($a11
    ->mulInt64($b4, 24));
  $s16 = $a5
    ->mulInt64($b11, 24)
    ->addInt64($a6
    ->mulInt64($b10, 24))
    ->addInt64($a7
    ->mulInt64($b9, 24))
    ->addInt64($a8
    ->mulInt64($b8, 24))
    ->addInt64($a9
    ->mulInt64($b7, 24))
    ->addInt64($a10
    ->mulInt64($b6, 24))
    ->addInt64($a11
    ->mulInt64($b5, 24));
  $s17 = $a6
    ->mulInt64($b11, 24)
    ->addInt64($a7
    ->mulInt64($b10, 24))
    ->addInt64($a8
    ->mulInt64($b9, 24))
    ->addInt64($a9
    ->mulInt64($b8, 24))
    ->addInt64($a10
    ->mulInt64($b7, 24))
    ->addInt64($a11
    ->mulInt64($b6, 24));
  $s18 = $a7
    ->mulInt64($b11, 24)
    ->addInt64($a8
    ->mulInt64($b10, 24))
    ->addInt64($a9
    ->mulInt64($b9, 24))
    ->addInt64($a10
    ->mulInt64($b8, 24))
    ->addInt64($a11
    ->mulInt64($b7, 24));
  $s19 = $a8
    ->mulInt64($b11, 24)
    ->addInt64($a9
    ->mulInt64($b10, 24))
    ->addInt64($a10
    ->mulInt64($b9, 24))
    ->addInt64($a11
    ->mulInt64($b8, 24));
  $s20 = $a9
    ->mulInt64($b11, 24)
    ->addInt64($a10
    ->mulInt64($b10, 24))
    ->addInt64($a11
    ->mulInt64($b9, 24));
  $s21 = $a10
    ->mulInt64($b11, 24)
    ->addInt64($a11
    ->mulInt64($b10, 24));
  $s22 = $a11
    ->mulInt64($b11, 24);
  $s23 = new ParagonIE_Sodium_Core32_Int64();
  $carry0 = $s0
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s1 = $s1
    ->addInt64($carry0);
  $s0 = $s0
    ->subInt64($carry0
    ->shiftLeft(21));
  $carry2 = $s2
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s3 = $s3
    ->addInt64($carry2);
  $s2 = $s2
    ->subInt64($carry2
    ->shiftLeft(21));
  $carry4 = $s4
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s5 = $s5
    ->addInt64($carry4);
  $s4 = $s4
    ->subInt64($carry4
    ->shiftLeft(21));
  $carry6 = $s6
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s7 = $s7
    ->addInt64($carry6);
  $s6 = $s6
    ->subInt64($carry6
    ->shiftLeft(21));
  $carry8 = $s8
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s9 = $s9
    ->addInt64($carry8);
  $s8 = $s8
    ->subInt64($carry8
    ->shiftLeft(21));
  $carry10 = $s10
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s11 = $s11
    ->addInt64($carry10);
  $s10 = $s10
    ->subInt64($carry10
    ->shiftLeft(21));
  $carry12 = $s12
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s13 = $s13
    ->addInt64($carry12);
  $s12 = $s12
    ->subInt64($carry12
    ->shiftLeft(21));
  $carry14 = $s14
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s15 = $s15
    ->addInt64($carry14);
  $s14 = $s14
    ->subInt64($carry14
    ->shiftLeft(21));
  $carry16 = $s16
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s17 = $s17
    ->addInt64($carry16);
  $s16 = $s16
    ->subInt64($carry16
    ->shiftLeft(21));
  $carry18 = $s18
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s19 = $s19
    ->addInt64($carry18);
  $s18 = $s18
    ->subInt64($carry18
    ->shiftLeft(21));
  $carry20 = $s20
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s21 = $s21
    ->addInt64($carry20);
  $s20 = $s20
    ->subInt64($carry20
    ->shiftLeft(21));
  $carry22 = $s22
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s23 = $s23
    ->addInt64($carry22);
  $s22 = $s22
    ->subInt64($carry22
    ->shiftLeft(21));
  $carry1 = $s1
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s2 = $s2
    ->addInt64($carry1);
  $s1 = $s1
    ->subInt64($carry1
    ->shiftLeft(21));
  $carry3 = $s3
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s4 = $s4
    ->addInt64($carry3);
  $s3 = $s3
    ->subInt64($carry3
    ->shiftLeft(21));
  $carry5 = $s5
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s6 = $s6
    ->addInt64($carry5);
  $s5 = $s5
    ->subInt64($carry5
    ->shiftLeft(21));
  $carry7 = $s7
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s8 = $s8
    ->addInt64($carry7);
  $s7 = $s7
    ->subInt64($carry7
    ->shiftLeft(21));
  $carry9 = $s9
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s10 = $s10
    ->addInt64($carry9);
  $s9 = $s9
    ->subInt64($carry9
    ->shiftLeft(21));
  $carry11 = $s11
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s12 = $s12
    ->addInt64($carry11);
  $s11 = $s11
    ->subInt64($carry11
    ->shiftLeft(21));
  $carry13 = $s13
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s14 = $s14
    ->addInt64($carry13);
  $s13 = $s13
    ->subInt64($carry13
    ->shiftLeft(21));
  $carry15 = $s15
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s16 = $s16
    ->addInt64($carry15);
  $s15 = $s15
    ->subInt64($carry15
    ->shiftLeft(21));
  $carry17 = $s17
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s18 = $s18
    ->addInt64($carry17);
  $s17 = $s17
    ->subInt64($carry17
    ->shiftLeft(21));
  $carry19 = $s19
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s20 = $s20
    ->addInt64($carry19);
  $s19 = $s19
    ->subInt64($carry19
    ->shiftLeft(21));
  $carry21 = $s21
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s22 = $s22
    ->addInt64($carry21);
  $s21 = $s21
    ->subInt64($carry21
    ->shiftLeft(21));
  $s11 = $s11
    ->addInt64($s23
    ->mulInt(666643, 20));
  $s12 = $s12
    ->addInt64($s23
    ->mulInt(470296, 19));
  $s13 = $s13
    ->addInt64($s23
    ->mulInt(654183, 20));
  $s14 = $s14
    ->subInt64($s23
    ->mulInt(997805, 20));
  $s15 = $s15
    ->addInt64($s23
    ->mulInt(136657, 18));
  $s16 = $s16
    ->subInt64($s23
    ->mulInt(683901, 20));
  $s10 = $s10
    ->addInt64($s22
    ->mulInt(666643, 20));
  $s11 = $s11
    ->addInt64($s22
    ->mulInt(470296, 19));
  $s12 = $s12
    ->addInt64($s22
    ->mulInt(654183, 20));
  $s13 = $s13
    ->subInt64($s22
    ->mulInt(997805, 20));
  $s14 = $s14
    ->addInt64($s22
    ->mulInt(136657, 18));
  $s15 = $s15
    ->subInt64($s22
    ->mulInt(683901, 20));
  $s9 = $s9
    ->addInt64($s21
    ->mulInt(666643, 20));
  $s10 = $s10
    ->addInt64($s21
    ->mulInt(470296, 19));
  $s11 = $s11
    ->addInt64($s21
    ->mulInt(654183, 20));
  $s12 = $s12
    ->subInt64($s21
    ->mulInt(997805, 20));
  $s13 = $s13
    ->addInt64($s21
    ->mulInt(136657, 18));
  $s14 = $s14
    ->subInt64($s21
    ->mulInt(683901, 20));
  $s8 = $s8
    ->addInt64($s20
    ->mulInt(666643, 20));
  $s9 = $s9
    ->addInt64($s20
    ->mulInt(470296, 19));
  $s10 = $s10
    ->addInt64($s20
    ->mulInt(654183, 20));
  $s11 = $s11
    ->subInt64($s20
    ->mulInt(997805, 20));
  $s12 = $s12
    ->addInt64($s20
    ->mulInt(136657, 18));
  $s13 = $s13
    ->subInt64($s20
    ->mulInt(683901, 20));
  $s7 = $s7
    ->addInt64($s19
    ->mulInt(666643, 20));
  $s8 = $s8
    ->addInt64($s19
    ->mulInt(470296, 19));
  $s9 = $s9
    ->addInt64($s19
    ->mulInt(654183, 20));
  $s10 = $s10
    ->subInt64($s19
    ->mulInt(997805, 20));
  $s11 = $s11
    ->addInt64($s19
    ->mulInt(136657, 18));
  $s12 = $s12
    ->subInt64($s19
    ->mulInt(683901, 20));
  $s6 = $s6
    ->addInt64($s18
    ->mulInt(666643, 20));
  $s7 = $s7
    ->addInt64($s18
    ->mulInt(470296, 19));
  $s8 = $s8
    ->addInt64($s18
    ->mulInt(654183, 20));
  $s9 = $s9
    ->subInt64($s18
    ->mulInt(997805, 20));
  $s10 = $s10
    ->addInt64($s18
    ->mulInt(136657, 18));
  $s11 = $s11
    ->subInt64($s18
    ->mulInt(683901, 20));
  $carry6 = $s6
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s7 = $s7
    ->addInt64($carry6);
  $s6 = $s6
    ->subInt64($carry6
    ->shiftLeft(21));
  $carry8 = $s8
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s9 = $s9
    ->addInt64($carry8);
  $s8 = $s8
    ->subInt64($carry8
    ->shiftLeft(21));
  $carry10 = $s10
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s11 = $s11
    ->addInt64($carry10);
  $s10 = $s10
    ->subInt64($carry10
    ->shiftLeft(21));
  $carry12 = $s12
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s13 = $s13
    ->addInt64($carry12);
  $s12 = $s12
    ->subInt64($carry12
    ->shiftLeft(21));
  $carry14 = $s14
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s15 = $s15
    ->addInt64($carry14);
  $s14 = $s14
    ->subInt64($carry14
    ->shiftLeft(21));
  $carry16 = $s16
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s17 = $s17
    ->addInt64($carry16);
  $s16 = $s16
    ->subInt64($carry16
    ->shiftLeft(21));
  $carry7 = $s7
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s8 = $s8
    ->addInt64($carry7);
  $s7 = $s7
    ->subInt64($carry7
    ->shiftLeft(21));
  $carry9 = $s9
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s10 = $s10
    ->addInt64($carry9);
  $s9 = $s9
    ->subInt64($carry9
    ->shiftLeft(21));
  $carry11 = $s11
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s12 = $s12
    ->addInt64($carry11);
  $s11 = $s11
    ->subInt64($carry11
    ->shiftLeft(21));
  $carry13 = $s13
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s14 = $s14
    ->addInt64($carry13);
  $s13 = $s13
    ->subInt64($carry13
    ->shiftLeft(21));
  $carry15 = $s15
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s16 = $s16
    ->addInt64($carry15);
  $s15 = $s15
    ->subInt64($carry15
    ->shiftLeft(21));
  $s5 = $s5
    ->addInt64($s17
    ->mulInt(666643, 20));
  $s6 = $s6
    ->addInt64($s17
    ->mulInt(470296, 19));
  $s7 = $s7
    ->addInt64($s17
    ->mulInt(654183, 20));
  $s8 = $s8
    ->subInt64($s17
    ->mulInt(997805, 20));
  $s9 = $s9
    ->addInt64($s17
    ->mulInt(136657, 18));
  $s10 = $s10
    ->subInt64($s17
    ->mulInt(683901, 20));
  $s4 = $s4
    ->addInt64($s16
    ->mulInt(666643, 20));
  $s5 = $s5
    ->addInt64($s16
    ->mulInt(470296, 19));
  $s6 = $s6
    ->addInt64($s16
    ->mulInt(654183, 20));
  $s7 = $s7
    ->subInt64($s16
    ->mulInt(997805, 20));
  $s8 = $s8
    ->addInt64($s16
    ->mulInt(136657, 18));
  $s9 = $s9
    ->subInt64($s16
    ->mulInt(683901, 20));
  $s3 = $s3
    ->addInt64($s15
    ->mulInt(666643, 20));
  $s4 = $s4
    ->addInt64($s15
    ->mulInt(470296, 19));
  $s5 = $s5
    ->addInt64($s15
    ->mulInt(654183, 20));
  $s6 = $s6
    ->subInt64($s15
    ->mulInt(997805, 20));
  $s7 = $s7
    ->addInt64($s15
    ->mulInt(136657, 18));
  $s8 = $s8
    ->subInt64($s15
    ->mulInt(683901, 20));
  $s2 = $s2
    ->addInt64($s14
    ->mulInt(666643, 20));
  $s3 = $s3
    ->addInt64($s14
    ->mulInt(470296, 19));
  $s4 = $s4
    ->addInt64($s14
    ->mulInt(654183, 20));
  $s5 = $s5
    ->subInt64($s14
    ->mulInt(997805, 20));
  $s6 = $s6
    ->addInt64($s14
    ->mulInt(136657, 18));
  $s7 = $s7
    ->subInt64($s14
    ->mulInt(683901, 20));
  $s1 = $s1
    ->addInt64($s13
    ->mulInt(666643, 20));
  $s2 = $s2
    ->addInt64($s13
    ->mulInt(470296, 19));
  $s3 = $s3
    ->addInt64($s13
    ->mulInt(654183, 20));
  $s4 = $s4
    ->subInt64($s13
    ->mulInt(997805, 20));
  $s5 = $s5
    ->addInt64($s13
    ->mulInt(136657, 18));
  $s6 = $s6
    ->subInt64($s13
    ->mulInt(683901, 20));
  $s0 = $s0
    ->addInt64($s12
    ->mulInt(666643, 20));
  $s1 = $s1
    ->addInt64($s12
    ->mulInt(470296, 19));
  $s2 = $s2
    ->addInt64($s12
    ->mulInt(654183, 20));
  $s3 = $s3
    ->subInt64($s12
    ->mulInt(997805, 20));
  $s4 = $s4
    ->addInt64($s12
    ->mulInt(136657, 18));
  $s5 = $s5
    ->subInt64($s12
    ->mulInt(683901, 20));
  $s12 = new ParagonIE_Sodium_Core32_Int64();
  $carry0 = $s0
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s1 = $s1
    ->addInt64($carry0);
  $s0 = $s0
    ->subInt64($carry0
    ->shiftLeft(21));
  $carry2 = $s2
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s3 = $s3
    ->addInt64($carry2);
  $s2 = $s2
    ->subInt64($carry2
    ->shiftLeft(21));
  $carry4 = $s4
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s5 = $s5
    ->addInt64($carry4);
  $s4 = $s4
    ->subInt64($carry4
    ->shiftLeft(21));
  $carry6 = $s6
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s7 = $s7
    ->addInt64($carry6);
  $s6 = $s6
    ->subInt64($carry6
    ->shiftLeft(21));
  $carry8 = $s8
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s9 = $s9
    ->addInt64($carry8);
  $s8 = $s8
    ->subInt64($carry8
    ->shiftLeft(21));
  $carry10 = $s10
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s11 = $s11
    ->addInt64($carry10);
  $s10 = $s10
    ->subInt64($carry10
    ->shiftLeft(21));
  $carry1 = $s1
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s2 = $s2
    ->addInt64($carry1);
  $s1 = $s1
    ->subInt64($carry1
    ->shiftLeft(21));
  $carry3 = $s3
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s4 = $s4
    ->addInt64($carry3);
  $s3 = $s3
    ->subInt64($carry3
    ->shiftLeft(21));
  $carry5 = $s5
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s6 = $s6
    ->addInt64($carry5);
  $s5 = $s5
    ->subInt64($carry5
    ->shiftLeft(21));
  $carry7 = $s7
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s8 = $s8
    ->addInt64($carry7);
  $s7 = $s7
    ->subInt64($carry7
    ->shiftLeft(21));
  $carry9 = $s9
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s10 = $s10
    ->addInt64($carry9);
  $s9 = $s9
    ->subInt64($carry9
    ->shiftLeft(21));
  $carry11 = $s11
    ->addInt(1 << 20)
    ->shiftRight(21);
  $s12 = $s12
    ->addInt64($carry11);
  $s11 = $s11
    ->subInt64($carry11
    ->shiftLeft(21));
  $s0 = $s0
    ->addInt64($s12
    ->mulInt(666643, 20));
  $s1 = $s1
    ->addInt64($s12
    ->mulInt(470296, 19));
  $s2 = $s2
    ->addInt64($s12
    ->mulInt(654183, 20));
  $s3 = $s3
    ->subInt64($s12
    ->mulInt(997805, 20));
  $s4 = $s4
    ->addInt64($s12
    ->mulInt(136657, 18));
  $s5 = $s5
    ->subInt64($s12
    ->mulInt(683901, 20));
  $s12 = new ParagonIE_Sodium_Core32_Int64();
  $carry0 = $s0
    ->shiftRight(21);
  $s1 = $s1
    ->addInt64($carry0);
  $s0 = $s0
    ->subInt64($carry0
    ->shiftLeft(21));
  $carry1 = $s1
    ->shiftRight(21);
  $s2 = $s2
    ->addInt64($carry1);
  $s1 = $s1
    ->subInt64($carry1
    ->shiftLeft(21));
  $carry2 = $s2
    ->shiftRight(21);
  $s3 = $s3
    ->addInt64($carry2);
  $s2 = $s2
    ->subInt64($carry2
    ->shiftLeft(21));
  $carry3 = $s3
    ->shiftRight(21);
  $s4 = $s4
    ->addInt64($carry3);
  $s3 = $s3
    ->subInt64($carry3
    ->shiftLeft(21));
  $carry4 = $s4
    ->shiftRight(21);
  $s5 = $s5
    ->addInt64($carry4);
  $s4 = $s4
    ->subInt64($carry4
    ->shiftLeft(21));
  $carry5 = $s5
    ->shiftRight(21);
  $s6 = $s6
    ->addInt64($carry5);
  $s5 = $s5
    ->subInt64($carry5
    ->shiftLeft(21));
  $carry6 = $s6
    ->shiftRight(21);
  $s7 = $s7
    ->addInt64($carry6);
  $s6 = $s6
    ->subInt64($carry6
    ->shiftLeft(21));
  $carry7 = $s7
    ->shiftRight(21);
  $s8 = $s8
    ->addInt64($carry7);
  $s7 = $s7
    ->subInt64($carry7
    ->shiftLeft(21));
  $carry8 = $s8
    ->shiftRight(21);
  $s9 = $s9
    ->addInt64($carry8);
  $s8 = $s8
    ->subInt64($carry8
    ->shiftLeft(21));
  $carry9 = $s9
    ->shiftRight(21);
  $s10 = $s10
    ->addInt64($carry9);
  $s9 = $s9
    ->subInt64($carry9
    ->shiftLeft(21));
  $carry10 = $s10
    ->shiftRight(21);
  $s11 = $s11
    ->addInt64($carry10);
  $s10 = $s10
    ->subInt64($carry10
    ->shiftLeft(21));
  $carry11 = $s11
    ->shiftRight(21);
  $s12 = $s12
    ->addInt64($carry11);
  $s11 = $s11
    ->subInt64($carry11
    ->shiftLeft(21));
  $s0 = $s0
    ->addInt64($s12
    ->mulInt(666643, 20));
  $s1 = $s1
    ->addInt64($s12
    ->mulInt(470296, 19));
  $s2 = $s2
    ->addInt64($s12
    ->mulInt(654183, 20));
  $s3 = $s3
    ->subInt64($s12
    ->mulInt(997805, 20));
  $s4 = $s4
    ->addInt64($s12
    ->mulInt(136657, 18));
  $s5 = $s5
    ->subInt64($s12
    ->mulInt(683901, 20));
  $carry0 = $s0
    ->shiftRight(21);
  $s1 = $s1
    ->addInt64($carry0);
  $s0 = $s0
    ->subInt64($carry0
    ->shiftLeft(21));
  $carry1 = $s1
    ->shiftRight(21);
  $s2 = $s2
    ->addInt64($carry1);
  $s1 = $s1
    ->subInt64($carry1
    ->shiftLeft(21));
  $carry2 = $s2
    ->shiftRight(21);
  $s3 = $s3
    ->addInt64($carry2);
  $s2 = $s2
    ->subInt64($carry2
    ->shiftLeft(21));
  $carry3 = $s3
    ->shiftRight(21);
  $s4 = $s4
    ->addInt64($carry3);
  $s3 = $s3
    ->subInt64($carry3
    ->shiftLeft(21));
  $carry4 = $s4
    ->shiftRight(21);
  $s5 = $s5
    ->addInt64($carry4);
  $s4 = $s4
    ->subInt64($carry4
    ->shiftLeft(21));
  $carry5 = $s5
    ->shiftRight(21);
  $s6 = $s6
    ->addInt64($carry5);
  $s5 = $s5
    ->subInt64($carry5
    ->shiftLeft(21));
  $carry6 = $s6
    ->shiftRight(21);
  $s7 = $s7
    ->addInt64($carry6);
  $s6 = $s6
    ->subInt64($carry6
    ->shiftLeft(21));
  $carry7 = $s7
    ->shiftRight(21);
  $s8 = $s8
    ->addInt64($carry7);
  $s7 = $s7
    ->subInt64($carry7
    ->shiftLeft(21));
  $carry8 = $s10
    ->shiftRight(21);
  $s9 = $s9
    ->addInt64($carry8);
  $s8 = $s8
    ->subInt64($carry8
    ->shiftLeft(21));
  $carry9 = $s9
    ->shiftRight(21);
  $s10 = $s10
    ->addInt64($carry9);
  $s9 = $s9
    ->subInt64($carry9
    ->shiftLeft(21));
  $carry10 = $s10
    ->shiftRight(21);
  $s11 = $s11
    ->addInt64($carry10);
  $s10 = $s10
    ->subInt64($carry10
    ->shiftLeft(21));
  $S0 = $s0
    ->toInt();
  $S1 = $s1
    ->toInt();
  $S2 = $s2
    ->toInt();
  $S3 = $s3
    ->toInt();
  $S4 = $s4
    ->toInt();
  $S5 = $s5
    ->toInt();
  $S6 = $s6
    ->toInt();
  $S7 = $s7
    ->toInt();
  $S8 = $s8
    ->toInt();
  $S9 = $s9
    ->toInt();
  $S10 = $s10
    ->toInt();
  $S11 = $s11
    ->toInt();

  /**
   * @var array<int, int>
   */
  $arr = array(
    (int) (0xff & $S0 >> 0),
    (int) (0xff & $S0 >> 8),
    (int) (0xff & ($S0 >> 16 | $S1 << 5)),
    (int) (0xff & $S1 >> 3),
    (int) (0xff & $S1 >> 11),
    (int) (0xff & ($S1 >> 19 | $S2 << 2)),
    (int) (0xff & $S2 >> 6),
    (int) (0xff & ($S2 >> 14 | $S3 << 7)),
    (int) (0xff & $S3 >> 1),
    (int) (0xff & $S3 >> 9),
    (int) (0xff & ($S3 >> 17 | $S4 << 4)),
    (int) (0xff & $S4 >> 4),
    (int) (0xff & $S4 >> 12),
    (int) (0xff & ($S4 >> 20 | $S5 << 1)),
    (int) (0xff & $S5 >> 7),
    (int) (0xff & ($S5 >> 15 | $S6 << 6)),
    (int) (0xff & $S6 >> 2),
    (int) (0xff & $S6 >> 10),
    (int) (0xff & ($S6 >> 18 | $S7 << 3)),
    (int) (0xff & $S7 >> 5),
    (int) (0xff & $S7 >> 13),
    (int) (0xff & $S8 >> 0),
    (int) (0xff & $S8 >> 8),
    (int) (0xff & ($S8 >> 16 | $S9 << 5)),
    (int) (0xff & $S9 >> 3),
    (int) (0xff & $S9 >> 11),
    (int) (0xff & ($S9 >> 19 | $S10 << 2)),
    (int) (0xff & $S10 >> 6),
    (int) (0xff & ($S10 >> 14 | $S11 << 7)),
    (int) (0xff & $S11 >> 1),
    (int) (0xff & $S11 >> 9),
    (int) (0xff & $S11 >> 17),
  );
  return self::intArrayToString($arr);
}