You are here

public function ParagonIE_Sodium_Core_Poly1305_State::blocks in Automatic Updates 8

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

@internal You should not use this directly from another application

Parameters

string $message:

int $bytes:

Return value

self

Throws

TypeError

2 calls to ParagonIE_Sodium_Core_Poly1305_State::blocks()
ParagonIE_Sodium_Core_Poly1305_State::finish in vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php
@internal You should not use this directly from another application
ParagonIE_Sodium_Core_Poly1305_State::update in vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php
@internal You should not use this directly from another application

File

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

Class

ParagonIE_Sodium_Core_Poly1305_State
Class ParagonIE_Sodium_Core_Poly1305_State

Code

public function blocks($message, $bytes) {
  if (self::strlen($message) < 16) {
    $message = str_pad($message, 16, "\0", STR_PAD_RIGHT);
  }

  /** @var int $hibit */
  $hibit = $this->final ? 0 : 1 << 24;

  /* 1 << 128 */
  $r0 = (int) $this->r[0];
  $r1 = (int) $this->r[1];
  $r2 = (int) $this->r[2];
  $r3 = (int) $this->r[3];
  $r4 = (int) $this->r[4];
  $s1 = self::mul($r1, 5, 3);
  $s2 = self::mul($r2, 5, 3);
  $s3 = self::mul($r3, 5, 3);
  $s4 = self::mul($r4, 5, 3);
  $h0 = $this->h[0];
  $h1 = $this->h[1];
  $h2 = $this->h[2];
  $h3 = $this->h[3];
  $h4 = $this->h[4];
  while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {

    /* h += m[i] */
    $h0 += self::load_4(self::substr($message, 0, 4)) & 0x3ffffff;
    $h1 += self::load_4(self::substr($message, 3, 4)) >> 2 & 0x3ffffff;
    $h2 += self::load_4(self::substr($message, 6, 4)) >> 4 & 0x3ffffff;
    $h3 += self::load_4(self::substr($message, 9, 4)) >> 6 & 0x3ffffff;
    $h4 += self::load_4(self::substr($message, 12, 4)) >> 8 | $hibit;

    /* h *= r */
    $d0 = self::mul($h0, $r0, 25) + self::mul($s4, $h1, 26) + self::mul($s3, $h2, 26) + self::mul($s2, $h3, 26) + self::mul($s1, $h4, 26);
    $d1 = self::mul($h0, $r1, 25) + self::mul($h1, $r0, 25) + self::mul($s4, $h2, 26) + self::mul($s3, $h3, 26) + self::mul($s2, $h4, 26);
    $d2 = self::mul($h0, $r2, 25) + self::mul($h1, $r1, 25) + self::mul($h2, $r0, 25) + self::mul($s4, $h3, 26) + self::mul($s3, $h4, 26);
    $d3 = self::mul($h0, $r3, 25) + self::mul($h1, $r2, 25) + self::mul($h2, $r1, 25) + self::mul($h3, $r0, 25) + self::mul($s4, $h4, 26);
    $d4 = self::mul($h0, $r4, 25) + self::mul($h1, $r3, 25) + self::mul($h2, $r2, 25) + self::mul($h3, $r1, 25) + self::mul($h4, $r0, 25);

    /* (partial) h %= p */

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

    /** @var int $h0 */
    $h0 = $d0 & 0x3ffffff;
    $d1 += $c;

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

    /** @var int $h1 */
    $h1 = $d1 & 0x3ffffff;
    $d2 += $c;

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

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

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

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

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

    /** @var int $h4 */
    $h4 = $d4 & 0x3ffffff;
    $h0 += (int) self::mul($c, 5, 3);

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

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

    // Chop off the left 32 bytes.
    $message = self::substr($message, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE);
    $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE;
  }
  $this->h = array(
    (int) ($h0 & 0xffffffff),
    (int) ($h1 & 0xffffffff),
    (int) ($h2 & 0xffffffff),
    (int) ($h3 & 0xffffffff),
    (int) ($h4 & 0xffffffff),
  );
  return $this;
}