You are here

public function ParagonIE_Sodium_Core_Poly1305_State::finish in Automatic Updates 7

Same name and namespace in other branches
  1. 8 vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php \ParagonIE_Sodium_Core_Poly1305_State::finish()

@internal You should not use this directly from another application

Return value

string

Throws

TypeError

File

vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php, line 313

Class

ParagonIE_Sodium_Core_Poly1305_State
Class ParagonIE_Sodium_Core_Poly1305_State

Code

public function finish() {

  /* process the remaining block */
  if ($this->leftover) {
    $i = $this->leftover;
    $this->buffer[$i++] = 1;
    for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) {
      $this->buffer[$i] = 0;
    }
    $this->final = true;
    $this
      ->blocks(self::substr(self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE);
  }
  $h0 = (int) $this->h[0];
  $h1 = (int) $this->h[1];
  $h2 = (int) $this->h[2];
  $h3 = (int) $this->h[3];
  $h4 = (int) $this->h[4];

  /** @var int $c */
  $c = $h1 >> 26;

  /** @var int $h1 */
  $h1 &= 0x3ffffff;

  /** @var int $h2 */
  $h2 += $c;

  /** @var int $c */
  $c = $h2 >> 26;

  /** @var int $h2 */
  $h2 &= 0x3ffffff;
  $h3 += $c;

  /** @var int $c */
  $c = $h3 >> 26;
  $h3 &= 0x3ffffff;
  $h4 += $c;

  /** @var int $c */
  $c = $h4 >> 26;
  $h4 &= 0x3ffffff;

  /** @var int $h0 */
  $h0 += self::mul($c, 5, 3);

  /** @var int $c */
  $c = $h0 >> 26;

  /** @var int $h0 */
  $h0 &= 0x3ffffff;

  /** @var int $h1 */
  $h1 += $c;

  /* compute h + -p */

  /** @var int $g0 */
  $g0 = $h0 + 5;

  /** @var int $c */
  $c = $g0 >> 26;

  /** @var int $g0 */
  $g0 &= 0x3ffffff;

  /** @var int $g1 */
  $g1 = $h1 + $c;

  /** @var int $c */
  $c = $g1 >> 26;
  $g1 &= 0x3ffffff;

  /** @var int $g2 */
  $g2 = $h2 + $c;

  /** @var int $c */
  $c = $g2 >> 26;

  /** @var int $g2 */
  $g2 &= 0x3ffffff;

  /** @var int $g3 */
  $g3 = $h3 + $c;

  /** @var int $c */
  $c = $g3 >> 26;

  /** @var int $g3 */
  $g3 &= 0x3ffffff;

  /** @var int $g4 */
  $g4 = $h4 + $c - (1 << 26) & 0xffffffff;

  /* select h if h < p, or h + -p if h >= p */

  /** @var int $mask */
  $mask = ($g4 >> 31) - 1;
  $g0 &= $mask;
  $g1 &= $mask;
  $g2 &= $mask;
  $g3 &= $mask;
  $g4 &= $mask;

  /** @var int $mask */
  $mask = ~$mask & 0xffffffff;

  /** @var int $h0 */
  $h0 = $h0 & $mask | $g0;

  /** @var int $h1 */
  $h1 = $h1 & $mask | $g1;

  /** @var int $h2 */
  $h2 = $h2 & $mask | $g2;

  /** @var int $h3 */
  $h3 = $h3 & $mask | $g3;

  /** @var int $h4 */
  $h4 = $h4 & $mask | $g4;

  /* h = h % (2^128) */

  /** @var int $h0 */
  $h0 = ($h0 | $h1 << 26) & 0xffffffff;

  /** @var int $h1 */
  $h1 = ($h1 >> 6 | $h2 << 20) & 0xffffffff;

  /** @var int $h2 */
  $h2 = ($h2 >> 12 | $h3 << 14) & 0xffffffff;

  /** @var int $h3 */
  $h3 = ($h3 >> 18 | $h4 << 8) & 0xffffffff;

  /* mac = (h + pad) % (2^128) */
  $f = (int) ($h0 + $this->pad[0]);
  $h0 = (int) $f;
  $f = (int) ($h1 + $this->pad[1] + ($f >> 32));
  $h1 = (int) $f;
  $f = (int) ($h2 + $this->pad[2] + ($f >> 32));
  $h2 = (int) $f;
  $f = (int) ($h3 + $this->pad[3] + ($f >> 32));
  $h3 = (int) $f;
  return self::store32_le($h0 & 0xffffffff) . self::store32_le($h1 & 0xffffffff) . self::store32_le($h2 & 0xffffffff) . self::store32_le($h3 & 0xffffffff);
}