You are here

public static function ParagonIE_Sodium_Core_Curve25519::sc_muladd in Automatic Updates 8

Same name and namespace in other branches
  1. 7 vendor/paragonie/sodium_compat/src/Core/Curve25519.php \ParagonIE_Sodium_Core_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

TypeError

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

File

vendor/paragonie/sodium_compat/src/Core/Curve25519.php, line 2003

Class

ParagonIE_Sodium_Core_Curve25519
Class ParagonIE_Sodium_Core_Curve25519

Code

public static function sc_muladd($a, $b, $c) {

  /** @var int $a0 */
  $a0 = 2097151 & self::load_3(self::substr($a, 0, 3));

  /** @var int $a1 */
  $a1 = 2097151 & self::load_4(self::substr($a, 2, 4)) >> 5;

  /** @var int $a2 */
  $a2 = 2097151 & self::load_3(self::substr($a, 5, 3)) >> 2;

  /** @var int $a3 */
  $a3 = 2097151 & self::load_4(self::substr($a, 7, 4)) >> 7;

  /** @var int $a4 */
  $a4 = 2097151 & self::load_4(self::substr($a, 10, 4)) >> 4;

  /** @var int $a5 */
  $a5 = 2097151 & self::load_3(self::substr($a, 13, 3)) >> 1;

  /** @var int $a6 */
  $a6 = 2097151 & self::load_4(self::substr($a, 15, 4)) >> 6;

  /** @var int $a7 */
  $a7 = 2097151 & self::load_3(self::substr($a, 18, 3)) >> 3;

  /** @var int $a8 */
  $a8 = 2097151 & self::load_3(self::substr($a, 21, 3));

  /** @var int $a9 */
  $a9 = 2097151 & self::load_4(self::substr($a, 23, 4)) >> 5;

  /** @var int $a10 */
  $a10 = 2097151 & self::load_3(self::substr($a, 26, 3)) >> 2;

  /** @var int $a11 */
  $a11 = self::load_4(self::substr($a, 28, 4)) >> 7;

  /** @var int $b0 */
  $b0 = 2097151 & self::load_3(self::substr($b, 0, 3));

  /** @var int $b1 */
  $b1 = 2097151 & self::load_4(self::substr($b, 2, 4)) >> 5;

  /** @var int $b2 */
  $b2 = 2097151 & self::load_3(self::substr($b, 5, 3)) >> 2;

  /** @var int $b3 */
  $b3 = 2097151 & self::load_4(self::substr($b, 7, 4)) >> 7;

  /** @var int $b4 */
  $b4 = 2097151 & self::load_4(self::substr($b, 10, 4)) >> 4;

  /** @var int $b5 */
  $b5 = 2097151 & self::load_3(self::substr($b, 13, 3)) >> 1;

  /** @var int $b6 */
  $b6 = 2097151 & self::load_4(self::substr($b, 15, 4)) >> 6;

  /** @var int $b7 */
  $b7 = 2097151 & self::load_3(self::substr($b, 18, 3)) >> 3;

  /** @var int $b8 */
  $b8 = 2097151 & self::load_3(self::substr($b, 21, 3));

  /** @var int $b9 */
  $b9 = 2097151 & self::load_4(self::substr($b, 23, 4)) >> 5;

  /** @var int $b10 */
  $b10 = 2097151 & self::load_3(self::substr($b, 26, 3)) >> 2;

  /** @var int $b11 */
  $b11 = self::load_4(self::substr($b, 28, 4)) >> 7;

  /** @var int $c0 */
  $c0 = 2097151 & self::load_3(self::substr($c, 0, 3));

  /** @var int $c1 */
  $c1 = 2097151 & self::load_4(self::substr($c, 2, 4)) >> 5;

  /** @var int $c2 */
  $c2 = 2097151 & self::load_3(self::substr($c, 5, 3)) >> 2;

  /** @var int $c3 */
  $c3 = 2097151 & self::load_4(self::substr($c, 7, 4)) >> 7;

  /** @var int $c4 */
  $c4 = 2097151 & self::load_4(self::substr($c, 10, 4)) >> 4;

  /** @var int $c5 */
  $c5 = 2097151 & self::load_3(self::substr($c, 13, 3)) >> 1;

  /** @var int $c6 */
  $c6 = 2097151 & self::load_4(self::substr($c, 15, 4)) >> 6;

  /** @var int $c7 */
  $c7 = 2097151 & self::load_3(self::substr($c, 18, 3)) >> 3;

  /** @var int $c8 */
  $c8 = 2097151 & self::load_3(self::substr($c, 21, 3));

  /** @var int $c9 */
  $c9 = 2097151 & self::load_4(self::substr($c, 23, 4)) >> 5;

  /** @var int $c10 */
  $c10 = 2097151 & self::load_3(self::substr($c, 26, 3)) >> 2;

  /** @var int $c11 */
  $c11 = self::load_4(self::substr($c, 28, 4)) >> 7;

  /* Can't really avoid the pyramid here: */
  $s0 = $c0 + self::mul($a0, $b0, 24);
  $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24);
  $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24);
  $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24);
  $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) + self::mul($a4, $b0, 24);
  $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) + self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24);
  $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) + self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24);
  $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) + self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24);
  $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) + self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) + self::mul($a8, $b0, 24);
  $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) + self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) + self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24);
  $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) + self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) + self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24);
  $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) + self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) + self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24);
  $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) + self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) + self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24);
  $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) + self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) + self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24);
  $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) + self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) + self::mul($a11, $b3, 24);
  $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) + self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24);
  $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) + self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24);
  $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) + self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24);
  $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) + self::mul($a11, $b7, 24);
  $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24);
  $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24);
  $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24);
  $s22 = self::mul($a11, $b11, 24);
  $s23 = 0;

  /** @var int $carry0 */
  $carry0 = $s0 + (1 << 20) >> 21;
  $s1 += $carry0;
  $s0 -= $carry0 << 21;

  /** @var int $carry2 */
  $carry2 = $s2 + (1 << 20) >> 21;
  $s3 += $carry2;
  $s2 -= $carry2 << 21;

  /** @var int $carry4 */
  $carry4 = $s4 + (1 << 20) >> 21;
  $s5 += $carry4;
  $s4 -= $carry4 << 21;

  /** @var int $carry6 */
  $carry6 = $s6 + (1 << 20) >> 21;
  $s7 += $carry6;
  $s6 -= $carry6 << 21;

  /** @var int $carry8 */
  $carry8 = $s8 + (1 << 20) >> 21;
  $s9 += $carry8;
  $s8 -= $carry8 << 21;

  /** @var int $carry10 */
  $carry10 = $s10 + (1 << 20) >> 21;
  $s11 += $carry10;
  $s10 -= $carry10 << 21;

  /** @var int $carry12 */
  $carry12 = $s12 + (1 << 20) >> 21;
  $s13 += $carry12;
  $s12 -= $carry12 << 21;

  /** @var int $carry14 */
  $carry14 = $s14 + (1 << 20) >> 21;
  $s15 += $carry14;
  $s14 -= $carry14 << 21;

  /** @var int $carry16 */
  $carry16 = $s16 + (1 << 20) >> 21;
  $s17 += $carry16;
  $s16 -= $carry16 << 21;

  /** @var int $carry18 */
  $carry18 = $s18 + (1 << 20) >> 21;
  $s19 += $carry18;
  $s18 -= $carry18 << 21;

  /** @var int $carry20 */
  $carry20 = $s20 + (1 << 20) >> 21;
  $s21 += $carry20;
  $s20 -= $carry20 << 21;

  /** @var int $carry22 */
  $carry22 = $s22 + (1 << 20) >> 21;
  $s23 += $carry22;
  $s22 -= $carry22 << 21;

  /** @var int $carry1 */
  $carry1 = $s1 + (1 << 20) >> 21;
  $s2 += $carry1;
  $s1 -= $carry1 << 21;

  /** @var int $carry3 */
  $carry3 = $s3 + (1 << 20) >> 21;
  $s4 += $carry3;
  $s3 -= $carry3 << 21;

  /** @var int $carry5 */
  $carry5 = $s5 + (1 << 20) >> 21;
  $s6 += $carry5;
  $s5 -= $carry5 << 21;

  /** @var int $carry7 */
  $carry7 = $s7 + (1 << 20) >> 21;
  $s8 += $carry7;
  $s7 -= $carry7 << 21;

  /** @var int $carry9 */
  $carry9 = $s9 + (1 << 20) >> 21;
  $s10 += $carry9;
  $s9 -= $carry9 << 21;

  /** @var int $carry11 */
  $carry11 = $s11 + (1 << 20) >> 21;
  $s12 += $carry11;
  $s11 -= $carry11 << 21;

  /** @var int $carry13 */
  $carry13 = $s13 + (1 << 20) >> 21;
  $s14 += $carry13;
  $s13 -= $carry13 << 21;

  /** @var int $carry15 */
  $carry15 = $s15 + (1 << 20) >> 21;
  $s16 += $carry15;
  $s15 -= $carry15 << 21;

  /** @var int $carry17 */
  $carry17 = $s17 + (1 << 20) >> 21;
  $s18 += $carry17;
  $s17 -= $carry17 << 21;

  /** @var int $carry19 */
  $carry19 = $s19 + (1 << 20) >> 21;
  $s20 += $carry19;
  $s19 -= $carry19 << 21;

  /** @var int $carry21 */
  $carry21 = $s21 + (1 << 20) >> 21;
  $s22 += $carry21;
  $s21 -= $carry21 << 21;
  $s11 += self::mul($s23, 666643, 20);
  $s12 += self::mul($s23, 470296, 19);
  $s13 += self::mul($s23, 654183, 20);
  $s14 -= self::mul($s23, 997805, 20);
  $s15 += self::mul($s23, 136657, 18);
  $s16 -= self::mul($s23, 683901, 20);
  $s10 += self::mul($s22, 666643, 20);
  $s11 += self::mul($s22, 470296, 19);
  $s12 += self::mul($s22, 654183, 20);
  $s13 -= self::mul($s22, 997805, 20);
  $s14 += self::mul($s22, 136657, 18);
  $s15 -= self::mul($s22, 683901, 20);
  $s9 += self::mul($s21, 666643, 20);
  $s10 += self::mul($s21, 470296, 19);
  $s11 += self::mul($s21, 654183, 20);
  $s12 -= self::mul($s21, 997805, 20);
  $s13 += self::mul($s21, 136657, 18);
  $s14 -= self::mul($s21, 683901, 20);
  $s8 += self::mul($s20, 666643, 20);
  $s9 += self::mul($s20, 470296, 19);
  $s10 += self::mul($s20, 654183, 20);
  $s11 -= self::mul($s20, 997805, 20);
  $s12 += self::mul($s20, 136657, 18);
  $s13 -= self::mul($s20, 683901, 20);
  $s7 += self::mul($s19, 666643, 20);
  $s8 += self::mul($s19, 470296, 19);
  $s9 += self::mul($s19, 654183, 20);
  $s10 -= self::mul($s19, 997805, 20);
  $s11 += self::mul($s19, 136657, 18);
  $s12 -= self::mul($s19, 683901, 20);
  $s6 += self::mul($s18, 666643, 20);
  $s7 += self::mul($s18, 470296, 19);
  $s8 += self::mul($s18, 654183, 20);
  $s9 -= self::mul($s18, 997805, 20);
  $s10 += self::mul($s18, 136657, 18);
  $s11 -= self::mul($s18, 683901, 20);

  /** @var int $carry6 */
  $carry6 = $s6 + (1 << 20) >> 21;
  $s7 += $carry6;
  $s6 -= $carry6 << 21;

  /** @var int $carry8 */
  $carry8 = $s8 + (1 << 20) >> 21;
  $s9 += $carry8;
  $s8 -= $carry8 << 21;

  /** @var int $carry10 */
  $carry10 = $s10 + (1 << 20) >> 21;
  $s11 += $carry10;
  $s10 -= $carry10 << 21;

  /** @var int $carry12 */
  $carry12 = $s12 + (1 << 20) >> 21;
  $s13 += $carry12;
  $s12 -= $carry12 << 21;

  /** @var int $carry14 */
  $carry14 = $s14 + (1 << 20) >> 21;
  $s15 += $carry14;
  $s14 -= $carry14 << 21;

  /** @var int $carry16 */
  $carry16 = $s16 + (1 << 20) >> 21;
  $s17 += $carry16;
  $s16 -= $carry16 << 21;

  /** @var int $carry7 */
  $carry7 = $s7 + (1 << 20) >> 21;
  $s8 += $carry7;
  $s7 -= $carry7 << 21;

  /** @var int $carry9 */
  $carry9 = $s9 + (1 << 20) >> 21;
  $s10 += $carry9;
  $s9 -= $carry9 << 21;

  /** @var int $carry11 */
  $carry11 = $s11 + (1 << 20) >> 21;
  $s12 += $carry11;
  $s11 -= $carry11 << 21;

  /** @var int $carry13 */
  $carry13 = $s13 + (1 << 20) >> 21;
  $s14 += $carry13;
  $s13 -= $carry13 << 21;

  /** @var int $carry15 */
  $carry15 = $s15 + (1 << 20) >> 21;
  $s16 += $carry15;
  $s15 -= $carry15 << 21;
  $s5 += self::mul($s17, 666643, 20);
  $s6 += self::mul($s17, 470296, 19);
  $s7 += self::mul($s17, 654183, 20);
  $s8 -= self::mul($s17, 997805, 20);
  $s9 += self::mul($s17, 136657, 18);
  $s10 -= self::mul($s17, 683901, 20);
  $s4 += self::mul($s16, 666643, 20);
  $s5 += self::mul($s16, 470296, 19);
  $s6 += self::mul($s16, 654183, 20);
  $s7 -= self::mul($s16, 997805, 20);
  $s8 += self::mul($s16, 136657, 18);
  $s9 -= self::mul($s16, 683901, 20);
  $s3 += self::mul($s15, 666643, 20);
  $s4 += self::mul($s15, 470296, 19);
  $s5 += self::mul($s15, 654183, 20);
  $s6 -= self::mul($s15, 997805, 20);
  $s7 += self::mul($s15, 136657, 18);
  $s8 -= self::mul($s15, 683901, 20);
  $s2 += self::mul($s14, 666643, 20);
  $s3 += self::mul($s14, 470296, 19);
  $s4 += self::mul($s14, 654183, 20);
  $s5 -= self::mul($s14, 997805, 20);
  $s6 += self::mul($s14, 136657, 18);
  $s7 -= self::mul($s14, 683901, 20);
  $s1 += self::mul($s13, 666643, 20);
  $s2 += self::mul($s13, 470296, 19);
  $s3 += self::mul($s13, 654183, 20);
  $s4 -= self::mul($s13, 997805, 20);
  $s5 += self::mul($s13, 136657, 18);
  $s6 -= self::mul($s13, 683901, 20);
  $s0 += self::mul($s12, 666643, 20);
  $s1 += self::mul($s12, 470296, 19);
  $s2 += self::mul($s12, 654183, 20);
  $s3 -= self::mul($s12, 997805, 20);
  $s4 += self::mul($s12, 136657, 18);
  $s5 -= self::mul($s12, 683901, 20);
  $s12 = 0;

  /** @var int $carry0 */
  $carry0 = $s0 + (1 << 20) >> 21;
  $s1 += $carry0;
  $s0 -= $carry0 << 21;

  /** @var int $carry2 */
  $carry2 = $s2 + (1 << 20) >> 21;
  $s3 += $carry2;
  $s2 -= $carry2 << 21;

  /** @var int $carry4 */
  $carry4 = $s4 + (1 << 20) >> 21;
  $s5 += $carry4;
  $s4 -= $carry4 << 21;

  /** @var int $carry6 */
  $carry6 = $s6 + (1 << 20) >> 21;
  $s7 += $carry6;
  $s6 -= $carry6 << 21;

  /** @var int $carry8 */
  $carry8 = $s8 + (1 << 20) >> 21;
  $s9 += $carry8;
  $s8 -= $carry8 << 21;

  /** @var int $carry10 */
  $carry10 = $s10 + (1 << 20) >> 21;
  $s11 += $carry10;
  $s10 -= $carry10 << 21;

  /** @var int $carry1 */
  $carry1 = $s1 + (1 << 20) >> 21;
  $s2 += $carry1;
  $s1 -= $carry1 << 21;

  /** @var int $carry3 */
  $carry3 = $s3 + (1 << 20) >> 21;
  $s4 += $carry3;
  $s3 -= $carry3 << 21;

  /** @var int $carry5 */
  $carry5 = $s5 + (1 << 20) >> 21;
  $s6 += $carry5;
  $s5 -= $carry5 << 21;

  /** @var int $carry7 */
  $carry7 = $s7 + (1 << 20) >> 21;
  $s8 += $carry7;
  $s7 -= $carry7 << 21;

  /** @var int $carry9 */
  $carry9 = $s9 + (1 << 20) >> 21;
  $s10 += $carry9;
  $s9 -= $carry9 << 21;

  /** @var int $carry11 */
  $carry11 = $s11 + (1 << 20) >> 21;
  $s12 += $carry11;
  $s11 -= $carry11 << 21;
  $s0 += self::mul($s12, 666643, 20);
  $s1 += self::mul($s12, 470296, 19);
  $s2 += self::mul($s12, 654183, 20);
  $s3 -= self::mul($s12, 997805, 20);
  $s4 += self::mul($s12, 136657, 18);
  $s5 -= self::mul($s12, 683901, 20);
  $s12 = 0;

  /** @var int $carry0 */
  $carry0 = $s0 >> 21;
  $s1 += $carry0;
  $s0 -= $carry0 << 21;

  /** @var int $carry1 */
  $carry1 = $s1 >> 21;
  $s2 += $carry1;
  $s1 -= $carry1 << 21;

  /** @var int $carry2 */
  $carry2 = $s2 >> 21;
  $s3 += $carry2;
  $s2 -= $carry2 << 21;

  /** @var int $carry3 */
  $carry3 = $s3 >> 21;
  $s4 += $carry3;
  $s3 -= $carry3 << 21;

  /** @var int $carry4 */
  $carry4 = $s4 >> 21;
  $s5 += $carry4;
  $s4 -= $carry4 << 21;

  /** @var int $carry5 */
  $carry5 = $s5 >> 21;
  $s6 += $carry5;
  $s5 -= $carry5 << 21;

  /** @var int $carry6 */
  $carry6 = $s6 >> 21;
  $s7 += $carry6;
  $s6 -= $carry6 << 21;

  /** @var int $carry7 */
  $carry7 = $s7 >> 21;
  $s8 += $carry7;
  $s7 -= $carry7 << 21;

  /** @var int $carry8 */
  $carry8 = $s8 >> 21;
  $s9 += $carry8;
  $s8 -= $carry8 << 21;

  /** @var int $carry9 */
  $carry9 = $s9 >> 21;
  $s10 += $carry9;
  $s9 -= $carry9 << 21;

  /** @var int $carry10 */
  $carry10 = $s10 >> 21;
  $s11 += $carry10;
  $s10 -= $carry10 << 21;

  /** @var int $carry11 */
  $carry11 = $s11 >> 21;
  $s12 += $carry11;
  $s11 -= $carry11 << 21;
  $s0 += self::mul($s12, 666643, 20);
  $s1 += self::mul($s12, 470296, 19);
  $s2 += self::mul($s12, 654183, 20);
  $s3 -= self::mul($s12, 997805, 20);
  $s4 += self::mul($s12, 136657, 18);
  $s5 -= self::mul($s12, 683901, 20);

  /** @var int $carry0 */
  $carry0 = $s0 >> 21;
  $s1 += $carry0;
  $s0 -= $carry0 << 21;

  /** @var int $carry1 */
  $carry1 = $s1 >> 21;
  $s2 += $carry1;
  $s1 -= $carry1 << 21;

  /** @var int $carry2 */
  $carry2 = $s2 >> 21;
  $s3 += $carry2;
  $s2 -= $carry2 << 21;

  /** @var int $carry3 */
  $carry3 = $s3 >> 21;
  $s4 += $carry3;
  $s3 -= $carry3 << 21;

  /** @var int $carry4 */
  $carry4 = $s4 >> 21;
  $s5 += $carry4;
  $s4 -= $carry4 << 21;

  /** @var int $carry5 */
  $carry5 = $s5 >> 21;
  $s6 += $carry5;
  $s5 -= $carry5 << 21;

  /** @var int $carry6 */
  $carry6 = $s6 >> 21;
  $s7 += $carry6;
  $s6 -= $carry6 << 21;

  /** @var int $carry7 */
  $carry7 = $s7 >> 21;
  $s8 += $carry7;
  $s7 -= $carry7 << 21;

  /** @var int $carry8 */
  $carry8 = $s8 >> 21;
  $s9 += $carry8;
  $s8 -= $carry8 << 21;

  /** @var int $carry9 */
  $carry9 = $s9 >> 21;
  $s10 += $carry9;
  $s9 -= $carry9 << 21;

  /** @var int $carry10 */
  $carry10 = $s10 >> 21;
  $s11 += $carry10;
  $s10 -= $carry10 << 21;

  /**
   * @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),
    0xff & $s11 >> 17,
  );
  return self::intArrayToString($arr);
}