You are here

public static function ParagonIE_Sodium_Crypto::secretbox in Automatic Updates 8

Same name and namespace in other branches
  1. 7 vendor/paragonie/sodium_compat/src/Crypto.php \ParagonIE_Sodium_Crypto::secretbox()

XSalsa20-Poly1305 authenticated symmetric-key encryption.

@internal Do not use this directly. Use ParagonIE_Sodium_Compat.

Parameters

string $plaintext:

string $nonce:

string $key:

Return value

string

Throws

SodiumException

TypeError

2 calls to ParagonIE_Sodium_Crypto::secretbox()
ParagonIE_Sodium_Compat::crypto_secretbox in vendor/paragonie/sodium_compat/src/Compat.php
Authenticated symmetric-key encryption.
ParagonIE_Sodium_Crypto::box in vendor/paragonie/sodium_compat/src/Crypto.php
X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption

File

vendor/paragonie/sodium_compat/src/Crypto.php, line 945

Class

ParagonIE_Sodium_Crypto
Class ParagonIE_Sodium_Crypto

Code

public static function secretbox($plaintext, $nonce, $key) {

  /** @var string $subkey */
  $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key);

  /** @var string $block0 */
  $block0 = str_repeat("\0", 32);

  /** @var int $mlen - Length of the plaintext message */
  $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext);
  $mlen0 = $mlen;
  if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) {
    $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES;
  }
  $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0);

  /** @var string $block0 */
  $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor($block0, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey);

  /** @var string $c */
  $c = ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES);
  if ($mlen > $mlen0) {
    $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic(ParagonIE_Sodium_Core_Util::substr($plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, $subkey);
  }
  $state = new ParagonIE_Sodium_Core_Poly1305_State(ParagonIE_Sodium_Core_Util::substr($block0, 0, self::onetimeauth_poly1305_KEYBYTES));
  try {
    ParagonIE_Sodium_Compat::memzero($block0);
    ParagonIE_Sodium_Compat::memzero($subkey);
  } catch (SodiumException $ex) {
    $block0 = null;
    $subkey = null;
  }
  $state
    ->update($c);

  /** @var string $c - MAC || ciphertext */
  $c = $state
    ->finish() . $c;
  unset($state);
  return $c;
}