wp/wp-includes/sodium_compat/src/Core/Curve25519.php
changeset 19 3d72ae0968f4
parent 18 be944660c56a
equal deleted inserted replaced
18:be944660c56a 19:3d72ae0968f4
   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);
   550         $f9g5_38 = self::mul($g5_19, $f9_2, 26);
   477         $f9g5_38 = self::mul($g5_19, $f9_2, 26);
   551         $f9g6_19 = self::mul($g6_19, $f9, 25);
   478         $f9g6_19 = self::mul($g6_19, $f9, 25);
   552         $f9g7_38 = self::mul($g7_19, $f9_2, 26);
   479         $f9g7_38 = self::mul($g7_19, $f9_2, 26);
   553         $f9g8_19 = self::mul($g8_19, $f9, 25);
   480         $f9g8_19 = self::mul($g8_19, $f9, 25);
   554         $f9g9_38 = self::mul($g9_19, $f9_2, 26);
   481         $f9g9_38 = self::mul($g9_19, $f9_2, 26);
       
   482 
   555         $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
   483         $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
   556         $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
   484         $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
   557         $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
   485         $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
   558         $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
   486         $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
   559         $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
   487         $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
   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     /**
   649     {
   567     {
   650         $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
   568         $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
   651         for ($i = 0; $i < 10; ++$i) {
   569         for ($i = 0; $i < 10; ++$i) {
   652             $h[$i] = -$f[$i];
   570             $h[$i] = -$f[$i];
   653         }
   571         }
   654         return $h;
   572         return self::fe_normalize($h);
   655     }
   573     }
   656 
   574 
   657     /**
   575     /**
   658      * Square a field element
   576      * Square a field element
   659      *
   577      *
   664      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
   582      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
   665      * @return ParagonIE_Sodium_Core_Curve25519_Fe
   583      * @return ParagonIE_Sodium_Core_Curve25519_Fe
   666      */
   584      */
   667     public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
   585     public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
   668     {
   586     {
       
   587         $f = self::fe_normalize($f);
   669         $f0 = (int) $f[0];
   588         $f0 = (int) $f[0];
   670         $f1 = (int) $f[1];
   589         $f1 = (int) $f[1];
   671         $f2 = (int) $f[2];
   590         $f2 = (int) $f[2];
   672         $f3 = (int) $f[3];
   591         $f3 = (int) $f[3];
   673         $f4 = (int) $f[4];
   592         $f4 = (int) $f[4];
   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 
   846      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
   747      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
   847      * @return ParagonIE_Sodium_Core_Curve25519_Fe
   748      * @return ParagonIE_Sodium_Core_Curve25519_Fe
   848      */
   749      */
   849     public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
   750     public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
   850     {
   751     {
       
   752         $f = self::fe_normalize($f);
   851         $f0 = (int) $f[0];
   753         $f0 = (int) $f[0];
   852         $f1 = (int) $f[1];
   754         $f1 = (int) $f[1];
   853         $f2 = (int) $f[2];
   755         $f2 = (int) $f[2];
   854         $f3 = (int) $f[3];
   756         $f3 = (int) $f[3];
   855         $f4 = (int) $f[4];
   757         $f4 = (int) $f[4];
   857         $f6 = (int) $f[6];
   759         $f6 = (int) $f[6];
   858         $f7 = (int) $f[7];
   760         $f7 = (int) $f[7];
   859         $f8 = (int) $f[8];
   761         $f8 = (int) $f[8];
   860         $f9 = (int) $f[9];
   762         $f9 = (int) $f[9];
   861 
   763 
   862         /** @var int $f0_2 */
       
   863         $f0_2 = $f0 << 1;
   764         $f0_2 = $f0 << 1;
   864         /** @var int $f1_2 */
       
   865         $f1_2 = $f1 << 1;
   765         $f1_2 = $f1 << 1;
   866         /** @var int $f2_2 */
       
   867         $f2_2 = $f2 << 1;
   766         $f2_2 = $f2 << 1;
   868         /** @var int $f3_2 */
       
   869         $f3_2 = $f3 << 1;
   767         $f3_2 = $f3 << 1;
   870         /** @var int $f4_2 */
       
   871         $f4_2 = $f4 << 1;
   768         $f4_2 = $f4 << 1;
   872         /** @var int $f5_2 */
       
   873         $f5_2 = $f5 << 1;
   769         $f5_2 = $f5 << 1;
   874         /** @var int $f6_2 */
       
   875         $f6_2 = $f6 << 1;
   770         $f6_2 = $f6 << 1;
   876         /** @var int $f7_2 */
       
   877         $f7_2 = $f7 << 1;
   771         $f7_2 = $f7 << 1;
   878         $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
   772         $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
   879         $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
   773         $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
   880         $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
   774         $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
   881         $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
   775         $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
   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     /**
  1094      * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
   968      * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
  1095      * @return ParagonIE_Sodium_Core_Curve25519_Fe
   969      * @return ParagonIE_Sodium_Core_Curve25519_Fe
  1096      */
   970      */
  1097     public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
   971     public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
  1098     {
   972     {
       
   973         $z = self::fe_normalize($z);
  1099         # fe_sq(t0, z);
   974         # fe_sq(t0, z);
  1100         # fe_sq(t1, t0);
   975         # fe_sq(t1, t0);
  1101         # fe_sq(t1, t1);
   976         # fe_sq(t1, t1);
  1102         # fe_mul(t1, z, t1);
   977         # fe_mul(t1, z, t1);
  1103         # fe_mul(t0, t0, t1);
   978         # fe_mul(t0, t0, t1);
  1221      * @return ParagonIE_Sodium_Core_Curve25519_Fe
  1096      * @return ParagonIE_Sodium_Core_Curve25519_Fe
  1222      * @psalm-suppress MixedOperand
  1097      * @psalm-suppress MixedOperand
  1223      */
  1098      */
  1224     public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
  1099     public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
  1225     {
  1100     {
  1226         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
  1101         return self::fe_normalize(
  1227             array(
  1102             ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
  1228                 (int) ($f[0] - $g[0]),
  1103                 array(
  1229                 (int) ($f[1] - $g[1]),
  1104                     (int) ($f[0] - $g[0]),
  1230                 (int) ($f[2] - $g[2]),
  1105                     (int) ($f[1] - $g[1]),
  1231                 (int) ($f[3] - $g[3]),
  1106                     (int) ($f[2] - $g[2]),
  1232                 (int) ($f[4] - $g[4]),
  1107                     (int) ($f[3] - $g[3]),
  1233                 (int) ($f[5] - $g[5]),
  1108                     (int) ($f[4] - $g[4]),
  1234                 (int) ($f[6] - $g[6]),
  1109                     (int) ($f[5] - $g[5]),
  1235                 (int) ($f[7] - $g[7]),
  1110                     (int) ($f[6] - $g[6]),
  1236                 (int) ($f[8] - $g[8]),
  1111                     (int) ($f[7] - $g[7]),
  1237                 (int) ($f[9] - $g[9])
  1112                     (int) ($f[8] - $g[8]),
       
  1113                     (int) ($f[9] - $g[9])
       
  1114                 )
  1238             )
  1115             )
  1239         );
  1116         );
  1240     }
  1117     }
  1241 
  1118 
  1242     /**
  1119     /**
  1788         }
  1665         }
  1789         if ($pos < 0 || $pos > 31) {
  1666         if ($pos < 0 || $pos > 31) {
  1790             throw new RangeException('Position is out of range [0, 31]');
  1667             throw new RangeException('Position is out of range [0, 31]');
  1791         }
  1668         }
  1792 
  1669 
  1793         /** @var int $bnegative */
       
  1794         $bnegative = self::negative($b);
  1670         $bnegative = self::negative($b);
  1795         /** @var int $babs */
       
  1796         $babs = $b - (((-$bnegative) & $b) << 1);
  1671         $babs = $b - (((-$bnegative) & $b) << 1);
  1797 
  1672 
  1798         $t = self::ge_precomp_0();
  1673         $t = self::ge_precomp_0();
  1799         for ($i = 0; $i < 8; ++$i) {
  1674         for ($i = 0; $i < 8; ++$i) {
  1800             $t = self::cmov(
  1675             $t = self::cmov(
  2078         //            carry = e[i] + 8;
  1953         //            carry = e[i] + 8;
  2079         //            carry >>= 4;
  1954         //            carry >>= 4;
  2080         //            e[i] -= carry * ((signed char) 1 << 4);
  1955         //            e[i] -= carry * ((signed char) 1 << 4);
  2081         //        }
  1956         //        }
  2082         $carry = 0;
  1957         $carry = 0;
  2083         for ($i = 0; $i < 64; ++$i) {
  1958         for ($i = 0; $i < 63; ++$i) {
  2084             $e[$i] += $carry;
  1959             $e[$i] += $carry;
  2085             $carry = $e[$i] + 8;
  1960             $carry = $e[$i] + 8;
  2086             $carry >>= 4;
  1961             $carry >>= 4;
  2087             $e[$i] -= $carry << 4;
  1962             $e[$i] -= $carry << 4;
  2088         }
  1963         }
  2144         /** @var array<int, int> $e */
  2019         /** @var array<int, int> $e */
  2145         $e = array();
  2020         $e = array();
  2146         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
  2021         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
  2147 
  2022 
  2148         for ($i = 0; $i < 32; ++$i) {
  2023         for ($i = 0; $i < 32; ++$i) {
  2149             /** @var int $dbl */
       
  2150             $dbl = (int) $i << 1;
  2024             $dbl = (int) $i << 1;
  2151             $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
  2025             $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
  2152             $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
  2026             $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
  2153         }
  2027         }
  2154 
  2028 
  2155         /** @var int $carry */
       
  2156         $carry = 0;
  2029         $carry = 0;
  2157         for ($i = 0; $i < 63; ++$i) {
  2030         for ($i = 0; $i < 63; ++$i) {
  2158             $e[$i] += $carry;
  2031             $e[$i] += $carry;
  2159             /** @var int $carry */
       
  2160             $carry = $e[$i] + 8;
  2032             $carry = $e[$i] + 8;
  2161             /** @var int $carry */
       
  2162             $carry >>= 4;
  2033             $carry >>= 4;
  2163             $e[$i] -= $carry << 4;
  2034             $e[$i] -= $carry << 4;
  2164         }
  2035         }
  2165         /** @var array<int, int> $e */
       
  2166         $e[63] += (int) $carry;
  2036         $e[63] += (int) $carry;
  2167 
  2037 
  2168         $h = self::ge_p3_0();
  2038         $h = self::ge_p3_0();
  2169 
  2039 
  2170         for ($i = 1; $i < 64; $i += 2) {
  2040         for ($i = 1; $i < 64; $i += 2) {
  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,
  4101         $s_[0] &= 248;
  3795         $s_[0] &= 248;
  4102         $s_[31] |= 64;
  3796         $s_[31] |= 64;
  4103         $s_[31] &= 128;
  3797         $s_[31] &= 128;
  4104         return self::intArrayToString($s_);
  3798         return self::intArrayToString($s_);
  4105     }
  3799     }
       
  3800 
       
  3801     /**
       
  3802      * Ensure limbs are less than 28 bits long to prevent float promotion.
       
  3803      *
       
  3804      * This uses a constant-time conditional swap under the hood.
       
  3805      *
       
  3806      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
       
  3807      * @return ParagonIE_Sodium_Core_Curve25519_Fe
       
  3808      */
       
  3809     public static function fe_normalize(ParagonIE_Sodium_Core_Curve25519_Fe $f)
       
  3810     {
       
  3811         $x = (PHP_INT_SIZE << 3) - 1; // 31 or 63
       
  3812 
       
  3813         $g = self::fe_copy($f);
       
  3814         for ($i = 0; $i < 10; ++$i) {
       
  3815             $mask = -(($g[$i] >> $x) & 1);
       
  3816 
       
  3817             /*
       
  3818              * Get two candidate normalized values for $g[$i], depending on the sign of $g[$i]:
       
  3819              */
       
  3820             $a = $g[$i] & 0x7ffffff;
       
  3821             $b = -((-$g[$i]) & 0x7ffffff);
       
  3822 
       
  3823             /*
       
  3824              * Return the appropriate candidate value, based on the sign of the original input:
       
  3825              *
       
  3826              * The following is equivalent to this ternary:
       
  3827              *
       
  3828              * $g[$i] = (($g[$i] >> $x) & 1) ? $a : $b;
       
  3829              *
       
  3830              * Except what's written doesn't contain timing leaks.
       
  3831              */
       
  3832             $g[$i] = ($a ^ (($a ^ $b) & $mask));
       
  3833         }
       
  3834         return $g;
       
  3835     }
  4106 }
  3836 }