/var/www/html/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx'false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_ChaCha20_Ctx
 */
class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util implements ArrayAccess
{
    
/**
     * @var SplFixedArray internally, <int, ParagonIE_Sodium_Core32_Int32>
     */
    
protected $container;

    
/**
     * ParagonIE_Sodium_Core_ChaCha20_Ctx 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 8 0x00 bytes.
     * @throws InvalidArgumentException
     * @throws SodiumException
     * @throws TypeError
     */
    
public function __construct($key ''$iv ''$counter '')
    {
        if (
self::strlen($key) !== 32) {
            throw new 
InvalidArgumentException('ChaCha20 expects a 256-bit key.');
        }
        if (
self::strlen($iv) !== 8) {
            throw new 
InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
        }
        
$this->container = new SplFixedArray(16);

        
/* "expand 32-byte k" as per ChaCha20 spec */
        
$this->container[0]  = new ParagonIE_Sodium_Core32_Int32(array(0x61700x7865));
        
$this->container[1]  = new ParagonIE_Sodium_Core32_Int32(array(0x33200x646e));
        
$this->container[2]  = new ParagonIE_Sodium_Core32_Int32(array(0x79620x2d32));
        
$this->container[3]  = new ParagonIE_Sodium_Core32_Int32(array(0x6b200x6574));

        
$this->container[4]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key04));
        
$this->container[5]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key44));
        
$this->container[6]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key84));
        
$this->container[7]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key124));
        
$this->container[8]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key164));
        
$this->container[9]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key204));
        
$this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key244));
        
$this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key284));

        if (empty(
$counter)) {
            
$this->container[12] = new ParagonIE_Sodium_Core32_Int32();
            
$this->container[13] = new ParagonIE_Sodium_Core32_Int32();
        } else {
            
$this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter04));
            
$this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter44));
        }
        
$this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv04));
        
$this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv44));
    }

    
/**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @param int|ParagonIE_Sodium_Core32_Int32 $value
     * @return void
     */
    
#[ReturnTypeWillChange]
    public function 
offsetSet($offset$value)
    {
        if (!
is_int($offset)) {
            throw new 
InvalidArgumentException('Expected an integer');
        }
        if (
$value instanceof ParagonIE_Sodium_Core32_Int32) {
            
/*
        } elseif (is_int($value)) {
            $value = ParagonIE_Sodium_Core32_Int32::fromInt($value);
            */
        
} else {
            throw new 
InvalidArgumentException('Expected an integer');
        }
        
$this->container[$offset] = $value;
    }

    
/**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return bool
     * @psalm-suppress MixedArrayOffset
     */
    
#[ReturnTypeWillChange]
    public function 
offsetExists($offset)
    {
        return isset(
$this->container[$offset]);
    }

    
/**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    
#[ReturnTypeWillChange]
    public function 
offsetUnset($offset)
    {
        unset(
$this->container[$offset]);
    }

    
/**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return mixed|null
     * @psalm-suppress MixedArrayOffset
     */
    
#[ReturnTypeWillChange]
    public function 
offsetGet($offset)
    {
        return isset(
$this->container[$offset])
            ? 
$this->container[$offset]
            : 
null;
    }
}