You are here

public function ParagonIE_Sodium_Core32_Poly1305_State::blocks in Automatic Updates 7

Same name and namespace in other branches
  1. 8 vendor/paragonie/sodium_compat/src/Core32/Poly1305/State.php \ParagonIE_Sodium_Core32_Poly1305_State::blocks()

@internal You should not use this directly from another application

Parameters

string $message:

int $bytes:

Return value

self

Throws

SodiumException

TypeError

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

File

vendor/paragonie/sodium_compat/src/Core32/Poly1305/State.php, line 186

Class

ParagonIE_Sodium_Core32_Poly1305_State
Class ParagonIE_Sodium_Core32_Poly1305_State

Code

public function blocks($message, $bytes) {
  if (self::strlen($message) < 16) {
    $message = str_pad($message, 16, "\0", STR_PAD_RIGHT);
  }
  $hibit = ParagonIE_Sodium_Core32_Int32::fromInt((int) ($this->final ? 0 : 1 << 24));

  /* 1 << 128 */
  $hibit
    ->setUnsignedInt(true);
  $zero = new ParagonIE_Sodium_Core32_Int64(array(
    0,
    0,
    0,
    0,
  ), true);

  /**
   * @var ParagonIE_Sodium_Core32_Int64 $d0
   * @var ParagonIE_Sodium_Core32_Int64 $d1
   * @var ParagonIE_Sodium_Core32_Int64 $d2
   * @var ParagonIE_Sodium_Core32_Int64 $d3
   * @var ParagonIE_Sodium_Core32_Int64 $d4
   * @var ParagonIE_Sodium_Core32_Int64 $r0
   * @var ParagonIE_Sodium_Core32_Int64 $r1
   * @var ParagonIE_Sodium_Core32_Int64 $r2
   * @var ParagonIE_Sodium_Core32_Int64 $r3
   * @var ParagonIE_Sodium_Core32_Int64 $r4
   *
   * @var ParagonIE_Sodium_Core32_Int32 $h0
   * @var ParagonIE_Sodium_Core32_Int32 $h1
   * @var ParagonIE_Sodium_Core32_Int32 $h2
   * @var ParagonIE_Sodium_Core32_Int32 $h3
   * @var ParagonIE_Sodium_Core32_Int32 $h4
   */
  $r0 = $this->r[0]
    ->toInt64();
  $r1 = $this->r[1]
    ->toInt64();
  $r2 = $this->r[2]
    ->toInt64();
  $r3 = $this->r[3]
    ->toInt64();
  $r4 = $this->r[4]
    ->toInt64();
  $s1 = $r1
    ->toInt64()
    ->mulInt(5, 3);
  $s2 = $r2
    ->toInt64()
    ->mulInt(5, 3);
  $s3 = $r3
    ->toInt64()
    ->mulInt(5, 3);
  $s4 = $r4
    ->toInt64()
    ->mulInt(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_Core32_Poly1305::BLOCK_SIZE) {

    /* h += m[i] */
    $h0 = $h0
      ->addInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4))
      ->mask(0x3ffffff))
      ->toInt64();
    $h1 = $h1
      ->addInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 3, 4))
      ->shiftRight(2)
      ->mask(0x3ffffff))
      ->toInt64();
    $h2 = $h2
      ->addInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 6, 4))
      ->shiftRight(4)
      ->mask(0x3ffffff))
      ->toInt64();
    $h3 = $h3
      ->addInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 9, 4))
      ->shiftRight(6)
      ->mask(0x3ffffff))
      ->toInt64();
    $h4 = $h4
      ->addInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4))
      ->shiftRight(8)
      ->orInt32($hibit))
      ->toInt64();

    /* h *= r */
    $d0 = $zero
      ->addInt64($h0
      ->mulInt64($r0, 25))
      ->addInt64($s4
      ->mulInt64($h1, 26))
      ->addInt64($s3
      ->mulInt64($h2, 26))
      ->addInt64($s2
      ->mulInt64($h3, 26))
      ->addInt64($s1
      ->mulInt64($h4, 26));
    $d1 = $zero
      ->addInt64($h0
      ->mulInt64($r1, 25))
      ->addInt64($h1
      ->mulInt64($r0, 25))
      ->addInt64($s4
      ->mulInt64($h2, 26))
      ->addInt64($s3
      ->mulInt64($h3, 26))
      ->addInt64($s2
      ->mulInt64($h4, 26));
    $d2 = $zero
      ->addInt64($h0
      ->mulInt64($r2, 25))
      ->addInt64($h1
      ->mulInt64($r1, 25))
      ->addInt64($h2
      ->mulInt64($r0, 25))
      ->addInt64($s4
      ->mulInt64($h3, 26))
      ->addInt64($s3
      ->mulInt64($h4, 26));
    $d3 = $zero
      ->addInt64($h0
      ->mulInt64($r3, 25))
      ->addInt64($h1
      ->mulInt64($r2, 25))
      ->addInt64($h2
      ->mulInt64($r1, 25))
      ->addInt64($h3
      ->mulInt64($r0, 25))
      ->addInt64($s4
      ->mulInt64($h4, 26));
    $d4 = $zero
      ->addInt64($h0
      ->mulInt64($r4, 25))
      ->addInt64($h1
      ->mulInt64($r3, 25))
      ->addInt64($h2
      ->mulInt64($r2, 25))
      ->addInt64($h3
      ->mulInt64($r1, 25))
      ->addInt64($h4
      ->mulInt64($r0, 25));

    /* (partial) h %= p */
    $c = $d0
      ->shiftRight(26);
    $h0 = $d0
      ->toInt32()
      ->mask(0x3ffffff);
    $d1 = $d1
      ->addInt64($c);
    $c = $d1
      ->shiftRight(26);
    $h1 = $d1
      ->toInt32()
      ->mask(0x3ffffff);
    $d2 = $d2
      ->addInt64($c);
    $c = $d2
      ->shiftRight(26);
    $h2 = $d2
      ->toInt32()
      ->mask(0x3ffffff);
    $d3 = $d3
      ->addInt64($c);
    $c = $d3
      ->shiftRight(26);
    $h3 = $d3
      ->toInt32()
      ->mask(0x3ffffff);
    $d4 = $d4
      ->addInt64($c);
    $c = $d4
      ->shiftRight(26);
    $h4 = $d4
      ->toInt32()
      ->mask(0x3ffffff);
    $h0 = $h0
      ->addInt32($c
      ->toInt32()
      ->mulInt(5, 3));
    $c = $h0
      ->shiftRight(26);
    $h0 = $h0
      ->mask(0x3ffffff);
    $h1 = $h1
      ->addInt32($c);

    // Chop off the left 32 bytes.
    $message = self::substr($message, ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE);
    $bytes -= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE;
  }

  /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
  $this->h = array(
    $h0,
    $h1,
    $h2,
    $h3,
    $h4,
  );
  return $this;
}