<?php 
declare(strict_types=1); 
 
if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) { 
    return; 
} 
 
/** 
 * Class ParagonIE_Sodium_Core_ChaCha20_IetfCtx 
 */ 
class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx 
{ 
    /** 
     * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor. 
     * 
     * @internal You should not use this directly from another application 
     * 
     * @param string $key     ChaCha20 key. 
     * @param string $iv      Initialization Vector (a.k.a. nonce). 
     * @param string $counter The initial counter value. 
     *                        Defaults to 4 0x00 bytes. 
     * @throws InvalidArgumentException 
     * @throws TypeError 
     */ 
    public function __construct( 
        #[SensitiveParameter] 
        string $key = '', 
        string $iv = '', 
        string $counter = '' 
    ) { 
        if (self::strlen($iv) !== 12) { 
            throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.'); 
        } 
        parent::__construct($key, self::substr($iv, 0, 8), $counter); 
 
        if (!empty($counter)) { 
            $this->container[12] = self::load_4(self::substr($counter, 0, 4)); 
        } 
        $this->container[13] = self::load_4(self::substr($iv, 0, 4)); 
        $this->container[14] = self::load_4(self::substr($iv, 4, 4)); 
        $this->container[15] = self::load_4(self::substr($iv, 8, 4)); 
    } 
} 
 
 |