Diff: STRATO-apps/wordpress_03/app/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 +
3 + if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
4 + return;
5 + }
6 +
7 + /**
8 + * Class ParagonIE_Sodium_Core_ChaCha20_Ctx
9 + */
10 + class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util implements ArrayAccess
11 + {
12 + /**
13 + * @var SplFixedArray internally, <int, int>
14 + */
15 + protected $container;
16 +
17 + /**
18 + * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
19 + *
20 + * @internal You should not use this directly from another application
21 + *
22 + * @param string $key ChaCha20 key.
23 + * @param string $iv Initialization Vector (a.k.a. nonce).
24 + * @param string $counter The initial counter value.
25 + * Defaults to 8 0x00 bytes.
26 + * @throws InvalidArgumentException
27 + * @throws TypeError
28 + */
29 + public function __construct($key = '', $iv = '', $counter = '')
30 + {
31 + if (self::strlen($key) !== 32) {
32 + throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
33 + }
34 + if (self::strlen($iv) !== 8) {
35 + throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
36 + }
37 + $this->container = new SplFixedArray(16);
38 +
39 + /* "expand 32-byte k" as per ChaCha20 spec */
40 + $this->container[0] = 0x61707865;
41 + $this->container[1] = 0x3320646e;
42 + $this->container[2] = 0x79622d32;
43 + $this->container[3] = 0x6b206574;
44 + $this->container[4] = self::load_4(self::substr($key, 0, 4));
45 + $this->container[5] = self::load_4(self::substr($key, 4, 4));
46 + $this->container[6] = self::load_4(self::substr($key, 8, 4));
47 + $this->container[7] = self::load_4(self::substr($key, 12, 4));
48 + $this->container[8] = self::load_4(self::substr($key, 16, 4));
49 + $this->container[9] = self::load_4(self::substr($key, 20, 4));
50 + $this->container[10] = self::load_4(self::substr($key, 24, 4));
51 + $this->container[11] = self::load_4(self::substr($key, 28, 4));
52 +
53 + $counter = $this->initCounter($counter);
54 + $this->container[12] = self::load_4(self::substr($counter, 0, 4));
55 + $this->container[13] = self::load_4(self::substr($counter, 4, 4));
56 + $this->container[14] = self::load_4(self::substr($iv, 0, 4));
57 + $this->container[15] = self::load_4(self::substr($iv, 4, 4));
58 + }
59 +
60 + /**
61 + * @internal You should not use this directly from another application
62 + *
63 + * @param int $offset
64 + * @param int $value
65 + * @return void
66 + * @psalm-suppress MixedArrayOffset
67 + */
68 + #[ReturnTypeWillChange]
69 + public function offsetSet($offset, $value)
70 + {
71 + if (!is_int($offset)) {
72 + throw new InvalidArgumentException('Expected an integer');
73 + }
74 + if (!is_int($value)) {
75 + throw new InvalidArgumentException('Expected an integer');
76 + }
77 + $this->container[$offset] = $value;
78 + }
79 +
80 + /**
81 + * @internal You should not use this directly from another application
82 + *
83 + * @param int $offset
84 + * @return bool
85 + */
86 + #[ReturnTypeWillChange]
87 + public function offsetExists($offset)
88 + {
89 + return isset($this->container[$offset]);
90 + }
91 +
92 + /**
93 + * @internal You should not use this directly from another application
94 + *
95 + * @param int $offset
96 + * @return void
97 + * @psalm-suppress MixedArrayOffset
98 + */
99 + #[ReturnTypeWillChange]
100 + public function offsetUnset($offset)
101 + {
102 + unset($this->container[$offset]);
103 + }
104 +
105 + /**
106 + * @internal You should not use this directly from another application
107 + *
108 + * @param int $offset
109 + * @return mixed|null
110 + * @psalm-suppress MixedArrayOffset
111 + */
112 + #[ReturnTypeWillChange]
113 + public function offsetGet($offset)
114 + {
115 + return isset($this->container[$offset])
116 + ? $this->container[$offset]
117 + : null;
118 + }
119 +
120 + /**
121 + * Initialize (pad) a counter value.
122 + * @throws SodiumException
123 + *
124 + * @param string $ctr
125 + * @return string
126 + */
127 + public function initCounter(
128 + #[SensitiveParameter]
129 + $ctr
130 + ) {
131 + $len = self::strlen($ctr);
132 + if ($len === 0) {
133 + return str_repeat("\0", 8);
134 + }
135 + if ($len < 8) {
136 + return $ctr . str_repeat("\0", 8 - $len);
137 + }
138 + if ($len > 8) {
139 + throw new SodiumException("counter cannot be more than 8 bytes");
140 + }
141 + return $ctr;
142 + }
143 + }
144 +