1<?php
2
3if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) {
4 return;
5}
6
7/**
8 * Class ParagonIE_Sodium_Core_ChaCha20_IetfCtx
9 */
10class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx
11{
12 /**
13 * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
14 *
15 * @internal You should not use this directly from another application
16 *
17 * @param string $key ChaCha20 key.
18 * @param string $iv Initialization Vector (a.k.a. nonce).
19 * @param string $counter The initial counter value.
20 * Defaults to 4 0x00 bytes.
21 * @throws InvalidArgumentException
22 * @throws TypeError
23 */
24 public function __construct($key = '', $iv = '', $counter = '')
25 {
26 if (self::strlen($iv) !== 12) {
27 throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
28 }
29 $counter = $this->initCounter($counter);
30 parent::__construct($key, self::substr($iv, 0, 8), $counter);
31 $this->container[12] = self::load_4(self::substr($counter, 0, 4));
32 $this->container[13] = self::load_4(self::substr($iv, 0, 4));
33 $this->container[14] = self::load_4(self::substr($iv, 4, 4));
34 $this->container[15] = self::load_4(self::substr($iv, 8, 4));
35 }
36}
37