Diff: STRATO-apps/wordpress_03/app/wp-includes/sodium_compat/src/Core/X25519.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
if (class_exists('ParagonIE_Sodium_Core_X25519', false)) {
4
+
return;
5
+
}
6
+
7
+
/**
8
+
* Class ParagonIE_Sodium_Core_X25519
9
+
*/
10
+
abstract class ParagonIE_Sodium_Core_X25519 extends ParagonIE_Sodium_Core_Curve25519
11
+
{
12
+
/**
13
+
* Alters the objects passed to this method in place.
14
+
*
15
+
* @internal You should not use this directly from another application
16
+
*
17
+
* @param ParagonIE_Sodium_Core_Curve25519_Fe $f
18
+
* @param ParagonIE_Sodium_Core_Curve25519_Fe $g
19
+
* @param int $b
20
+
* @return void
21
+
* @psalm-suppress MixedAssignment
22
+
*/
23
+
public static function fe_cswap(
24
+
ParagonIE_Sodium_Core_Curve25519_Fe $f,
25
+
ParagonIE_Sodium_Core_Curve25519_Fe $g,
26
+
$b = 0
27
+
) {
28
+
$b = -$b;
29
+
$x0 = ($f->e0 ^ $g->e0) & $b;
30
+
$x1 = ($f->e1 ^ $g->e1) & $b;
31
+
$x2 = ($f->e2 ^ $g->e2) & $b;
32
+
$x3 = ($f->e3 ^ $g->e3) & $b;
33
+
$x4 = ($f->e4 ^ $g->e4) & $b;
34
+
$x5 = ($f->e5 ^ $g->e5) & $b;
35
+
$x6 = ($f->e6 ^ $g->e6) & $b;
36
+
$x7 = ($f->e7 ^ $g->e7) & $b;
37
+
$x8 = ($f->e8 ^ $g->e8) & $b;
38
+
$x9 = ($f->e9 ^ $g->e9) & $b;
39
+
$f->e0 ^= $x0;
40
+
$f->e1 ^= $x1;
41
+
$f->e2 ^= $x2;
42
+
$f->e3 ^= $x3;
43
+
$f->e4 ^= $x4;
44
+
$f->e5 ^= $x5;
45
+
$f->e6 ^= $x6;
46
+
$f->e7 ^= $x7;
47
+
$f->e8 ^= $x8;
48
+
$f->e9 ^= $x9;
49
+
$g->e0 ^= $x0;
50
+
$g->e1 ^= $x1;
51
+
$g->e2 ^= $x2;
52
+
$g->e3 ^= $x3;
53
+
$g->e4 ^= $x4;
54
+
$g->e5 ^= $x5;
55
+
$g->e6 ^= $x6;
56
+
$g->e7 ^= $x7;
57
+
$g->e8 ^= $x8;
58
+
$g->e9 ^= $x9;
59
+
}
60
+
61
+
/**
62
+
* @internal You should not use this directly from another application
63
+
*
64
+
* @param ParagonIE_Sodium_Core_Curve25519_Fe $f
65
+
* @return ParagonIE_Sodium_Core_Curve25519_Fe
66
+
*/
67
+
public static function fe_mul121666(ParagonIE_Sodium_Core_Curve25519_Fe $f)
68
+
{
69
+
$h0 = self::mul($f->e0, 121666, 17);
70
+
$h1 = self::mul($f->e1, 121666, 17);
71
+
$h2 = self::mul($f->e2, 121666, 17);
72
+
$h3 = self::mul($f->e3, 121666, 17);
73
+
$h4 = self::mul($f->e4, 121666, 17);
74
+
$h5 = self::mul($f->e5, 121666, 17);
75
+
$h6 = self::mul($f->e6, 121666, 17);
76
+
$h7 = self::mul($f->e7, 121666, 17);
77
+
$h8 = self::mul($f->e8, 121666, 17);
78
+
$h9 = self::mul($f->e9, 121666, 17);
79
+
80
+
$carry9 = ($h9 + (1 << 24)) >> 25;
81
+
$h0 += self::mul($carry9, 19, 5);
82
+
$h9 -= $carry9 << 25;
83
+
84
+
$carry1 = ($h1 + (1 << 24)) >> 25;
85
+
$h2 += $carry1;
86
+
$h1 -= $carry1 << 25;
87
+
88
+
$carry3 = ($h3 + (1 << 24)) >> 25;
89
+
$h4 += $carry3;
90
+
$h3 -= $carry3 << 25;
91
+
92
+
$carry5 = ($h5 + (1 << 24)) >> 25;
93
+
$h6 += $carry5;
94
+
$h5 -= $carry5 << 25;
95
+
96
+
$carry7 = ($h7 + (1 << 24)) >> 25;
97
+
$h8 += $carry7;
98
+
$h7 -= $carry7 << 25;
99
+
100
+
101
+
$carry0 = ($h0 + (1 << 25)) >> 26;
102
+
$h1 += $carry0;
103
+
$h0 -= $carry0 << 26;
104
+
105
+
$carry2 = ($h2 + (1 << 25)) >> 26;
106
+
$h3 += $carry2;
107
+
$h2 -= $carry2 << 26;
108
+
109
+
$carry4 = ($h4 + (1 << 25)) >> 26;
110
+
$h5 += $carry4;
111
+
$h4 -= $carry4 << 26;
112
+
113
+
$carry6 = ($h6 + (1 << 25)) >> 26;
114
+
$h7 += $carry6;
115
+
$h6 -= $carry6 << 26;
116
+
117
+
$carry8 = ($h8 + (1 << 25)) >> 26;
118
+
$h9 += $carry8;
119
+
$h8 -= $carry8 << 26;
120
+
return new ParagonIE_Sodium_Core_Curve25519_Fe($h0, $h1, $h2, $h3, $h4, $h5, $h6, $h7, $h8, $h9);
121
+
}
122
+
123
+
/**
124
+
* @internal You should not use this directly from another application
125
+
*
126
+
* Inline comments preceded by # are from libsodium's ref10 code.
127
+
*
128
+
* @param string $n
129
+
* @param string $p
130
+
* @return string
131
+
* @throws SodiumException
132
+
* @throws TypeError
133
+
*/
134
+
public static function crypto_scalarmult_curve25519_ref10($n, $p)
135
+
{
136
+
# for (i = 0;i < 32;++i) e[i] = n[i];
137
+
$e = '' . $n;
138
+
# e[0] &= 248;
139
+
$e[0] = self::intToChr(
140
+
self::chrToInt($e[0]) & 248
141
+
);
142
+
# e[31] &= 127;
143
+
# e[31] |= 64;
144
+
$e[31] = self::intToChr(
145
+
(self::chrToInt($e[31]) & 127) | 64
146
+
);
147
+
# fe_frombytes(x1,p);
148
+
$x1 = self::fe_frombytes($p);
149
+
# fe_1(x2);
150
+
$x2 = self::fe_1();
151
+
# fe_0(z2);
152
+
$z2 = self::fe_0();
153
+
# fe_copy(x3,x1);
154
+
$x3 = self::fe_copy($x1);
155
+
# fe_1(z3);
156
+
$z3 = self::fe_1();
157
+
158
+
# swap = 0;
159
+
/** @var int $swap */
160
+
$swap = 0;
161
+
162
+
# for (pos = 254;pos >= 0;--pos) {
163
+
for ($pos = 254; $pos >= 0; --$pos) {
164
+
# b = e[pos / 8] >> (pos & 7);
165
+
/** @var int $b */
166
+
$b = self::chrToInt(
167
+
$e[(int) floor($pos / 8)]
168
+
) >> ($pos & 7);
169
+
# b &= 1;
170
+
$b &= 1;
171
+
# swap ^= b;
172
+
$swap ^= $b;
173
+
# fe_cswap(x2,x3,swap);
174
+
self::fe_cswap($x2, $x3, $swap);
175
+
# fe_cswap(z2,z3,swap);
176
+
self::fe_cswap($z2, $z3, $swap);
177
+
# swap = b;
178
+
$swap = $b;
179
+
# fe_sub(tmp0,x3,z3);
180
+
$tmp0 = self::fe_sub($x3, $z3);
181
+
# fe_sub(tmp1,x2,z2);
182
+
$tmp1 = self::fe_sub($x2, $z2);
183
+
184
+
# fe_add(x2,x2,z2);
185
+
$x2 = self::fe_add($x2, $z2);
186
+
187
+
# fe_add(z2,x3,z3);
188
+
$z2 = self::fe_add($x3, $z3);
189
+
190
+
# fe_mul(z3,tmp0,x2);
191
+
$z3 = self::fe_mul($tmp0, $x2);
192
+
193
+
# fe_mul(z2,z2,tmp1);
194
+
$z2 = self::fe_mul($z2, $tmp1);
195
+
196
+
# fe_sq(tmp0,tmp1);
197
+
$tmp0 = self::fe_sq($tmp1);
198
+
199
+
# fe_sq(tmp1,x2);
200
+
$tmp1 = self::fe_sq($x2);
201
+
202
+
# fe_add(x3,z3,z2);
203
+
$x3 = self::fe_add($z3, $z2);
204
+
205
+
# fe_sub(z2,z3,z2);
206
+
$z2 = self::fe_sub($z3, $z2);
207
+
208
+
# fe_mul(x2,tmp1,tmp0);
209
+
$x2 = self::fe_mul($tmp1, $tmp0);
210
+
211
+
# fe_sub(tmp1,tmp1,tmp0);
212
+
$tmp1 = self::fe_sub($tmp1, $tmp0);
213
+
214
+
# fe_sq(z2,z2);
215
+
$z2 = self::fe_sq($z2);
216
+
217
+
# fe_mul121666(z3,tmp1);
218
+
$z3 = self::fe_mul121666($tmp1);
219
+
220
+
# fe_sq(x3,x3);
221
+
$x3 = self::fe_sq($x3);
222
+
223
+
# fe_add(tmp0,tmp0,z3);
224
+
$tmp0 = self::fe_add($tmp0, $z3);
225
+
226
+
# fe_mul(z3,x1,z2);
227
+
$z3 = self::fe_mul($x1, $z2);
228
+
229
+
# fe_mul(z2,tmp1,tmp0);
230
+
$z2 = self::fe_mul($tmp1, $tmp0);
231
+
}
232
+
233
+
# fe_cswap(x2,x3,swap);
234
+
self::fe_cswap($x2, $x3, $swap);
235
+
236
+
# fe_cswap(z2,z3,swap);
237
+
self::fe_cswap($z2, $z3, $swap);
238
+
239
+
# fe_invert(z2,z2);
240
+
$z2 = self::fe_invert($z2);
241
+
242
+
# fe_mul(x2,x2,z2);
243
+
$x2 = self::fe_mul($x2, $z2);
244
+
# fe_tobytes(q,x2);
245
+
return self::fe_tobytes($x2);
246
+
}
247
+
248
+
/**
249
+
* @internal You should not use this directly from another application
250
+
*
251
+
* @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY
252
+
* @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ
253
+
* @return ParagonIE_Sodium_Core_Curve25519_Fe
254
+
*/
255
+
public static function edwards_to_montgomery(
256
+
ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY,
257
+
ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ
258
+
) {
259
+
$tempX = self::fe_add($edwardsZ, $edwardsY);
260
+
$tempZ = self::fe_sub($edwardsZ, $edwardsY);
261
+
$tempZ = self::fe_invert($tempZ);
262
+
return self::fe_mul($tempX, $tempZ);
263
+
}
264
+
265
+
/**
266
+
* @internal You should not use this directly from another application
267
+
*
268
+
* @param string $n
269
+
* @return string
270
+
* @throws SodiumException
271
+
* @throws TypeError
272
+
*/
273
+
public static function crypto_scalarmult_curve25519_ref10_base($n)
274
+
{
275
+
# for (i = 0;i < 32;++i) e[i] = n[i];
276
+
$e = '' . $n;
277
+
278
+
# e[0] &= 248;
279
+
$e[0] = self::intToChr(
280
+
self::chrToInt($e[0]) & 248
281
+
);
282
+
283
+
# e[31] &= 127;
284
+
# e[31] |= 64;
285
+
$e[31] = self::intToChr(
286
+
(self::chrToInt($e[31]) & 127) | 64
287
+
);
288
+
289
+
$A = self::ge_scalarmult_base($e);
290
+
if (
291
+
!($A->Y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)
292
+
||
293
+
!($A->Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)
294
+
) {
295
+
throw new TypeError('Null points encountered');
296
+
}
297
+
$pk = self::edwards_to_montgomery($A->Y, $A->Z);
298
+
return self::fe_tobytes($pk);
299
+
}
300
+
}
301
+