Diff: STRATO-apps/wordpress_03/app/wp-includes/sodium_compat/src/Core/Salsa20.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
if (class_exists('ParagonIE_Sodium_Core_Salsa20', false)) {
4
+
return;
5
+
}
6
+
7
+
/**
8
+
* Class ParagonIE_Sodium_Core_Salsa20
9
+
*/
10
+
abstract class ParagonIE_Sodium_Core_Salsa20 extends ParagonIE_Sodium_Core_Util
11
+
{
12
+
const ROUNDS = 20;
13
+
14
+
/**
15
+
* Calculate an salsa20 hash of a single block
16
+
*
17
+
* @internal You should not use this directly from another application
18
+
*
19
+
* @param string $in
20
+
* @param string $k
21
+
* @param string|null $c
22
+
* @return string
23
+
* @throws TypeError
24
+
*/
25
+
public static function core_salsa20($in, $k, $c = null)
26
+
{
27
+
if (self::strlen($k) < 32) {
28
+
throw new RangeException('Key must be 32 bytes long');
29
+
}
30
+
if ($c === null) {
31
+
$j0 = $x0 = 0x61707865;
32
+
$j5 = $x5 = 0x3320646e;
33
+
$j10 = $x10 = 0x79622d32;
34
+
$j15 = $x15 = 0x6b206574;
35
+
} else {
36
+
$j0 = $x0 = self::load_4(self::substr($c, 0, 4));
37
+
$j5 = $x5 = self::load_4(self::substr($c, 4, 4));
38
+
$j10 = $x10 = self::load_4(self::substr($c, 8, 4));
39
+
$j15 = $x15 = self::load_4(self::substr($c, 12, 4));
40
+
}
41
+
$j1 = $x1 = self::load_4(self::substr($k, 0, 4));
42
+
$j2 = $x2 = self::load_4(self::substr($k, 4, 4));
43
+
$j3 = $x3 = self::load_4(self::substr($k, 8, 4));
44
+
$j4 = $x4 = self::load_4(self::substr($k, 12, 4));
45
+
$j6 = $x6 = self::load_4(self::substr($in, 0, 4));
46
+
$j7 = $x7 = self::load_4(self::substr($in, 4, 4));
47
+
$j8 = $x8 = self::load_4(self::substr($in, 8, 4));
48
+
$j9 = $x9 = self::load_4(self::substr($in, 12, 4));
49
+
$j11 = $x11 = self::load_4(self::substr($k, 16, 4));
50
+
$j12 = $x12 = self::load_4(self::substr($k, 20, 4));
51
+
$j13 = $x13 = self::load_4(self::substr($k, 24, 4));
52
+
$j14 = $x14 = self::load_4(self::substr($k, 28, 4));
53
+
54
+
for ($i = self::ROUNDS; $i > 0; $i -= 2) {
55
+
$x4 ^= self::rotate($x0 + $x12, 7);
56
+
$x8 ^= self::rotate($x4 + $x0, 9);
57
+
$x12 ^= self::rotate($x8 + $x4, 13);
58
+
$x0 ^= self::rotate($x12 + $x8, 18);
59
+
60
+
$x9 ^= self::rotate($x5 + $x1, 7);
61
+
$x13 ^= self::rotate($x9 + $x5, 9);
62
+
$x1 ^= self::rotate($x13 + $x9, 13);
63
+
$x5 ^= self::rotate($x1 + $x13, 18);
64
+
65
+
$x14 ^= self::rotate($x10 + $x6, 7);
66
+
$x2 ^= self::rotate($x14 + $x10, 9);
67
+
$x6 ^= self::rotate($x2 + $x14, 13);
68
+
$x10 ^= self::rotate($x6 + $x2, 18);
69
+
70
+
$x3 ^= self::rotate($x15 + $x11, 7);
71
+
$x7 ^= self::rotate($x3 + $x15, 9);
72
+
$x11 ^= self::rotate($x7 + $x3, 13);
73
+
$x15 ^= self::rotate($x11 + $x7, 18);
74
+
75
+
$x1 ^= self::rotate($x0 + $x3, 7);
76
+
$x2 ^= self::rotate($x1 + $x0, 9);
77
+
$x3 ^= self::rotate($x2 + $x1, 13);
78
+
$x0 ^= self::rotate($x3 + $x2, 18);
79
+
80
+
$x6 ^= self::rotate($x5 + $x4, 7);
81
+
$x7 ^= self::rotate($x6 + $x5, 9);
82
+
$x4 ^= self::rotate($x7 + $x6, 13);
83
+
$x5 ^= self::rotate($x4 + $x7, 18);
84
+
85
+
$x11 ^= self::rotate($x10 + $x9, 7);
86
+
$x8 ^= self::rotate($x11 + $x10, 9);
87
+
$x9 ^= self::rotate($x8 + $x11, 13);
88
+
$x10 ^= self::rotate($x9 + $x8, 18);
89
+
90
+
$x12 ^= self::rotate($x15 + $x14, 7);
91
+
$x13 ^= self::rotate($x12 + $x15, 9);
92
+
$x14 ^= self::rotate($x13 + $x12, 13);
93
+
$x15 ^= self::rotate($x14 + $x13, 18);
94
+
}
95
+
96
+
$x0 += $j0;
97
+
$x1 += $j1;
98
+
$x2 += $j2;
99
+
$x3 += $j3;
100
+
$x4 += $j4;
101
+
$x5 += $j5;
102
+
$x6 += $j6;
103
+
$x7 += $j7;
104
+
$x8 += $j8;
105
+
$x9 += $j9;
106
+
$x10 += $j10;
107
+
$x11 += $j11;
108
+
$x12 += $j12;
109
+
$x13 += $j13;
110
+
$x14 += $j14;
111
+
$x15 += $j15;
112
+
113
+
return self::store32_le($x0) .
114
+
self::store32_le($x1) .
115
+
self::store32_le($x2) .
116
+
self::store32_le($x3) .
117
+
self::store32_le($x4) .
118
+
self::store32_le($x5) .
119
+
self::store32_le($x6) .
120
+
self::store32_le($x7) .
121
+
self::store32_le($x8) .
122
+
self::store32_le($x9) .
123
+
self::store32_le($x10) .
124
+
self::store32_le($x11) .
125
+
self::store32_le($x12) .
126
+
self::store32_le($x13) .
127
+
self::store32_le($x14) .
128
+
self::store32_le($x15);
129
+
}
130
+
131
+
/**
132
+
* @internal You should not use this directly from another application
133
+
*
134
+
* @param int $len
135
+
* @param string $nonce
136
+
* @param string $key
137
+
* @return string
138
+
* @throws SodiumException
139
+
* @throws TypeError
140
+
*/
141
+
public static function salsa20($len, $nonce, $key)
142
+
{
143
+
if (self::strlen($key) !== 32) {
144
+
throw new RangeException('Key must be 32 bytes long');
145
+
}
146
+
$kcopy = '' . $key;
147
+
$in = self::substr($nonce, 0, 8) . str_repeat("\0", 8);
148
+
$c = '';
149
+
while ($len >= 64) {
150
+
$c .= self::core_salsa20($in, $kcopy, null);
151
+
$u = 1;
152
+
// Internal counter.
153
+
for ($i = 8; $i < 16; ++$i) {
154
+
$u += self::chrToInt($in[$i]);
155
+
$in[$i] = self::intToChr($u & 0xff);
156
+
$u >>= 8;
157
+
}
158
+
$len -= 64;
159
+
}
160
+
if ($len > 0) {
161
+
$c .= self::substr(
162
+
self::core_salsa20($in, $kcopy, null),
163
+
0,
164
+
$len
165
+
);
166
+
}
167
+
try {
168
+
ParagonIE_Sodium_Compat::memzero($kcopy);
169
+
} catch (SodiumException $ex) {
170
+
$kcopy = null;
171
+
}
172
+
return $c;
173
+
}
174
+
175
+
/**
176
+
* @internal You should not use this directly from another application
177
+
*
178
+
* @param string $m
179
+
* @param string $n
180
+
* @param int $ic
181
+
* @param string $k
182
+
* @return string
183
+
* @throws SodiumException
184
+
* @throws TypeError
185
+
*/
186
+
public static function salsa20_xor_ic($m, $n, $ic, $k)
187
+
{
188
+
$mlen = self::strlen($m);
189
+
if ($mlen < 1) {
190
+
return '';
191
+
}
192
+
$kcopy = self::substr($k, 0, 32);
193
+
$in = self::substr($n, 0, 8);
194
+
// Initialize the counter
195
+
$in .= ParagonIE_Sodium_Core_Util::store64_le($ic);
196
+
197
+
$c = '';
198
+
while ($mlen >= 64) {
199
+
$block = self::core_salsa20($in, $kcopy, null);
200
+
$c .= self::xorStrings(
201
+
self::substr($m, 0, 64),
202
+
self::substr($block, 0, 64)
203
+
);
204
+
$u = 1;
205
+
for ($i = 8; $i < 16; ++$i) {
206
+
$u += self::chrToInt($in[$i]);
207
+
$in[$i] = self::intToChr($u & 0xff);
208
+
$u >>= 8;
209
+
}
210
+
211
+
$mlen -= 64;
212
+
$m = self::substr($m, 64);
213
+
}
214
+
215
+
if ($mlen) {
216
+
$block = self::core_salsa20($in, $kcopy, null);
217
+
$c .= self::xorStrings(
218
+
self::substr($m, 0, $mlen),
219
+
self::substr($block, 0, $mlen)
220
+
);
221
+
}
222
+
try {
223
+
ParagonIE_Sodium_Compat::memzero($block);
224
+
ParagonIE_Sodium_Compat::memzero($kcopy);
225
+
} catch (SodiumException $ex) {
226
+
$block = null;
227
+
$kcopy = null;
228
+
}
229
+
230
+
return $c;
231
+
}
232
+
233
+
/**
234
+
* @internal You should not use this directly from another application
235
+
*
236
+
* @param string $message
237
+
* @param string $nonce
238
+
* @param string $key
239
+
* @return string
240
+
* @throws SodiumException
241
+
* @throws TypeError
242
+
*/
243
+
public static function salsa20_xor($message, $nonce, $key)
244
+
{
245
+
return self::xorStrings(
246
+
$message,
247
+
self::salsa20(
248
+
self::strlen($message),
249
+
$nonce,
250
+
$key
251
+
)
252
+
);
253
+
}
254
+
255
+
/**
256
+
* @internal You should not use this directly from another application
257
+
*
258
+
* @param int $u
259
+
* @param int $c
260
+
* @return int
261
+
*/
262
+
public static function rotate($u, $c)
263
+
{
264
+
$u &= 0xffffffff;
265
+
$c %= 32;
266
+
return (int) (0xffffffff & (
267
+
($u << $c)
268
+
|
269
+
($u >> (32 - $c))
270
+
)
271
+
);
272
+
}
273
+
}
274
+