You are here

public function ParagonIE_Sodium_Core32_Poly1305_State::update 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::update()

@internal You should not use this directly from another application

Parameters

string $message:

Return value

self

Throws

SodiumException

TypeError

File

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

Class

ParagonIE_Sodium_Core32_Poly1305_State
Class ParagonIE_Sodium_Core32_Poly1305_State

Code

public function update($message = '') {
  $bytes = self::strlen($message);

  /* handle leftover */
  if ($this->leftover) {

    /** @var int $want */
    $want = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - $this->leftover;
    if ($want > $bytes) {
      $want = $bytes;
    }
    for ($i = 0; $i < $want; ++$i) {
      $mi = self::chrToInt($message[$i]);
      $this->buffer[$this->leftover + $i] = $mi;
    }

    // We snip off the leftmost bytes.
    $message = self::substr($message, $want);
    $bytes = self::strlen($message);
    $this->leftover += $want;
    if ($this->leftover < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {

      // We still don't have enough to run $this->blocks()
      return $this;
    }
    $this
      ->blocks(self::intArrayToString($this->buffer), ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE);
    $this->leftover = 0;
  }

  /* process full blocks */
  if ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {

    /** @var int $want */
    $want = $bytes & ~(ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - 1);
    if ($want >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {

      /** @var string $block */
      $block = self::substr($message, 0, $want);
      if (self::strlen($block) >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
        $this
          ->blocks($block, $want);
        $message = self::substr($message, $want);
        $bytes = self::strlen($message);
      }
    }
  }

  /* store leftover */
  if ($bytes) {
    for ($i = 0; $i < $bytes; ++$i) {
      $mi = self::chrToInt($message[$i]);
      $this->buffer[$this->leftover + $i] = $mi;
    }
    $this->leftover = (int) $this->leftover + $bytes;
  }
  return $this;
}