public function ParagonIE_Sodium_Core_Poly1305_State::blocks in Automatic Updates 7
Same name and namespace in other branches
- 8 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;
}