120 public static function fe_frombytes($s) |
120 public static function fe_frombytes($s) |
121 { |
121 { |
122 if (self::strlen($s) !== 32) { |
122 if (self::strlen($s) !== 32) { |
123 throw new RangeException('Expected a 32-byte string.'); |
123 throw new RangeException('Expected a 32-byte string.'); |
124 } |
124 } |
125 /** @var int $h0 */ |
|
126 $h0 = self::load_4($s); |
125 $h0 = self::load_4($s); |
127 /** @var int $h1 */ |
|
128 $h1 = self::load_3(self::substr($s, 4, 3)) << 6; |
126 $h1 = self::load_3(self::substr($s, 4, 3)) << 6; |
129 /** @var int $h2 */ |
|
130 $h2 = self::load_3(self::substr($s, 7, 3)) << 5; |
127 $h2 = self::load_3(self::substr($s, 7, 3)) << 5; |
131 /** @var int $h3 */ |
|
132 $h3 = self::load_3(self::substr($s, 10, 3)) << 3; |
128 $h3 = self::load_3(self::substr($s, 10, 3)) << 3; |
133 /** @var int $h4 */ |
|
134 $h4 = self::load_3(self::substr($s, 13, 3)) << 2; |
129 $h4 = self::load_3(self::substr($s, 13, 3)) << 2; |
135 /** @var int $h5 */ |
|
136 $h5 = self::load_4(self::substr($s, 16, 4)); |
130 $h5 = self::load_4(self::substr($s, 16, 4)); |
137 /** @var int $h6 */ |
|
138 $h6 = self::load_3(self::substr($s, 20, 3)) << 7; |
131 $h6 = self::load_3(self::substr($s, 20, 3)) << 7; |
139 /** @var int $h7 */ |
|
140 $h7 = self::load_3(self::substr($s, 23, 3)) << 5; |
132 $h7 = self::load_3(self::substr($s, 23, 3)) << 5; |
141 /** @var int $h8 */ |
|
142 $h8 = self::load_3(self::substr($s, 26, 3)) << 4; |
133 $h8 = self::load_3(self::substr($s, 26, 3)) << 4; |
143 /** @var int $h9 */ |
|
144 $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2; |
134 $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2; |
145 |
135 |
146 /** @var int $carry9 */ |
|
147 $carry9 = ($h9 + (1 << 24)) >> 25; |
136 $carry9 = ($h9 + (1 << 24)) >> 25; |
148 $h0 += self::mul($carry9, 19, 5); |
137 $h0 += self::mul($carry9, 19, 5); |
149 $h9 -= $carry9 << 25; |
138 $h9 -= $carry9 << 25; |
150 /** @var int $carry1 */ |
|
151 $carry1 = ($h1 + (1 << 24)) >> 25; |
139 $carry1 = ($h1 + (1 << 24)) >> 25; |
152 $h2 += $carry1; |
140 $h2 += $carry1; |
153 $h1 -= $carry1 << 25; |
141 $h1 -= $carry1 << 25; |
154 /** @var int $carry3 */ |
|
155 $carry3 = ($h3 + (1 << 24)) >> 25; |
142 $carry3 = ($h3 + (1 << 24)) >> 25; |
156 $h4 += $carry3; |
143 $h4 += $carry3; |
157 $h3 -= $carry3 << 25; |
144 $h3 -= $carry3 << 25; |
158 /** @var int $carry5 */ |
|
159 $carry5 = ($h5 + (1 << 24)) >> 25; |
145 $carry5 = ($h5 + (1 << 24)) >> 25; |
160 $h6 += $carry5; |
146 $h6 += $carry5; |
161 $h5 -= $carry5 << 25; |
147 $h5 -= $carry5 << 25; |
162 /** @var int $carry7 */ |
|
163 $carry7 = ($h7 + (1 << 24)) >> 25; |
148 $carry7 = ($h7 + (1 << 24)) >> 25; |
164 $h8 += $carry7; |
149 $h8 += $carry7; |
165 $h7 -= $carry7 << 25; |
150 $h7 -= $carry7 << 25; |
166 |
151 |
167 /** @var int $carry0 */ |
|
168 $carry0 = ($h0 + (1 << 25)) >> 26; |
152 $carry0 = ($h0 + (1 << 25)) >> 26; |
169 $h1 += $carry0; |
153 $h1 += $carry0; |
170 $h0 -= $carry0 << 26; |
154 $h0 -= $carry0 << 26; |
171 /** @var int $carry2 */ |
|
172 $carry2 = ($h2 + (1 << 25)) >> 26; |
155 $carry2 = ($h2 + (1 << 25)) >> 26; |
173 $h3 += $carry2; |
156 $h3 += $carry2; |
174 $h2 -= $carry2 << 26; |
157 $h2 -= $carry2 << 26; |
175 /** @var int $carry4 */ |
|
176 $carry4 = ($h4 + (1 << 25)) >> 26; |
158 $carry4 = ($h4 + (1 << 25)) >> 26; |
177 $h5 += $carry4; |
159 $h5 += $carry4; |
178 $h4 -= $carry4 << 26; |
160 $h4 -= $carry4 << 26; |
179 /** @var int $carry6 */ |
|
180 $carry6 = ($h6 + (1 << 25)) >> 26; |
161 $carry6 = ($h6 + (1 << 25)) >> 26; |
181 $h7 += $carry6; |
162 $h7 += $carry6; |
182 $h6 -= $carry6 << 26; |
163 $h6 -= $carry6 << 26; |
183 /** @var int $carry8 */ |
|
184 $carry8 = ($h8 + (1 << 25)) >> 26; |
164 $carry8 = ($h8 + (1 << 25)) >> 26; |
185 $h9 += $carry8; |
165 $h9 += $carry8; |
186 $h8 -= $carry8 << 26; |
166 $h8 -= $carry8 << 26; |
187 |
167 |
188 return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
168 return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
209 * @param ParagonIE_Sodium_Core_Curve25519_Fe $h |
189 * @param ParagonIE_Sodium_Core_Curve25519_Fe $h |
210 * @return string |
190 * @return string |
211 */ |
191 */ |
212 public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) |
192 public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) |
213 { |
193 { |
214 /** @var int $h0 */ |
|
215 $h0 = (int) $h[0]; |
194 $h0 = (int) $h[0]; |
216 /** @var int $h1 */ |
|
217 $h1 = (int) $h[1]; |
195 $h1 = (int) $h[1]; |
218 /** @var int $h2 */ |
|
219 $h2 = (int) $h[2]; |
196 $h2 = (int) $h[2]; |
220 /** @var int $h3 */ |
|
221 $h3 = (int) $h[3]; |
197 $h3 = (int) $h[3]; |
222 /** @var int $h4 */ |
|
223 $h4 = (int) $h[4]; |
198 $h4 = (int) $h[4]; |
224 /** @var int $h5 */ |
|
225 $h5 = (int) $h[5]; |
199 $h5 = (int) $h[5]; |
226 /** @var int $h6 */ |
|
227 $h6 = (int) $h[6]; |
200 $h6 = (int) $h[6]; |
228 /** @var int $h7 */ |
|
229 $h7 = (int) $h[7]; |
201 $h7 = (int) $h[7]; |
230 /** @var int $h8 */ |
|
231 $h8 = (int) $h[8]; |
202 $h8 = (int) $h[8]; |
232 /** @var int $h9 */ |
|
233 $h9 = (int) $h[9]; |
203 $h9 = (int) $h[9]; |
234 |
204 |
235 /** @var int $q */ |
|
236 $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25; |
205 $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25; |
237 /** @var int $q */ |
|
238 $q = ($h0 + $q) >> 26; |
206 $q = ($h0 + $q) >> 26; |
239 /** @var int $q */ |
|
240 $q = ($h1 + $q) >> 25; |
207 $q = ($h1 + $q) >> 25; |
241 /** @var int $q */ |
|
242 $q = ($h2 + $q) >> 26; |
208 $q = ($h2 + $q) >> 26; |
243 /** @var int $q */ |
|
244 $q = ($h3 + $q) >> 25; |
209 $q = ($h3 + $q) >> 25; |
245 /** @var int $q */ |
|
246 $q = ($h4 + $q) >> 26; |
210 $q = ($h4 + $q) >> 26; |
247 /** @var int $q */ |
|
248 $q = ($h5 + $q) >> 25; |
211 $q = ($h5 + $q) >> 25; |
249 /** @var int $q */ |
|
250 $q = ($h6 + $q) >> 26; |
212 $q = ($h6 + $q) >> 26; |
251 /** @var int $q */ |
|
252 $q = ($h7 + $q) >> 25; |
213 $q = ($h7 + $q) >> 25; |
253 /** @var int $q */ |
|
254 $q = ($h8 + $q) >> 26; |
214 $q = ($h8 + $q) >> 26; |
255 /** @var int $q */ |
|
256 $q = ($h9 + $q) >> 25; |
215 $q = ($h9 + $q) >> 25; |
257 |
216 |
258 $h0 += self::mul($q, 19, 5); |
217 $h0 += self::mul($q, 19, 5); |
259 |
218 |
260 /** @var int $carry0 */ |
|
261 $carry0 = $h0 >> 26; |
219 $carry0 = $h0 >> 26; |
262 $h1 += $carry0; |
220 $h1 += $carry0; |
263 $h0 -= $carry0 << 26; |
221 $h0 -= $carry0 << 26; |
264 /** @var int $carry1 */ |
|
265 $carry1 = $h1 >> 25; |
222 $carry1 = $h1 >> 25; |
266 $h2 += $carry1; |
223 $h2 += $carry1; |
267 $h1 -= $carry1 << 25; |
224 $h1 -= $carry1 << 25; |
268 /** @var int $carry2 */ |
|
269 $carry2 = $h2 >> 26; |
225 $carry2 = $h2 >> 26; |
270 $h3 += $carry2; |
226 $h3 += $carry2; |
271 $h2 -= $carry2 << 26; |
227 $h2 -= $carry2 << 26; |
272 /** @var int $carry3 */ |
|
273 $carry3 = $h3 >> 25; |
228 $carry3 = $h3 >> 25; |
274 $h4 += $carry3; |
229 $h4 += $carry3; |
275 $h3 -= $carry3 << 25; |
230 $h3 -= $carry3 << 25; |
276 /** @var int $carry4 */ |
|
277 $carry4 = $h4 >> 26; |
231 $carry4 = $h4 >> 26; |
278 $h5 += $carry4; |
232 $h5 += $carry4; |
279 $h4 -= $carry4 << 26; |
233 $h4 -= $carry4 << 26; |
280 /** @var int $carry5 */ |
|
281 $carry5 = $h5 >> 25; |
234 $carry5 = $h5 >> 25; |
282 $h6 += $carry5; |
235 $h6 += $carry5; |
283 $h5 -= $carry5 << 25; |
236 $h5 -= $carry5 << 25; |
284 /** @var int $carry6 */ |
|
285 $carry6 = $h6 >> 26; |
237 $carry6 = $h6 >> 26; |
286 $h7 += $carry6; |
238 $h7 += $carry6; |
287 $h6 -= $carry6 << 26; |
239 $h6 -= $carry6 << 26; |
288 /** @var int $carry7 */ |
|
289 $carry7 = $h7 >> 25; |
240 $carry7 = $h7 >> 25; |
290 $h8 += $carry7; |
241 $h8 += $carry7; |
291 $h7 -= $carry7 << 25; |
242 $h7 -= $carry7 << 25; |
292 /** @var int $carry8 */ |
|
293 $carry8 = $h8 >> 26; |
243 $carry8 = $h8 >> 26; |
294 $h9 += $carry8; |
244 $h9 += $carry8; |
295 $h8 -= $carry8 << 26; |
245 $h8 -= $carry8 << 26; |
296 /** @var int $carry9 */ |
|
297 $carry9 = $h9 >> 25; |
246 $carry9 = $h9 >> 25; |
298 $h9 -= $carry9 << 25; |
247 $h9 -= $carry9 << 25; |
299 |
248 |
300 /** |
249 /** |
301 * @var array<int, int> |
250 * @var array<int, int> |
391 */ |
340 */ |
392 public static function fe_mul( |
341 public static function fe_mul( |
393 ParagonIE_Sodium_Core_Curve25519_Fe $f, |
342 ParagonIE_Sodium_Core_Curve25519_Fe $f, |
394 ParagonIE_Sodium_Core_Curve25519_Fe $g |
343 ParagonIE_Sodium_Core_Curve25519_Fe $g |
395 ) { |
344 ) { |
396 /** @var int $f0 */ |
345 // Ensure limbs aren't oversized. |
|
346 $f = self::fe_normalize($f); |
|
347 $g = self::fe_normalize($g); |
397 $f0 = $f[0]; |
348 $f0 = $f[0]; |
398 /** @var int $f1 */ |
|
399 $f1 = $f[1]; |
349 $f1 = $f[1]; |
400 /** @var int $f2 */ |
|
401 $f2 = $f[2]; |
350 $f2 = $f[2]; |
402 /** @var int $f3 */ |
|
403 $f3 = $f[3]; |
351 $f3 = $f[3]; |
404 /** @var int $f4 */ |
|
405 $f4 = $f[4]; |
352 $f4 = $f[4]; |
406 /** @var int $f5 */ |
|
407 $f5 = $f[5]; |
353 $f5 = $f[5]; |
408 /** @var int $f6 */ |
|
409 $f6 = $f[6]; |
354 $f6 = $f[6]; |
410 /** @var int $f7 */ |
|
411 $f7 = $f[7]; |
355 $f7 = $f[7]; |
412 /** @var int $f8 */ |
|
413 $f8 = $f[8]; |
356 $f8 = $f[8]; |
414 /** @var int $f9 */ |
|
415 $f9 = $f[9]; |
357 $f9 = $f[9]; |
416 /** @var int $g0 */ |
|
417 $g0 = $g[0]; |
358 $g0 = $g[0]; |
418 /** @var int $g1 */ |
|
419 $g1 = $g[1]; |
359 $g1 = $g[1]; |
420 /** @var int $g2 */ |
|
421 $g2 = $g[2]; |
360 $g2 = $g[2]; |
422 /** @var int $g3 */ |
|
423 $g3 = $g[3]; |
361 $g3 = $g[3]; |
424 /** @var int $g4 */ |
|
425 $g4 = $g[4]; |
362 $g4 = $g[4]; |
426 /** @var int $g5 */ |
|
427 $g5 = $g[5]; |
363 $g5 = $g[5]; |
428 /** @var int $g6 */ |
|
429 $g6 = $g[6]; |
364 $g6 = $g[6]; |
430 /** @var int $g7 */ |
|
431 $g7 = $g[7]; |
365 $g7 = $g[7]; |
432 /** @var int $g8 */ |
|
433 $g8 = $g[8]; |
366 $g8 = $g[8]; |
434 /** @var int $g9 */ |
|
435 $g9 = $g[9]; |
367 $g9 = $g[9]; |
436 $g1_19 = self::mul($g1, 19, 5); |
368 $g1_19 = self::mul($g1, 19, 5); |
437 $g2_19 = self::mul($g2, 19, 5); |
369 $g2_19 = self::mul($g2, 19, 5); |
438 $g3_19 = self::mul($g3, 19, 5); |
370 $g3_19 = self::mul($g3, 19, 5); |
439 $g4_19 = self::mul($g4, 19, 5); |
371 $g4_19 = self::mul($g4, 19, 5); |
440 $g5_19 = self::mul($g5, 19, 5); |
372 $g5_19 = self::mul($g5, 19, 5); |
441 $g6_19 = self::mul($g6, 19, 5); |
373 $g6_19 = self::mul($g6, 19, 5); |
442 $g7_19 = self::mul($g7, 19, 5); |
374 $g7_19 = self::mul($g7, 19, 5); |
443 $g8_19 = self::mul($g8, 19, 5); |
375 $g8_19 = self::mul($g8, 19, 5); |
444 $g9_19 = self::mul($g9, 19, 5); |
376 $g9_19 = self::mul($g9, 19, 5); |
445 /** @var int $f1_2 */ |
|
446 $f1_2 = $f1 << 1; |
377 $f1_2 = $f1 << 1; |
447 /** @var int $f3_2 */ |
|
448 $f3_2 = $f3 << 1; |
378 $f3_2 = $f3 << 1; |
449 /** @var int $f5_2 */ |
|
450 $f5_2 = $f5 << 1; |
379 $f5_2 = $f5 << 1; |
451 /** @var int $f7_2 */ |
|
452 $f7_2 = $f7 << 1; |
380 $f7_2 = $f7 << 1; |
453 /** @var int $f9_2 */ |
|
454 $f9_2 = $f9 << 1; |
381 $f9_2 = $f9 << 1; |
455 $f0g0 = self::mul($f0, $g0, 26); |
382 $f0g0 = self::mul($f0, $g0, 26); |
456 $f0g1 = self::mul($f0, $g1, 25); |
383 $f0g1 = self::mul($f0, $g1, 25); |
457 $f0g2 = self::mul($f0, $g2, 26); |
384 $f0g2 = self::mul($f0, $g2, 26); |
458 $f0g3 = self::mul($f0, $g3, 25); |
385 $f0g3 = self::mul($f0, $g3, 25); |
561 $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; |
489 $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; |
562 $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; |
490 $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; |
563 $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; |
491 $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; |
564 $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; |
492 $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; |
565 |
493 |
566 /** @var int $carry0 */ |
|
567 $carry0 = ($h0 + (1 << 25)) >> 26; |
494 $carry0 = ($h0 + (1 << 25)) >> 26; |
568 $h1 += $carry0; |
495 $h1 += $carry0; |
569 $h0 -= $carry0 << 26; |
496 $h0 -= $carry0 << 26; |
570 /** @var int $carry4 */ |
|
571 $carry4 = ($h4 + (1 << 25)) >> 26; |
497 $carry4 = ($h4 + (1 << 25)) >> 26; |
572 $h5 += $carry4; |
498 $h5 += $carry4; |
573 $h4 -= $carry4 << 26; |
499 $h4 -= $carry4 << 26; |
574 |
500 |
575 /** @var int $carry1 */ |
|
576 $carry1 = ($h1 + (1 << 24)) >> 25; |
501 $carry1 = ($h1 + (1 << 24)) >> 25; |
577 $h2 += $carry1; |
502 $h2 += $carry1; |
578 $h1 -= $carry1 << 25; |
503 $h1 -= $carry1 << 25; |
579 /** @var int $carry5 */ |
|
580 $carry5 = ($h5 + (1 << 24)) >> 25; |
504 $carry5 = ($h5 + (1 << 24)) >> 25; |
581 $h6 += $carry5; |
505 $h6 += $carry5; |
582 $h5 -= $carry5 << 25; |
506 $h5 -= $carry5 << 25; |
583 |
507 |
584 /** @var int $carry2 */ |
|
585 $carry2 = ($h2 + (1 << 25)) >> 26; |
508 $carry2 = ($h2 + (1 << 25)) >> 26; |
586 $h3 += $carry2; |
509 $h3 += $carry2; |
587 $h2 -= $carry2 << 26; |
510 $h2 -= $carry2 << 26; |
588 /** @var int $carry6 */ |
|
589 $carry6 = ($h6 + (1 << 25)) >> 26; |
511 $carry6 = ($h6 + (1 << 25)) >> 26; |
590 $h7 += $carry6; |
512 $h7 += $carry6; |
591 $h6 -= $carry6 << 26; |
513 $h6 -= $carry6 << 26; |
592 |
514 |
593 /** @var int $carry3 */ |
|
594 $carry3 = ($h3 + (1 << 24)) >> 25; |
515 $carry3 = ($h3 + (1 << 24)) >> 25; |
595 $h4 += $carry3; |
516 $h4 += $carry3; |
596 $h3 -= $carry3 << 25; |
517 $h3 -= $carry3 << 25; |
597 /** @var int $carry7 */ |
|
598 $carry7 = ($h7 + (1 << 24)) >> 25; |
518 $carry7 = ($h7 + (1 << 24)) >> 25; |
599 $h8 += $carry7; |
519 $h8 += $carry7; |
600 $h7 -= $carry7 << 25; |
520 $h7 -= $carry7 << 25; |
601 |
521 |
602 /** @var int $carry4 */ |
|
603 $carry4 = ($h4 + (1 << 25)) >> 26; |
522 $carry4 = ($h4 + (1 << 25)) >> 26; |
604 $h5 += $carry4; |
523 $h5 += $carry4; |
605 $h4 -= $carry4 << 26; |
524 $h4 -= $carry4 << 26; |
606 /** @var int $carry8 */ |
|
607 $carry8 = ($h8 + (1 << 25)) >> 26; |
525 $carry8 = ($h8 + (1 << 25)) >> 26; |
608 $h9 += $carry8; |
526 $h9 += $carry8; |
609 $h8 -= $carry8 << 26; |
527 $h8 -= $carry8 << 26; |
610 |
528 |
611 /** @var int $carry9 */ |
|
612 $carry9 = ($h9 + (1 << 24)) >> 25; |
529 $carry9 = ($h9 + (1 << 24)) >> 25; |
613 $h0 += self::mul($carry9, 19, 5); |
530 $h0 += self::mul($carry9, 19, 5); |
614 $h9 -= $carry9 << 25; |
531 $h9 -= $carry9 << 25; |
615 |
532 |
616 /** @var int $carry0 */ |
|
617 $carry0 = ($h0 + (1 << 25)) >> 26; |
533 $carry0 = ($h0 + (1 << 25)) >> 26; |
618 $h1 += $carry0; |
534 $h1 += $carry0; |
619 $h0 -= $carry0 << 26; |
535 $h0 -= $carry0 << 26; |
620 |
536 |
621 return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
537 return self::fe_normalize( |
622 array( |
538 ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
623 (int) $h0, |
539 array( |
624 (int) $h1, |
540 (int) $h0, |
625 (int) $h2, |
541 (int) $h1, |
626 (int) $h3, |
542 (int) $h2, |
627 (int) $h4, |
543 (int) $h3, |
628 (int) $h5, |
544 (int) $h4, |
629 (int) $h6, |
545 (int) $h5, |
630 (int) $h7, |
546 (int) $h6, |
631 (int) $h8, |
547 (int) $h7, |
632 (int) $h9 |
548 (int) $h8, |
|
549 (int) $h9 |
|
550 ) |
633 ) |
551 ) |
634 ); |
552 ); |
635 } |
553 } |
636 |
554 |
637 /** |
555 /** |
675 $f6 = (int) $f[6]; |
594 $f6 = (int) $f[6]; |
676 $f7 = (int) $f[7]; |
595 $f7 = (int) $f[7]; |
677 $f8 = (int) $f[8]; |
596 $f8 = (int) $f[8]; |
678 $f9 = (int) $f[9]; |
597 $f9 = (int) $f[9]; |
679 |
598 |
680 /** @var int $f0_2 */ |
|
681 $f0_2 = $f0 << 1; |
599 $f0_2 = $f0 << 1; |
682 /** @var int $f1_2 */ |
|
683 $f1_2 = $f1 << 1; |
600 $f1_2 = $f1 << 1; |
684 /** @var int $f2_2 */ |
|
685 $f2_2 = $f2 << 1; |
601 $f2_2 = $f2 << 1; |
686 /** @var int $f3_2 */ |
|
687 $f3_2 = $f3 << 1; |
602 $f3_2 = $f3 << 1; |
688 /** @var int $f4_2 */ |
|
689 $f4_2 = $f4 << 1; |
603 $f4_2 = $f4 << 1; |
690 /** @var int $f5_2 */ |
|
691 $f5_2 = $f5 << 1; |
604 $f5_2 = $f5 << 1; |
692 /** @var int $f6_2 */ |
|
693 $f6_2 = $f6 << 1; |
605 $f6_2 = $f6 << 1; |
694 /** @var int $f7_2 */ |
|
695 $f7_2 = $f7 << 1; |
606 $f7_2 = $f7 << 1; |
696 $f5_38 = self::mul($f5, 38, 6); |
607 $f5_38 = self::mul($f5, 38, 6); |
697 $f6_19 = self::mul($f6, 19, 5); |
608 $f6_19 = self::mul($f6, 19, 5); |
698 $f7_38 = self::mul($f7, 38, 6); |
609 $f7_38 = self::mul($f7, 38, 6); |
699 $f8_19 = self::mul($f8, 19, 5); |
610 $f8_19 = self::mul($f8, 19, 5); |
700 $f9_38 = self::mul($f9, 38, 6); |
611 $f9_38 = self::mul($f9, 38, 6); |
701 $f0f0 = self::mul($f0, $f0, 25); |
612 $f0f0 = self::mul($f0, $f0, 26); |
702 $f0f1_2 = self::mul($f0_2, $f1, 24); |
613 $f0f1_2 = self::mul($f0_2, $f1, 26); |
703 $f0f2_2 = self::mul($f0_2, $f2, 26); |
614 $f0f2_2 = self::mul($f0_2, $f2, 26); |
704 $f0f3_2 = self::mul($f0_2, $f3, 24); |
615 $f0f3_2 = self::mul($f0_2, $f3, 26); |
705 $f0f4_2 = self::mul($f0_2, $f4, 25); |
616 $f0f4_2 = self::mul($f0_2, $f4, 26); |
706 $f0f5_2 = self::mul($f0_2, $f5, 25); |
617 $f0f5_2 = self::mul($f0_2, $f5, 26); |
707 $f0f6_2 = self::mul($f0_2, $f6, 25); |
618 $f0f6_2 = self::mul($f0_2, $f6, 26); |
708 $f0f7_2 = self::mul($f0_2, $f7, 24); |
619 $f0f7_2 = self::mul($f0_2, $f7, 26); |
709 $f0f8_2 = self::mul($f0_2, $f8, 25); |
620 $f0f8_2 = self::mul($f0_2, $f8, 26); |
710 $f0f9_2 = self::mul($f0_2, $f9, 25); |
621 $f0f9_2 = self::mul($f0_2, $f9, 26); |
711 $f1f1_2 = self::mul($f1_2, $f1, 24); |
622 $f1f1_2 = self::mul($f1_2, $f1, 26); |
712 $f1f2_2 = self::mul($f1_2, $f2, 26); |
623 $f1f2_2 = self::mul($f1_2, $f2, 26); |
713 $f1f3_4 = self::mul($f1_2, $f3_2, 25); |
624 $f1f3_4 = self::mul($f1_2, $f3_2, 26); |
714 $f1f4_2 = self::mul($f1_2, $f4, 25); |
625 $f1f4_2 = self::mul($f1_2, $f4, 26); |
715 $f1f5_4 = self::mul($f1_2, $f5_2, 26); |
626 $f1f5_4 = self::mul($f1_2, $f5_2, 26); |
716 $f1f6_2 = self::mul($f1_2, $f6, 25); |
627 $f1f6_2 = self::mul($f1_2, $f6, 26); |
717 $f1f7_4 = self::mul($f1_2, $f7_2, 25); |
628 $f1f7_4 = self::mul($f1_2, $f7_2, 26); |
718 $f1f8_2 = self::mul($f1_2, $f8, 25); |
629 $f1f8_2 = self::mul($f1_2, $f8, 26); |
719 $f1f9_76 = self::mul($f9_38, $f1_2, 25); |
630 $f1f9_76 = self::mul($f9_38, $f1_2, 27); |
720 $f2f2 = self::mul($f2, $f2, 26); |
631 $f2f2 = self::mul($f2, $f2, 27); |
721 $f2f3_2 = self::mul($f2_2, $f3, 24); |
632 $f2f3_2 = self::mul($f2_2, $f3, 27); |
722 $f2f4_2 = self::mul($f2_2, $f4, 25); |
633 $f2f4_2 = self::mul($f2_2, $f4, 27); |
723 $f2f5_2 = self::mul($f2_2, $f5, 25); |
634 $f2f5_2 = self::mul($f2_2, $f5, 27); |
724 $f2f6_2 = self::mul($f2_2, $f6, 25); |
635 $f2f6_2 = self::mul($f2_2, $f6, 27); |
725 $f2f7_2 = self::mul($f2_2, $f7, 25); |
636 $f2f7_2 = self::mul($f2_2, $f7, 27); |
726 $f2f8_38 = self::mul($f8_19, $f2_2, 27); |
637 $f2f8_38 = self::mul($f8_19, $f2_2, 27); |
727 $f2f9_38 = self::mul($f9_38, $f2, 26); |
638 $f2f9_38 = self::mul($f9_38, $f2, 26); |
728 $f3f3_2 = self::mul($f3_2, $f3, 25); |
639 $f3f3_2 = self::mul($f3_2, $f3, 26); |
729 $f3f4_2 = self::mul($f3_2, $f4, 25); |
640 $f3f4_2 = self::mul($f3_2, $f4, 26); |
730 $f3f5_4 = self::mul($f3_2, $f5_2, 26); |
641 $f3f5_4 = self::mul($f3_2, $f5_2, 26); |
731 $f3f6_2 = self::mul($f3_2, $f6, 25); |
642 $f3f6_2 = self::mul($f3_2, $f6, 26); |
732 $f3f7_76 = self::mul($f7_38, $f3_2, 25); |
643 $f3f7_76 = self::mul($f7_38, $f3_2, 26); |
733 $f3f8_38 = self::mul($f8_19, $f3_2, 25); |
644 $f3f8_38 = self::mul($f8_19, $f3_2, 26); |
734 $f3f9_76 = self::mul($f9_38, $f3_2, 25); |
645 $f3f9_76 = self::mul($f9_38, $f3_2, 26); |
735 $f4f4 = self::mul($f4, $f4, 25); |
646 $f4f4 = self::mul($f4, $f4, 26); |
736 $f4f5_2 = self::mul($f4_2, $f5, 25); |
647 $f4f5_2 = self::mul($f4_2, $f5, 26); |
737 $f4f6_38 = self::mul($f6_19, $f4_2, 26); |
648 $f4f6_38 = self::mul($f6_19, $f4_2, 27); |
738 $f4f7_38 = self::mul($f7_38, $f4, 25); |
649 $f4f7_38 = self::mul($f7_38, $f4, 26); |
739 $f4f8_38 = self::mul($f8_19, $f4_2, 26); |
650 $f4f8_38 = self::mul($f8_19, $f4_2, 27); |
740 $f4f9_38 = self::mul($f9_38, $f4, 25); |
651 $f4f9_38 = self::mul($f9_38, $f4, 26); |
741 $f5f5_38 = self::mul($f5_38, $f5, 25); |
652 $f5f5_38 = self::mul($f5_38, $f5, 26); |
742 $f5f6_38 = self::mul($f6_19, $f5_2, 26); |
653 $f5f6_38 = self::mul($f6_19, $f5_2, 26); |
743 $f5f7_76 = self::mul($f7_38, $f5_2, 26); |
654 $f5f7_76 = self::mul($f7_38, $f5_2, 26); |
744 $f5f8_38 = self::mul($f8_19, $f5_2, 26); |
655 $f5f8_38 = self::mul($f8_19, $f5_2, 26); |
745 $f5f9_76 = self::mul($f9_38, $f5_2, 26); |
656 $f5f9_76 = self::mul($f9_38, $f5_2, 26); |
746 $f6f6_19 = self::mul($f6_19, $f6, 25); |
657 $f6f6_19 = self::mul($f6_19, $f6, 26); |
747 $f6f7_38 = self::mul($f7_38, $f6, 25); |
658 $f6f7_38 = self::mul($f7_38, $f6, 26); |
748 $f6f8_38 = self::mul($f8_19, $f6_2, 26); |
659 $f6f8_38 = self::mul($f8_19, $f6_2, 27); |
749 $f6f9_38 = self::mul($f9_38, $f6, 25); |
660 $f6f9_38 = self::mul($f9_38, $f6, 26); |
750 $f7f7_38 = self::mul($f7_38, $f7, 24); |
661 $f7f7_38 = self::mul($f7_38, $f7, 26); |
751 $f7f8_38 = self::mul($f8_19, $f7_2, 25); |
662 $f7f8_38 = self::mul($f8_19, $f7_2, 26); |
752 $f7f9_76 = self::mul($f9_38, $f7_2, 25); |
663 $f7f9_76 = self::mul($f9_38, $f7_2, 26); |
753 $f8f8_19 = self::mul($f8_19, $f8, 25); |
664 $f8f8_19 = self::mul($f8_19, $f8, 26); |
754 $f8f9_38 = self::mul($f9_38, $f8, 25); |
665 $f8f9_38 = self::mul($f9_38, $f8, 26); |
755 $f9f9_38 = self::mul($f9_38, $f9, 25); |
666 $f9f9_38 = self::mul($f9_38, $f9, 26); |
756 $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38; |
667 $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38; |
757 $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38; |
668 $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38; |
758 $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19; |
669 $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19; |
759 $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38; |
670 $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38; |
760 $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38; |
671 $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38; |
762 $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19; |
673 $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19; |
763 $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38; |
674 $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38; |
764 $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38; |
675 $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38; |
765 $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2; |
676 $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2; |
766 |
677 |
767 /** @var int $carry0 */ |
|
768 $carry0 = ($h0 + (1 << 25)) >> 26; |
678 $carry0 = ($h0 + (1 << 25)) >> 26; |
769 $h1 += $carry0; |
679 $h1 += $carry0; |
770 $h0 -= $carry0 << 26; |
680 $h0 -= $carry0 << 26; |
771 /** @var int $carry4 */ |
|
772 $carry4 = ($h4 + (1 << 25)) >> 26; |
681 $carry4 = ($h4 + (1 << 25)) >> 26; |
773 $h5 += $carry4; |
682 $h5 += $carry4; |
774 $h4 -= $carry4 << 26; |
683 $h4 -= $carry4 << 26; |
775 |
684 |
776 /** @var int $carry1 */ |
|
777 $carry1 = ($h1 + (1 << 24)) >> 25; |
685 $carry1 = ($h1 + (1 << 24)) >> 25; |
778 $h2 += $carry1; |
686 $h2 += $carry1; |
779 $h1 -= $carry1 << 25; |
687 $h1 -= $carry1 << 25; |
780 /** @var int $carry5 */ |
|
781 $carry5 = ($h5 + (1 << 24)) >> 25; |
688 $carry5 = ($h5 + (1 << 24)) >> 25; |
782 $h6 += $carry5; |
689 $h6 += $carry5; |
783 $h5 -= $carry5 << 25; |
690 $h5 -= $carry5 << 25; |
784 |
691 |
785 /** @var int $carry2 */ |
|
786 $carry2 = ($h2 + (1 << 25)) >> 26; |
692 $carry2 = ($h2 + (1 << 25)) >> 26; |
787 $h3 += $carry2; |
693 $h3 += $carry2; |
788 $h2 -= $carry2 << 26; |
694 $h2 -= $carry2 << 26; |
789 /** @var int $carry6 */ |
|
790 $carry6 = ($h6 + (1 << 25)) >> 26; |
695 $carry6 = ($h6 + (1 << 25)) >> 26; |
791 $h7 += $carry6; |
696 $h7 += $carry6; |
792 $h6 -= $carry6 << 26; |
697 $h6 -= $carry6 << 26; |
793 |
698 |
794 /** @var int $carry3 */ |
|
795 $carry3 = ($h3 + (1 << 24)) >> 25; |
699 $carry3 = ($h3 + (1 << 24)) >> 25; |
796 $h4 += $carry3; |
700 $h4 += $carry3; |
797 $h3 -= $carry3 << 25; |
701 $h3 -= $carry3 << 25; |
798 /** @var int $carry7 */ |
|
799 $carry7 = ($h7 + (1 << 24)) >> 25; |
702 $carry7 = ($h7 + (1 << 24)) >> 25; |
800 $h8 += $carry7; |
703 $h8 += $carry7; |
801 $h7 -= $carry7 << 25; |
704 $h7 -= $carry7 << 25; |
802 |
705 |
803 /** @var int $carry4 */ |
|
804 $carry4 = ($h4 + (1 << 25)) >> 26; |
706 $carry4 = ($h4 + (1 << 25)) >> 26; |
805 $h5 += $carry4; |
707 $h5 += $carry4; |
806 $h4 -= $carry4 << 26; |
708 $h4 -= $carry4 << 26; |
807 /** @var int $carry8 */ |
|
808 $carry8 = ($h8 + (1 << 25)) >> 26; |
709 $carry8 = ($h8 + (1 << 25)) >> 26; |
809 $h9 += $carry8; |
710 $h9 += $carry8; |
810 $h8 -= $carry8 << 26; |
711 $h8 -= $carry8 << 26; |
811 |
712 |
812 /** @var int $carry9 */ |
|
813 $carry9 = ($h9 + (1 << 24)) >> 25; |
713 $carry9 = ($h9 + (1 << 24)) >> 25; |
814 $h0 += self::mul($carry9, 19, 5); |
714 $h0 += self::mul($carry9, 19, 5); |
815 $h9 -= $carry9 << 25; |
715 $h9 -= $carry9 << 25; |
816 |
716 |
817 /** @var int $carry0 */ |
|
818 $carry0 = ($h0 + (1 << 25)) >> 26; |
717 $carry0 = ($h0 + (1 << 25)) >> 26; |
819 $h1 += $carry0; |
718 $h1 += $carry0; |
820 $h0 -= $carry0 << 26; |
719 $h0 -= $carry0 << 26; |
821 |
720 |
822 return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
721 return self::fe_normalize( |
823 array( |
722 ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
824 (int) $h0, |
723 array( |
825 (int) $h1, |
724 (int) $h0, |
826 (int) $h2, |
725 (int) $h1, |
827 (int) $h3, |
726 (int) $h2, |
828 (int) $h4, |
727 (int) $h3, |
829 (int) $h5, |
728 (int) $h4, |
830 (int) $h6, |
729 (int) $h5, |
831 (int) $h7, |
730 (int) $h6, |
832 (int) $h8, |
731 (int) $h7, |
833 (int) $h9 |
732 (int) $h8, |
|
733 (int) $h9 |
|
734 ) |
834 ) |
735 ) |
835 ); |
736 ); |
836 } |
737 } |
837 |
738 |
838 |
739 |
934 $f7f9_76 = self::mul($f9_38, $f7_2, 24); |
828 $f7f9_76 = self::mul($f9_38, $f7_2, 24); |
935 $f8f8_19 = self::mul($f8_19, $f8, 24); |
829 $f8f8_19 = self::mul($f8_19, $f8, 24); |
936 $f8f9_38 = self::mul($f9_38, $f8, 24); |
830 $f8f9_38 = self::mul($f9_38, $f8, 24); |
937 $f9f9_38 = self::mul($f9_38, $f9, 24); |
831 $f9f9_38 = self::mul($f9_38, $f9, 24); |
938 |
832 |
939 /** @var int $h0 */ |
|
940 $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1; |
833 $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1; |
941 /** @var int $h1 */ |
|
942 $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1; |
834 $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1; |
943 /** @var int $h2 */ |
|
944 $h2 = (int) ($f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1; |
835 $h2 = (int) ($f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1; |
945 /** @var int $h3 */ |
|
946 $h3 = (int) ($f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1; |
836 $h3 = (int) ($f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1; |
947 /** @var int $h4 */ |
|
948 $h4 = (int) ($f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1; |
837 $h4 = (int) ($f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1; |
949 /** @var int $h5 */ |
|
950 $h5 = (int) ($f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38) << 1; |
838 $h5 = (int) ($f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38) << 1; |
951 /** @var int $h6 */ |
|
952 $h6 = (int) ($f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19) << 1; |
839 $h6 = (int) ($f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19) << 1; |
953 /** @var int $h7 */ |
|
954 $h7 = (int) ($f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38) << 1; |
840 $h7 = (int) ($f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38) << 1; |
955 /** @var int $h8 */ |
|
956 $h8 = (int) ($f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38) << 1; |
841 $h8 = (int) ($f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38) << 1; |
957 /** @var int $h9 */ |
|
958 $h9 = (int) ($f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2) << 1; |
842 $h9 = (int) ($f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2) << 1; |
959 |
843 |
960 /** @var int $carry0 */ |
|
961 $carry0 = ($h0 + (1 << 25)) >> 26; |
844 $carry0 = ($h0 + (1 << 25)) >> 26; |
962 $h1 += $carry0; |
845 $h1 += $carry0; |
963 $h0 -= $carry0 << 26; |
846 $h0 -= $carry0 << 26; |
964 /** @var int $carry4 */ |
|
965 $carry4 = ($h4 + (1 << 25)) >> 26; |
847 $carry4 = ($h4 + (1 << 25)) >> 26; |
966 $h5 += $carry4; |
848 $h5 += $carry4; |
967 $h4 -= $carry4 << 26; |
849 $h4 -= $carry4 << 26; |
968 |
850 |
969 /** @var int $carry1 */ |
|
970 $carry1 = ($h1 + (1 << 24)) >> 25; |
851 $carry1 = ($h1 + (1 << 24)) >> 25; |
971 $h2 += $carry1; |
852 $h2 += $carry1; |
972 $h1 -= $carry1 << 25; |
853 $h1 -= $carry1 << 25; |
973 /** @var int $carry5 */ |
|
974 $carry5 = ($h5 + (1 << 24)) >> 25; |
854 $carry5 = ($h5 + (1 << 24)) >> 25; |
975 $h6 += $carry5; |
855 $h6 += $carry5; |
976 $h5 -= $carry5 << 25; |
856 $h5 -= $carry5 << 25; |
977 |
857 |
978 /** @var int $carry2 */ |
|
979 $carry2 = ($h2 + (1 << 25)) >> 26; |
858 $carry2 = ($h2 + (1 << 25)) >> 26; |
980 $h3 += $carry2; |
859 $h3 += $carry2; |
981 $h2 -= $carry2 << 26; |
860 $h2 -= $carry2 << 26; |
982 /** @var int $carry6 */ |
|
983 $carry6 = ($h6 + (1 << 25)) >> 26; |
861 $carry6 = ($h6 + (1 << 25)) >> 26; |
984 $h7 += $carry6; |
862 $h7 += $carry6; |
985 $h6 -= $carry6 << 26; |
863 $h6 -= $carry6 << 26; |
986 |
864 |
987 /** @var int $carry3 */ |
|
988 $carry3 = ($h3 + (1 << 24)) >> 25; |
865 $carry3 = ($h3 + (1 << 24)) >> 25; |
989 $h4 += $carry3; |
866 $h4 += $carry3; |
990 $h3 -= $carry3 << 25; |
867 $h3 -= $carry3 << 25; |
991 /** @var int $carry7 */ |
|
992 $carry7 = ($h7 + (1 << 24)) >> 25; |
868 $carry7 = ($h7 + (1 << 24)) >> 25; |
993 $h8 += $carry7; |
869 $h8 += $carry7; |
994 $h7 -= $carry7 << 25; |
870 $h7 -= $carry7 << 25; |
995 |
871 |
996 /** @var int $carry4 */ |
|
997 $carry4 = ($h4 + (1 << 25)) >> 26; |
872 $carry4 = ($h4 + (1 << 25)) >> 26; |
998 $h5 += $carry4; |
873 $h5 += $carry4; |
999 $h4 -= $carry4 << 26; |
874 $h4 -= $carry4 << 26; |
1000 /** @var int $carry8 */ |
|
1001 $carry8 = ($h8 + (1 << 25)) >> 26; |
875 $carry8 = ($h8 + (1 << 25)) >> 26; |
1002 $h9 += $carry8; |
876 $h9 += $carry8; |
1003 $h8 -= $carry8 << 26; |
877 $h8 -= $carry8 << 26; |
1004 |
878 |
1005 /** @var int $carry9 */ |
|
1006 $carry9 = ($h9 + (1 << 24)) >> 25; |
879 $carry9 = ($h9 + (1 << 24)) >> 25; |
1007 $h0 += self::mul($carry9, 19, 5); |
880 $h0 += self::mul($carry9, 19, 5); |
1008 $h9 -= $carry9 << 25; |
881 $h9 -= $carry9 << 25; |
1009 |
882 |
1010 /** @var int $carry0 */ |
|
1011 $carry0 = ($h0 + (1 << 25)) >> 26; |
883 $carry0 = ($h0 + (1 << 25)) >> 26; |
1012 $h1 += $carry0; |
884 $h1 += $carry0; |
1013 $h0 -= $carry0 << 26; |
885 $h0 -= $carry0 << 26; |
1014 |
886 |
1015 return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
887 return self::fe_normalize( |
1016 array( |
888 ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( |
1017 (int) $h0, |
889 array( |
1018 (int) $h1, |
890 (int) $h0, |
1019 (int) $h2, |
891 (int) $h1, |
1020 (int) $h3, |
892 (int) $h2, |
1021 (int) $h4, |
893 (int) $h3, |
1022 (int) $h5, |
894 (int) $h4, |
1023 (int) $h6, |
895 (int) $h5, |
1024 (int) $h7, |
896 (int) $h6, |
1025 (int) $h8, |
897 (int) $h7, |
1026 (int) $h9 |
898 (int) $h8, |
|
899 (int) $h9 |
|
900 ) |
1027 ) |
901 ) |
1028 ); |
902 ); |
1029 } |
903 } |
1030 |
904 |
1031 /** |
905 /** |
2204 * @return string |
2074 * @return string |
2205 * @throws TypeError |
2075 * @throws TypeError |
2206 */ |
2076 */ |
2207 public static function sc_muladd($a, $b, $c) |
2077 public static function sc_muladd($a, $b, $c) |
2208 { |
2078 { |
2209 /** @var int $a0 */ |
|
2210 $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); |
2079 $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); |
2211 /** @var int $a1 */ |
|
2212 $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); |
2080 $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); |
2213 /** @var int $a2 */ |
|
2214 $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); |
2081 $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); |
2215 /** @var int $a3 */ |
|
2216 $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); |
2082 $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); |
2217 /** @var int $a4 */ |
|
2218 $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); |
2083 $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); |
2219 /** @var int $a5 */ |
|
2220 $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); |
2084 $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); |
2221 /** @var int $a6 */ |
|
2222 $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); |
2085 $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); |
2223 /** @var int $a7 */ |
|
2224 $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); |
2086 $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); |
2225 /** @var int $a8 */ |
|
2226 $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); |
2087 $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); |
2227 /** @var int $a9 */ |
|
2228 $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); |
2088 $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); |
2229 /** @var int $a10 */ |
|
2230 $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); |
2089 $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); |
2231 /** @var int $a11 */ |
|
2232 $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); |
2090 $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); |
2233 |
2091 |
2234 /** @var int $b0 */ |
|
2235 $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); |
2092 $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); |
2236 /** @var int $b1 */ |
|
2237 $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); |
2093 $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); |
2238 /** @var int $b2 */ |
|
2239 $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); |
2094 $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); |
2240 /** @var int $b3 */ |
|
2241 $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); |
2095 $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); |
2242 /** @var int $b4 */ |
|
2243 $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); |
2096 $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); |
2244 /** @var int $b5 */ |
|
2245 $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); |
2097 $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); |
2246 /** @var int $b6 */ |
|
2247 $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); |
2098 $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); |
2248 /** @var int $b7 */ |
|
2249 $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); |
2099 $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); |
2250 /** @var int $b8 */ |
|
2251 $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); |
2100 $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); |
2252 /** @var int $b9 */ |
|
2253 $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); |
2101 $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); |
2254 /** @var int $b10 */ |
|
2255 $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); |
2102 $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); |
2256 /** @var int $b11 */ |
|
2257 $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); |
2103 $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); |
2258 |
2104 |
2259 /** @var int $c0 */ |
|
2260 $c0 = 2097151 & self::load_3(self::substr($c, 0, 3)); |
2105 $c0 = 2097151 & self::load_3(self::substr($c, 0, 3)); |
2261 /** @var int $c1 */ |
|
2262 $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5); |
2106 $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5); |
2263 /** @var int $c2 */ |
|
2264 $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2); |
2107 $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2); |
2265 /** @var int $c3 */ |
|
2266 $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7); |
2108 $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7); |
2267 /** @var int $c4 */ |
|
2268 $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4); |
2109 $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4); |
2269 /** @var int $c5 */ |
|
2270 $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1); |
2110 $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1); |
2271 /** @var int $c6 */ |
|
2272 $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6); |
2111 $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6); |
2273 /** @var int $c7 */ |
|
2274 $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3); |
2112 $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3); |
2275 /** @var int $c8 */ |
|
2276 $c8 = 2097151 & self::load_3(self::substr($c, 21, 3)); |
2113 $c8 = 2097151 & self::load_3(self::substr($c, 21, 3)); |
2277 /** @var int $c9 */ |
|
2278 $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5); |
2114 $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5); |
2279 /** @var int $c10 */ |
|
2280 $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2); |
2115 $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2); |
2281 /** @var int $c11 */ |
|
2282 $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7); |
2116 $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7); |
2283 |
2117 |
2284 /* Can't really avoid the pyramid here: */ |
2118 /* Can't really avoid the pyramid here: */ |
2285 $s0 = $c0 + self::mul($a0, $b0, 24); |
2119 $s0 = $c0 + self::mul($a0, $b0, 24); |
2286 $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24); |
2120 $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24); |
2327 $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24); |
2161 $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24); |
2328 $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24); |
2162 $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24); |
2329 $s22 = self::mul($a11, $b11, 24); |
2163 $s22 = self::mul($a11, $b11, 24); |
2330 $s23 = 0; |
2164 $s23 = 0; |
2331 |
2165 |
2332 /** @var int $carry0 */ |
|
2333 $carry0 = ($s0 + (1 << 20)) >> 21; |
2166 $carry0 = ($s0 + (1 << 20)) >> 21; |
2334 $s1 += $carry0; |
2167 $s1 += $carry0; |
2335 $s0 -= $carry0 << 21; |
2168 $s0 -= $carry0 << 21; |
2336 /** @var int $carry2 */ |
|
2337 $carry2 = ($s2 + (1 << 20)) >> 21; |
2169 $carry2 = ($s2 + (1 << 20)) >> 21; |
2338 $s3 += $carry2; |
2170 $s3 += $carry2; |
2339 $s2 -= $carry2 << 21; |
2171 $s2 -= $carry2 << 21; |
2340 /** @var int $carry4 */ |
|
2341 $carry4 = ($s4 + (1 << 20)) >> 21; |
2172 $carry4 = ($s4 + (1 << 20)) >> 21; |
2342 $s5 += $carry4; |
2173 $s5 += $carry4; |
2343 $s4 -= $carry4 << 21; |
2174 $s4 -= $carry4 << 21; |
2344 /** @var int $carry6 */ |
|
2345 $carry6 = ($s6 + (1 << 20)) >> 21; |
2175 $carry6 = ($s6 + (1 << 20)) >> 21; |
2346 $s7 += $carry6; |
2176 $s7 += $carry6; |
2347 $s6 -= $carry6 << 21; |
2177 $s6 -= $carry6 << 21; |
2348 /** @var int $carry8 */ |
|
2349 $carry8 = ($s8 + (1 << 20)) >> 21; |
2178 $carry8 = ($s8 + (1 << 20)) >> 21; |
2350 $s9 += $carry8; |
2179 $s9 += $carry8; |
2351 $s8 -= $carry8 << 21; |
2180 $s8 -= $carry8 << 21; |
2352 /** @var int $carry10 */ |
|
2353 $carry10 = ($s10 + (1 << 20)) >> 21; |
2181 $carry10 = ($s10 + (1 << 20)) >> 21; |
2354 $s11 += $carry10; |
2182 $s11 += $carry10; |
2355 $s10 -= $carry10 << 21; |
2183 $s10 -= $carry10 << 21; |
2356 /** @var int $carry12 */ |
|
2357 $carry12 = ($s12 + (1 << 20)) >> 21; |
2184 $carry12 = ($s12 + (1 << 20)) >> 21; |
2358 $s13 += $carry12; |
2185 $s13 += $carry12; |
2359 $s12 -= $carry12 << 21; |
2186 $s12 -= $carry12 << 21; |
2360 /** @var int $carry14 */ |
|
2361 $carry14 = ($s14 + (1 << 20)) >> 21; |
2187 $carry14 = ($s14 + (1 << 20)) >> 21; |
2362 $s15 += $carry14; |
2188 $s15 += $carry14; |
2363 $s14 -= $carry14 << 21; |
2189 $s14 -= $carry14 << 21; |
2364 /** @var int $carry16 */ |
|
2365 $carry16 = ($s16 + (1 << 20)) >> 21; |
2190 $carry16 = ($s16 + (1 << 20)) >> 21; |
2366 $s17 += $carry16; |
2191 $s17 += $carry16; |
2367 $s16 -= $carry16 << 21; |
2192 $s16 -= $carry16 << 21; |
2368 /** @var int $carry18 */ |
|
2369 $carry18 = ($s18 + (1 << 20)) >> 21; |
2193 $carry18 = ($s18 + (1 << 20)) >> 21; |
2370 $s19 += $carry18; |
2194 $s19 += $carry18; |
2371 $s18 -= $carry18 << 21; |
2195 $s18 -= $carry18 << 21; |
2372 /** @var int $carry20 */ |
|
2373 $carry20 = ($s20 + (1 << 20)) >> 21; |
2196 $carry20 = ($s20 + (1 << 20)) >> 21; |
2374 $s21 += $carry20; |
2197 $s21 += $carry20; |
2375 $s20 -= $carry20 << 21; |
2198 $s20 -= $carry20 << 21; |
2376 /** @var int $carry22 */ |
|
2377 $carry22 = ($s22 + (1 << 20)) >> 21; |
2199 $carry22 = ($s22 + (1 << 20)) >> 21; |
2378 $s23 += $carry22; |
2200 $s23 += $carry22; |
2379 $s22 -= $carry22 << 21; |
2201 $s22 -= $carry22 << 21; |
2380 |
2202 |
2381 /** @var int $carry1 */ |
|
2382 $carry1 = ($s1 + (1 << 20)) >> 21; |
2203 $carry1 = ($s1 + (1 << 20)) >> 21; |
2383 $s2 += $carry1; |
2204 $s2 += $carry1; |
2384 $s1 -= $carry1 << 21; |
2205 $s1 -= $carry1 << 21; |
2385 /** @var int $carry3 */ |
|
2386 $carry3 = ($s3 + (1 << 20)) >> 21; |
2206 $carry3 = ($s3 + (1 << 20)) >> 21; |
2387 $s4 += $carry3; |
2207 $s4 += $carry3; |
2388 $s3 -= $carry3 << 21; |
2208 $s3 -= $carry3 << 21; |
2389 /** @var int $carry5 */ |
|
2390 $carry5 = ($s5 + (1 << 20)) >> 21; |
2209 $carry5 = ($s5 + (1 << 20)) >> 21; |
2391 $s6 += $carry5; |
2210 $s6 += $carry5; |
2392 $s5 -= $carry5 << 21; |
2211 $s5 -= $carry5 << 21; |
2393 /** @var int $carry7 */ |
|
2394 $carry7 = ($s7 + (1 << 20)) >> 21; |
2212 $carry7 = ($s7 + (1 << 20)) >> 21; |
2395 $s8 += $carry7; |
2213 $s8 += $carry7; |
2396 $s7 -= $carry7 << 21; |
2214 $s7 -= $carry7 << 21; |
2397 /** @var int $carry9 */ |
|
2398 $carry9 = ($s9 + (1 << 20)) >> 21; |
2215 $carry9 = ($s9 + (1 << 20)) >> 21; |
2399 $s10 += $carry9; |
2216 $s10 += $carry9; |
2400 $s9 -= $carry9 << 21; |
2217 $s9 -= $carry9 << 21; |
2401 /** @var int $carry11 */ |
|
2402 $carry11 = ($s11 + (1 << 20)) >> 21; |
2218 $carry11 = ($s11 + (1 << 20)) >> 21; |
2403 $s12 += $carry11; |
2219 $s12 += $carry11; |
2404 $s11 -= $carry11 << 21; |
2220 $s11 -= $carry11 << 21; |
2405 /** @var int $carry13 */ |
|
2406 $carry13 = ($s13 + (1 << 20)) >> 21; |
2221 $carry13 = ($s13 + (1 << 20)) >> 21; |
2407 $s14 += $carry13; |
2222 $s14 += $carry13; |
2408 $s13 -= $carry13 << 21; |
2223 $s13 -= $carry13 << 21; |
2409 /** @var int $carry15 */ |
|
2410 $carry15 = ($s15 + (1 << 20)) >> 21; |
2224 $carry15 = ($s15 + (1 << 20)) >> 21; |
2411 $s16 += $carry15; |
2225 $s16 += $carry15; |
2412 $s15 -= $carry15 << 21; |
2226 $s15 -= $carry15 << 21; |
2413 /** @var int $carry17 */ |
|
2414 $carry17 = ($s17 + (1 << 20)) >> 21; |
2227 $carry17 = ($s17 + (1 << 20)) >> 21; |
2415 $s18 += $carry17; |
2228 $s18 += $carry17; |
2416 $s17 -= $carry17 << 21; |
2229 $s17 -= $carry17 << 21; |
2417 /** @var int $carry19 */ |
|
2418 $carry19 = ($s19 + (1 << 20)) >> 21; |
2230 $carry19 = ($s19 + (1 << 20)) >> 21; |
2419 $s20 += $carry19; |
2231 $s20 += $carry19; |
2420 $s19 -= $carry19 << 21; |
2232 $s19 -= $carry19 << 21; |
2421 /** @var int $carry21 */ |
|
2422 $carry21 = ($s21 + (1 << 20)) >> 21; |
2233 $carry21 = ($s21 + (1 << 20)) >> 21; |
2423 $s22 += $carry21; |
2234 $s22 += $carry21; |
2424 $s21 -= $carry21 << 21; |
2235 $s21 -= $carry21 << 21; |
2425 |
2236 |
2426 $s11 += self::mul($s23, 666643, 20); |
2237 $s11 += self::mul($s23, 666643, 20); |
2463 $s8 += self::mul($s18, 654183, 20); |
2274 $s8 += self::mul($s18, 654183, 20); |
2464 $s9 -= self::mul($s18, 997805, 20); |
2275 $s9 -= self::mul($s18, 997805, 20); |
2465 $s10 += self::mul($s18, 136657, 18); |
2276 $s10 += self::mul($s18, 136657, 18); |
2466 $s11 -= self::mul($s18, 683901, 20); |
2277 $s11 -= self::mul($s18, 683901, 20); |
2467 |
2278 |
2468 /** @var int $carry6 */ |
|
2469 $carry6 = ($s6 + (1 << 20)) >> 21; |
2279 $carry6 = ($s6 + (1 << 20)) >> 21; |
2470 $s7 += $carry6; |
2280 $s7 += $carry6; |
2471 $s6 -= $carry6 << 21; |
2281 $s6 -= $carry6 << 21; |
2472 /** @var int $carry8 */ |
|
2473 $carry8 = ($s8 + (1 << 20)) >> 21; |
2282 $carry8 = ($s8 + (1 << 20)) >> 21; |
2474 $s9 += $carry8; |
2283 $s9 += $carry8; |
2475 $s8 -= $carry8 << 21; |
2284 $s8 -= $carry8 << 21; |
2476 /** @var int $carry10 */ |
|
2477 $carry10 = ($s10 + (1 << 20)) >> 21; |
2285 $carry10 = ($s10 + (1 << 20)) >> 21; |
2478 $s11 += $carry10; |
2286 $s11 += $carry10; |
2479 $s10 -= $carry10 << 21; |
2287 $s10 -= $carry10 << 21; |
2480 /** @var int $carry12 */ |
|
2481 $carry12 = ($s12 + (1 << 20)) >> 21; |
2288 $carry12 = ($s12 + (1 << 20)) >> 21; |
2482 $s13 += $carry12; |
2289 $s13 += $carry12; |
2483 $s12 -= $carry12 << 21; |
2290 $s12 -= $carry12 << 21; |
2484 /** @var int $carry14 */ |
|
2485 $carry14 = ($s14 + (1 << 20)) >> 21; |
2291 $carry14 = ($s14 + (1 << 20)) >> 21; |
2486 $s15 += $carry14; |
2292 $s15 += $carry14; |
2487 $s14 -= $carry14 << 21; |
2293 $s14 -= $carry14 << 21; |
2488 /** @var int $carry16 */ |
|
2489 $carry16 = ($s16 + (1 << 20)) >> 21; |
2294 $carry16 = ($s16 + (1 << 20)) >> 21; |
2490 $s17 += $carry16; |
2295 $s17 += $carry16; |
2491 $s16 -= $carry16 << 21; |
2296 $s16 -= $carry16 << 21; |
2492 |
2297 |
2493 /** @var int $carry7 */ |
|
2494 $carry7 = ($s7 + (1 << 20)) >> 21; |
2298 $carry7 = ($s7 + (1 << 20)) >> 21; |
2495 $s8 += $carry7; |
2299 $s8 += $carry7; |
2496 $s7 -= $carry7 << 21; |
2300 $s7 -= $carry7 << 21; |
2497 /** @var int $carry9 */ |
|
2498 $carry9 = ($s9 + (1 << 20)) >> 21; |
2301 $carry9 = ($s9 + (1 << 20)) >> 21; |
2499 $s10 += $carry9; |
2302 $s10 += $carry9; |
2500 $s9 -= $carry9 << 21; |
2303 $s9 -= $carry9 << 21; |
2501 /** @var int $carry11 */ |
|
2502 $carry11 = ($s11 + (1 << 20)) >> 21; |
2304 $carry11 = ($s11 + (1 << 20)) >> 21; |
2503 $s12 += $carry11; |
2305 $s12 += $carry11; |
2504 $s11 -= $carry11 << 21; |
2306 $s11 -= $carry11 << 21; |
2505 /** @var int $carry13 */ |
|
2506 $carry13 = ($s13 + (1 << 20)) >> 21; |
2307 $carry13 = ($s13 + (1 << 20)) >> 21; |
2507 $s14 += $carry13; |
2308 $s14 += $carry13; |
2508 $s13 -= $carry13 << 21; |
2309 $s13 -= $carry13 << 21; |
2509 /** @var int $carry15 */ |
|
2510 $carry15 = ($s15 + (1 << 20)) >> 21; |
2310 $carry15 = ($s15 + (1 << 20)) >> 21; |
2511 $s16 += $carry15; |
2311 $s16 += $carry15; |
2512 $s15 -= $carry15 << 21; |
2312 $s15 -= $carry15 << 21; |
2513 |
2313 |
2514 $s5 += self::mul($s17, 666643, 20); |
2314 $s5 += self::mul($s17, 666643, 20); |
2552 $s3 -= self::mul($s12, 997805, 20); |
2352 $s3 -= self::mul($s12, 997805, 20); |
2553 $s4 += self::mul($s12, 136657, 18); |
2353 $s4 += self::mul($s12, 136657, 18); |
2554 $s5 -= self::mul($s12, 683901, 20); |
2354 $s5 -= self::mul($s12, 683901, 20); |
2555 $s12 = 0; |
2355 $s12 = 0; |
2556 |
2356 |
2557 /** @var int $carry0 */ |
|
2558 $carry0 = ($s0 + (1 << 20)) >> 21; |
2357 $carry0 = ($s0 + (1 << 20)) >> 21; |
2559 $s1 += $carry0; |
2358 $s1 += $carry0; |
2560 $s0 -= $carry0 << 21; |
2359 $s0 -= $carry0 << 21; |
2561 /** @var int $carry2 */ |
|
2562 $carry2 = ($s2 + (1 << 20)) >> 21; |
2360 $carry2 = ($s2 + (1 << 20)) >> 21; |
2563 $s3 += $carry2; |
2361 $s3 += $carry2; |
2564 $s2 -= $carry2 << 21; |
2362 $s2 -= $carry2 << 21; |
2565 /** @var int $carry4 */ |
|
2566 $carry4 = ($s4 + (1 << 20)) >> 21; |
2363 $carry4 = ($s4 + (1 << 20)) >> 21; |
2567 $s5 += $carry4; |
2364 $s5 += $carry4; |
2568 $s4 -= $carry4 << 21; |
2365 $s4 -= $carry4 << 21; |
2569 /** @var int $carry6 */ |
|
2570 $carry6 = ($s6 + (1 << 20)) >> 21; |
2366 $carry6 = ($s6 + (1 << 20)) >> 21; |
2571 $s7 += $carry6; |
2367 $s7 += $carry6; |
2572 $s6 -= $carry6 << 21; |
2368 $s6 -= $carry6 << 21; |
2573 /** @var int $carry8 */ |
|
2574 $carry8 = ($s8 + (1 << 20)) >> 21; |
2369 $carry8 = ($s8 + (1 << 20)) >> 21; |
2575 $s9 += $carry8; |
2370 $s9 += $carry8; |
2576 $s8 -= $carry8 << 21; |
2371 $s8 -= $carry8 << 21; |
2577 /** @var int $carry10 */ |
|
2578 $carry10 = ($s10 + (1 << 20)) >> 21; |
2372 $carry10 = ($s10 + (1 << 20)) >> 21; |
2579 $s11 += $carry10; |
2373 $s11 += $carry10; |
2580 $s10 -= $carry10 << 21; |
2374 $s10 -= $carry10 << 21; |
2581 |
2375 |
2582 /** @var int $carry1 */ |
|
2583 $carry1 = ($s1 + (1 << 20)) >> 21; |
2376 $carry1 = ($s1 + (1 << 20)) >> 21; |
2584 $s2 += $carry1; |
2377 $s2 += $carry1; |
2585 $s1 -= $carry1 << 21; |
2378 $s1 -= $carry1 << 21; |
2586 /** @var int $carry3 */ |
|
2587 $carry3 = ($s3 + (1 << 20)) >> 21; |
2379 $carry3 = ($s3 + (1 << 20)) >> 21; |
2588 $s4 += $carry3; |
2380 $s4 += $carry3; |
2589 $s3 -= $carry3 << 21; |
2381 $s3 -= $carry3 << 21; |
2590 /** @var int $carry5 */ |
|
2591 $carry5 = ($s5 + (1 << 20)) >> 21; |
2382 $carry5 = ($s5 + (1 << 20)) >> 21; |
2592 $s6 += $carry5; |
2383 $s6 += $carry5; |
2593 $s5 -= $carry5 << 21; |
2384 $s5 -= $carry5 << 21; |
2594 /** @var int $carry7 */ |
|
2595 $carry7 = ($s7 + (1 << 20)) >> 21; |
2385 $carry7 = ($s7 + (1 << 20)) >> 21; |
2596 $s8 += $carry7; |
2386 $s8 += $carry7; |
2597 $s7 -= $carry7 << 21; |
2387 $s7 -= $carry7 << 21; |
2598 /** @var int $carry9 */ |
|
2599 $carry9 = ($s9 + (1 << 20)) >> 21; |
2388 $carry9 = ($s9 + (1 << 20)) >> 21; |
2600 $s10 += $carry9; |
2389 $s10 += $carry9; |
2601 $s9 -= $carry9 << 21; |
2390 $s9 -= $carry9 << 21; |
2602 /** @var int $carry11 */ |
|
2603 $carry11 = ($s11 + (1 << 20)) >> 21; |
2391 $carry11 = ($s11 + (1 << 20)) >> 21; |
2604 $s12 += $carry11; |
2392 $s12 += $carry11; |
2605 $s11 -= $carry11 << 21; |
2393 $s11 -= $carry11 << 21; |
2606 |
2394 |
2607 $s0 += self::mul($s12, 666643, 20); |
2395 $s0 += self::mul($s12, 666643, 20); |
2610 $s3 -= self::mul($s12, 997805, 20); |
2398 $s3 -= self::mul($s12, 997805, 20); |
2611 $s4 += self::mul($s12, 136657, 18); |
2399 $s4 += self::mul($s12, 136657, 18); |
2612 $s5 -= self::mul($s12, 683901, 20); |
2400 $s5 -= self::mul($s12, 683901, 20); |
2613 $s12 = 0; |
2401 $s12 = 0; |
2614 |
2402 |
2615 /** @var int $carry0 */ |
|
2616 $carry0 = $s0 >> 21; |
2403 $carry0 = $s0 >> 21; |
2617 $s1 += $carry0; |
2404 $s1 += $carry0; |
2618 $s0 -= $carry0 << 21; |
2405 $s0 -= $carry0 << 21; |
2619 /** @var int $carry1 */ |
|
2620 $carry1 = $s1 >> 21; |
2406 $carry1 = $s1 >> 21; |
2621 $s2 += $carry1; |
2407 $s2 += $carry1; |
2622 $s1 -= $carry1 << 21; |
2408 $s1 -= $carry1 << 21; |
2623 /** @var int $carry2 */ |
|
2624 $carry2 = $s2 >> 21; |
2409 $carry2 = $s2 >> 21; |
2625 $s3 += $carry2; |
2410 $s3 += $carry2; |
2626 $s2 -= $carry2 << 21; |
2411 $s2 -= $carry2 << 21; |
2627 /** @var int $carry3 */ |
|
2628 $carry3 = $s3 >> 21; |
2412 $carry3 = $s3 >> 21; |
2629 $s4 += $carry3; |
2413 $s4 += $carry3; |
2630 $s3 -= $carry3 << 21; |
2414 $s3 -= $carry3 << 21; |
2631 /** @var int $carry4 */ |
|
2632 $carry4 = $s4 >> 21; |
2415 $carry4 = $s4 >> 21; |
2633 $s5 += $carry4; |
2416 $s5 += $carry4; |
2634 $s4 -= $carry4 << 21; |
2417 $s4 -= $carry4 << 21; |
2635 /** @var int $carry5 */ |
|
2636 $carry5 = $s5 >> 21; |
2418 $carry5 = $s5 >> 21; |
2637 $s6 += $carry5; |
2419 $s6 += $carry5; |
2638 $s5 -= $carry5 << 21; |
2420 $s5 -= $carry5 << 21; |
2639 /** @var int $carry6 */ |
|
2640 $carry6 = $s6 >> 21; |
2421 $carry6 = $s6 >> 21; |
2641 $s7 += $carry6; |
2422 $s7 += $carry6; |
2642 $s6 -= $carry6 << 21; |
2423 $s6 -= $carry6 << 21; |
2643 /** @var int $carry7 */ |
|
2644 $carry7 = $s7 >> 21; |
2424 $carry7 = $s7 >> 21; |
2645 $s8 += $carry7; |
2425 $s8 += $carry7; |
2646 $s7 -= $carry7 << 21; |
2426 $s7 -= $carry7 << 21; |
2647 /** @var int $carry8 */ |
|
2648 $carry8 = $s8 >> 21; |
2427 $carry8 = $s8 >> 21; |
2649 $s9 += $carry8; |
2428 $s9 += $carry8; |
2650 $s8 -= $carry8 << 21; |
2429 $s8 -= $carry8 << 21; |
2651 /** @var int $carry9 */ |
|
2652 $carry9 = $s9 >> 21; |
2430 $carry9 = $s9 >> 21; |
2653 $s10 += $carry9; |
2431 $s10 += $carry9; |
2654 $s9 -= $carry9 << 21; |
2432 $s9 -= $carry9 << 21; |
2655 /** @var int $carry10 */ |
|
2656 $carry10 = $s10 >> 21; |
2433 $carry10 = $s10 >> 21; |
2657 $s11 += $carry10; |
2434 $s11 += $carry10; |
2658 $s10 -= $carry10 << 21; |
2435 $s10 -= $carry10 << 21; |
2659 /** @var int $carry11 */ |
|
2660 $carry11 = $s11 >> 21; |
2436 $carry11 = $s11 >> 21; |
2661 $s12 += $carry11; |
2437 $s12 += $carry11; |
2662 $s11 -= $carry11 << 21; |
2438 $s11 -= $carry11 << 21; |
2663 |
2439 |
2664 $s0 += self::mul($s12, 666643, 20); |
2440 $s0 += self::mul($s12, 666643, 20); |
2666 $s2 += self::mul($s12, 654183, 20); |
2442 $s2 += self::mul($s12, 654183, 20); |
2667 $s3 -= self::mul($s12, 997805, 20); |
2443 $s3 -= self::mul($s12, 997805, 20); |
2668 $s4 += self::mul($s12, 136657, 18); |
2444 $s4 += self::mul($s12, 136657, 18); |
2669 $s5 -= self::mul($s12, 683901, 20); |
2445 $s5 -= self::mul($s12, 683901, 20); |
2670 |
2446 |
2671 /** @var int $carry0 */ |
|
2672 $carry0 = $s0 >> 21; |
2447 $carry0 = $s0 >> 21; |
2673 $s1 += $carry0; |
2448 $s1 += $carry0; |
2674 $s0 -= $carry0 << 21; |
2449 $s0 -= $carry0 << 21; |
2675 /** @var int $carry1 */ |
|
2676 $carry1 = $s1 >> 21; |
2450 $carry1 = $s1 >> 21; |
2677 $s2 += $carry1; |
2451 $s2 += $carry1; |
2678 $s1 -= $carry1 << 21; |
2452 $s1 -= $carry1 << 21; |
2679 /** @var int $carry2 */ |
|
2680 $carry2 = $s2 >> 21; |
2453 $carry2 = $s2 >> 21; |
2681 $s3 += $carry2; |
2454 $s3 += $carry2; |
2682 $s2 -= $carry2 << 21; |
2455 $s2 -= $carry2 << 21; |
2683 /** @var int $carry3 */ |
|
2684 $carry3 = $s3 >> 21; |
2456 $carry3 = $s3 >> 21; |
2685 $s4 += $carry3; |
2457 $s4 += $carry3; |
2686 $s3 -= $carry3 << 21; |
2458 $s3 -= $carry3 << 21; |
2687 /** @var int $carry4 */ |
|
2688 $carry4 = $s4 >> 21; |
2459 $carry4 = $s4 >> 21; |
2689 $s5 += $carry4; |
2460 $s5 += $carry4; |
2690 $s4 -= $carry4 << 21; |
2461 $s4 -= $carry4 << 21; |
2691 /** @var int $carry5 */ |
|
2692 $carry5 = $s5 >> 21; |
2462 $carry5 = $s5 >> 21; |
2693 $s6 += $carry5; |
2463 $s6 += $carry5; |
2694 $s5 -= $carry5 << 21; |
2464 $s5 -= $carry5 << 21; |
2695 /** @var int $carry6 */ |
|
2696 $carry6 = $s6 >> 21; |
2465 $carry6 = $s6 >> 21; |
2697 $s7 += $carry6; |
2466 $s7 += $carry6; |
2698 $s6 -= $carry6 << 21; |
2467 $s6 -= $carry6 << 21; |
2699 /** @var int $carry7 */ |
|
2700 $carry7 = $s7 >> 21; |
2468 $carry7 = $s7 >> 21; |
2701 $s8 += $carry7; |
2469 $s8 += $carry7; |
2702 $s7 -= $carry7 << 21; |
2470 $s7 -= $carry7 << 21; |
2703 /** @var int $carry8 */ |
|
2704 $carry8 = $s8 >> 21; |
2471 $carry8 = $s8 >> 21; |
2705 $s9 += $carry8; |
2472 $s9 += $carry8; |
2706 $s8 -= $carry8 << 21; |
2473 $s8 -= $carry8 << 21; |
2707 /** @var int $carry9 */ |
|
2708 $carry9 = $s9 >> 21; |
2474 $carry9 = $s9 >> 21; |
2709 $s10 += $carry9; |
2475 $s10 += $carry9; |
2710 $s9 -= $carry9 << 21; |
2476 $s9 -= $carry9 << 21; |
2711 /** @var int $carry10 */ |
|
2712 $carry10 = $s10 >> 21; |
2477 $carry10 = $s10 >> 21; |
2713 $s11 += $carry10; |
2478 $s11 += $carry10; |
2714 $s10 -= $carry10 << 21; |
2479 $s10 -= $carry10 << 21; |
2715 |
2480 |
2716 /** |
2481 /** |
2760 * @return string |
2525 * @return string |
2761 * @throws TypeError |
2526 * @throws TypeError |
2762 */ |
2527 */ |
2763 public static function sc_reduce($s) |
2528 public static function sc_reduce($s) |
2764 { |
2529 { |
2765 /** @var int $s0 */ |
|
2766 $s0 = 2097151 & self::load_3(self::substr($s, 0, 3)); |
2530 $s0 = 2097151 & self::load_3(self::substr($s, 0, 3)); |
2767 /** @var int $s1 */ |
|
2768 $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5); |
2531 $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5); |
2769 /** @var int $s2 */ |
|
2770 $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2); |
2532 $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2); |
2771 /** @var int $s3 */ |
|
2772 $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7); |
2533 $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7); |
2773 /** @var int $s4 */ |
|
2774 $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4); |
2534 $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4); |
2775 /** @var int $s5 */ |
|
2776 $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1); |
2535 $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1); |
2777 /** @var int $s6 */ |
|
2778 $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6); |
2536 $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6); |
2779 /** @var int $s7 */ |
|
2780 $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3); |
2537 $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3); |
2781 /** @var int $s8 */ |
|
2782 $s8 = 2097151 & self::load_3(self::substr($s, 21, 3)); |
2538 $s8 = 2097151 & self::load_3(self::substr($s, 21, 3)); |
2783 /** @var int $s9 */ |
|
2784 $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5); |
2539 $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5); |
2785 /** @var int $s10 */ |
|
2786 $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2); |
2540 $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2); |
2787 /** @var int $s11 */ |
|
2788 $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7); |
2541 $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7); |
2789 /** @var int $s12 */ |
|
2790 $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4); |
2542 $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4); |
2791 /** @var int $s13 */ |
|
2792 $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1); |
2543 $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1); |
2793 /** @var int $s14 */ |
|
2794 $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6); |
2544 $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6); |
2795 /** @var int $s15 */ |
|
2796 $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3); |
2545 $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3); |
2797 /** @var int $s16 */ |
|
2798 $s16 = 2097151 & self::load_3(self::substr($s, 42, 3)); |
2546 $s16 = 2097151 & self::load_3(self::substr($s, 42, 3)); |
2799 /** @var int $s17 */ |
|
2800 $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5); |
2547 $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5); |
2801 /** @var int $s18 */ |
|
2802 $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2); |
2548 $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2); |
2803 /** @var int $s19 */ |
|
2804 $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7); |
2549 $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7); |
2805 /** @var int $s20 */ |
|
2806 $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4); |
2550 $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4); |
2807 /** @var int $s21 */ |
|
2808 $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1); |
2551 $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1); |
2809 /** @var int $s22 */ |
|
2810 $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6); |
2552 $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6); |
2811 /** @var int $s23 */ |
2553 $s23 = 0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3); |
2812 $s23 = (self::load_4(self::substr($s, 60, 4)) >> 3); |
|
2813 |
2554 |
2814 $s11 += self::mul($s23, 666643, 20); |
2555 $s11 += self::mul($s23, 666643, 20); |
2815 $s12 += self::mul($s23, 470296, 19); |
2556 $s12 += self::mul($s23, 470296, 19); |
2816 $s13 += self::mul($s23, 654183, 20); |
2557 $s13 += self::mul($s23, 654183, 20); |
2817 $s14 -= self::mul($s23, 997805, 20); |
2558 $s14 -= self::mul($s23, 997805, 20); |
2851 $s8 += self::mul($s18, 654183, 20); |
2592 $s8 += self::mul($s18, 654183, 20); |
2852 $s9 -= self::mul($s18, 997805, 20); |
2593 $s9 -= self::mul($s18, 997805, 20); |
2853 $s10 += self::mul($s18, 136657, 18); |
2594 $s10 += self::mul($s18, 136657, 18); |
2854 $s11 -= self::mul($s18, 683901, 20); |
2595 $s11 -= self::mul($s18, 683901, 20); |
2855 |
2596 |
2856 /** @var int $carry6 */ |
|
2857 $carry6 = ($s6 + (1 << 20)) >> 21; |
2597 $carry6 = ($s6 + (1 << 20)) >> 21; |
2858 $s7 += $carry6; |
2598 $s7 += $carry6; |
2859 $s6 -= $carry6 << 21; |
2599 $s6 -= $carry6 << 21; |
2860 /** @var int $carry8 */ |
|
2861 $carry8 = ($s8 + (1 << 20)) >> 21; |
2600 $carry8 = ($s8 + (1 << 20)) >> 21; |
2862 $s9 += $carry8; |
2601 $s9 += $carry8; |
2863 $s8 -= $carry8 << 21; |
2602 $s8 -= $carry8 << 21; |
2864 /** @var int $carry10 */ |
|
2865 $carry10 = ($s10 + (1 << 20)) >> 21; |
2603 $carry10 = ($s10 + (1 << 20)) >> 21; |
2866 $s11 += $carry10; |
2604 $s11 += $carry10; |
2867 $s10 -= $carry10 << 21; |
2605 $s10 -= $carry10 << 21; |
2868 /** @var int $carry12 */ |
|
2869 $carry12 = ($s12 + (1 << 20)) >> 21; |
2606 $carry12 = ($s12 + (1 << 20)) >> 21; |
2870 $s13 += $carry12; |
2607 $s13 += $carry12; |
2871 $s12 -= $carry12 << 21; |
2608 $s12 -= $carry12 << 21; |
2872 /** @var int $carry14 */ |
|
2873 $carry14 = ($s14 + (1 << 20)) >> 21; |
2609 $carry14 = ($s14 + (1 << 20)) >> 21; |
2874 $s15 += $carry14; |
2610 $s15 += $carry14; |
2875 $s14 -= $carry14 << 21; |
2611 $s14 -= $carry14 << 21; |
2876 /** @var int $carry16 */ |
|
2877 $carry16 = ($s16 + (1 << 20)) >> 21; |
2612 $carry16 = ($s16 + (1 << 20)) >> 21; |
2878 $s17 += $carry16; |
2613 $s17 += $carry16; |
2879 $s16 -= $carry16 << 21; |
2614 $s16 -= $carry16 << 21; |
2880 |
2615 |
2881 /** @var int $carry7 */ |
|
2882 $carry7 = ($s7 + (1 << 20)) >> 21; |
2616 $carry7 = ($s7 + (1 << 20)) >> 21; |
2883 $s8 += $carry7; |
2617 $s8 += $carry7; |
2884 $s7 -= $carry7 << 21; |
2618 $s7 -= $carry7 << 21; |
2885 /** @var int $carry9 */ |
|
2886 $carry9 = ($s9 + (1 << 20)) >> 21; |
2619 $carry9 = ($s9 + (1 << 20)) >> 21; |
2887 $s10 += $carry9; |
2620 $s10 += $carry9; |
2888 $s9 -= $carry9 << 21; |
2621 $s9 -= $carry9 << 21; |
2889 /** @var int $carry11 */ |
|
2890 $carry11 = ($s11 + (1 << 20)) >> 21; |
2622 $carry11 = ($s11 + (1 << 20)) >> 21; |
2891 $s12 += $carry11; |
2623 $s12 += $carry11; |
2892 $s11 -= $carry11 << 21; |
2624 $s11 -= $carry11 << 21; |
2893 /** @var int $carry13 */ |
|
2894 $carry13 = ($s13 + (1 << 20)) >> 21; |
2625 $carry13 = ($s13 + (1 << 20)) >> 21; |
2895 $s14 += $carry13; |
2626 $s14 += $carry13; |
2896 $s13 -= $carry13 << 21; |
2627 $s13 -= $carry13 << 21; |
2897 /** @var int $carry15 */ |
|
2898 $carry15 = ($s15 + (1 << 20)) >> 21; |
2628 $carry15 = ($s15 + (1 << 20)) >> 21; |
2899 $s16 += $carry15; |
2629 $s16 += $carry15; |
2900 $s15 -= $carry15 << 21; |
2630 $s15 -= $carry15 << 21; |
2901 |
2631 |
2902 $s5 += self::mul($s17, 666643, 20); |
2632 $s5 += self::mul($s17, 666643, 20); |
2940 $s3 -= self::mul($s12, 997805, 20); |
2670 $s3 -= self::mul($s12, 997805, 20); |
2941 $s4 += self::mul($s12, 136657, 18); |
2671 $s4 += self::mul($s12, 136657, 18); |
2942 $s5 -= self::mul($s12, 683901, 20); |
2672 $s5 -= self::mul($s12, 683901, 20); |
2943 $s12 = 0; |
2673 $s12 = 0; |
2944 |
2674 |
2945 /** @var int $carry0 */ |
|
2946 $carry0 = ($s0 + (1 << 20)) >> 21; |
2675 $carry0 = ($s0 + (1 << 20)) >> 21; |
2947 $s1 += $carry0; |
2676 $s1 += $carry0; |
2948 $s0 -= $carry0 << 21; |
2677 $s0 -= $carry0 << 21; |
2949 /** @var int $carry2 */ |
|
2950 $carry2 = ($s2 + (1 << 20)) >> 21; |
2678 $carry2 = ($s2 + (1 << 20)) >> 21; |
2951 $s3 += $carry2; |
2679 $s3 += $carry2; |
2952 $s2 -= $carry2 << 21; |
2680 $s2 -= $carry2 << 21; |
2953 /** @var int $carry4 */ |
|
2954 $carry4 = ($s4 + (1 << 20)) >> 21; |
2681 $carry4 = ($s4 + (1 << 20)) >> 21; |
2955 $s5 += $carry4; |
2682 $s5 += $carry4; |
2956 $s4 -= $carry4 << 21; |
2683 $s4 -= $carry4 << 21; |
2957 /** @var int $carry6 */ |
|
2958 $carry6 = ($s6 + (1 << 20)) >> 21; |
2684 $carry6 = ($s6 + (1 << 20)) >> 21; |
2959 $s7 += $carry6; |
2685 $s7 += $carry6; |
2960 $s6 -= $carry6 << 21; |
2686 $s6 -= $carry6 << 21; |
2961 /** @var int $carry8 */ |
|
2962 $carry8 = ($s8 + (1 << 20)) >> 21; |
2687 $carry8 = ($s8 + (1 << 20)) >> 21; |
2963 $s9 += $carry8; |
2688 $s9 += $carry8; |
2964 $s8 -= $carry8 << 21; |
2689 $s8 -= $carry8 << 21; |
2965 /** @var int $carry10 */ |
|
2966 $carry10 = ($s10 + (1 << 20)) >> 21; |
2690 $carry10 = ($s10 + (1 << 20)) >> 21; |
2967 $s11 += $carry10; |
2691 $s11 += $carry10; |
2968 $s10 -= $carry10 << 21; |
2692 $s10 -= $carry10 << 21; |
2969 |
2693 |
2970 /** @var int $carry1 */ |
|
2971 $carry1 = ($s1 + (1 << 20)) >> 21; |
2694 $carry1 = ($s1 + (1 << 20)) >> 21; |
2972 $s2 += $carry1; |
2695 $s2 += $carry1; |
2973 $s1 -= $carry1 << 21; |
2696 $s1 -= $carry1 << 21; |
2974 /** @var int $carry3 */ |
|
2975 $carry3 = ($s3 + (1 << 20)) >> 21; |
2697 $carry3 = ($s3 + (1 << 20)) >> 21; |
2976 $s4 += $carry3; |
2698 $s4 += $carry3; |
2977 $s3 -= $carry3 << 21; |
2699 $s3 -= $carry3 << 21; |
2978 /** @var int $carry5 */ |
|
2979 $carry5 = ($s5 + (1 << 20)) >> 21; |
2700 $carry5 = ($s5 + (1 << 20)) >> 21; |
2980 $s6 += $carry5; |
2701 $s6 += $carry5; |
2981 $s5 -= $carry5 << 21; |
2702 $s5 -= $carry5 << 21; |
2982 /** @var int $carry7 */ |
|
2983 $carry7 = ($s7 + (1 << 20)) >> 21; |
2703 $carry7 = ($s7 + (1 << 20)) >> 21; |
2984 $s8 += $carry7; |
2704 $s8 += $carry7; |
2985 $s7 -= $carry7 << 21; |
2705 $s7 -= $carry7 << 21; |
2986 /** @var int $carry9 */ |
|
2987 $carry9 = ($s9 + (1 << 20)) >> 21; |
2706 $carry9 = ($s9 + (1 << 20)) >> 21; |
2988 $s10 += $carry9; |
2707 $s10 += $carry9; |
2989 $s9 -= $carry9 << 21; |
2708 $s9 -= $carry9 << 21; |
2990 /** @var int $carry11 */ |
|
2991 $carry11 = ($s11 + (1 << 20)) >> 21; |
2709 $carry11 = ($s11 + (1 << 20)) >> 21; |
2992 $s12 += $carry11; |
2710 $s12 += $carry11; |
2993 $s11 -= $carry11 << 21; |
2711 $s11 -= $carry11 << 21; |
2994 |
2712 |
2995 $s0 += self::mul($s12, 666643, 20); |
2713 $s0 += self::mul($s12, 666643, 20); |
2998 $s3 -= self::mul($s12, 997805, 20); |
2716 $s3 -= self::mul($s12, 997805, 20); |
2999 $s4 += self::mul($s12, 136657, 18); |
2717 $s4 += self::mul($s12, 136657, 18); |
3000 $s5 -= self::mul($s12, 683901, 20); |
2718 $s5 -= self::mul($s12, 683901, 20); |
3001 $s12 = 0; |
2719 $s12 = 0; |
3002 |
2720 |
3003 /** @var int $carry0 */ |
|
3004 $carry0 = $s0 >> 21; |
2721 $carry0 = $s0 >> 21; |
3005 $s1 += $carry0; |
2722 $s1 += $carry0; |
3006 $s0 -= $carry0 << 21; |
2723 $s0 -= $carry0 << 21; |
3007 /** @var int $carry1 */ |
|
3008 $carry1 = $s1 >> 21; |
2724 $carry1 = $s1 >> 21; |
3009 $s2 += $carry1; |
2725 $s2 += $carry1; |
3010 $s1 -= $carry1 << 21; |
2726 $s1 -= $carry1 << 21; |
3011 /** @var int $carry2 */ |
|
3012 $carry2 = $s2 >> 21; |
2727 $carry2 = $s2 >> 21; |
3013 $s3 += $carry2; |
2728 $s3 += $carry2; |
3014 $s2 -= $carry2 << 21; |
2729 $s2 -= $carry2 << 21; |
3015 /** @var int $carry3 */ |
|
3016 $carry3 = $s3 >> 21; |
2730 $carry3 = $s3 >> 21; |
3017 $s4 += $carry3; |
2731 $s4 += $carry3; |
3018 $s3 -= $carry3 << 21; |
2732 $s3 -= $carry3 << 21; |
3019 /** @var int $carry4 */ |
|
3020 $carry4 = $s4 >> 21; |
2733 $carry4 = $s4 >> 21; |
3021 $s5 += $carry4; |
2734 $s5 += $carry4; |
3022 $s4 -= $carry4 << 21; |
2735 $s4 -= $carry4 << 21; |
3023 /** @var int $carry5 */ |
|
3024 $carry5 = $s5 >> 21; |
2736 $carry5 = $s5 >> 21; |
3025 $s6 += $carry5; |
2737 $s6 += $carry5; |
3026 $s5 -= $carry5 << 21; |
2738 $s5 -= $carry5 << 21; |
3027 /** @var int $carry6 */ |
|
3028 $carry6 = $s6 >> 21; |
2739 $carry6 = $s6 >> 21; |
3029 $s7 += $carry6; |
2740 $s7 += $carry6; |
3030 $s6 -= $carry6 << 21; |
2741 $s6 -= $carry6 << 21; |
3031 /** @var int $carry7 */ |
|
3032 $carry7 = $s7 >> 21; |
2742 $carry7 = $s7 >> 21; |
3033 $s8 += $carry7; |
2743 $s8 += $carry7; |
3034 $s7 -= $carry7 << 21; |
2744 $s7 -= $carry7 << 21; |
3035 /** @var int $carry8 */ |
|
3036 $carry8 = $s8 >> 21; |
2745 $carry8 = $s8 >> 21; |
3037 $s9 += $carry8; |
2746 $s9 += $carry8; |
3038 $s8 -= $carry8 << 21; |
2747 $s8 -= $carry8 << 21; |
3039 /** @var int $carry9 */ |
|
3040 $carry9 = $s9 >> 21; |
2748 $carry9 = $s9 >> 21; |
3041 $s10 += $carry9; |
2749 $s10 += $carry9; |
3042 $s9 -= $carry9 << 21; |
2750 $s9 -= $carry9 << 21; |
3043 /** @var int $carry10 */ |
|
3044 $carry10 = $s10 >> 21; |
2751 $carry10 = $s10 >> 21; |
3045 $s11 += $carry10; |
2752 $s11 += $carry10; |
3046 $s10 -= $carry10 << 21; |
2753 $s10 -= $carry10 << 21; |
3047 /** @var int $carry11 */ |
|
3048 $carry11 = $s11 >> 21; |
2754 $carry11 = $s11 >> 21; |
3049 $s12 += $carry11; |
2755 $s12 += $carry11; |
3050 $s11 -= $carry11 << 21; |
2756 $s11 -= $carry11 << 21; |
3051 |
2757 |
3052 $s0 += self::mul($s12, 666643, 20); |
2758 $s0 += self::mul($s12, 666643, 20); |
3054 $s2 += self::mul($s12, 654183, 20); |
2760 $s2 += self::mul($s12, 654183, 20); |
3055 $s3 -= self::mul($s12, 997805, 20); |
2761 $s3 -= self::mul($s12, 997805, 20); |
3056 $s4 += self::mul($s12, 136657, 18); |
2762 $s4 += self::mul($s12, 136657, 18); |
3057 $s5 -= self::mul($s12, 683901, 20); |
2763 $s5 -= self::mul($s12, 683901, 20); |
3058 |
2764 |
3059 /** @var int $carry0 */ |
|
3060 $carry0 = $s0 >> 21; |
2765 $carry0 = $s0 >> 21; |
3061 $s1 += $carry0; |
2766 $s1 += $carry0; |
3062 $s0 -= $carry0 << 21; |
2767 $s0 -= $carry0 << 21; |
3063 /** @var int $carry1 */ |
|
3064 $carry1 = $s1 >> 21; |
2768 $carry1 = $s1 >> 21; |
3065 $s2 += $carry1; |
2769 $s2 += $carry1; |
3066 $s1 -= $carry1 << 21; |
2770 $s1 -= $carry1 << 21; |
3067 /** @var int $carry2 */ |
|
3068 $carry2 = $s2 >> 21; |
2771 $carry2 = $s2 >> 21; |
3069 $s3 += $carry2; |
2772 $s3 += $carry2; |
3070 $s2 -= $carry2 << 21; |
2773 $s2 -= $carry2 << 21; |
3071 /** @var int $carry3 */ |
|
3072 $carry3 = $s3 >> 21; |
2774 $carry3 = $s3 >> 21; |
3073 $s4 += $carry3; |
2775 $s4 += $carry3; |
3074 $s3 -= $carry3 << 21; |
2776 $s3 -= $carry3 << 21; |
3075 /** @var int $carry4 */ |
|
3076 $carry4 = $s4 >> 21; |
2777 $carry4 = $s4 >> 21; |
3077 $s5 += $carry4; |
2778 $s5 += $carry4; |
3078 $s4 -= $carry4 << 21; |
2779 $s4 -= $carry4 << 21; |
3079 /** @var int $carry5 */ |
|
3080 $carry5 = $s5 >> 21; |
2780 $carry5 = $s5 >> 21; |
3081 $s6 += $carry5; |
2781 $s6 += $carry5; |
3082 $s5 -= $carry5 << 21; |
2782 $s5 -= $carry5 << 21; |
3083 /** @var int $carry6 */ |
|
3084 $carry6 = $s6 >> 21; |
2783 $carry6 = $s6 >> 21; |
3085 $s7 += $carry6; |
2784 $s7 += $carry6; |
3086 $s6 -= $carry6 << 21; |
2785 $s6 -= $carry6 << 21; |
3087 /** @var int $carry7 */ |
|
3088 $carry7 = $s7 >> 21; |
2786 $carry7 = $s7 >> 21; |
3089 $s8 += $carry7; |
2787 $s8 += $carry7; |
3090 $s7 -= $carry7 << 21; |
2788 $s7 -= $carry7 << 21; |
3091 /** @var int $carry8 */ |
|
3092 $carry8 = $s8 >> 21; |
2789 $carry8 = $s8 >> 21; |
3093 $s9 += $carry8; |
2790 $s9 += $carry8; |
3094 $s8 -= $carry8 << 21; |
2791 $s8 -= $carry8 << 21; |
3095 /** @var int $carry9 */ |
|
3096 $carry9 = $s9 >> 21; |
2792 $carry9 = $s9 >> 21; |
3097 $s10 += $carry9; |
2793 $s10 += $carry9; |
3098 $s9 -= $carry9 << 21; |
2794 $s9 -= $carry9 << 21; |
3099 /** @var int $carry10 */ |
|
3100 $carry10 = $s10 >> 21; |
2795 $carry10 = $s10 >> 21; |
3101 $s11 += $carry10; |
2796 $s11 += $carry10; |
3102 $s10 -= $carry10 << 21; |
2797 $s10 -= $carry10 << 21; |
3103 |
2798 |
3104 /** |
2799 /** |
3147 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A |
2842 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A |
3148 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 |
2843 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 |
3149 */ |
2844 */ |
3150 public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) |
2845 public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) |
3151 { |
2846 { |
3152 /** @var array<int, int> $aslide */ |
|
3153 $aslide = array( |
2847 $aslide = array( |
3154 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, |
2848 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, |
3155 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, |
2849 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, |
3156 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, |
2850 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, |
3157 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, |
2851 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, |