Completed
Push — develop ( 47c1de...5901ab )
by Zack
19:00 queued 11s
created
vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php 3 patches
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P2', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 
7 7
 /**
@@ -9,46 +9,46 @@  discard block
 block discarded – undo
9 9
  */
10 10
 class ParagonIE_Sodium_Core_Curve25519_Ge_P2
11 11
 {
12
-    /**
13
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
-     */
15
-    public $X;
12
+	/**
13
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
+	 */
15
+	public $X;
16 16
 
17
-    /**
18
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
-     */
20
-    public $Y;
17
+	/**
18
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
+	 */
20
+	public $Y;
21 21
 
22
-    /**
23
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
-     */
25
-    public $Z;
22
+	/**
23
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
+	 */
25
+	public $Z;
26 26
 
27
-    /**
28
-     * ParagonIE_Sodium_Core_Curve25519_Ge_P2 constructor.
29
-     *
30
-     * @internal You should not use this directly from another application
31
-     *
32
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
33
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
34
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
35
-     */
36
-    public function __construct(
37
-        ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
38
-        ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
39
-        ParagonIE_Sodium_Core_Curve25519_Fe $z = null
40
-    ) {
41
-        if ($x === null) {
42
-            $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
43
-        }
44
-        $this->X = $x;
45
-        if ($y === null) {
46
-            $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
47
-        }
48
-        $this->Y = $y;
49
-        if ($z === null) {
50
-            $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
51
-        }
52
-        $this->Z = $z;
53
-    }
27
+	/**
28
+	 * ParagonIE_Sodium_Core_Curve25519_Ge_P2 constructor.
29
+	 *
30
+	 * @internal You should not use this directly from another application
31
+	 *
32
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
33
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
34
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
35
+	 */
36
+	public function __construct(
37
+		ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
38
+		ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
39
+		ParagonIE_Sodium_Core_Curve25519_Fe $z = null
40
+	) {
41
+		if ($x === null) {
42
+			$x = new ParagonIE_Sodium_Core_Curve25519_Fe();
43
+		}
44
+		$this->X = $x;
45
+		if ($y === null) {
46
+			$y = new ParagonIE_Sodium_Core_Curve25519_Fe();
47
+		}
48
+		$this->Y = $y;
49
+		if ($z === null) {
50
+			$z = new ParagonIE_Sodium_Core_Curve25519_Fe();
51
+		}
52
+		$this->Z = $z;
53
+	}
54 54
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P2', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_Curve25519_Ge_P2', false ) ) {
4 4
     return;
5 5
 }
6 6
 
@@ -38,15 +38,15 @@  discard block
 block discarded – undo
38 38
         ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
39 39
         ParagonIE_Sodium_Core_Curve25519_Fe $z = null
40 40
     ) {
41
-        if ($x === null) {
41
+        if ( $x === null ) {
42 42
             $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
43 43
         }
44 44
         $this->X = $x;
45
-        if ($y === null) {
45
+        if ( $y === null ) {
46 46
             $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
47 47
         }
48 48
         $this->Y = $y;
49
-        if ($z === null) {
49
+        if ( $z === null ) {
50 50
             $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
51 51
         }
52 52
         $this->Z = $z;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -7,8 +7,7 @@
 block discarded – undo
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_P2
9 9
  */
10
-class ParagonIE_Sodium_Core_Curve25519_Ge_P2
11
-{
10
+class ParagonIE_Sodium_Core_Curve25519_Ge_P2 {
12 11
     /**
13 12
      * @var ParagonIE_Sodium_Core_Curve25519_Fe
14 13
      */
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php 3 patches
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -1,64 +1,64 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P1p1', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 /**
7 7
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
8 8
  */
9 9
 class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
10 10
 {
11
-    /**
12
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
13
-     */
14
-    public $X;
11
+	/**
12
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
13
+	 */
14
+	public $X;
15 15
 
16
-    /**
17
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
18
-     */
19
-    public $Y;
16
+	/**
17
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
18
+	 */
19
+	public $Y;
20 20
 
21
-    /**
22
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
23
-     */
24
-    public $Z;
21
+	/**
22
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
23
+	 */
24
+	public $Z;
25 25
 
26
-    /**
27
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
28
-     */
29
-    public $T;
26
+	/**
27
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
28
+	 */
29
+	public $T;
30 30
 
31
-    /**
32
-     * ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 constructor.
33
-     *
34
-     * @internal You should not use this directly from another application
35
-     *
36
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
37
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
38
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
39
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t
40
-     */
41
-    public function __construct(
42
-        ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
43
-        ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
44
-        ParagonIE_Sodium_Core_Curve25519_Fe $z = null,
45
-        ParagonIE_Sodium_Core_Curve25519_Fe $t = null
46
-    ) {
47
-        if ($x === null) {
48
-            $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
49
-        }
50
-        $this->X = $x;
51
-        if ($y === null) {
52
-            $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
53
-        }
54
-        $this->Y = $y;
55
-        if ($z === null) {
56
-            $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
57
-        }
58
-        $this->Z = $z;
59
-        if ($t === null) {
60
-            $t = new ParagonIE_Sodium_Core_Curve25519_Fe();
61
-        }
62
-        $this->T = $t;
63
-    }
31
+	/**
32
+	 * ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 constructor.
33
+	 *
34
+	 * @internal You should not use this directly from another application
35
+	 *
36
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
37
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
38
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
39
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t
40
+	 */
41
+	public function __construct(
42
+		ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
43
+		ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
44
+		ParagonIE_Sodium_Core_Curve25519_Fe $z = null,
45
+		ParagonIE_Sodium_Core_Curve25519_Fe $t = null
46
+	) {
47
+		if ($x === null) {
48
+			$x = new ParagonIE_Sodium_Core_Curve25519_Fe();
49
+		}
50
+		$this->X = $x;
51
+		if ($y === null) {
52
+			$y = new ParagonIE_Sodium_Core_Curve25519_Fe();
53
+		}
54
+		$this->Y = $y;
55
+		if ($z === null) {
56
+			$z = new ParagonIE_Sodium_Core_Curve25519_Fe();
57
+		}
58
+		$this->Z = $z;
59
+		if ($t === null) {
60
+			$t = new ParagonIE_Sodium_Core_Curve25519_Fe();
61
+		}
62
+		$this->T = $t;
63
+	}
64 64
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P1p1', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_Curve25519_Ge_P1p1', false ) ) {
4 4
     return;
5 5
 }
6 6
 /**
@@ -44,19 +44,19 @@  discard block
 block discarded – undo
44 44
         ParagonIE_Sodium_Core_Curve25519_Fe $z = null,
45 45
         ParagonIE_Sodium_Core_Curve25519_Fe $t = null
46 46
     ) {
47
-        if ($x === null) {
47
+        if ( $x === null ) {
48 48
             $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
49 49
         }
50 50
         $this->X = $x;
51
-        if ($y === null) {
51
+        if ( $y === null ) {
52 52
             $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
53 53
         }
54 54
         $this->Y = $y;
55
-        if ($z === null) {
55
+        if ( $z === null ) {
56 56
             $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
57 57
         }
58 58
         $this->Z = $z;
59
-        if ($t === null) {
59
+        if ( $t === null ) {
60 60
             $t = new ParagonIE_Sodium_Core_Curve25519_Fe();
61 61
         }
62 62
         $this->T = $t;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -6,8 +6,7 @@
 block discarded – undo
6 6
 /**
7 7
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
8 8
  */
9
-class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
10
-{
9
+class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 {
11 10
     /**
12 11
      * @var ParagonIE_Sodium_Core_Curve25519_Fe
13 12
      */
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php 3 patches
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -2,64 +2,64 @@
 block discarded – undo
2 2
 
3 3
 
4 4
 if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Cached', false)) {
5
-    return;
5
+	return;
6 6
 }
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
9 9
  */
10 10
 class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
11 11
 {
12
-    /**
13
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
-     */
15
-    public $YplusX;
12
+	/**
13
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
+	 */
15
+	public $YplusX;
16 16
 
17
-    /**
18
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
-     */
20
-    public $YminusX;
17
+	/**
18
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
+	 */
20
+	public $YminusX;
21 21
 
22
-    /**
23
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
-     */
25
-    public $Z;
22
+	/**
23
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
+	 */
25
+	public $Z;
26 26
 
27
-    /**
28
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
29
-     */
30
-    public $T2d;
27
+	/**
28
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
29
+	 */
30
+	public $T2d;
31 31
 
32
-    /**
33
-     * ParagonIE_Sodium_Core_Curve25519_Ge_Cached constructor.
34
-     *
35
-     * @internal You should not use this directly from another application
36
-     *
37
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YplusX
38
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YminusX
39
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $Z
40
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $T2d
41
-     */
42
-    public function __construct(
43
-        ParagonIE_Sodium_Core_Curve25519_Fe $YplusX = null,
44
-        ParagonIE_Sodium_Core_Curve25519_Fe $YminusX = null,
45
-        ParagonIE_Sodium_Core_Curve25519_Fe $Z = null,
46
-        ParagonIE_Sodium_Core_Curve25519_Fe $T2d = null
47
-    ) {
48
-        if ($YplusX === null) {
49
-            $YplusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
50
-        }
51
-        $this->YplusX = $YplusX;
52
-        if ($YminusX === null) {
53
-            $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
54
-        }
55
-        $this->YminusX = $YminusX;
56
-        if ($Z === null) {
57
-            $Z = new ParagonIE_Sodium_Core_Curve25519_Fe();
58
-        }
59
-        $this->Z = $Z;
60
-        if ($T2d === null) {
61
-            $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
62
-        }
63
-        $this->T2d = $T2d;
64
-    }
32
+	/**
33
+	 * ParagonIE_Sodium_Core_Curve25519_Ge_Cached constructor.
34
+	 *
35
+	 * @internal You should not use this directly from another application
36
+	 *
37
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YplusX
38
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YminusX
39
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $Z
40
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $T2d
41
+	 */
42
+	public function __construct(
43
+		ParagonIE_Sodium_Core_Curve25519_Fe $YplusX = null,
44
+		ParagonIE_Sodium_Core_Curve25519_Fe $YminusX = null,
45
+		ParagonIE_Sodium_Core_Curve25519_Fe $Z = null,
46
+		ParagonIE_Sodium_Core_Curve25519_Fe $T2d = null
47
+	) {
48
+		if ($YplusX === null) {
49
+			$YplusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
50
+		}
51
+		$this->YplusX = $YplusX;
52
+		if ($YminusX === null) {
53
+			$YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
54
+		}
55
+		$this->YminusX = $YminusX;
56
+		if ($Z === null) {
57
+			$Z = new ParagonIE_Sodium_Core_Curve25519_Fe();
58
+		}
59
+		$this->Z = $Z;
60
+		if ($T2d === null) {
61
+			$T2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
62
+		}
63
+		$this->T2d = $T2d;
64
+	}
65 65
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 
4
-if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Cached', false)) {
4
+if ( class_exists( 'ParagonIE_Sodium_Core_Curve25519_Ge_Cached', false ) ) {
5 5
     return;
6 6
 }
7 7
 /**
@@ -45,19 +45,19 @@  discard block
 block discarded – undo
45 45
         ParagonIE_Sodium_Core_Curve25519_Fe $Z = null,
46 46
         ParagonIE_Sodium_Core_Curve25519_Fe $T2d = null
47 47
     ) {
48
-        if ($YplusX === null) {
48
+        if ( $YplusX === null ) {
49 49
             $YplusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
50 50
         }
51 51
         $this->YplusX = $YplusX;
52
-        if ($YminusX === null) {
52
+        if ( $YminusX === null ) {
53 53
             $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
54 54
         }
55 55
         $this->YminusX = $YminusX;
56
-        if ($Z === null) {
56
+        if ( $Z === null ) {
57 57
             $Z = new ParagonIE_Sodium_Core_Curve25519_Fe();
58 58
         }
59 59
         $this->Z = $Z;
60
-        if ($T2d === null) {
60
+        if ( $T2d === null ) {
61 61
             $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
62 62
         }
63 63
         $this->T2d = $T2d;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -7,8 +7,7 @@
 block discarded – undo
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
9 9
  */
10
-class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
11
-{
10
+class ParagonIE_Sodium_Core_Curve25519_Ge_Cached {
12 11
     /**
13 12
      * @var ParagonIE_Sodium_Core_Curve25519_Fe
14 13
      */
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php 3 patches
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Precomp', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 
7 7
 /**
@@ -9,46 +9,46 @@  discard block
 block discarded – undo
9 9
  */
10 10
 class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
11 11
 {
12
-    /**
13
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
-     */
15
-    public $yplusx;
12
+	/**
13
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
14
+	 */
15
+	public $yplusx;
16 16
 
17
-    /**
18
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
-     */
20
-    public $yminusx;
17
+	/**
18
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
19
+	 */
20
+	public $yminusx;
21 21
 
22
-    /**
23
-     * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
-     */
25
-    public $xy2d;
22
+	/**
23
+	 * @var ParagonIE_Sodium_Core_Curve25519_Fe
24
+	 */
25
+	public $xy2d;
26 26
 
27
-    /**
28
-     * ParagonIE_Sodium_Core_Curve25519_Ge_Precomp constructor.
29
-     *
30
-     * @internal You should not use this directly from another application
31
-     *
32
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $yplusx
33
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $yminusx
34
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $xy2d
35
-     */
36
-    public function __construct(
37
-        ParagonIE_Sodium_Core_Curve25519_Fe $yplusx = null,
38
-        ParagonIE_Sodium_Core_Curve25519_Fe $yminusx = null,
39
-        ParagonIE_Sodium_Core_Curve25519_Fe $xy2d = null
40
-    ) {
41
-        if ($yplusx === null) {
42
-            $yplusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
43
-        }
44
-        $this->yplusx = $yplusx;
45
-        if ($yminusx === null) {
46
-            $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
47
-        }
48
-        $this->yminusx = $yminusx;
49
-        if ($xy2d === null) {
50
-            $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
51
-        }
52
-        $this->xy2d = $xy2d;
53
-    }
27
+	/**
28
+	 * ParagonIE_Sodium_Core_Curve25519_Ge_Precomp constructor.
29
+	 *
30
+	 * @internal You should not use this directly from another application
31
+	 *
32
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $yplusx
33
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $yminusx
34
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $xy2d
35
+	 */
36
+	public function __construct(
37
+		ParagonIE_Sodium_Core_Curve25519_Fe $yplusx = null,
38
+		ParagonIE_Sodium_Core_Curve25519_Fe $yminusx = null,
39
+		ParagonIE_Sodium_Core_Curve25519_Fe $xy2d = null
40
+	) {
41
+		if ($yplusx === null) {
42
+			$yplusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
43
+		}
44
+		$this->yplusx = $yplusx;
45
+		if ($yminusx === null) {
46
+			$yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
47
+		}
48
+		$this->yminusx = $yminusx;
49
+		if ($xy2d === null) {
50
+			$xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
51
+		}
52
+		$this->xy2d = $xy2d;
53
+	}
54 54
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Precomp', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_Curve25519_Ge_Precomp', false ) ) {
4 4
     return;
5 5
 }
6 6
 
@@ -38,15 +38,15 @@  discard block
 block discarded – undo
38 38
         ParagonIE_Sodium_Core_Curve25519_Fe $yminusx = null,
39 39
         ParagonIE_Sodium_Core_Curve25519_Fe $xy2d = null
40 40
     ) {
41
-        if ($yplusx === null) {
41
+        if ( $yplusx === null ) {
42 42
             $yplusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
43 43
         }
44 44
         $this->yplusx = $yplusx;
45
-        if ($yminusx === null) {
45
+        if ( $yminusx === null ) {
46 46
             $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
47 47
         }
48 48
         $this->yminusx = $yminusx;
49
-        if ($xy2d === null) {
49
+        if ( $xy2d === null ) {
50 50
             $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
51 51
         }
52 52
         $this->xy2d = $xy2d;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -7,8 +7,7 @@
 block discarded – undo
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
9 9
  */
10
-class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
11
-{
10
+class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp {
12 11
     /**
13 12
      * @var ParagonIE_Sodium_Core_Curve25519_Fe
14 13
      */
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/Curve25519.php 3 patches
Indentation   +3768 added lines, -3768 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_Curve25519', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 
7 7
 /**
@@ -15,3771 +15,3771 @@  discard block
 block discarded – undo
15 15
  */
16 16
 abstract class ParagonIE_Sodium_Core_Curve25519 extends ParagonIE_Sodium_Core_Curve25519_H
17 17
 {
18
-    /**
19
-     * Get a field element of size 10 with a value of 0
20
-     *
21
-     * @internal You should not use this directly from another application
22
-     *
23
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
24
-     */
25
-    public static function fe_0()
26
-    {
27
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
28
-            array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
29
-        );
30
-    }
31
-
32
-    /**
33
-     * Get a field element of size 10 with a value of 1
34
-     *
35
-     * @internal You should not use this directly from another application
36
-     *
37
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
38
-     */
39
-    public static function fe_1()
40
-    {
41
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
42
-            array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
43
-        );
44
-    }
45
-
46
-    /**
47
-     * Add two field elements.
48
-     *
49
-     * @internal You should not use this directly from another application
50
-     *
51
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
52
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
53
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
54
-     * @psalm-suppress MixedAssignment
55
-     * @psalm-suppress MixedOperand
56
-     */
57
-    public static function fe_add(
58
-        ParagonIE_Sodium_Core_Curve25519_Fe $f,
59
-        ParagonIE_Sodium_Core_Curve25519_Fe $g
60
-    ) {
61
-        /** @var array<int, int> $arr */
62
-        $arr = array();
63
-        for ($i = 0; $i < 10; ++$i) {
64
-            $arr[$i] = (int) ($f[$i] + $g[$i]);
65
-        }
66
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr);
67
-    }
68
-
69
-    /**
70
-     * Constant-time conditional move.
71
-     *
72
-     * @internal You should not use this directly from another application
73
-     *
74
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
75
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
76
-     * @param int $b
77
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
78
-     * @psalm-suppress MixedAssignment
79
-     */
80
-    public static function fe_cmov(
81
-        ParagonIE_Sodium_Core_Curve25519_Fe $f,
82
-        ParagonIE_Sodium_Core_Curve25519_Fe $g,
83
-        $b = 0
84
-    ) {
85
-        /** @var array<int, int> $h */
86
-        $h = array();
87
-        $b *= -1;
88
-        for ($i = 0; $i < 10; ++$i) {
89
-            $x = (($f[$i] ^ $g[$i]) & $b);
90
-            $h[$i] = ($f[$i]) ^ $x;
91
-        }
92
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h);
93
-    }
94
-
95
-    /**
96
-     * Create a copy of a field element.
97
-     *
98
-     * @internal You should not use this directly from another application
99
-     *
100
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
101
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
102
-     */
103
-    public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f)
104
-    {
105
-        $h = clone $f;
106
-        return $h;
107
-    }
108
-
109
-    /**
110
-     * Give: 32-byte string.
111
-     * Receive: A field element object to use for internal calculations.
112
-     *
113
-     * @internal You should not use this directly from another application
114
-     *
115
-     * @param string $s
116
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
117
-     * @throws RangeException
118
-     * @throws TypeError
119
-     */
120
-    public static function fe_frombytes($s)
121
-    {
122
-        if (self::strlen($s) !== 32) {
123
-            throw new RangeException('Expected a 32-byte string.');
124
-        }
125
-        $h0 = self::load_4($s);
126
-        $h1 = self::load_3(self::substr($s, 4, 3)) << 6;
127
-        $h2 = self::load_3(self::substr($s, 7, 3)) << 5;
128
-        $h3 = self::load_3(self::substr($s, 10, 3)) << 3;
129
-        $h4 = self::load_3(self::substr($s, 13, 3)) << 2;
130
-        $h5 = self::load_4(self::substr($s, 16, 4));
131
-        $h6 = self::load_3(self::substr($s, 20, 3)) << 7;
132
-        $h7 = self::load_3(self::substr($s, 23, 3)) << 5;
133
-        $h8 = self::load_3(self::substr($s, 26, 3)) << 4;
134
-        $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2;
135
-
136
-        $carry9 = ($h9 + (1 << 24)) >> 25;
137
-        $h0 += self::mul($carry9, 19, 5);
138
-        $h9 -= $carry9 << 25;
139
-        $carry1 = ($h1 + (1 << 24)) >> 25;
140
-        $h2 += $carry1;
141
-        $h1 -= $carry1 << 25;
142
-        $carry3 = ($h3 + (1 << 24)) >> 25;
143
-        $h4 += $carry3;
144
-        $h3 -= $carry3 << 25;
145
-        $carry5 = ($h5 + (1 << 24)) >> 25;
146
-        $h6 += $carry5;
147
-        $h5 -= $carry5 << 25;
148
-        $carry7 = ($h7 + (1 << 24)) >> 25;
149
-        $h8 += $carry7;
150
-        $h7 -= $carry7 << 25;
151
-
152
-        $carry0 = ($h0 + (1 << 25)) >> 26;
153
-        $h1 += $carry0;
154
-        $h0 -= $carry0 << 26;
155
-        $carry2 = ($h2 + (1 << 25)) >> 26;
156
-        $h3 += $carry2;
157
-        $h2 -= $carry2 << 26;
158
-        $carry4 = ($h4 + (1 << 25)) >> 26;
159
-        $h5 += $carry4;
160
-        $h4 -= $carry4 << 26;
161
-        $carry6 = ($h6 + (1 << 25)) >> 26;
162
-        $h7 += $carry6;
163
-        $h6 -= $carry6 << 26;
164
-        $carry8 = ($h8 + (1 << 25)) >> 26;
165
-        $h9 += $carry8;
166
-        $h8 -= $carry8 << 26;
167
-
168
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
169
-            array(
170
-                (int) $h0,
171
-                (int) $h1,
172
-                (int) $h2,
173
-                (int) $h3,
174
-                (int) $h4,
175
-                (int) $h5,
176
-                (int) $h6,
177
-                (int) $h7,
178
-                (int) $h8,
179
-                (int) $h9
180
-            )
181
-        );
182
-    }
183
-
184
-    /**
185
-     * Convert a field element to a byte string.
186
-     *
187
-     * @internal You should not use this directly from another application
188
-     *
189
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $h
190
-     * @return string
191
-     */
192
-    public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h)
193
-    {
194
-        $h0 = (int) $h[0];
195
-        $h1 = (int) $h[1];
196
-        $h2 = (int) $h[2];
197
-        $h3 = (int) $h[3];
198
-        $h4 = (int) $h[4];
199
-        $h5 = (int) $h[5];
200
-        $h6 = (int) $h[6];
201
-        $h7 = (int) $h[7];
202
-        $h8 = (int) $h[8];
203
-        $h9 = (int) $h[9];
204
-
205
-        $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25;
206
-        $q = ($h0 + $q) >> 26;
207
-        $q = ($h1 + $q) >> 25;
208
-        $q = ($h2 + $q) >> 26;
209
-        $q = ($h3 + $q) >> 25;
210
-        $q = ($h4 + $q) >> 26;
211
-        $q = ($h5 + $q) >> 25;
212
-        $q = ($h6 + $q) >> 26;
213
-        $q = ($h7 + $q) >> 25;
214
-        $q = ($h8 + $q) >> 26;
215
-        $q = ($h9 + $q) >> 25;
216
-
217
-        $h0 += self::mul($q, 19, 5);
218
-
219
-        $carry0 = $h0 >> 26;
220
-        $h1 += $carry0;
221
-        $h0 -= $carry0 << 26;
222
-        $carry1 = $h1 >> 25;
223
-        $h2 += $carry1;
224
-        $h1 -= $carry1 << 25;
225
-        $carry2 = $h2 >> 26;
226
-        $h3 += $carry2;
227
-        $h2 -= $carry2 << 26;
228
-        $carry3 = $h3 >> 25;
229
-        $h4 += $carry3;
230
-        $h3 -= $carry3 << 25;
231
-        $carry4 = $h4 >> 26;
232
-        $h5 += $carry4;
233
-        $h4 -= $carry4 << 26;
234
-        $carry5 = $h5 >> 25;
235
-        $h6 += $carry5;
236
-        $h5 -= $carry5 << 25;
237
-        $carry6 = $h6 >> 26;
238
-        $h7 += $carry6;
239
-        $h6 -= $carry6 << 26;
240
-        $carry7 = $h7 >> 25;
241
-        $h8 += $carry7;
242
-        $h7 -= $carry7 << 25;
243
-        $carry8 = $h8 >> 26;
244
-        $h9 += $carry8;
245
-        $h8 -= $carry8 << 26;
246
-        $carry9 = $h9 >> 25;
247
-        $h9 -= $carry9 << 25;
248
-
249
-        /**
250
-         * @var array<int, int>
251
-         */
252
-        $s = array(
253
-            (int) (($h0 >> 0) & 0xff),
254
-            (int) (($h0 >> 8) & 0xff),
255
-            (int) (($h0 >> 16) & 0xff),
256
-            (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
257
-            (int) (($h1 >> 6) & 0xff),
258
-            (int) (($h1 >> 14) & 0xff),
259
-            (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
260
-            (int) (($h2 >> 5) & 0xff),
261
-            (int) (($h2 >> 13) & 0xff),
262
-            (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
263
-            (int) (($h3 >> 3) & 0xff),
264
-            (int) (($h3 >> 11) & 0xff),
265
-            (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
266
-            (int) (($h4 >> 2) & 0xff),
267
-            (int) (($h4 >> 10) & 0xff),
268
-            (int) (($h4 >> 18) & 0xff),
269
-            (int) (($h5 >> 0) & 0xff),
270
-            (int) (($h5 >> 8) & 0xff),
271
-            (int) (($h5 >> 16) & 0xff),
272
-            (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
273
-            (int) (($h6 >> 7) & 0xff),
274
-            (int) (($h6 >> 15) & 0xff),
275
-            (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
276
-            (int) (($h7 >> 5) & 0xff),
277
-            (int) (($h7 >> 13) & 0xff),
278
-            (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
279
-            (int) (($h8 >> 4) & 0xff),
280
-            (int) (($h8 >> 12) & 0xff),
281
-            (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
282
-            (int) (($h9 >> 2) & 0xff),
283
-            (int) (($h9 >> 10) & 0xff),
284
-            (int) (($h9 >> 18) & 0xff)
285
-        );
286
-        return self::intArrayToString($s);
287
-    }
288
-
289
-    /**
290
-     * Is a field element negative? (1 = yes, 0 = no. Used in calculations.)
291
-     *
292
-     * @internal You should not use this directly from another application
293
-     *
294
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
295
-     * @return int
296
-     * @throws SodiumException
297
-     * @throws TypeError
298
-     */
299
-    public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f)
300
-    {
301
-        $str = self::fe_tobytes($f);
302
-        return (int) (self::chrToInt($str[0]) & 1);
303
-    }
304
-
305
-    /**
306
-     * Returns 0 if this field element results in all NUL bytes.
307
-     *
308
-     * @internal You should not use this directly from another application
309
-     *
310
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
311
-     * @return bool
312
-     * @throws SodiumException
313
-     * @throws TypeError
314
-     */
315
-    public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
316
-    {
317
-        static $zero;
318
-        if ($zero === null) {
319
-            $zero = str_repeat("\x00", 32);
320
-        }
321
-        /** @var string $zero */
322
-        /** @var string $str */
323
-        $str = self::fe_tobytes($f);
324
-        return !self::verify_32($str, (string) $zero);
325
-    }
326
-
327
-    /**
328
-     * Multiply two field elements
329
-     *
330
-     * h = f * g
331
-     *
332
-     * @internal You should not use this directly from another application
333
-     *
334
-     * @security Is multiplication a source of timing leaks? If so, can we do
335
-     *           anything to prevent that from happening?
336
-     *
337
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
338
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
339
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
340
-     */
341
-    public static function fe_mul(
342
-        ParagonIE_Sodium_Core_Curve25519_Fe $f,
343
-        ParagonIE_Sodium_Core_Curve25519_Fe $g
344
-    ) {
345
-        $f0 = $f[0];
346
-        $f1 = $f[1];
347
-        $f2 = $f[2];
348
-        $f3 = $f[3];
349
-        $f4 = $f[4];
350
-        $f5 = $f[5];
351
-        $f6 = $f[6];
352
-        $f7 = $f[7];
353
-        $f8 = $f[8];
354
-        $f9 = $f[9];
355
-        $g0 = $g[0];
356
-        $g1 = $g[1];
357
-        $g2 = $g[2];
358
-        $g3 = $g[3];
359
-        $g4 = $g[4];
360
-        $g5 = $g[5];
361
-        $g6 = $g[6];
362
-        $g7 = $g[7];
363
-        $g8 = $g[8];
364
-        $g9 = $g[9];
365
-        $g1_19 = self::mul($g1, 19, 5);
366
-        $g2_19 = self::mul($g2, 19, 5);
367
-        $g3_19 = self::mul($g3, 19, 5);
368
-        $g4_19 = self::mul($g4, 19, 5);
369
-        $g5_19 = self::mul($g5, 19, 5);
370
-        $g6_19 = self::mul($g6, 19, 5);
371
-        $g7_19 = self::mul($g7, 19, 5);
372
-        $g8_19 = self::mul($g8, 19, 5);
373
-        $g9_19 = self::mul($g9, 19, 5);
374
-        $f1_2 = $f1 << 1;
375
-        $f3_2 = $f3 << 1;
376
-        $f5_2 = $f5 << 1;
377
-        $f7_2 = $f7 << 1;
378
-        $f9_2 = $f9 << 1;
379
-        $f0g0    = self::mul($f0,    $g0, 26);
380
-        $f0g1    = self::mul($f0,    $g1, 25);
381
-        $f0g2    = self::mul($f0,    $g2, 26);
382
-        $f0g3    = self::mul($f0,    $g3, 25);
383
-        $f0g4    = self::mul($f0,    $g4, 26);
384
-        $f0g5    = self::mul($f0,    $g5, 25);
385
-        $f0g6    = self::mul($f0,    $g6, 26);
386
-        $f0g7    = self::mul($f0,    $g7, 25);
387
-        $f0g8    = self::mul($f0,    $g8, 26);
388
-        $f0g9    = self::mul($f0,    $g9, 26);
389
-        $f1g0    = self::mul($f1,    $g0, 26);
390
-        $f1g1_2  = self::mul($f1_2,  $g1, 25);
391
-        $f1g2    = self::mul($f1,    $g2, 26);
392
-        $f1g3_2  = self::mul($f1_2,  $g3, 25);
393
-        $f1g4    = self::mul($f1,    $g4, 26);
394
-        $f1g5_2  = self::mul($f1_2,  $g5, 25);
395
-        $f1g6    = self::mul($f1,    $g6, 26);
396
-        $f1g7_2  = self::mul($f1_2,  $g7, 25);
397
-        $f1g8    = self::mul($f1,    $g8, 26);
398
-        $f1g9_38 = self::mul($g9_19, $f1_2, 26);
399
-        $f2g0    = self::mul($f2,    $g0, 26);
400
-        $f2g1    = self::mul($f2,    $g1, 25);
401
-        $f2g2    = self::mul($f2,    $g2, 26);
402
-        $f2g3    = self::mul($f2,    $g3, 25);
403
-        $f2g4    = self::mul($f2,    $g4, 26);
404
-        $f2g5    = self::mul($f2,    $g5, 25);
405
-        $f2g6    = self::mul($f2,    $g6, 26);
406
-        $f2g7    = self::mul($f2,    $g7, 25);
407
-        $f2g8_19 = self::mul($g8_19, $f2, 26);
408
-        $f2g9_19 = self::mul($g9_19, $f2, 26);
409
-        $f3g0    = self::mul($f3,    $g0, 26);
410
-        $f3g1_2  = self::mul($f3_2,  $g1, 25);
411
-        $f3g2    = self::mul($f3,    $g2, 26);
412
-        $f3g3_2  = self::mul($f3_2,  $g3, 25);
413
-        $f3g4    = self::mul($f3,    $g4, 26);
414
-        $f3g5_2  = self::mul($f3_2,  $g5, 25);
415
-        $f3g6    = self::mul($f3,    $g6, 26);
416
-        $f3g7_38 = self::mul($g7_19, $f3_2, 26);
417
-        $f3g8_19 = self::mul($g8_19, $f3, 25);
418
-        $f3g9_38 = self::mul($g9_19, $f3_2, 26);
419
-        $f4g0    = self::mul($f4,    $g0, 26);
420
-        $f4g1    = self::mul($f4,    $g1, 25);
421
-        $f4g2    = self::mul($f4,    $g2, 26);
422
-        $f4g3    = self::mul($f4,    $g3, 25);
423
-        $f4g4    = self::mul($f4,    $g4, 26);
424
-        $f4g5    = self::mul($f4,    $g5, 25);
425
-        $f4g6_19 = self::mul($g6_19, $f4, 26);
426
-        $f4g7_19 = self::mul($g7_19, $f4, 26);
427
-        $f4g8_19 = self::mul($g8_19, $f4, 26);
428
-        $f4g9_19 = self::mul($g9_19, $f4, 26);
429
-        $f5g0    = self::mul($f5,    $g0, 26);
430
-        $f5g1_2  = self::mul($f5_2,  $g1, 25);
431
-        $f5g2    = self::mul($f5,    $g2, 26);
432
-        $f5g3_2  = self::mul($f5_2,  $g3, 25);
433
-        $f5g4    = self::mul($f5,    $g4, 26);
434
-        $f5g5_38 = self::mul($g5_19, $f5_2, 26);
435
-        $f5g6_19 = self::mul($g6_19, $f5, 25);
436
-        $f5g7_38 = self::mul($g7_19, $f5_2, 26);
437
-        $f5g8_19 = self::mul($g8_19, $f5, 25);
438
-        $f5g9_38 = self::mul($g9_19, $f5_2, 26);
439
-        $f6g0    = self::mul($f6,    $g0, 26);
440
-        $f6g1    = self::mul($f6,    $g1, 25);
441
-        $f6g2    = self::mul($f6,    $g2, 26);
442
-        $f6g3    = self::mul($f6,    $g3, 25);
443
-        $f6g4_19 = self::mul($g4_19, $f6, 26);
444
-        $f6g5_19 = self::mul($g5_19, $f6, 26);
445
-        $f6g6_19 = self::mul($g6_19, $f6, 26);
446
-        $f6g7_19 = self::mul($g7_19, $f6, 26);
447
-        $f6g8_19 = self::mul($g8_19, $f6, 26);
448
-        $f6g9_19 = self::mul($g9_19, $f6, 26);
449
-        $f7g0    = self::mul($f7,    $g0, 26);
450
-        $f7g1_2  = self::mul($f7_2,  $g1, 25);
451
-        $f7g2    = self::mul($f7,    $g2, 26);
452
-        $f7g3_38 = self::mul($g3_19, $f7_2, 26);
453
-        $f7g4_19 = self::mul($g4_19, $f7, 26);
454
-        $f7g5_38 = self::mul($g5_19, $f7_2, 26);
455
-        $f7g6_19 = self::mul($g6_19, $f7, 25);
456
-        $f7g7_38 = self::mul($g7_19, $f7_2, 26);
457
-        $f7g8_19 = self::mul($g8_19, $f7, 25);
458
-        $f7g9_38 = self::mul($g9_19,$f7_2, 26);
459
-        $f8g0    = self::mul($f8,    $g0, 26);
460
-        $f8g1    = self::mul($f8,    $g1, 25);
461
-        $f8g2_19 = self::mul($g2_19, $f8, 26);
462
-        $f8g3_19 = self::mul($g3_19, $f8, 26);
463
-        $f8g4_19 = self::mul($g4_19, $f8, 26);
464
-        $f8g5_19 = self::mul($g5_19, $f8, 26);
465
-        $f8g6_19 = self::mul($g6_19, $f8, 26);
466
-        $f8g7_19 = self::mul($g7_19, $f8, 26);
467
-        $f8g8_19 = self::mul($g8_19, $f8, 26);
468
-        $f8g9_19 = self::mul($g9_19, $f8, 26);
469
-        $f9g0    = self::mul($f9,    $g0, 26);
470
-        $f9g1_38 = self::mul($g1_19, $f9_2, 26);
471
-        $f9g2_19 = self::mul($g2_19, $f9, 25);
472
-        $f9g3_38 = self::mul($g3_19, $f9_2, 26);
473
-        $f9g4_19 = self::mul($g4_19, $f9, 25);
474
-        $f9g5_38 = self::mul($g5_19, $f9_2, 26);
475
-        $f9g6_19 = self::mul($g6_19, $f9, 25);
476
-        $f9g7_38 = self::mul($g7_19, $f9_2, 26);
477
-        $f9g8_19 = self::mul($g8_19, $f9, 25);
478
-        $f9g9_38 = self::mul($g9_19, $f9_2, 26);
479
-        $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
480
-        $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
481
-        $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
482
-        $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
483
-        $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
484
-        $h5 = $f0g5 + $f1g4    + $f2g3    + $f3g2    + $f4g1    + $f5g0    + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
485
-        $h6 = $f0g6 + $f1g5_2  + $f2g4    + $f3g3_2  + $f4g2    + $f5g1_2  + $f6g0    + $f7g9_38 + $f8g8_19 + $f9g7_38;
486
-        $h7 = $f0g7 + $f1g6    + $f2g5    + $f3g4    + $f4g3    + $f5g2    + $f6g1    + $f7g0    + $f8g9_19 + $f9g8_19;
487
-        $h8 = $f0g8 + $f1g7_2  + $f2g6    + $f3g5_2  + $f4g4    + $f5g3_2  + $f6g2    + $f7g1_2  + $f8g0    + $f9g9_38;
488
-        $h9 = $f0g9 + $f1g8    + $f2g7    + $f3g6    + $f4g5    + $f5g4    + $f6g3    + $f7g2    + $f8g1    + $f9g0   ;
489
-
490
-        $carry0 = ($h0 + (1 << 25)) >> 26;
491
-        $h1 += $carry0;
492
-        $h0 -= $carry0 << 26;
493
-        $carry4 = ($h4 + (1 << 25)) >> 26;
494
-        $h5 += $carry4;
495
-        $h4 -= $carry4 << 26;
496
-
497
-        $carry1 = ($h1 + (1 << 24)) >> 25;
498
-        $h2 += $carry1;
499
-        $h1 -= $carry1 << 25;
500
-        $carry5 = ($h5 + (1 << 24)) >> 25;
501
-        $h6 += $carry5;
502
-        $h5 -= $carry5 << 25;
503
-
504
-        $carry2 = ($h2 + (1 << 25)) >> 26;
505
-        $h3 += $carry2;
506
-        $h2 -= $carry2 << 26;
507
-        $carry6 = ($h6 + (1 << 25)) >> 26;
508
-        $h7 += $carry6;
509
-        $h6 -= $carry6 << 26;
510
-
511
-        $carry3 = ($h3 + (1 << 24)) >> 25;
512
-        $h4 += $carry3;
513
-        $h3 -= $carry3 << 25;
514
-        $carry7 = ($h7 + (1 << 24)) >> 25;
515
-        $h8 += $carry7;
516
-        $h7 -= $carry7 << 25;
517
-
518
-        $carry4 = ($h4 + (1 << 25)) >> 26;
519
-        $h5 += $carry4;
520
-        $h4 -= $carry4 << 26;
521
-        $carry8 = ($h8 + (1 << 25)) >> 26;
522
-        $h9 += $carry8;
523
-        $h8 -= $carry8 << 26;
524
-
525
-        $carry9 = ($h9 + (1 << 24)) >> 25;
526
-        $h0 += self::mul($carry9, 19, 5);
527
-        $h9 -= $carry9 << 25;
528
-
529
-        $carry0 = ($h0 + (1 << 25)) >> 26;
530
-        $h1 += $carry0;
531
-        $h0 -= $carry0 << 26;
532
-
533
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
534
-            array(
535
-                (int) $h0,
536
-                (int) $h1,
537
-                (int) $h2,
538
-                (int) $h3,
539
-                (int) $h4,
540
-                (int) $h5,
541
-                (int) $h6,
542
-                (int) $h7,
543
-                (int) $h8,
544
-                (int) $h9
545
-            )
546
-        );
547
-    }
548
-
549
-    /**
550
-     * Get the negative values for each piece of the field element.
551
-     *
552
-     * h = -f
553
-     *
554
-     * @internal You should not use this directly from another application
555
-     *
556
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
557
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
558
-     * @psalm-suppress MixedAssignment
559
-     */
560
-    public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f)
561
-    {
562
-        $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
563
-        for ($i = 0; $i < 10; ++$i) {
564
-            $h[$i] = -$f[$i];
565
-        }
566
-        return $h;
567
-    }
568
-
569
-    /**
570
-     * Square a field element
571
-     *
572
-     * h = f * f
573
-     *
574
-     * @internal You should not use this directly from another application
575
-     *
576
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
577
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
578
-     */
579
-    public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
580
-    {
581
-        $f0 = (int) $f[0];
582
-        $f1 = (int) $f[1];
583
-        $f2 = (int) $f[2];
584
-        $f3 = (int) $f[3];
585
-        $f4 = (int) $f[4];
586
-        $f5 = (int) $f[5];
587
-        $f6 = (int) $f[6];
588
-        $f7 = (int) $f[7];
589
-        $f8 = (int) $f[8];
590
-        $f9 = (int) $f[9];
591
-
592
-        $f0_2 = $f0 << 1;
593
-        $f1_2 = $f1 << 1;
594
-        $f2_2 = $f2 << 1;
595
-        $f3_2 = $f3 << 1;
596
-        $f4_2 = $f4 << 1;
597
-        $f5_2 = $f5 << 1;
598
-        $f6_2 = $f6 << 1;
599
-        $f7_2 = $f7 << 1;
600
-        $f5_38 = self::mul($f5, 38, 6);
601
-        $f6_19 = self::mul($f6, 19, 5);
602
-        $f7_38 = self::mul($f7, 38, 6);
603
-        $f8_19 = self::mul($f8, 19, 5);
604
-        $f9_38 = self::mul($f9, 38, 6);
605
-        $f0f0    = self::mul($f0,    $f0,    26);
606
-        $f0f1_2  = self::mul($f0_2,  $f1,    26);
607
-        $f0f2_2  = self::mul($f0_2,  $f2,    26);
608
-        $f0f3_2  = self::mul($f0_2,  $f3,    26);
609
-        $f0f4_2  = self::mul($f0_2,  $f4,    26);
610
-        $f0f5_2  = self::mul($f0_2,  $f5,    26);
611
-        $f0f6_2  = self::mul($f0_2,  $f6,    26);
612
-        $f0f7_2  = self::mul($f0_2,  $f7,    26);
613
-        $f0f8_2  = self::mul($f0_2,  $f8,    26);
614
-        $f0f9_2  = self::mul($f0_2,  $f9,    26);
615
-        $f1f1_2  = self::mul($f1_2,  $f1,    26);
616
-        $f1f2_2  = self::mul($f1_2,  $f2,    26);
617
-        $f1f3_4  = self::mul($f1_2,  $f3_2,  26);
618
-        $f1f4_2  = self::mul($f1_2,  $f4,    26);
619
-        $f1f5_4  = self::mul($f1_2,  $f5_2,  26);
620
-        $f1f6_2  = self::mul($f1_2,  $f6,    26);
621
-        $f1f7_4  = self::mul($f1_2,  $f7_2,  26);
622
-        $f1f8_2  = self::mul($f1_2,  $f8,    26);
623
-        $f1f9_76 = self::mul($f9_38, $f1_2,  27);
624
-        $f2f2    = self::mul($f2,    $f2,    27);
625
-        $f2f3_2  = self::mul($f2_2,  $f3,    27);
626
-        $f2f4_2  = self::mul($f2_2,  $f4,    27);
627
-        $f2f5_2  = self::mul($f2_2,  $f5,    27);
628
-        $f2f6_2  = self::mul($f2_2,  $f6,    27);
629
-        $f2f7_2  = self::mul($f2_2,  $f7,    27);
630
-        $f2f8_38 = self::mul($f8_19, $f2_2,  27);
631
-        $f2f9_38 = self::mul($f9_38, $f2,    26);
632
-        $f3f3_2  = self::mul($f3_2,  $f3,    26);
633
-        $f3f4_2  = self::mul($f3_2,  $f4,    26);
634
-        $f3f5_4  = self::mul($f3_2,  $f5_2,  26);
635
-        $f3f6_2  = self::mul($f3_2,  $f6,    26);
636
-        $f3f7_76 = self::mul($f7_38, $f3_2,  26);
637
-        $f3f8_38 = self::mul($f8_19, $f3_2,  26);
638
-        $f3f9_76 = self::mul($f9_38, $f3_2,  26);
639
-        $f4f4    = self::mul($f4,    $f4,    26);
640
-        $f4f5_2  = self::mul($f4_2,  $f5,    26);
641
-        $f4f6_38 = self::mul($f6_19, $f4_2,  27);
642
-        $f4f7_38 = self::mul($f7_38, $f4,    26);
643
-        $f4f8_38 = self::mul($f8_19, $f4_2,  27);
644
-        $f4f9_38 = self::mul($f9_38, $f4,    26);
645
-        $f5f5_38 = self::mul($f5_38, $f5,    26);
646
-        $f5f6_38 = self::mul($f6_19, $f5_2,  26);
647
-        $f5f7_76 = self::mul($f7_38, $f5_2,  26);
648
-        $f5f8_38 = self::mul($f8_19, $f5_2,  26);
649
-        $f5f9_76 = self::mul($f9_38, $f5_2,  26);
650
-        $f6f6_19 = self::mul($f6_19, $f6,    26);
651
-        $f6f7_38 = self::mul($f7_38, $f6,    26);
652
-        $f6f8_38 = self::mul($f8_19, $f6_2,  27);
653
-        $f6f9_38 = self::mul($f9_38, $f6,    26);
654
-        $f7f7_38 = self::mul($f7_38, $f7,    26);
655
-        $f7f8_38 = self::mul($f8_19, $f7_2,  26);
656
-        $f7f9_76 = self::mul($f9_38, $f7_2,  26);
657
-        $f8f8_19 = self::mul($f8_19, $f8,    26);
658
-        $f8f9_38 = self::mul($f9_38, $f8,    26);
659
-        $f9f9_38 = self::mul($f9_38, $f9,    26);
660
-        $h0 = $f0f0   + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38;
661
-        $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38;
662
-        $h2 = $f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19;
663
-        $h3 = $f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38;
664
-        $h4 = $f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38;
665
-        $h5 = $f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38;
666
-        $h6 = $f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19;
667
-        $h7 = $f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38;
668
-        $h8 = $f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38;
669
-        $h9 = $f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2;
670
-
671
-        $carry0 = ($h0 + (1 << 25)) >> 26;
672
-        $h1 += $carry0;
673
-        $h0 -= $carry0 << 26;
674
-        $carry4 = ($h4 + (1 << 25)) >> 26;
675
-        $h5 += $carry4;
676
-        $h4 -= $carry4 << 26;
677
-
678
-        $carry1 = ($h1 + (1 << 24)) >> 25;
679
-        $h2 += $carry1;
680
-        $h1 -= $carry1 << 25;
681
-        $carry5 = ($h5 + (1 << 24)) >> 25;
682
-        $h6 += $carry5;
683
-        $h5 -= $carry5 << 25;
684
-
685
-        $carry2 = ($h2 + (1 << 25)) >> 26;
686
-        $h3 += $carry2;
687
-        $h2 -= $carry2 << 26;
688
-        $carry6 = ($h6 + (1 << 25)) >> 26;
689
-        $h7 += $carry6;
690
-        $h6 -= $carry6 << 26;
691
-
692
-        $carry3 = ($h3 + (1 << 24)) >> 25;
693
-        $h4 += $carry3;
694
-        $h3 -= $carry3 << 25;
695
-        $carry7 = ($h7 + (1 << 24)) >> 25;
696
-        $h8 += $carry7;
697
-        $h7 -= $carry7 << 25;
698
-
699
-        $carry4 = ($h4 + (1 << 25)) >> 26;
700
-        $h5 += $carry4;
701
-        $h4 -= $carry4 << 26;
702
-        $carry8 = ($h8 + (1 << 25)) >> 26;
703
-        $h9 += $carry8;
704
-        $h8 -= $carry8 << 26;
705
-
706
-        $carry9 = ($h9 + (1 << 24)) >> 25;
707
-        $h0 += self::mul($carry9, 19, 5);
708
-        $h9 -= $carry9 << 25;
709
-
710
-        $carry0 = ($h0 + (1 << 25)) >> 26;
711
-        $h1 += $carry0;
712
-        $h0 -= $carry0 << 26;
713
-
714
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
715
-            array(
716
-                (int) $h0,
717
-                (int) $h1,
718
-                (int) $h2,
719
-                (int) $h3,
720
-                (int) $h4,
721
-                (int) $h5,
722
-                (int) $h6,
723
-                (int) $h7,
724
-                (int) $h8,
725
-                (int) $h9
726
-            )
727
-        );
728
-    }
729
-
730
-
731
-    /**
732
-     * Square and double a field element
733
-     *
734
-     * h = 2 * f * f
735
-     *
736
-     * @internal You should not use this directly from another application
737
-     *
738
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
739
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
740
-     */
741
-    public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
742
-    {
743
-        $f0 = (int) $f[0];
744
-        $f1 = (int) $f[1];
745
-        $f2 = (int) $f[2];
746
-        $f3 = (int) $f[3];
747
-        $f4 = (int) $f[4];
748
-        $f5 = (int) $f[5];
749
-        $f6 = (int) $f[6];
750
-        $f7 = (int) $f[7];
751
-        $f8 = (int) $f[8];
752
-        $f9 = (int) $f[9];
753
-
754
-        $f0_2 = $f0 << 1;
755
-        $f1_2 = $f1 << 1;
756
-        $f2_2 = $f2 << 1;
757
-        $f3_2 = $f3 << 1;
758
-        $f4_2 = $f4 << 1;
759
-        $f5_2 = $f5 << 1;
760
-        $f6_2 = $f6 << 1;
761
-        $f7_2 = $f7 << 1;
762
-        $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
763
-        $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
764
-        $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
765
-        $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
766
-        $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */
767
-        $f0f0 = self::mul($f0, $f0, 24);
768
-        $f0f1_2 = self::mul($f0_2, $f1, 24);
769
-        $f0f2_2 = self::mul($f0_2, $f2, 24);
770
-        $f0f3_2 = self::mul($f0_2, $f3, 24);
771
-        $f0f4_2 = self::mul($f0_2, $f4, 24);
772
-        $f0f5_2 = self::mul($f0_2, $f5, 24);
773
-        $f0f6_2 = self::mul($f0_2, $f6, 24);
774
-        $f0f7_2 = self::mul($f0_2, $f7, 24);
775
-        $f0f8_2 = self::mul($f0_2, $f8, 24);
776
-        $f0f9_2 = self::mul($f0_2, $f9, 24);
777
-        $f1f1_2 = self::mul($f1_2,  $f1, 24);
778
-        $f1f2_2 = self::mul($f1_2,  $f2, 24);
779
-        $f1f3_4 = self::mul($f1_2,  $f3_2, 24);
780
-        $f1f4_2 = self::mul($f1_2,  $f4, 24);
781
-        $f1f5_4 = self::mul($f1_2,  $f5_2, 24);
782
-        $f1f6_2 = self::mul($f1_2,  $f6, 24);
783
-        $f1f7_4 = self::mul($f1_2,  $f7_2, 24);
784
-        $f1f8_2 = self::mul($f1_2,  $f8, 24);
785
-        $f1f9_76 = self::mul($f9_38, $f1_2, 24);
786
-        $f2f2 = self::mul($f2,  $f2, 24);
787
-        $f2f3_2 = self::mul($f2_2,  $f3, 24);
788
-        $f2f4_2 = self::mul($f2_2,  $f4, 24);
789
-        $f2f5_2 = self::mul($f2_2,  $f5, 24);
790
-        $f2f6_2 = self::mul($f2_2,  $f6, 24);
791
-        $f2f7_2 = self::mul($f2_2,  $f7, 24);
792
-        $f2f8_38 = self::mul($f8_19, $f2_2, 25);
793
-        $f2f9_38 = self::mul($f9_38, $f2, 24);
794
-        $f3f3_2 = self::mul($f3_2,  $f3, 24);
795
-        $f3f4_2 = self::mul($f3_2,  $f4, 24);
796
-        $f3f5_4 = self::mul($f3_2,  $f5_2, 24);
797
-        $f3f6_2 = self::mul($f3_2,  $f6, 24);
798
-        $f3f7_76 = self::mul($f7_38, $f3_2, 24);
799
-        $f3f8_38 = self::mul($f8_19, $f3_2, 24);
800
-        $f3f9_76 = self::mul($f9_38, $f3_2, 24);
801
-        $f4f4 = self::mul($f4,  $f4, 24);
802
-        $f4f5_2 = self::mul($f4_2,  $f5, 24);
803
-        $f4f6_38 = self::mul($f6_19, $f4_2, 25);
804
-        $f4f7_38 = self::mul($f7_38, $f4, 24);
805
-        $f4f8_38 = self::mul($f8_19, $f4_2, 25);
806
-        $f4f9_38 = self::mul($f9_38, $f4, 24);
807
-        $f5f5_38 = self::mul($f5_38, $f5, 24);
808
-        $f5f6_38 = self::mul($f6_19, $f5_2, 24);
809
-        $f5f7_76 = self::mul($f7_38, $f5_2, 24);
810
-        $f5f8_38 = self::mul($f8_19, $f5_2, 24);
811
-        $f5f9_76 = self::mul($f9_38, $f5_2, 24);
812
-        $f6f6_19 = self::mul($f6_19, $f6, 24);
813
-        $f6f7_38 = self::mul($f7_38, $f6, 24);
814
-        $f6f8_38 = self::mul($f8_19, $f6_2, 25);
815
-        $f6f9_38 = self::mul($f9_38, $f6, 24);
816
-        $f7f7_38 = self::mul($f7_38, $f7, 24);
817
-        $f7f8_38 = self::mul($f8_19, $f7_2, 24);
818
-        $f7f9_76 = self::mul($f9_38, $f7_2, 24);
819
-        $f8f8_19 = self::mul($f8_19, $f8, 24);
820
-        $f8f9_38 = self::mul($f9_38, $f8, 24);
821
-        $f9f9_38 = self::mul($f9_38, $f9, 24);
822
-
823
-        $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1;
824
-        $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1;
825
-        $h2 = (int) ($f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1;
826
-        $h3 = (int) ($f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1;
827
-        $h4 = (int) ($f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1;
828
-        $h5 = (int) ($f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38) << 1;
829
-        $h6 = (int) ($f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19) << 1;
830
-        $h7 = (int) ($f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38) << 1;
831
-        $h8 = (int) ($f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38) << 1;
832
-        $h9 = (int) ($f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2) << 1;
833
-
834
-        $carry0 = ($h0 + (1 << 25)) >> 26;
835
-        $h1 += $carry0;
836
-        $h0 -= $carry0 << 26;
837
-        $carry4 = ($h4 + (1 << 25)) >> 26;
838
-        $h5 += $carry4;
839
-        $h4 -= $carry4 << 26;
840
-
841
-        $carry1 = ($h1 + (1 << 24)) >> 25;
842
-        $h2 += $carry1;
843
-        $h1 -= $carry1 << 25;
844
-        $carry5 = ($h5 + (1 << 24)) >> 25;
845
-        $h6 += $carry5;
846
-        $h5 -= $carry5 << 25;
847
-
848
-        $carry2 = ($h2 + (1 << 25)) >> 26;
849
-        $h3 += $carry2;
850
-        $h2 -= $carry2 << 26;
851
-        $carry6 = ($h6 + (1 << 25)) >> 26;
852
-        $h7 += $carry6;
853
-        $h6 -= $carry6 << 26;
854
-
855
-        $carry3 = ($h3 + (1 << 24)) >> 25;
856
-        $h4 += $carry3;
857
-        $h3 -= $carry3 << 25;
858
-        $carry7 = ($h7 + (1 << 24)) >> 25;
859
-        $h8 += $carry7;
860
-        $h7 -= $carry7 << 25;
861
-
862
-        $carry4 = ($h4 + (1 << 25)) >> 26;
863
-        $h5 += $carry4;
864
-        $h4 -= $carry4 << 26;
865
-        $carry8 = ($h8 + (1 << 25)) >> 26;
866
-        $h9 += $carry8;
867
-        $h8 -= $carry8 << 26;
868
-
869
-        $carry9 = ($h9 + (1 << 24)) >> 25;
870
-        $h0 += self::mul($carry9, 19, 5);
871
-        $h9 -= $carry9 << 25;
872
-
873
-        $carry0 = ($h0 + (1 << 25)) >> 26;
874
-        $h1 += $carry0;
875
-        $h0 -= $carry0 << 26;
876
-
877
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
878
-            array(
879
-                (int) $h0,
880
-                (int) $h1,
881
-                (int) $h2,
882
-                (int) $h3,
883
-                (int) $h4,
884
-                (int) $h5,
885
-                (int) $h6,
886
-                (int) $h7,
887
-                (int) $h8,
888
-                (int) $h9
889
-            )
890
-        );
891
-    }
892
-
893
-    /**
894
-     * @internal You should not use this directly from another application
895
-     *
896
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z
897
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
898
-     */
899
-    public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z)
900
-    {
901
-        $z = clone $Z;
902
-        $t0 = self::fe_sq($z);
903
-        $t1 = self::fe_sq($t0);
904
-        $t1 = self::fe_sq($t1);
905
-        $t1 = self::fe_mul($z, $t1);
906
-        $t0 = self::fe_mul($t0, $t1);
907
-        $t2 = self::fe_sq($t0);
908
-        $t1 = self::fe_mul($t1, $t2);
909
-        $t2 = self::fe_sq($t1);
910
-        for ($i = 1; $i < 5; ++$i) {
911
-            $t2 = self::fe_sq($t2);
912
-        }
913
-        $t1 = self::fe_mul($t2, $t1);
914
-        $t2 = self::fe_sq($t1);
915
-        for ($i = 1; $i < 10; ++$i) {
916
-            $t2 = self::fe_sq($t2);
917
-        }
918
-        $t2 = self::fe_mul($t2, $t1);
919
-        $t3 = self::fe_sq($t2);
920
-        for ($i = 1; $i < 20; ++$i) {
921
-            $t3 = self::fe_sq($t3);
922
-        }
923
-        $t2 = self::fe_mul($t3, $t2);
924
-        $t2 = self::fe_sq($t2);
925
-        for ($i = 1; $i < 10; ++$i) {
926
-            $t2 = self::fe_sq($t2);
927
-        }
928
-        $t1 = self::fe_mul($t2, $t1);
929
-        $t2 = self::fe_sq($t1);
930
-        for ($i = 1; $i < 50; ++$i) {
931
-            $t2 = self::fe_sq($t2);
932
-        }
933
-        $t2 = self::fe_mul($t2, $t1);
934
-        $t3 = self::fe_sq($t2);
935
-        for ($i = 1; $i < 100; ++$i) {
936
-            $t3 = self::fe_sq($t3);
937
-        }
938
-        $t2 = self::fe_mul($t3, $t2);
939
-        $t2 = self::fe_sq($t2);
940
-        for ($i = 1; $i < 50; ++$i) {
941
-            $t2 = self::fe_sq($t2);
942
-        }
943
-        $t1 = self::fe_mul($t2, $t1);
944
-        $t1 = self::fe_sq($t1);
945
-        for ($i = 1; $i < 5; ++$i) {
946
-            $t1 = self::fe_sq($t1);
947
-        }
948
-        return self::fe_mul($t1, $t0);
949
-    }
950
-
951
-    /**
952
-     * @internal You should not use this directly from another application
953
-     *
954
-     * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106
955
-     *
956
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
957
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
958
-     */
959
-    public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
960
-    {
961
-        # fe_sq(t0, z);
962
-        # fe_sq(t1, t0);
963
-        # fe_sq(t1, t1);
964
-        # fe_mul(t1, z, t1);
965
-        # fe_mul(t0, t0, t1);
966
-        # fe_sq(t0, t0);
967
-        # fe_mul(t0, t1, t0);
968
-        # fe_sq(t1, t0);
969
-        $t0 = self::fe_sq($z);
970
-        $t1 = self::fe_sq($t0);
971
-        $t1 = self::fe_sq($t1);
972
-        $t1 = self::fe_mul($z, $t1);
973
-        $t0 = self::fe_mul($t0, $t1);
974
-        $t0 = self::fe_sq($t0);
975
-        $t0 = self::fe_mul($t1, $t0);
976
-        $t1 = self::fe_sq($t0);
977
-
978
-        # for (i = 1; i < 5; ++i) {
979
-        #     fe_sq(t1, t1);
980
-        # }
981
-        for ($i = 1; $i < 5; ++$i) {
982
-            $t1 = self::fe_sq($t1);
983
-        }
984
-
985
-        # fe_mul(t0, t1, t0);
986
-        # fe_sq(t1, t0);
987
-        $t0 = self::fe_mul($t1, $t0);
988
-        $t1 = self::fe_sq($t0);
989
-
990
-        # for (i = 1; i < 10; ++i) {
991
-        #     fe_sq(t1, t1);
992
-        # }
993
-        for ($i = 1; $i < 10; ++$i) {
994
-            $t1 = self::fe_sq($t1);
995
-        }
996
-
997
-        # fe_mul(t1, t1, t0);
998
-        # fe_sq(t2, t1);
999
-        $t1 = self::fe_mul($t1, $t0);
1000
-        $t2 = self::fe_sq($t1);
1001
-
1002
-        # for (i = 1; i < 20; ++i) {
1003
-        #     fe_sq(t2, t2);
1004
-        # }
1005
-        for ($i = 1; $i < 20; ++$i) {
1006
-            $t2 = self::fe_sq($t2);
1007
-        }
1008
-
1009
-        # fe_mul(t1, t2, t1);
1010
-        # fe_sq(t1, t1);
1011
-        $t1 = self::fe_mul($t2, $t1);
1012
-        $t1 = self::fe_sq($t1);
1013
-
1014
-        # for (i = 1; i < 10; ++i) {
1015
-        #     fe_sq(t1, t1);
1016
-        # }
1017
-        for ($i = 1; $i < 10; ++$i) {
1018
-            $t1 = self::fe_sq($t1);
1019
-        }
1020
-
1021
-        # fe_mul(t0, t1, t0);
1022
-        # fe_sq(t1, t0);
1023
-        $t0 = self::fe_mul($t1, $t0);
1024
-        $t1 = self::fe_sq($t0);
1025
-
1026
-        # for (i = 1; i < 50; ++i) {
1027
-        #     fe_sq(t1, t1);
1028
-        # }
1029
-        for ($i = 1; $i < 50; ++$i) {
1030
-            $t1 = self::fe_sq($t1);
1031
-        }
1032
-
1033
-        # fe_mul(t1, t1, t0);
1034
-        # fe_sq(t2, t1);
1035
-        $t1 = self::fe_mul($t1, $t0);
1036
-        $t2 = self::fe_sq($t1);
1037
-
1038
-        # for (i = 1; i < 100; ++i) {
1039
-        #     fe_sq(t2, t2);
1040
-        # }
1041
-        for ($i = 1; $i < 100; ++$i) {
1042
-            $t2 = self::fe_sq($t2);
1043
-        }
1044
-
1045
-        # fe_mul(t1, t2, t1);
1046
-        # fe_sq(t1, t1);
1047
-        $t1 = self::fe_mul($t2, $t1);
1048
-        $t1 = self::fe_sq($t1);
1049
-
1050
-        # for (i = 1; i < 50; ++i) {
1051
-        #     fe_sq(t1, t1);
1052
-        # }
1053
-        for ($i = 1; $i < 50; ++$i) {
1054
-            $t1 = self::fe_sq($t1);
1055
-        }
1056
-
1057
-        # fe_mul(t0, t1, t0);
1058
-        # fe_sq(t0, t0);
1059
-        # fe_sq(t0, t0);
1060
-        # fe_mul(out, t0, z);
1061
-        $t0 = self::fe_mul($t1, $t0);
1062
-        $t0 = self::fe_sq($t0);
1063
-        $t0 = self::fe_sq($t0);
1064
-        return self::fe_mul($t0, $z);
1065
-    }
1066
-
1067
-    /**
1068
-     * Subtract two field elements.
1069
-     *
1070
-     * h = f - g
1071
-     *
1072
-     * Preconditions:
1073
-     * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
1074
-     * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
1075
-     *
1076
-     * Postconditions:
1077
-     * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
1078
-     *
1079
-     * @internal You should not use this directly from another application
1080
-     *
1081
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
1082
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
1083
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
1084
-     * @psalm-suppress MixedOperand
1085
-     */
1086
-    public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
1087
-    {
1088
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
1089
-            array(
1090
-                (int) ($f[0] - $g[0]),
1091
-                (int) ($f[1] - $g[1]),
1092
-                (int) ($f[2] - $g[2]),
1093
-                (int) ($f[3] - $g[3]),
1094
-                (int) ($f[4] - $g[4]),
1095
-                (int) ($f[5] - $g[5]),
1096
-                (int) ($f[6] - $g[6]),
1097
-                (int) ($f[7] - $g[7]),
1098
-                (int) ($f[8] - $g[8]),
1099
-                (int) ($f[9] - $g[9])
1100
-            )
1101
-        );
1102
-    }
1103
-
1104
-    /**
1105
-     * Add two group elements.
1106
-     *
1107
-     * r = p + q
1108
-     *
1109
-     * @internal You should not use this directly from another application
1110
-     *
1111
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1112
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1113
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1114
-     */
1115
-    public static function ge_add(
1116
-        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1117
-        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1118
-    ) {
1119
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1120
-        $r->X = self::fe_add($p->Y, $p->X);
1121
-        $r->Y = self::fe_sub($p->Y, $p->X);
1122
-        $r->Z = self::fe_mul($r->X, $q->YplusX);
1123
-        $r->Y = self::fe_mul($r->Y, $q->YminusX);
1124
-        $r->T = self::fe_mul($q->T2d, $p->T);
1125
-        $r->X = self::fe_mul($p->Z, $q->Z);
1126
-        $t0   = self::fe_add($r->X, $r->X);
1127
-        $r->X = self::fe_sub($r->Z, $r->Y);
1128
-        $r->Y = self::fe_add($r->Z, $r->Y);
1129
-        $r->Z = self::fe_add($t0, $r->T);
1130
-        $r->T = self::fe_sub($t0, $r->T);
1131
-        return $r;
1132
-    }
1133
-
1134
-    /**
1135
-     * @internal You should not use this directly from another application
1136
-     *
1137
-     * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215
1138
-     * @param string $a
1139
-     * @return array<int, mixed>
1140
-     * @throws SodiumException
1141
-     * @throws TypeError
1142
-     */
1143
-    public static function slide($a)
1144
-    {
1145
-        if (self::strlen($a) < 256) {
1146
-            if (self::strlen($a) < 16) {
1147
-                $a = str_pad($a, 256, '0', STR_PAD_RIGHT);
1148
-            }
1149
-        }
1150
-        /** @var array<int, int> $r */
1151
-        $r = array();
1152
-
1153
-        /** @var int $i */
1154
-        for ($i = 0; $i < 256; ++$i) {
1155
-            $r[$i] = (int) (
1156
-                1 & (
1157
-                    self::chrToInt($a[(int) ($i >> 3)])
1158
-                        >>
1159
-                    ($i & 7)
1160
-                )
1161
-            );
1162
-        }
1163
-
1164
-        for ($i = 0;$i < 256;++$i) {
1165
-            if ($r[$i]) {
1166
-                for ($b = 1;$b <= 6 && $i + $b < 256;++$b) {
1167
-                    if ($r[$i + $b]) {
1168
-                        if ($r[$i] + ($r[$i + $b] << $b) <= 15) {
1169
-                            $r[$i] += $r[$i + $b] << $b;
1170
-                            $r[$i + $b] = 0;
1171
-                        } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) {
1172
-                            $r[$i] -= $r[$i + $b] << $b;
1173
-                            for ($k = $i + $b; $k < 256; ++$k) {
1174
-                                if (!$r[$k]) {
1175
-                                    $r[$k] = 1;
1176
-                                    break;
1177
-                                }
1178
-                                $r[$k] = 0;
1179
-                            }
1180
-                        } else {
1181
-                            break;
1182
-                        }
1183
-                    }
1184
-                }
1185
-            }
1186
-        }
1187
-        return $r;
1188
-    }
1189
-
1190
-    /**
1191
-     * @internal You should not use this directly from another application
1192
-     *
1193
-     * @param string $s
1194
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1195
-     * @throws SodiumException
1196
-     * @throws TypeError
1197
-     */
1198
-    public static function ge_frombytes_negate_vartime($s)
1199
-    {
1200
-        static $d = null;
1201
-        if (!$d) {
1202
-            $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
1203
-        }
1204
-
1205
-        # fe_frombytes(h->Y,s);
1206
-        # fe_1(h->Z);
1207
-        $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1208
-            self::fe_0(),
1209
-            self::fe_frombytes($s),
1210
-            self::fe_1()
1211
-        );
1212
-
1213
-        # fe_sq(u,h->Y);
1214
-        # fe_mul(v,u,d);
1215
-        # fe_sub(u,u,h->Z);       /* u = y^2-1 */
1216
-        # fe_add(v,v,h->Z);       /* v = dy^2+1 */
1217
-        $u = self::fe_sq($h->Y);
1218
-        /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */
1219
-        $v = self::fe_mul($u, $d);
1220
-        $u = self::fe_sub($u, $h->Z); /* u =  y^2 - 1 */
1221
-        $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */
1222
-
1223
-        # fe_sq(v3,v);
1224
-        # fe_mul(v3,v3,v);        /* v3 = v^3 */
1225
-        # fe_sq(h->X,v3);
1226
-        # fe_mul(h->X,h->X,v);
1227
-        # fe_mul(h->X,h->X,u);    /* x = uv^7 */
1228
-        $v3 = self::fe_sq($v);
1229
-        $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */
1230
-        $h->X = self::fe_sq($v3);
1231
-        $h->X = self::fe_mul($h->X, $v);
1232
-        $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */
1233
-
1234
-        # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
1235
-        # fe_mul(h->X,h->X,v3);
1236
-        # fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */
1237
-        $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */
1238
-        $h->X = self::fe_mul($h->X, $v3);
1239
-        $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */
1240
-
1241
-        # fe_sq(vxx,h->X);
1242
-        # fe_mul(vxx,vxx,v);
1243
-        # fe_sub(check,vxx,u);    /* vx^2-u */
1244
-        $vxx = self::fe_sq($h->X);
1245
-        $vxx = self::fe_mul($vxx, $v);
1246
-        $check = self::fe_sub($vxx, $u); /* vx^2 - u */
1247
-
1248
-        # if (fe_isnonzero(check)) {
1249
-        #     fe_add(check,vxx,u);  /* vx^2+u */
1250
-        #     if (fe_isnonzero(check)) {
1251
-        #         return -1;
1252
-        #     }
1253
-        #     fe_mul(h->X,h->X,sqrtm1);
1254
-        # }
1255
-        if (self::fe_isnonzero($check)) {
1256
-            $check = self::fe_add($vxx, $u); /* vx^2 + u */
1257
-            if (self::fe_isnonzero($check)) {
1258
-                throw new RangeException('Internal check failed.');
1259
-            }
1260
-            $h->X = self::fe_mul(
1261
-                $h->X,
1262
-                ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1)
1263
-            );
1264
-        }
1265
-
1266
-        # if (fe_isnegative(h->X) == (s[31] >> 7)) {
1267
-        #     fe_neg(h->X,h->X);
1268
-        # }
1269
-        $i = self::chrToInt($s[31]);
1270
-        if (self::fe_isnegative($h->X) === ($i >> 7)) {
1271
-            $h->X = self::fe_neg($h->X);
1272
-        }
1273
-
1274
-        # fe_mul(h->T,h->X,h->Y);
1275
-        $h->T = self::fe_mul($h->X, $h->Y);
1276
-        return $h;
1277
-    }
1278
-
1279
-    /**
1280
-     * @internal You should not use this directly from another application
1281
-     *
1282
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
1283
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1284
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1285
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1286
-     */
1287
-    public static function ge_madd(
1288
-        ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
1289
-        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1290
-        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1291
-    ) {
1292
-        $r = clone $R;
1293
-        $r->X = self::fe_add($p->Y, $p->X);
1294
-        $r->Y = self::fe_sub($p->Y, $p->X);
1295
-        $r->Z = self::fe_mul($r->X, $q->yplusx);
1296
-        $r->Y = self::fe_mul($r->Y, $q->yminusx);
1297
-        $r->T = self::fe_mul($q->xy2d, $p->T);
1298
-        $t0 = self::fe_add(clone $p->Z, clone $p->Z);
1299
-        $r->X = self::fe_sub($r->Z, $r->Y);
1300
-        $r->Y = self::fe_add($r->Z, $r->Y);
1301
-        $r->Z = self::fe_add($t0, $r->T);
1302
-        $r->T = self::fe_sub($t0, $r->T);
1303
-
1304
-        return $r;
1305
-    }
1306
-
1307
-    /**
1308
-     * @internal You should not use this directly from another application
1309
-     *
1310
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
1311
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1312
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1313
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1314
-     */
1315
-    public static function ge_msub(
1316
-        ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
1317
-        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1318
-        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1319
-    ) {
1320
-        $r = clone $R;
1321
-
1322
-        $r->X = self::fe_add($p->Y, $p->X);
1323
-        $r->Y = self::fe_sub($p->Y, $p->X);
1324
-        $r->Z = self::fe_mul($r->X, $q->yminusx);
1325
-        $r->Y = self::fe_mul($r->Y, $q->yplusx);
1326
-        $r->T = self::fe_mul($q->xy2d, $p->T);
1327
-        $t0 = self::fe_add($p->Z, $p->Z);
1328
-        $r->X = self::fe_sub($r->Z, $r->Y);
1329
-        $r->Y = self::fe_add($r->Z, $r->Y);
1330
-        $r->Z = self::fe_sub($t0, $r->T);
1331
-        $r->T = self::fe_add($t0, $r->T);
1332
-
1333
-        return $r;
1334
-    }
1335
-
1336
-    /**
1337
-     * @internal You should not use this directly from another application
1338
-     *
1339
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1340
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1341
-     */
1342
-    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1343
-    {
1344
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2();
1345
-        $r->X = self::fe_mul($p->X, $p->T);
1346
-        $r->Y = self::fe_mul($p->Y, $p->Z);
1347
-        $r->Z = self::fe_mul($p->Z, $p->T);
1348
-        return $r;
1349
-    }
1350
-
1351
-    /**
1352
-     * @internal You should not use this directly from another application
1353
-     *
1354
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1355
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1356
-     */
1357
-    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1358
-    {
1359
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
1360
-        $r->X = self::fe_mul($p->X, $p->T);
1361
-        $r->Y = self::fe_mul($p->Y, $p->Z);
1362
-        $r->Z = self::fe_mul($p->Z, $p->T);
1363
-        $r->T = self::fe_mul($p->X, $p->Y);
1364
-        return $r;
1365
-    }
1366
-
1367
-    /**
1368
-     * @internal You should not use this directly from another application
1369
-     *
1370
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1371
-     */
1372
-    public static function ge_p2_0()
1373
-    {
1374
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1375
-            self::fe_0(),
1376
-            self::fe_1(),
1377
-            self::fe_1()
1378
-        );
1379
-    }
1380
-
1381
-    /**
1382
-     * @internal You should not use this directly from another application
1383
-     *
1384
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p
1385
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1386
-     */
1387
-    public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p)
1388
-    {
1389
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1390
-
1391
-        $r->X = self::fe_sq($p->X);
1392
-        $r->Z = self::fe_sq($p->Y);
1393
-        $r->T = self::fe_sq2($p->Z);
1394
-        $r->Y = self::fe_add($p->X, $p->Y);
1395
-        $t0   = self::fe_sq($r->Y);
1396
-        $r->Y = self::fe_add($r->Z, $r->X);
1397
-        $r->Z = self::fe_sub($r->Z, $r->X);
1398
-        $r->X = self::fe_sub($t0, $r->Y);
1399
-        $r->T = self::fe_sub($r->T, $r->Z);
1400
-
1401
-        return $r;
1402
-    }
1403
-
1404
-    /**
1405
-     * @internal You should not use this directly from another application
1406
-     *
1407
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1408
-     */
1409
-    public static function ge_p3_0()
1410
-    {
1411
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1412
-            self::fe_0(),
1413
-            self::fe_1(),
1414
-            self::fe_1(),
1415
-            self::fe_0()
1416
-        );
1417
-    }
1418
-
1419
-    /**
1420
-     * @internal You should not use this directly from another application
1421
-     *
1422
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1423
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1424
-     */
1425
-    public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1426
-    {
1427
-        static $d2 = null;
1428
-        if ($d2 === null) {
1429
-            $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2);
1430
-        }
1431
-        /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */
1432
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1433
-        $r->YplusX = self::fe_add($p->Y, $p->X);
1434
-        $r->YminusX = self::fe_sub($p->Y, $p->X);
1435
-        $r->Z = self::fe_copy($p->Z);
1436
-        $r->T2d = self::fe_mul($p->T, $d2);
1437
-        return $r;
1438
-    }
1439
-
1440
-    /**
1441
-     * @internal You should not use this directly from another application
1442
-     *
1443
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1444
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1445
-     */
1446
-    public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1447
-    {
1448
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1449
-            self::fe_copy($p->X),
1450
-            self::fe_copy($p->Y),
1451
-            self::fe_copy($p->Z)
1452
-        );
1453
-    }
1454
-
1455
-    /**
1456
-     * @internal You should not use this directly from another application
1457
-     *
1458
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
1459
-     * @return string
1460
-     * @throws SodiumException
1461
-     * @throws TypeError
1462
-     */
1463
-    public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
1464
-    {
1465
-        $recip = self::fe_invert($h->Z);
1466
-        $x = self::fe_mul($h->X, $recip);
1467
-        $y = self::fe_mul($h->Y, $recip);
1468
-        $s = self::fe_tobytes($y);
1469
-        $s[31] = self::intToChr(
1470
-            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1471
-        );
1472
-        return $s;
1473
-    }
1474
-
1475
-    /**
1476
-     * @internal You should not use this directly from another application
1477
-     *
1478
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1479
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1480
-     */
1481
-    public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1482
-    {
1483
-        $q = self::ge_p3_to_p2($p);
1484
-        return self::ge_p2_dbl($q);
1485
-    }
1486
-
1487
-    /**
1488
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1489
-     */
1490
-    public static function ge_precomp_0()
1491
-    {
1492
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1493
-            self::fe_1(),
1494
-            self::fe_1(),
1495
-            self::fe_0()
1496
-        );
1497
-    }
1498
-
1499
-    /**
1500
-     * @internal You should not use this directly from another application
1501
-     *
1502
-     * @param int $b
1503
-     * @param int $c
1504
-     * @return int
1505
-     */
1506
-    public static function equal($b, $c)
1507
-    {
1508
-        return (int) ((($b ^ $c) - 1) >> 31) & 1;
1509
-    }
1510
-
1511
-    /**
1512
-     * @internal You should not use this directly from another application
1513
-     *
1514
-     * @param int|string $char
1515
-     * @return int (1 = yes, 0 = no)
1516
-     * @throws SodiumException
1517
-     * @throws TypeError
1518
-     */
1519
-    public static function negative($char)
1520
-    {
1521
-        if (is_int($char)) {
1522
-            return ($char >> 63) & 1;
1523
-        }
1524
-        $x = self::chrToInt(self::substr($char, 0, 1));
1525
-        return (int) ($x >> 63);
1526
-    }
1527
-
1528
-    /**
1529
-     * Conditional move
1530
-     *
1531
-     * @internal You should not use this directly from another application
1532
-     *
1533
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t
1534
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u
1535
-     * @param int $b
1536
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1537
-     */
1538
-    public static function cmov(
1539
-        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t,
1540
-        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u,
1541
-        $b
1542
-    ) {
1543
-        if (!is_int($b)) {
1544
-            throw new InvalidArgumentException('Expected an integer.');
1545
-        }
1546
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1547
-            self::fe_cmov($t->yplusx,  $u->yplusx,  $b),
1548
-            self::fe_cmov($t->yminusx, $u->yminusx, $b),
1549
-            self::fe_cmov($t->xy2d,    $u->xy2d,    $b)
1550
-        );
1551
-    }
1552
-
1553
-    /**
1554
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t
1555
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u
1556
-     * @param int $b
1557
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1558
-     */
1559
-    public static function ge_cmov_cached(
1560
-        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t,
1561
-        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u,
1562
-        $b
1563
-    ) {
1564
-        $b &= 1;
1565
-        $ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1566
-        $ret->YplusX  = self::fe_cmov($t->YplusX,  $u->YplusX,  $b);
1567
-        $ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b);
1568
-        $ret->Z       = self::fe_cmov($t->Z,       $u->Z,       $b);
1569
-        $ret->T2d     = self::fe_cmov($t->T2d,     $u->T2d,     $b);
1570
-        return $ret;
1571
-    }
1572
-
1573
-    /**
1574
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $cached
1575
-     * @param int $b
1576
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1577
-     * @throws SodiumException
1578
-     */
1579
-    public static function ge_cmov8_cached(array $cached, $b)
1580
-    {
1581
-        // const unsigned char bnegative = negative(b);
1582
-        // const unsigned char babs      = b - (((-bnegative) & b) * ((signed char) 1 << 1));
1583
-        $bnegative = self::negative($b);
1584
-        $babs = $b - (((-$bnegative) & $b) << 1);
1585
-
1586
-        // ge25519_cached_0(t);
1587
-        $t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1588
-            self::fe_1(),
1589
-            self::fe_1(),
1590
-            self::fe_1(),
1591
-            self::fe_0()
1592
-        );
1593
-
1594
-        // ge25519_cmov_cached(t, &cached[0], equal(babs, 1));
1595
-        // ge25519_cmov_cached(t, &cached[1], equal(babs, 2));
1596
-        // ge25519_cmov_cached(t, &cached[2], equal(babs, 3));
1597
-        // ge25519_cmov_cached(t, &cached[3], equal(babs, 4));
1598
-        // ge25519_cmov_cached(t, &cached[4], equal(babs, 5));
1599
-        // ge25519_cmov_cached(t, &cached[5], equal(babs, 6));
1600
-        // ge25519_cmov_cached(t, &cached[6], equal(babs, 7));
1601
-        // ge25519_cmov_cached(t, &cached[7], equal(babs, 8));
1602
-        for ($x = 0; $x < 8; ++$x) {
1603
-            $t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1));
1604
-        }
1605
-
1606
-        // fe25519_copy(minust.YplusX, t->YminusX);
1607
-        // fe25519_copy(minust.YminusX, t->YplusX);
1608
-        // fe25519_copy(minust.Z, t->Z);
1609
-        // fe25519_neg(minust.T2d, t->T2d);
1610
-        $minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1611
-            self::fe_copy($t->YminusX),
1612
-            self::fe_copy($t->YplusX),
1613
-            self::fe_copy($t->Z),
1614
-            self::fe_neg($t->T2d)
1615
-        );
1616
-        return self::ge_cmov_cached($t, $minust, $bnegative);
1617
-    }
1618
-
1619
-    /**
1620
-     * @internal You should not use this directly from another application
1621
-     *
1622
-     * @param int $pos
1623
-     * @param int $b
1624
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1625
-     * @throws SodiumException
1626
-     * @throws TypeError
1627
-     * @psalm-suppress MixedArgument
1628
-     * @psalm-suppress MixedArrayAccess
1629
-     * @psalm-suppress MixedArrayOffset
1630
-     */
1631
-    public static function ge_select($pos = 0, $b = 0)
1632
-    {
1633
-        static $base = null;
1634
-        if ($base === null) {
1635
-            $base = array();
1636
-            /** @var int $i */
1637
-            foreach (self::$base as $i => $bas) {
1638
-                for ($j = 0; $j < 8; ++$j) {
1639
-                    $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1640
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]),
1641
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]),
1642
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2])
1643
-                    );
1644
-                }
1645
-            }
1646
-        }
1647
-        /** @var array<int, array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp>> $base */
1648
-        if (!is_int($pos)) {
1649
-            throw new InvalidArgumentException('Position must be an integer');
1650
-        }
1651
-        if ($pos < 0 || $pos > 31) {
1652
-            throw new RangeException('Position is out of range [0, 31]');
1653
-        }
1654
-
1655
-        $bnegative = self::negative($b);
1656
-        $babs = $b - (((-$bnegative) & $b) << 1);
1657
-
1658
-        $t = self::ge_precomp_0();
1659
-        for ($i = 0; $i < 8; ++$i) {
1660
-            $t = self::cmov(
1661
-                $t,
1662
-                $base[$pos][$i],
1663
-                self::equal($babs, $i + 1)
1664
-            );
1665
-        }
1666
-        $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1667
-            self::fe_copy($t->yminusx),
1668
-            self::fe_copy($t->yplusx),
1669
-            self::fe_neg($t->xy2d)
1670
-        );
1671
-        return self::cmov($t, $minusT, $bnegative);
1672
-    }
1673
-
1674
-    /**
1675
-     * Subtract two group elements.
1676
-     *
1677
-     * r = p - q
1678
-     *
1679
-     * @internal You should not use this directly from another application
1680
-     *
1681
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1682
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1683
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1684
-     */
1685
-    public static function ge_sub(
1686
-        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1687
-        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1688
-    ) {
1689
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1690
-
1691
-        $r->X = self::fe_add($p->Y, $p->X);
1692
-        $r->Y = self::fe_sub($p->Y, $p->X);
1693
-        $r->Z = self::fe_mul($r->X, $q->YminusX);
1694
-        $r->Y = self::fe_mul($r->Y, $q->YplusX);
1695
-        $r->T = self::fe_mul($q->T2d, $p->T);
1696
-        $r->X = self::fe_mul($p->Z, $q->Z);
1697
-        $t0 = self::fe_add($r->X, $r->X);
1698
-        $r->X = self::fe_sub($r->Z, $r->Y);
1699
-        $r->Y = self::fe_add($r->Z, $r->Y);
1700
-        $r->Z = self::fe_sub($t0, $r->T);
1701
-        $r->T = self::fe_add($t0, $r->T);
1702
-
1703
-        return $r;
1704
-    }
1705
-
1706
-    /**
1707
-     * Convert a group element to a byte string.
1708
-     *
1709
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h
1710
-     * @return string
1711
-     * @throws SodiumException
1712
-     * @throws TypeError
1713
-     */
1714
-    public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h)
1715
-    {
1716
-        $recip = self::fe_invert($h->Z);
1717
-        $x = self::fe_mul($h->X, $recip);
1718
-        $y = self::fe_mul($h->Y, $recip);
1719
-        $s = self::fe_tobytes($y);
1720
-        $s[31] = self::intToChr(
1721
-            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1722
-        );
1723
-        return $s;
1724
-    }
1725
-
1726
-    /**
1727
-     * @internal You should not use this directly from another application
1728
-     *
1729
-     * @param string $a
1730
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
1731
-     * @param string $b
1732
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1733
-     * @throws SodiumException
1734
-     * @throws TypeError
1735
-     * @psalm-suppress MixedArgument
1736
-     * @psalm-suppress MixedArrayAccess
1737
-     */
1738
-    public static function ge_double_scalarmult_vartime(
1739
-        $a,
1740
-        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A,
1741
-        $b
1742
-    ) {
1743
-        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai */
1744
-        $Ai = array();
1745
-
1746
-        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp> $Bi */
1747
-        static $Bi = array();
1748
-        if (!$Bi) {
1749
-            for ($i = 0; $i < 8; ++$i) {
1750
-                $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1751
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]),
1752
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]),
1753
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2])
1754
-                );
1755
-            }
1756
-        }
1757
-        for ($i = 0; $i < 8; ++$i) {
1758
-            $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1759
-                self::fe_0(),
1760
-                self::fe_0(),
1761
-                self::fe_0(),
1762
-                self::fe_0()
1763
-            );
1764
-        }
1765
-
1766
-        # slide(aslide,a);
1767
-        # slide(bslide,b);
1768
-        /** @var array<int, int> $aslide */
1769
-        $aslide = self::slide($a);
1770
-        /** @var array<int, int> $bslide */
1771
-        $bslide = self::slide($b);
1772
-
1773
-        # ge_p3_to_cached(&Ai[0],A);
1774
-        # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
1775
-        $Ai[0] = self::ge_p3_to_cached($A);
1776
-        $t = self::ge_p3_dbl($A);
1777
-        $A2 = self::ge_p1p1_to_p3($t);
1778
-
1779
-        # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
1780
-        # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
1781
-        # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);
1782
-        # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);
1783
-        # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
1784
-        # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
1785
-        # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
1786
-        for ($i = 0; $i < 7; ++$i) {
1787
-            $t = self::ge_add($A2, $Ai[$i]);
1788
-            $u = self::ge_p1p1_to_p3($t);
1789
-            $Ai[$i + 1] = self::ge_p3_to_cached($u);
1790
-        }
1791
-
1792
-        # ge_p2_0(r);
1793
-        $r = self::ge_p2_0();
1794
-
1795
-        # for (i = 255;i >= 0;--i) {
1796
-        #     if (aslide[i] || bslide[i]) break;
1797
-        # }
1798
-        $i = 255;
1799
-        for (; $i >= 0; --$i) {
1800
-            if ($aslide[$i] || $bslide[$i]) {
1801
-                break;
1802
-            }
1803
-        }
1804
-
1805
-        # for (;i >= 0;--i) {
1806
-        for (; $i >= 0; --$i) {
1807
-            # ge_p2_dbl(&t,r);
1808
-            $t = self::ge_p2_dbl($r);
1809
-
1810
-            # if (aslide[i] > 0) {
1811
-            if ($aslide[$i] > 0) {
1812
-                # ge_p1p1_to_p3(&u,&t);
1813
-                # ge_add(&t,&u,&Ai[aslide[i]/2]);
1814
-                $u = self::ge_p1p1_to_p3($t);
1815
-                $t = self::ge_add(
1816
-                    $u,
1817
-                    $Ai[(int) floor($aslide[$i] / 2)]
1818
-                );
1819
-            # } else if (aslide[i] < 0) {
1820
-            } elseif ($aslide[$i] < 0) {
1821
-                # ge_p1p1_to_p3(&u,&t);
1822
-                # ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
1823
-                $u = self::ge_p1p1_to_p3($t);
1824
-                $t = self::ge_sub(
1825
-                    $u,
1826
-                    $Ai[(int) floor(-$aslide[$i] / 2)]
1827
-                );
1828
-            }
1829
-
1830
-            # if (bslide[i] > 0) {
1831
-            if ($bslide[$i] > 0) {
1832
-                /** @var int $index */
1833
-                $index = (int) floor($bslide[$i] / 2);
1834
-                # ge_p1p1_to_p3(&u,&t);
1835
-                # ge_madd(&t,&u,&Bi[bslide[i]/2]);
1836
-                $u = self::ge_p1p1_to_p3($t);
1837
-                $t = self::ge_madd($t, $u, $Bi[$index]);
1838
-            # } else if (bslide[i] < 0) {
1839
-            } elseif ($bslide[$i] < 0) {
1840
-                /** @var int $index */
1841
-                $index = (int) floor(-$bslide[$i] / 2);
1842
-                # ge_p1p1_to_p3(&u,&t);
1843
-                # ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
1844
-                $u = self::ge_p1p1_to_p3($t);
1845
-                $t = self::ge_msub($t, $u, $Bi[$index]);
1846
-            }
1847
-            # ge_p1p1_to_p2(r,&t);
1848
-            $r = self::ge_p1p1_to_p2($t);
1849
-        }
1850
-        return $r;
1851
-    }
1852
-
1853
-    /**
1854
-     * @internal You should not use this directly from another application
1855
-     *
1856
-     * @param string $a
1857
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1858
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1859
-     * @throws SodiumException
1860
-     * @throws TypeError
1861
-     * @psalm-suppress MixedAssignment
1862
-     * @psalm-suppress MixedOperand
1863
-     */
1864
-    public static function ge_scalarmult($a, $p)
1865
-    {
1866
-        $e = array_fill(0, 64, 0);
1867
-
1868
-        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */
1869
-        $pi = array();
1870
-
1871
-        //        ge25519_p3_to_cached(&pi[1 - 1], p);   /* p */
1872
-        $pi[0] = self::ge_p3_to_cached($p);
1873
-
1874
-        //        ge25519_p3_dbl(&t2, p);
1875
-        //        ge25519_p1p1_to_p3(&p2, &t2);
1876
-        //        ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */
1877
-        $t2 = self::ge_p3_dbl($p);
1878
-        $p2 = self::ge_p1p1_to_p3($t2);
1879
-        $pi[1] = self::ge_p3_to_cached($p2);
1880
-
1881
-        //        ge25519_add_cached(&t3, p, &pi[2 - 1]);
1882
-        //        ge25519_p1p1_to_p3(&p3, &t3);
1883
-        //        ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */
1884
-        $t3 = self::ge_add($p, $pi[1]);
1885
-        $p3 = self::ge_p1p1_to_p3($t3);
1886
-        $pi[2] = self::ge_p3_to_cached($p3);
1887
-
1888
-        //        ge25519_p3_dbl(&t4, &p2);
1889
-        //        ge25519_p1p1_to_p3(&p4, &t4);
1890
-        //        ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */
1891
-        $t4 = self::ge_p3_dbl($p2);
1892
-        $p4 = self::ge_p1p1_to_p3($t4);
1893
-        $pi[3] = self::ge_p3_to_cached($p4);
1894
-
1895
-        //        ge25519_add_cached(&t5, p, &pi[4 - 1]);
1896
-        //        ge25519_p1p1_to_p3(&p5, &t5);
1897
-        //        ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */
1898
-        $t5 = self::ge_add($p, $pi[3]);
1899
-        $p5 = self::ge_p1p1_to_p3($t5);
1900
-        $pi[4] = self::ge_p3_to_cached($p5);
1901
-
1902
-        //        ge25519_p3_dbl(&t6, &p3);
1903
-        //        ge25519_p1p1_to_p3(&p6, &t6);
1904
-        //        ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */
1905
-        $t6 = self::ge_p3_dbl($p3);
1906
-        $p6 = self::ge_p1p1_to_p3($t6);
1907
-        $pi[5] = self::ge_p3_to_cached($p6);
1908
-
1909
-        //        ge25519_add_cached(&t7, p, &pi[6 - 1]);
1910
-        //        ge25519_p1p1_to_p3(&p7, &t7);
1911
-        //        ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */
1912
-        $t7 = self::ge_add($p, $pi[5]);
1913
-        $p7 = self::ge_p1p1_to_p3($t7);
1914
-        $pi[6] = self::ge_p3_to_cached($p7);
1915
-
1916
-        //        ge25519_p3_dbl(&t8, &p4);
1917
-        //        ge25519_p1p1_to_p3(&p8, &t8);
1918
-        //        ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */
1919
-        $t8 = self::ge_p3_dbl($p4);
1920
-        $p8 = self::ge_p1p1_to_p3($t8);
1921
-        $pi[7] = self::ge_p3_to_cached($p8);
1922
-
1923
-
1924
-        //        for (i = 0; i < 32; ++i) {
1925
-        //            e[2 * i + 0] = (a[i] >> 0) & 15;
1926
-        //            e[2 * i + 1] = (a[i] >> 4) & 15;
1927
-        //        }
1928
-        for ($i = 0; $i < 32; ++$i) {
1929
-            $e[($i << 1)    ] =  self::chrToInt($a[$i]) & 15;
1930
-            $e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15;
1931
-        }
1932
-        //        /* each e[i] is between 0 and 15 */
1933
-        //        /* e[63] is between 0 and 7 */
1934
-
1935
-        //        carry = 0;
1936
-        //        for (i = 0; i < 63; ++i) {
1937
-        //            e[i] += carry;
1938
-        //            carry = e[i] + 8;
1939
-        //            carry >>= 4;
1940
-        //            e[i] -= carry * ((signed char) 1 << 4);
1941
-        //        }
1942
-        $carry = 0;
1943
-        for ($i = 0; $i < 63; ++$i) {
1944
-            $e[$i] += $carry;
1945
-            $carry = $e[$i] + 8;
1946
-            $carry >>= 4;
1947
-            $e[$i] -= $carry << 4;
1948
-        }
1949
-        //        e[63] += carry;
1950
-        //        /* each e[i] is between -8 and 8 */
1951
-        $e[63] += $carry;
1952
-
1953
-        //        ge25519_p3_0(h);
1954
-        $h = self::ge_p3_0();
1955
-
1956
-        //        for (i = 63; i != 0; i--) {
1957
-        for ($i = 63; $i != 0; --$i) {
1958
-            // ge25519_cmov8_cached(&t, pi, e[i]);
1959
-            $t = self::ge_cmov8_cached($pi, $e[$i]);
1960
-            // ge25519_add_cached(&r, h, &t);
1961
-            $r = self::ge_add($h, $t);
1962
-
1963
-            // ge25519_p1p1_to_p2(&s, &r);
1964
-            // ge25519_p2_dbl(&r, &s);
1965
-            // ge25519_p1p1_to_p2(&s, &r);
1966
-            // ge25519_p2_dbl(&r, &s);
1967
-            // ge25519_p1p1_to_p2(&s, &r);
1968
-            // ge25519_p2_dbl(&r, &s);
1969
-            // ge25519_p1p1_to_p2(&s, &r);
1970
-            // ge25519_p2_dbl(&r, &s);
1971
-            $s = self::ge_p1p1_to_p2($r);
1972
-            $r = self::ge_p2_dbl($s);
1973
-            $s = self::ge_p1p1_to_p2($r);
1974
-            $r = self::ge_p2_dbl($s);
1975
-            $s = self::ge_p1p1_to_p2($r);
1976
-            $r = self::ge_p2_dbl($s);
1977
-            $s = self::ge_p1p1_to_p2($r);
1978
-            $r = self::ge_p2_dbl($s);
1979
-
1980
-            // ge25519_p1p1_to_p3(h, &r);  /* *16 */
1981
-            $h = self::ge_p1p1_to_p3($r); /* *16 */
1982
-        }
1983
-
1984
-        //        ge25519_cmov8_cached(&t, pi, e[i]);
1985
-        //        ge25519_add_cached(&r, h, &t);
1986
-        //        ge25519_p1p1_to_p3(h, &r);
1987
-        $t = self::ge_cmov8_cached($pi, $e[0]);
1988
-        $r = self::ge_add($h, $t);
1989
-        return self::ge_p1p1_to_p3($r);
1990
-    }
1991
-
1992
-    /**
1993
-     * @internal You should not use this directly from another application
1994
-     *
1995
-     * @param string $a
1996
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1997
-     * @throws SodiumException
1998
-     * @throws TypeError
1999
-     * @psalm-suppress MixedAssignment
2000
-     * @psalm-suppress MixedOperand
2001
-     */
2002
-    public static function ge_scalarmult_base($a)
2003
-    {
2004
-        /** @var array<int, int> $e */
2005
-        $e = array();
2006
-        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
2007
-
2008
-        for ($i = 0; $i < 32; ++$i) {
2009
-            $dbl = (int) $i << 1;
2010
-            $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
2011
-            $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
2012
-        }
2013
-
2014
-        $carry = 0;
2015
-        for ($i = 0; $i < 63; ++$i) {
2016
-            $e[$i] += $carry;
2017
-            $carry = $e[$i] + 8;
2018
-            $carry >>= 4;
2019
-            $e[$i] -= $carry << 4;
2020
-        }
2021
-        $e[63] += (int) $carry;
2022
-
2023
-        $h = self::ge_p3_0();
2024
-
2025
-        for ($i = 1; $i < 64; $i += 2) {
2026
-            $t = self::ge_select((int) floor($i / 2), (int) $e[$i]);
2027
-            $r = self::ge_madd($r, $h, $t);
2028
-            $h = self::ge_p1p1_to_p3($r);
2029
-        }
2030
-
2031
-        $r = self::ge_p3_dbl($h);
2032
-
2033
-        $s = self::ge_p1p1_to_p2($r);
2034
-        $r = self::ge_p2_dbl($s);
2035
-        $s = self::ge_p1p1_to_p2($r);
2036
-        $r = self::ge_p2_dbl($s);
2037
-        $s = self::ge_p1p1_to_p2($r);
2038
-        $r = self::ge_p2_dbl($s);
2039
-
2040
-        $h = self::ge_p1p1_to_p3($r);
2041
-
2042
-        for ($i = 0; $i < 64; $i += 2) {
2043
-            $t = self::ge_select($i >> 1, (int) $e[$i]);
2044
-            $r = self::ge_madd($r, $h, $t);
2045
-            $h = self::ge_p1p1_to_p3($r);
2046
-        }
2047
-        return $h;
2048
-    }
2049
-
2050
-    /**
2051
-     * Calculates (ab + c) mod l
2052
-     * where l = 2^252 + 27742317777372353535851937790883648493
2053
-     *
2054
-     * @internal You should not use this directly from another application
2055
-     *
2056
-     * @param string $a
2057
-     * @param string $b
2058
-     * @param string $c
2059
-     * @return string
2060
-     * @throws TypeError
2061
-     */
2062
-    public static function sc_muladd($a, $b, $c)
2063
-    {
2064
-        $a0 = 2097151 & self::load_3(self::substr($a, 0, 3));
2065
-        $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2066
-        $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2067
-        $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2068
-        $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2069
-        $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2070
-        $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2071
-        $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2072
-        $a8 = 2097151 & self::load_3(self::substr($a, 21, 3));
2073
-        $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2074
-        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2075
-        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2076
-
2077
-        $b0 = 2097151 & self::load_3(self::substr($b, 0, 3));
2078
-        $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2079
-        $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2080
-        $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2081
-        $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2082
-        $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2083
-        $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2084
-        $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2085
-        $b8 = 2097151 & self::load_3(self::substr($b, 21, 3));
2086
-        $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2087
-        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2088
-        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2089
-
2090
-        $c0 = 2097151 & self::load_3(self::substr($c, 0, 3));
2091
-        $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5);
2092
-        $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2);
2093
-        $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7);
2094
-        $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4);
2095
-        $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1);
2096
-        $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6);
2097
-        $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3);
2098
-        $c8 = 2097151 & self::load_3(self::substr($c, 21, 3));
2099
-        $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5);
2100
-        $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2);
2101
-        $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7);
2102
-
2103
-        /* Can't really avoid the pyramid here: */
2104
-        $s0 = $c0 + self::mul($a0, $b0, 24);
2105
-        $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24);
2106
-        $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24);
2107
-        $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24);
2108
-        $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) +
2109
-               self::mul($a4, $b0, 24);
2110
-        $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) +
2111
-               self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24);
2112
-        $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) +
2113
-               self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24);
2114
-        $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) +
2115
-               self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24);
2116
-        $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) +
2117
-               self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) +
2118
-               self::mul($a8, $b0, 24);
2119
-        $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) +
2120
-               self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) +
2121
-               self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24);
2122
-        $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) +
2123
-               self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) +
2124
-               self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24);
2125
-        $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) +
2126
-               self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) +
2127
-               self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24);
2128
-        $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) +
2129
-               self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) +
2130
-               self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24);
2131
-        $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) +
2132
-               self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) +
2133
-               self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24);
2134
-        $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) +
2135
-               self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) +
2136
-               self::mul($a11, $b3, 24);
2137
-        $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) +
2138
-               self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24);
2139
-        $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) +
2140
-               self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24);
2141
-        $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) +
2142
-               self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24);
2143
-        $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) +
2144
-               self::mul($a11, $b7, 24);
2145
-        $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24);
2146
-        $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24);
2147
-        $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24);
2148
-        $s22 = self::mul($a11, $b11, 24);
2149
-        $s23 = 0;
2150
-
2151
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2152
-        $s1 += $carry0;
2153
-        $s0 -= $carry0 << 21;
2154
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2155
-        $s3 += $carry2;
2156
-        $s2 -= $carry2 << 21;
2157
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2158
-        $s5 += $carry4;
2159
-        $s4 -= $carry4 << 21;
2160
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2161
-        $s7 += $carry6;
2162
-        $s6 -= $carry6 << 21;
2163
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2164
-        $s9 += $carry8;
2165
-        $s8 -= $carry8 << 21;
2166
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2167
-        $s11 += $carry10;
2168
-        $s10 -= $carry10 << 21;
2169
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2170
-        $s13 += $carry12;
2171
-        $s12 -= $carry12 << 21;
2172
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2173
-        $s15 += $carry14;
2174
-        $s14 -= $carry14 << 21;
2175
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2176
-        $s17 += $carry16;
2177
-        $s16 -= $carry16 << 21;
2178
-        $carry18 = ($s18 + (1 << 20)) >> 21;
2179
-        $s19 += $carry18;
2180
-        $s18 -= $carry18 << 21;
2181
-        $carry20 = ($s20 + (1 << 20)) >> 21;
2182
-        $s21 += $carry20;
2183
-        $s20 -= $carry20 << 21;
2184
-        $carry22 = ($s22 + (1 << 20)) >> 21;
2185
-        $s23 += $carry22;
2186
-        $s22 -= $carry22 << 21;
2187
-
2188
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2189
-        $s2 += $carry1;
2190
-        $s1 -= $carry1 << 21;
2191
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2192
-        $s4 += $carry3;
2193
-        $s3 -= $carry3 << 21;
2194
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2195
-        $s6 += $carry5;
2196
-        $s5 -= $carry5 << 21;
2197
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2198
-        $s8 += $carry7;
2199
-        $s7 -= $carry7 << 21;
2200
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2201
-        $s10 += $carry9;
2202
-        $s9 -= $carry9 << 21;
2203
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2204
-        $s12 += $carry11;
2205
-        $s11 -= $carry11 << 21;
2206
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2207
-        $s14 += $carry13;
2208
-        $s13 -= $carry13 << 21;
2209
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2210
-        $s16 += $carry15;
2211
-        $s15 -= $carry15 << 21;
2212
-        $carry17 = ($s17 + (1 << 20)) >> 21;
2213
-        $s18 += $carry17;
2214
-        $s17 -= $carry17 << 21;
2215
-        $carry19 = ($s19 + (1 << 20)) >> 21;
2216
-        $s20 += $carry19;
2217
-        $s19 -= $carry19 << 21;
2218
-        $carry21 = ($s21 + (1 << 20)) >> 21;
2219
-        $s22 += $carry21;
2220
-        $s21 -= $carry21 << 21;
2221
-
2222
-        $s11 += self::mul($s23, 666643, 20);
2223
-        $s12 += self::mul($s23, 470296, 19);
2224
-        $s13 += self::mul($s23, 654183, 20);
2225
-        $s14 -= self::mul($s23, 997805, 20);
2226
-        $s15 += self::mul($s23, 136657, 18);
2227
-        $s16 -= self::mul($s23, 683901, 20);
2228
-
2229
-        $s10 += self::mul($s22, 666643, 20);
2230
-        $s11 += self::mul($s22, 470296, 19);
2231
-        $s12 += self::mul($s22, 654183, 20);
2232
-        $s13 -= self::mul($s22, 997805, 20);
2233
-        $s14 += self::mul($s22, 136657, 18);
2234
-        $s15 -= self::mul($s22, 683901, 20);
2235
-
2236
-        $s9  += self::mul($s21,  666643, 20);
2237
-        $s10 += self::mul($s21,  470296, 19);
2238
-        $s11 += self::mul($s21,  654183, 20);
2239
-        $s12 -= self::mul($s21,  997805, 20);
2240
-        $s13 += self::mul($s21,  136657, 18);
2241
-        $s14 -= self::mul($s21,  683901, 20);
2242
-
2243
-        $s8  += self::mul($s20,  666643, 20);
2244
-        $s9  += self::mul($s20,  470296, 19);
2245
-        $s10 += self::mul($s20,  654183, 20);
2246
-        $s11 -= self::mul($s20,  997805, 20);
2247
-        $s12 += self::mul($s20,  136657, 18);
2248
-        $s13 -= self::mul($s20,  683901, 20);
2249
-
2250
-        $s7  += self::mul($s19,  666643, 20);
2251
-        $s8  += self::mul($s19,  470296, 19);
2252
-        $s9  += self::mul($s19,  654183, 20);
2253
-        $s10 -= self::mul($s19,  997805, 20);
2254
-        $s11 += self::mul($s19,  136657, 18);
2255
-        $s12 -= self::mul($s19,  683901, 20);
2256
-
2257
-        $s6  += self::mul($s18,  666643, 20);
2258
-        $s7  += self::mul($s18,  470296, 19);
2259
-        $s8  += self::mul($s18,  654183, 20);
2260
-        $s9  -= self::mul($s18,  997805, 20);
2261
-        $s10 += self::mul($s18,  136657, 18);
2262
-        $s11 -= self::mul($s18,  683901, 20);
2263
-
2264
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2265
-        $s7 += $carry6;
2266
-        $s6 -= $carry6 << 21;
2267
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2268
-        $s9 += $carry8;
2269
-        $s8 -= $carry8 << 21;
2270
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2271
-        $s11 += $carry10;
2272
-        $s10 -= $carry10 << 21;
2273
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2274
-        $s13 += $carry12;
2275
-        $s12 -= $carry12 << 21;
2276
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2277
-        $s15 += $carry14;
2278
-        $s14 -= $carry14 << 21;
2279
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2280
-        $s17 += $carry16;
2281
-        $s16 -= $carry16 << 21;
2282
-
2283
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2284
-        $s8 += $carry7;
2285
-        $s7 -= $carry7 << 21;
2286
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2287
-        $s10 += $carry9;
2288
-        $s9 -= $carry9 << 21;
2289
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2290
-        $s12 += $carry11;
2291
-        $s11 -= $carry11 << 21;
2292
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2293
-        $s14 += $carry13;
2294
-        $s13 -= $carry13 << 21;
2295
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2296
-        $s16 += $carry15;
2297
-        $s15 -= $carry15 << 21;
2298
-
2299
-        $s5  += self::mul($s17,  666643, 20);
2300
-        $s6  += self::mul($s17,  470296, 19);
2301
-        $s7  += self::mul($s17,  654183, 20);
2302
-        $s8  -= self::mul($s17,  997805, 20);
2303
-        $s9  += self::mul($s17,  136657, 18);
2304
-        $s10 -= self::mul($s17,  683901, 20);
2305
-
2306
-        $s4 += self::mul($s16,  666643, 20);
2307
-        $s5 += self::mul($s16,  470296, 19);
2308
-        $s6 += self::mul($s16,  654183, 20);
2309
-        $s7 -= self::mul($s16,  997805, 20);
2310
-        $s8 += self::mul($s16,  136657, 18);
2311
-        $s9 -= self::mul($s16,  683901, 20);
2312
-
2313
-        $s3 += self::mul($s15,  666643, 20);
2314
-        $s4 += self::mul($s15,  470296, 19);
2315
-        $s5 += self::mul($s15,  654183, 20);
2316
-        $s6 -= self::mul($s15,  997805, 20);
2317
-        $s7 += self::mul($s15,  136657, 18);
2318
-        $s8 -= self::mul($s15,  683901, 20);
2319
-
2320
-        $s2 += self::mul($s14,  666643, 20);
2321
-        $s3 += self::mul($s14,  470296, 19);
2322
-        $s4 += self::mul($s14,  654183, 20);
2323
-        $s5 -= self::mul($s14,  997805, 20);
2324
-        $s6 += self::mul($s14,  136657, 18);
2325
-        $s7 -= self::mul($s14,  683901, 20);
2326
-
2327
-        $s1 += self::mul($s13,  666643, 20);
2328
-        $s2 += self::mul($s13,  470296, 19);
2329
-        $s3 += self::mul($s13,  654183, 20);
2330
-        $s4 -= self::mul($s13,  997805, 20);
2331
-        $s5 += self::mul($s13,  136657, 18);
2332
-        $s6 -= self::mul($s13,  683901, 20);
2333
-
2334
-        $s0 += self::mul($s12,  666643, 20);
2335
-        $s1 += self::mul($s12,  470296, 19);
2336
-        $s2 += self::mul($s12,  654183, 20);
2337
-        $s3 -= self::mul($s12,  997805, 20);
2338
-        $s4 += self::mul($s12,  136657, 18);
2339
-        $s5 -= self::mul($s12,  683901, 20);
2340
-        $s12 = 0;
2341
-
2342
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2343
-        $s1 += $carry0;
2344
-        $s0 -= $carry0 << 21;
2345
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2346
-        $s3 += $carry2;
2347
-        $s2 -= $carry2 << 21;
2348
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2349
-        $s5 += $carry4;
2350
-        $s4 -= $carry4 << 21;
2351
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2352
-        $s7 += $carry6;
2353
-        $s6 -= $carry6 << 21;
2354
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2355
-        $s9 += $carry8;
2356
-        $s8 -= $carry8 << 21;
2357
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2358
-        $s11 += $carry10;
2359
-        $s10 -= $carry10 << 21;
2360
-
2361
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2362
-        $s2 += $carry1;
2363
-        $s1 -= $carry1 << 21;
2364
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2365
-        $s4 += $carry3;
2366
-        $s3 -= $carry3 << 21;
2367
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2368
-        $s6 += $carry5;
2369
-        $s5 -= $carry5 << 21;
2370
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2371
-        $s8 += $carry7;
2372
-        $s7 -= $carry7 << 21;
2373
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2374
-        $s10 += $carry9;
2375
-        $s9 -= $carry9 << 21;
2376
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2377
-        $s12 += $carry11;
2378
-        $s11 -= $carry11 << 21;
2379
-
2380
-        $s0 += self::mul($s12,  666643, 20);
2381
-        $s1 += self::mul($s12,  470296, 19);
2382
-        $s2 += self::mul($s12,  654183, 20);
2383
-        $s3 -= self::mul($s12,  997805, 20);
2384
-        $s4 += self::mul($s12,  136657, 18);
2385
-        $s5 -= self::mul($s12,  683901, 20);
2386
-        $s12 = 0;
2387
-
2388
-        $carry0 = $s0 >> 21;
2389
-        $s1 += $carry0;
2390
-        $s0 -= $carry0 << 21;
2391
-        $carry1 = $s1 >> 21;
2392
-        $s2 += $carry1;
2393
-        $s1 -= $carry1 << 21;
2394
-        $carry2 = $s2 >> 21;
2395
-        $s3 += $carry2;
2396
-        $s2 -= $carry2 << 21;
2397
-        $carry3 = $s3 >> 21;
2398
-        $s4 += $carry3;
2399
-        $s3 -= $carry3 << 21;
2400
-        $carry4 = $s4 >> 21;
2401
-        $s5 += $carry4;
2402
-        $s4 -= $carry4 << 21;
2403
-        $carry5 = $s5 >> 21;
2404
-        $s6 += $carry5;
2405
-        $s5 -= $carry5 << 21;
2406
-        $carry6 = $s6 >> 21;
2407
-        $s7 += $carry6;
2408
-        $s6 -= $carry6 << 21;
2409
-        $carry7 = $s7 >> 21;
2410
-        $s8 += $carry7;
2411
-        $s7 -= $carry7 << 21;
2412
-        $carry8 = $s8 >> 21;
2413
-        $s9 += $carry8;
2414
-        $s8 -= $carry8 << 21;
2415
-        $carry9 = $s9 >> 21;
2416
-        $s10 += $carry9;
2417
-        $s9 -= $carry9 << 21;
2418
-        $carry10 = $s10 >> 21;
2419
-        $s11 += $carry10;
2420
-        $s10 -= $carry10 << 21;
2421
-        $carry11 = $s11 >> 21;
2422
-        $s12 += $carry11;
2423
-        $s11 -= $carry11 << 21;
2424
-
2425
-        $s0 += self::mul($s12,  666643, 20);
2426
-        $s1 += self::mul($s12,  470296, 19);
2427
-        $s2 += self::mul($s12,  654183, 20);
2428
-        $s3 -= self::mul($s12,  997805, 20);
2429
-        $s4 += self::mul($s12,  136657, 18);
2430
-        $s5 -= self::mul($s12,  683901, 20);
2431
-
2432
-        $carry0 = $s0 >> 21;
2433
-        $s1 += $carry0;
2434
-        $s0 -= $carry0 << 21;
2435
-        $carry1 = $s1 >> 21;
2436
-        $s2 += $carry1;
2437
-        $s1 -= $carry1 << 21;
2438
-        $carry2 = $s2 >> 21;
2439
-        $s3 += $carry2;
2440
-        $s2 -= $carry2 << 21;
2441
-        $carry3 = $s3 >> 21;
2442
-        $s4 += $carry3;
2443
-        $s3 -= $carry3 << 21;
2444
-        $carry4 = $s4 >> 21;
2445
-        $s5 += $carry4;
2446
-        $s4 -= $carry4 << 21;
2447
-        $carry5 = $s5 >> 21;
2448
-        $s6 += $carry5;
2449
-        $s5 -= $carry5 << 21;
2450
-        $carry6 = $s6 >> 21;
2451
-        $s7 += $carry6;
2452
-        $s6 -= $carry6 << 21;
2453
-        $carry7 = $s7 >> 21;
2454
-        $s8 += $carry7;
2455
-        $s7 -= $carry7 << 21;
2456
-        $carry8 = $s8 >> 21;
2457
-        $s9 += $carry8;
2458
-        $s8 -= $carry8 << 21;
2459
-        $carry9 = $s9 >> 21;
2460
-        $s10 += $carry9;
2461
-        $s9 -= $carry9 << 21;
2462
-        $carry10 = $s10 >> 21;
2463
-        $s11 += $carry10;
2464
-        $s10 -= $carry10 << 21;
2465
-
2466
-        /**
2467
-         * @var array<int, int>
2468
-         */
2469
-        $arr = array(
2470
-            (int) (0xff & ($s0 >> 0)),
2471
-            (int) (0xff & ($s0 >> 8)),
2472
-            (int) (0xff & (($s0 >> 16) | $s1 << 5)),
2473
-            (int) (0xff & ($s1 >> 3)),
2474
-            (int) (0xff & ($s1 >> 11)),
2475
-            (int) (0xff & (($s1 >> 19) | $s2 << 2)),
2476
-            (int) (0xff & ($s2 >> 6)),
2477
-            (int) (0xff & (($s2 >> 14) | $s3 << 7)),
2478
-            (int) (0xff & ($s3 >> 1)),
2479
-            (int) (0xff & ($s3 >> 9)),
2480
-            (int) (0xff & (($s3 >> 17) | $s4 << 4)),
2481
-            (int) (0xff & ($s4 >> 4)),
2482
-            (int) (0xff & ($s4 >> 12)),
2483
-            (int) (0xff & (($s4 >> 20) | $s5 << 1)),
2484
-            (int) (0xff & ($s5 >> 7)),
2485
-            (int) (0xff & (($s5 >> 15) | $s6 << 6)),
2486
-            (int) (0xff & ($s6 >> 2)),
2487
-            (int) (0xff & ($s6 >> 10)),
2488
-            (int) (0xff & (($s6 >> 18) | $s7 << 3)),
2489
-            (int) (0xff & ($s7 >> 5)),
2490
-            (int) (0xff & ($s7 >> 13)),
2491
-            (int) (0xff & ($s8 >> 0)),
2492
-            (int) (0xff & ($s8 >> 8)),
2493
-            (int) (0xff & (($s8 >> 16) | $s9 << 5)),
2494
-            (int) (0xff & ($s9 >> 3)),
2495
-            (int) (0xff & ($s9 >> 11)),
2496
-            (int) (0xff & (($s9 >> 19) | $s10 << 2)),
2497
-            (int) (0xff & ($s10 >> 6)),
2498
-            (int) (0xff & (($s10 >> 14) | $s11 << 7)),
2499
-            (int) (0xff & ($s11 >> 1)),
2500
-            (int) (0xff & ($s11 >> 9)),
2501
-            0xff & ($s11 >> 17)
2502
-        );
2503
-        return self::intArrayToString($arr);
2504
-    }
2505
-
2506
-    /**
2507
-     * @internal You should not use this directly from another application
2508
-     *
2509
-     * @param string $s
2510
-     * @return string
2511
-     * @throws TypeError
2512
-     */
2513
-    public static function sc_reduce($s)
2514
-    {
2515
-        $s0 = 2097151 & self::load_3(self::substr($s, 0, 3));
2516
-        $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5);
2517
-        $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2);
2518
-        $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7);
2519
-        $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4);
2520
-        $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1);
2521
-        $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6);
2522
-        $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3);
2523
-        $s8 = 2097151 & self::load_3(self::substr($s, 21, 3));
2524
-        $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5);
2525
-        $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2);
2526
-        $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7);
2527
-        $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4);
2528
-        $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1);
2529
-        $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6);
2530
-        $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3);
2531
-        $s16 = 2097151 & self::load_3(self::substr($s, 42, 3));
2532
-        $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5);
2533
-        $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2);
2534
-        $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7);
2535
-        $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4);
2536
-        $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1);
2537
-        $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6);
2538
-        $s23 = (self::load_4(self::substr($s, 60, 4)) >> 3);
2539
-
2540
-        $s11 += self::mul($s23,  666643, 20);
2541
-        $s12 += self::mul($s23,  470296, 19);
2542
-        $s13 += self::mul($s23,  654183, 20);
2543
-        $s14 -= self::mul($s23,  997805, 20);
2544
-        $s15 += self::mul($s23,  136657, 18);
2545
-        $s16 -= self::mul($s23,  683901, 20);
2546
-
2547
-        $s10 += self::mul($s22,  666643, 20);
2548
-        $s11 += self::mul($s22,  470296, 19);
2549
-        $s12 += self::mul($s22,  654183, 20);
2550
-        $s13 -= self::mul($s22,  997805, 20);
2551
-        $s14 += self::mul($s22,  136657, 18);
2552
-        $s15 -= self::mul($s22,  683901, 20);
2553
-
2554
-        $s9  += self::mul($s21,  666643, 20);
2555
-        $s10 += self::mul($s21,  470296, 19);
2556
-        $s11 += self::mul($s21,  654183, 20);
2557
-        $s12 -= self::mul($s21,  997805, 20);
2558
-        $s13 += self::mul($s21,  136657, 18);
2559
-        $s14 -= self::mul($s21,  683901, 20);
2560
-
2561
-        $s8  += self::mul($s20,  666643, 20);
2562
-        $s9  += self::mul($s20,  470296, 19);
2563
-        $s10 += self::mul($s20,  654183, 20);
2564
-        $s11 -= self::mul($s20,  997805, 20);
2565
-        $s12 += self::mul($s20,  136657, 18);
2566
-        $s13 -= self::mul($s20,  683901, 20);
2567
-
2568
-        $s7  += self::mul($s19,  666643, 20);
2569
-        $s8  += self::mul($s19,  470296, 19);
2570
-        $s9  += self::mul($s19,  654183, 20);
2571
-        $s10 -= self::mul($s19,  997805, 20);
2572
-        $s11 += self::mul($s19,  136657, 18);
2573
-        $s12 -= self::mul($s19,  683901, 20);
2574
-
2575
-        $s6  += self::mul($s18,  666643, 20);
2576
-        $s7  += self::mul($s18,  470296, 19);
2577
-        $s8  += self::mul($s18,  654183, 20);
2578
-        $s9  -= self::mul($s18,  997805, 20);
2579
-        $s10 += self::mul($s18,  136657, 18);
2580
-        $s11 -= self::mul($s18,  683901, 20);
2581
-
2582
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2583
-        $s7 += $carry6;
2584
-        $s6 -= $carry6 << 21;
2585
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2586
-        $s9 += $carry8;
2587
-        $s8 -= $carry8 << 21;
2588
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2589
-        $s11 += $carry10;
2590
-        $s10 -= $carry10 << 21;
2591
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2592
-        $s13 += $carry12;
2593
-        $s12 -= $carry12 << 21;
2594
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2595
-        $s15 += $carry14;
2596
-        $s14 -= $carry14 << 21;
2597
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2598
-        $s17 += $carry16;
2599
-        $s16 -= $carry16 << 21;
2600
-
2601
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2602
-        $s8 += $carry7;
2603
-        $s7 -= $carry7 << 21;
2604
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2605
-        $s10 += $carry9;
2606
-        $s9 -= $carry9 << 21;
2607
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2608
-        $s12 += $carry11;
2609
-        $s11 -= $carry11 << 21;
2610
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2611
-        $s14 += $carry13;
2612
-        $s13 -= $carry13 << 21;
2613
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2614
-        $s16 += $carry15;
2615
-        $s15 -= $carry15 << 21;
2616
-
2617
-        $s5  += self::mul($s17,  666643, 20);
2618
-        $s6  += self::mul($s17,  470296, 19);
2619
-        $s7  += self::mul($s17,  654183, 20);
2620
-        $s8  -= self::mul($s17,  997805, 20);
2621
-        $s9  += self::mul($s17,  136657, 18);
2622
-        $s10 -= self::mul($s17,  683901, 20);
2623
-
2624
-        $s4 += self::mul($s16,  666643, 20);
2625
-        $s5 += self::mul($s16,  470296, 19);
2626
-        $s6 += self::mul($s16,  654183, 20);
2627
-        $s7 -= self::mul($s16,  997805, 20);
2628
-        $s8 += self::mul($s16,  136657, 18);
2629
-        $s9 -= self::mul($s16,  683901, 20);
2630
-
2631
-        $s3 += self::mul($s15,  666643, 20);
2632
-        $s4 += self::mul($s15,  470296, 19);
2633
-        $s5 += self::mul($s15,  654183, 20);
2634
-        $s6 -= self::mul($s15,  997805, 20);
2635
-        $s7 += self::mul($s15,  136657, 18);
2636
-        $s8 -= self::mul($s15,  683901, 20);
2637
-
2638
-        $s2 += self::mul($s14,  666643, 20);
2639
-        $s3 += self::mul($s14,  470296, 19);
2640
-        $s4 += self::mul($s14,  654183, 20);
2641
-        $s5 -= self::mul($s14,  997805, 20);
2642
-        $s6 += self::mul($s14,  136657, 18);
2643
-        $s7 -= self::mul($s14,  683901, 20);
2644
-
2645
-        $s1 += self::mul($s13,  666643, 20);
2646
-        $s2 += self::mul($s13,  470296, 19);
2647
-        $s3 += self::mul($s13,  654183, 20);
2648
-        $s4 -= self::mul($s13,  997805, 20);
2649
-        $s5 += self::mul($s13,  136657, 18);
2650
-        $s6 -= self::mul($s13,  683901, 20);
2651
-
2652
-        $s0 += self::mul($s12,  666643, 20);
2653
-        $s1 += self::mul($s12,  470296, 19);
2654
-        $s2 += self::mul($s12,  654183, 20);
2655
-        $s3 -= self::mul($s12,  997805, 20);
2656
-        $s4 += self::mul($s12,  136657, 18);
2657
-        $s5 -= self::mul($s12,  683901, 20);
2658
-        $s12 = 0;
2659
-
2660
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2661
-        $s1 += $carry0;
2662
-        $s0 -= $carry0 << 21;
2663
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2664
-        $s3 += $carry2;
2665
-        $s2 -= $carry2 << 21;
2666
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2667
-        $s5 += $carry4;
2668
-        $s4 -= $carry4 << 21;
2669
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2670
-        $s7 += $carry6;
2671
-        $s6 -= $carry6 << 21;
2672
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2673
-        $s9 += $carry8;
2674
-        $s8 -= $carry8 << 21;
2675
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2676
-        $s11 += $carry10;
2677
-        $s10 -= $carry10 << 21;
2678
-
2679
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2680
-        $s2 += $carry1;
2681
-        $s1 -= $carry1 << 21;
2682
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2683
-        $s4 += $carry3;
2684
-        $s3 -= $carry3 << 21;
2685
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2686
-        $s6 += $carry5;
2687
-        $s5 -= $carry5 << 21;
2688
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2689
-        $s8 += $carry7;
2690
-        $s7 -= $carry7 << 21;
2691
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2692
-        $s10 += $carry9;
2693
-        $s9 -= $carry9 << 21;
2694
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2695
-        $s12 += $carry11;
2696
-        $s11 -= $carry11 << 21;
2697
-
2698
-        $s0 += self::mul($s12,  666643, 20);
2699
-        $s1 += self::mul($s12,  470296, 19);
2700
-        $s2 += self::mul($s12,  654183, 20);
2701
-        $s3 -= self::mul($s12,  997805, 20);
2702
-        $s4 += self::mul($s12,  136657, 18);
2703
-        $s5 -= self::mul($s12,  683901, 20);
2704
-        $s12 = 0;
2705
-
2706
-        $carry0 = $s0 >> 21;
2707
-        $s1 += $carry0;
2708
-        $s0 -= $carry0 << 21;
2709
-        $carry1 = $s1 >> 21;
2710
-        $s2 += $carry1;
2711
-        $s1 -= $carry1 << 21;
2712
-        $carry2 = $s2 >> 21;
2713
-        $s3 += $carry2;
2714
-        $s2 -= $carry2 << 21;
2715
-        $carry3 = $s3 >> 21;
2716
-        $s4 += $carry3;
2717
-        $s3 -= $carry3 << 21;
2718
-        $carry4 = $s4 >> 21;
2719
-        $s5 += $carry4;
2720
-        $s4 -= $carry4 << 21;
2721
-        $carry5 = $s5 >> 21;
2722
-        $s6 += $carry5;
2723
-        $s5 -= $carry5 << 21;
2724
-        $carry6 = $s6 >> 21;
2725
-        $s7 += $carry6;
2726
-        $s6 -= $carry6 << 21;
2727
-        $carry7 = $s7 >> 21;
2728
-        $s8 += $carry7;
2729
-        $s7 -= $carry7 << 21;
2730
-        $carry8 = $s8 >> 21;
2731
-        $s9 += $carry8;
2732
-        $s8 -= $carry8 << 21;
2733
-        $carry9 = $s9 >> 21;
2734
-        $s10 += $carry9;
2735
-        $s9 -= $carry9 << 21;
2736
-        $carry10 = $s10 >> 21;
2737
-        $s11 += $carry10;
2738
-        $s10 -= $carry10 << 21;
2739
-        $carry11 = $s11 >> 21;
2740
-        $s12 += $carry11;
2741
-        $s11 -= $carry11 << 21;
2742
-
2743
-        $s0 += self::mul($s12,  666643, 20);
2744
-        $s1 += self::mul($s12,  470296, 19);
2745
-        $s2 += self::mul($s12,  654183, 20);
2746
-        $s3 -= self::mul($s12,  997805, 20);
2747
-        $s4 += self::mul($s12,  136657, 18);
2748
-        $s5 -= self::mul($s12,  683901, 20);
2749
-
2750
-        $carry0 = $s0 >> 21;
2751
-        $s1 += $carry0;
2752
-        $s0 -= $carry0 << 21;
2753
-        $carry1 = $s1 >> 21;
2754
-        $s2 += $carry1;
2755
-        $s1 -= $carry1 << 21;
2756
-        $carry2 = $s2 >> 21;
2757
-        $s3 += $carry2;
2758
-        $s2 -= $carry2 << 21;
2759
-        $carry3 = $s3 >> 21;
2760
-        $s4 += $carry3;
2761
-        $s3 -= $carry3 << 21;
2762
-        $carry4 = $s4 >> 21;
2763
-        $s5 += $carry4;
2764
-        $s4 -= $carry4 << 21;
2765
-        $carry5 = $s5 >> 21;
2766
-        $s6 += $carry5;
2767
-        $s5 -= $carry5 << 21;
2768
-        $carry6 = $s6 >> 21;
2769
-        $s7 += $carry6;
2770
-        $s6 -= $carry6 << 21;
2771
-        $carry7 = $s7 >> 21;
2772
-        $s8 += $carry7;
2773
-        $s7 -= $carry7 << 21;
2774
-        $carry8 = $s8 >> 21;
2775
-        $s9 += $carry8;
2776
-        $s8 -= $carry8 << 21;
2777
-        $carry9 = $s9 >> 21;
2778
-        $s10 += $carry9;
2779
-        $s9 -= $carry9 << 21;
2780
-        $carry10 = $s10 >> 21;
2781
-        $s11 += $carry10;
2782
-        $s10 -= $carry10 << 21;
2783
-
2784
-        /**
2785
-         * @var array<int, int>
2786
-         */
2787
-        $arr = array(
2788
-            (int) ($s0 >> 0),
2789
-            (int) ($s0 >> 8),
2790
-            (int) (($s0 >> 16) | $s1 << 5),
2791
-            (int) ($s1 >> 3),
2792
-            (int) ($s1 >> 11),
2793
-            (int) (($s1 >> 19) | $s2 << 2),
2794
-            (int) ($s2 >> 6),
2795
-            (int) (($s2 >> 14) | $s3 << 7),
2796
-            (int) ($s3 >> 1),
2797
-            (int) ($s3 >> 9),
2798
-            (int) (($s3 >> 17) | $s4 << 4),
2799
-            (int) ($s4 >> 4),
2800
-            (int) ($s4 >> 12),
2801
-            (int) (($s4 >> 20) | $s5 << 1),
2802
-            (int) ($s5 >> 7),
2803
-            (int) (($s5 >> 15) | $s6 << 6),
2804
-            (int) ($s6 >> 2),
2805
-            (int) ($s6 >> 10),
2806
-            (int) (($s6 >> 18) | $s7 << 3),
2807
-            (int) ($s7 >> 5),
2808
-            (int) ($s7 >> 13),
2809
-            (int) ($s8 >> 0),
2810
-            (int) ($s8 >> 8),
2811
-            (int) (($s8 >> 16) | $s9 << 5),
2812
-            (int) ($s9 >> 3),
2813
-            (int) ($s9 >> 11),
2814
-            (int) (($s9 >> 19) | $s10 << 2),
2815
-            (int) ($s10 >> 6),
2816
-            (int) (($s10 >> 14) | $s11 << 7),
2817
-            (int) ($s11 >> 1),
2818
-            (int) ($s11 >> 9),
2819
-            (int) $s11 >> 17
2820
-        );
2821
-        return self::intArrayToString($arr);
2822
-    }
2823
-
2824
-    /**
2825
-     * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493
2826
-     *
2827
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
2828
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
2829
-     */
2830
-    public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A)
2831
-    {
2832
-        $aslide = array(
2833
-            13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
2834
-            0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
2835
-            0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0,
2836
-            0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1,
2837
-            0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
2838
-            0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0,
2839
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2840
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2841
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2842
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2843
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2844
-            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
2845
-        );
2846
-
2847
-        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai size 8 */
2848
-        $Ai = array();
2849
-
2850
-        # ge_p3_to_cached(&Ai[0], A);
2851
-        $Ai[0] = self::ge_p3_to_cached($A);
2852
-        # ge_p3_dbl(&t, A);
2853
-        $t = self::ge_p3_dbl($A);
2854
-        # ge_p1p1_to_p3(&A2, &t);
2855
-        $A2 = self::ge_p1p1_to_p3($t);
2856
-
2857
-        for ($i = 1; $i < 8; ++$i) {
2858
-            # ge_add(&t, &A2, &Ai[0]);
2859
-            $t = self::ge_add($A2, $Ai[$i - 1]);
2860
-            # ge_p1p1_to_p3(&u, &t);
2861
-            $u = self::ge_p1p1_to_p3($t);
2862
-            # ge_p3_to_cached(&Ai[i], &u);
2863
-            $Ai[$i] = self::ge_p3_to_cached($u);
2864
-        }
2865
-
2866
-        $r = self::ge_p3_0();
2867
-        for ($i = 252; $i >= 0; --$i) {
2868
-            $t = self::ge_p3_dbl($r);
2869
-            if ($aslide[$i] > 0) {
2870
-                # ge_p1p1_to_p3(&u, &t);
2871
-                $u = self::ge_p1p1_to_p3($t);
2872
-                # ge_add(&t, &u, &Ai[aslide[i] / 2]);
2873
-                $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]);
2874
-            } elseif ($aslide[$i] < 0) {
2875
-                # ge_p1p1_to_p3(&u, &t);
2876
-                $u = self::ge_p1p1_to_p3($t);
2877
-                # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
2878
-                $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]);
2879
-            }
2880
-        }
2881
-
2882
-        # ge_p1p1_to_p3(r, &t);
2883
-        return self::ge_p1p1_to_p3($t);
2884
-    }
2885
-
2886
-    /**
2887
-     * @param string $a
2888
-     * @param string $b
2889
-     * @return string
2890
-     */
2891
-    public static function sc25519_mul($a, $b)
2892
-    {
2893
-        //    int64_t a0  = 2097151 & load_3(a);
2894
-        //    int64_t a1  = 2097151 & (load_4(a + 2) >> 5);
2895
-        //    int64_t a2  = 2097151 & (load_3(a + 5) >> 2);
2896
-        //    int64_t a3  = 2097151 & (load_4(a + 7) >> 7);
2897
-        //    int64_t a4  = 2097151 & (load_4(a + 10) >> 4);
2898
-        //    int64_t a5  = 2097151 & (load_3(a + 13) >> 1);
2899
-        //    int64_t a6  = 2097151 & (load_4(a + 15) >> 6);
2900
-        //    int64_t a7  = 2097151 & (load_3(a + 18) >> 3);
2901
-        //    int64_t a8  = 2097151 & load_3(a + 21);
2902
-        //    int64_t a9  = 2097151 & (load_4(a + 23) >> 5);
2903
-        //    int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
2904
-        //    int64_t a11 = (load_4(a + 28) >> 7);
2905
-        $a0  = 2097151 &  self::load_3(self::substr($a, 0, 3));
2906
-        $a1  = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2907
-        $a2  = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2908
-        $a3  = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2909
-        $a4  = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2910
-        $a5  = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2911
-        $a6  = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2912
-        $a7  = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2913
-        $a8  = 2097151 &  self::load_3(self::substr($a, 21, 3));
2914
-        $a9  = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2915
-        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2916
-        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2917
-
2918
-        //    int64_t b0  = 2097151 & load_3(b);
2919
-        //    int64_t b1  = 2097151 & (load_4(b + 2) >> 5);
2920
-        //    int64_t b2  = 2097151 & (load_3(b + 5) >> 2);
2921
-        //    int64_t b3  = 2097151 & (load_4(b + 7) >> 7);
2922
-        //    int64_t b4  = 2097151 & (load_4(b + 10) >> 4);
2923
-        //    int64_t b5  = 2097151 & (load_3(b + 13) >> 1);
2924
-        //    int64_t b6  = 2097151 & (load_4(b + 15) >> 6);
2925
-        //    int64_t b7  = 2097151 & (load_3(b + 18) >> 3);
2926
-        //    int64_t b8  = 2097151 & load_3(b + 21);
2927
-        //    int64_t b9  = 2097151 & (load_4(b + 23) >> 5);
2928
-        //    int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
2929
-        //    int64_t b11 = (load_4(b + 28) >> 7);
2930
-        $b0  = 2097151 &  self::load_3(self::substr($b, 0, 3));
2931
-        $b1  = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2932
-        $b2  = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2933
-        $b3  = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2934
-        $b4  = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2935
-        $b5  = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2936
-        $b6  = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2937
-        $b7  = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2938
-        $b8  = 2097151 &  self::load_3(self::substr($b, 21, 3));
2939
-        $b9  = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2940
-        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2941
-        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2942
-
2943
-        //    s0 = a0 * b0;
2944
-        //    s1 = a0 * b1 + a1 * b0;
2945
-        //    s2 = a0 * b2 + a1 * b1 + a2 * b0;
2946
-        //    s3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
2947
-        //    s4 = a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
2948
-        //    s5 = a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
2949
-        //    s6 = a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
2950
-        //    s7 = a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 +
2951
-        //        a6 * b1 + a7 * b0;
2952
-        //    s8 = a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
2953
-        //        a6 * b2 + a7 * b1 + a8 * b0;
2954
-        //    s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
2955
-        //        a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
2956
-        //    s10 = a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
2957
-        //        a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
2958
-        //    s11 = a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
2959
-        //        a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
2960
-        //    s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 +
2961
-        //        a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
2962
-        //    s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 +
2963
-        //        a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2;
2964
-        //    s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 +
2965
-        //        a9 * b5 + a10 * b4 + a11 * b3;
2966
-        //    s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 +
2967
-        //        a10 * b5 + a11 * b4;
2968
-        //    s16 =
2969
-        //        a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
2970
-        //    s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
2971
-        //    s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
2972
-        //    s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
2973
-        //    s20 = a9 * b11 + a10 * b10 + a11 * b9;
2974
-        //    s21 = a10 * b11 + a11 * b10;
2975
-        //    s22 = a11 * b11;
2976
-        //    s23 = 0;
2977
-        $s0 = self::mul($a0, $b0, 22);
2978
-        $s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22);
2979
-        $s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22);
2980
-        $s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22);
2981
-        $s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) +
2982
-            self::mul($a4, $b0, 22);
2983
-        $s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) +
2984
-            self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22);
2985
-        $s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) +
2986
-            self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22);
2987
-        $s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) +
2988
-            self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22);
2989
-        $s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) +
2990
-            self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) +
2991
-            self::mul($a8, $b0, 22);
2992
-        $s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) +
2993
-            self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) +
2994
-            self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22);
2995
-        $s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) +
2996
-            self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) +
2997
-            self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22);
2998
-        $s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) +
2999
-            self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) +
3000
-            self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22);
3001
-        $s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) +
3002
-            self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) +
3003
-            self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22);
3004
-        $s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) +
3005
-            self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) +
3006
-            self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22);
3007
-        $s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) +
3008
-            self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) +
3009
-            self::mul($a11, $b3, 22);
3010
-        $s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) +
3011
-            self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22);
3012
-        $s16 =
3013
-            self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) +
3014
-            self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22);
3015
-        $s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) +
3016
-            self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22);
3017
-        $s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22)
3018
-            + self::mul($a11, $b7, 22);
3019
-        $s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) +
3020
-            self::mul($a11, $b8, 22);
3021
-        $s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22);
3022
-        $s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22);
3023
-        $s22 = self::mul($a11, $b11, 22);
3024
-        $s23 = 0;
3025
-
3026
-        //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3027
-        //    s1 += carry0;
3028
-        //    s0 -= carry0 * ((uint64_t) 1L << 21);
3029
-        $carry0 = ($s0 + (1 << 20)) >> 21;
3030
-        $s1 += $carry0;
3031
-        $s0 -= $carry0 << 21;
3032
-        //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3033
-        //    s3 += carry2;
3034
-        //    s2 -= carry2 * ((uint64_t) 1L << 21);
3035
-        $carry2 = ($s2 + (1 << 20)) >> 21;
3036
-        $s3 += $carry2;
3037
-        $s2 -= $carry2 << 21;
3038
-        //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3039
-        //    s5 += carry4;
3040
-        //    s4 -= carry4 * ((uint64_t) 1L << 21);
3041
-        $carry4 = ($s4 + (1 << 20)) >> 21;
3042
-        $s5 += $carry4;
3043
-        $s4 -= $carry4 << 21;
3044
-        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3045
-        //    s7 += carry6;
3046
-        //    s6 -= carry6 * ((uint64_t) 1L << 21);
3047
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3048
-        $s7 += $carry6;
3049
-        $s6 -= $carry6 << 21;
3050
-        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3051
-        //    s9 += carry8;
3052
-        //    s8 -= carry8 * ((uint64_t) 1L << 21);
3053
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3054
-        $s9 += $carry8;
3055
-        $s8 -= $carry8 << 21;
3056
-        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3057
-        //    s11 += carry10;
3058
-        //    s10 -= carry10 * ((uint64_t) 1L << 21);
3059
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3060
-        $s11 += $carry10;
3061
-        $s10 -= $carry10 << 21;
3062
-        //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3063
-        //    s13 += carry12;
3064
-        //    s12 -= carry12 * ((uint64_t) 1L << 21);
3065
-        $carry12 = ($s12 + (1 << 20)) >> 21;
3066
-        $s13 += $carry12;
3067
-        $s12 -= $carry12 << 21;
3068
-        //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3069
-        //    s15 += carry14;
3070
-        //    s14 -= carry14 * ((uint64_t) 1L << 21);
3071
-        $carry14 = ($s14 + (1 << 20)) >> 21;
3072
-        $s15 += $carry14;
3073
-        $s14 -= $carry14 << 21;
3074
-        //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3075
-        //    s17 += carry16;
3076
-        //    s16 -= carry16 * ((uint64_t) 1L << 21);
3077
-        $carry16 = ($s16 + (1 << 20)) >> 21;
3078
-        $s17 += $carry16;
3079
-        $s16 -= $carry16 << 21;
3080
-        //    carry18 = (s18 + (int64_t) (1L << 20)) >> 21;
3081
-        //    s19 += carry18;
3082
-        //    s18 -= carry18 * ((uint64_t) 1L << 21);
3083
-        $carry18 = ($s18 + (1 << 20)) >> 21;
3084
-        $s19 += $carry18;
3085
-        $s18 -= $carry18 << 21;
3086
-        //    carry20 = (s20 + (int64_t) (1L << 20)) >> 21;
3087
-        //    s21 += carry20;
3088
-        //    s20 -= carry20 * ((uint64_t) 1L << 21);
3089
-        $carry20 = ($s20 + (1 << 20)) >> 21;
3090
-        $s21 += $carry20;
3091
-        $s20 -= $carry20 << 21;
3092
-        //    carry22 = (s22 + (int64_t) (1L << 20)) >> 21;
3093
-        //    s23 += carry22;
3094
-        //    s22 -= carry22 * ((uint64_t) 1L << 21);
3095
-        $carry22 = ($s22 + (1 << 20)) >> 21;
3096
-        $s23 += $carry22;
3097
-        $s22 -= $carry22 << 21;
3098
-
3099
-        //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3100
-        //    s2 += carry1;
3101
-        //    s1 -= carry1 * ((uint64_t) 1L << 21);
3102
-        $carry1 = ($s1 + (1 << 20)) >> 21;
3103
-        $s2 += $carry1;
3104
-        $s1 -= $carry1 << 21;
3105
-        //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3106
-        //    s4 += carry3;
3107
-        //    s3 -= carry3 * ((uint64_t) 1L << 21);
3108
-        $carry3 = ($s3 + (1 << 20)) >> 21;
3109
-        $s4 += $carry3;
3110
-        $s3 -= $carry3 << 21;
3111
-        //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3112
-        //    s6 += carry5;
3113
-        //    s5 -= carry5 * ((uint64_t) 1L << 21);
3114
-        $carry5 = ($s5 + (1 << 20)) >> 21;
3115
-        $s6 += $carry5;
3116
-        $s5 -= $carry5 << 21;
3117
-        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3118
-        //    s8 += carry7;
3119
-        //    s7 -= carry7 * ((uint64_t) 1L << 21);
3120
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3121
-        $s8 += $carry7;
3122
-        $s7 -= $carry7 << 21;
3123
-        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3124
-        //    s10 += carry9;
3125
-        //    s9 -= carry9 * ((uint64_t) 1L << 21);
3126
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3127
-        $s10 += $carry9;
3128
-        $s9 -= $carry9 << 21;
3129
-        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3130
-        //    s12 += carry11;
3131
-        //    s11 -= carry11 * ((uint64_t) 1L << 21);
3132
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3133
-        $s12 += $carry11;
3134
-        $s11 -= $carry11 << 21;
3135
-        //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3136
-        //    s14 += carry13;
3137
-        //    s13 -= carry13 * ((uint64_t) 1L << 21);
3138
-        $carry13 = ($s13 + (1 << 20)) >> 21;
3139
-        $s14 += $carry13;
3140
-        $s13 -= $carry13 << 21;
3141
-        //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3142
-        //    s16 += carry15;
3143
-        //    s15 -= carry15 * ((uint64_t) 1L << 21);
3144
-        $carry15 = ($s15 + (1 << 20)) >> 21;
3145
-        $s16 += $carry15;
3146
-        $s15 -= $carry15 << 21;
3147
-        //    carry17 = (s17 + (int64_t) (1L << 20)) >> 21;
3148
-        //    s18 += carry17;
3149
-        //    s17 -= carry17 * ((uint64_t) 1L << 21);
3150
-        $carry17 = ($s17 + (1 << 20)) >> 21;
3151
-        $s18 += $carry17;
3152
-        $s17 -= $carry17 << 21;
3153
-        //    carry19 = (s19 + (int64_t) (1L << 20)) >> 21;
3154
-        //    s20 += carry19;
3155
-        //    s19 -= carry19 * ((uint64_t) 1L << 21);
3156
-        $carry19 = ($s19 + (1 << 20)) >> 21;
3157
-        $s20 += $carry19;
3158
-        $s19 -= $carry19 << 21;
3159
-        //    carry21 = (s21 + (int64_t) (1L << 20)) >> 21;
3160
-        //    s22 += carry21;
3161
-        //    s21 -= carry21 * ((uint64_t) 1L << 21);
3162
-        $carry21 = ($s21 + (1 << 20)) >> 21;
3163
-        $s22 += $carry21;
3164
-        $s21 -= $carry21 << 21;
3165
-
3166
-        //    s11 += s23 * 666643;
3167
-        //    s12 += s23 * 470296;
3168
-        //    s13 += s23 * 654183;
3169
-        //    s14 -= s23 * 997805;
3170
-        //    s15 += s23 * 136657;
3171
-        //    s16 -= s23 * 683901;
3172
-        $s11 += self::mul($s23, 666643, 20);
3173
-        $s12 += self::mul($s23, 470296, 19);
3174
-        $s13 += self::mul($s23, 654183, 20);
3175
-        $s14 -= self::mul($s23, 997805, 20);
3176
-        $s15 += self::mul($s23, 136657, 18);
3177
-        $s16 -= self::mul($s23, 683901, 20);
3178
-
3179
-        //    s10 += s22 * 666643;
3180
-        //    s11 += s22 * 470296;
3181
-        //    s12 += s22 * 654183;
3182
-        //    s13 -= s22 * 997805;
3183
-        //    s14 += s22 * 136657;
3184
-        //    s15 -= s22 * 683901;
3185
-        $s10 += self::mul($s22, 666643, 20);
3186
-        $s11 += self::mul($s22, 470296, 19);
3187
-        $s12 += self::mul($s22, 654183, 20);
3188
-        $s13 -= self::mul($s22, 997805, 20);
3189
-        $s14 += self::mul($s22, 136657, 18);
3190
-        $s15 -= self::mul($s22, 683901, 20);
3191
-
3192
-        //    s9 += s21 * 666643;
3193
-        //    s10 += s21 * 470296;
3194
-        //    s11 += s21 * 654183;
3195
-        //    s12 -= s21 * 997805;
3196
-        //    s13 += s21 * 136657;
3197
-        //    s14 -= s21 * 683901;
3198
-        $s9 += self::mul($s21, 666643, 20);
3199
-        $s10 += self::mul($s21, 470296, 19);
3200
-        $s11 += self::mul($s21, 654183, 20);
3201
-        $s12 -= self::mul($s21, 997805, 20);
3202
-        $s13 += self::mul($s21, 136657, 18);
3203
-        $s14 -= self::mul($s21, 683901, 20);
3204
-
3205
-        //    s8 += s20 * 666643;
3206
-        //    s9 += s20 * 470296;
3207
-        //    s10 += s20 * 654183;
3208
-        //    s11 -= s20 * 997805;
3209
-        //    s12 += s20 * 136657;
3210
-        //    s13 -= s20 * 683901;
3211
-        $s8 += self::mul($s20, 666643, 20);
3212
-        $s9 += self::mul($s20, 470296, 19);
3213
-        $s10 += self::mul($s20, 654183, 20);
3214
-        $s11 -= self::mul($s20, 997805, 20);
3215
-        $s12 += self::mul($s20, 136657, 18);
3216
-        $s13 -= self::mul($s20, 683901, 20);
3217
-
3218
-        //    s7 += s19 * 666643;
3219
-        //    s8 += s19 * 470296;
3220
-        //    s9 += s19 * 654183;
3221
-        //    s10 -= s19 * 997805;
3222
-        //    s11 += s19 * 136657;
3223
-        //    s12 -= s19 * 683901;
3224
-        $s7 += self::mul($s19, 666643, 20);
3225
-        $s8 += self::mul($s19, 470296, 19);
3226
-        $s9 += self::mul($s19, 654183, 20);
3227
-        $s10 -= self::mul($s19, 997805, 20);
3228
-        $s11 += self::mul($s19, 136657, 18);
3229
-        $s12 -= self::mul($s19, 683901, 20);
3230
-
3231
-        //    s6 += s18 * 666643;
3232
-        //    s7 += s18 * 470296;
3233
-        //    s8 += s18 * 654183;
3234
-        //    s9 -= s18 * 997805;
3235
-        //    s10 += s18 * 136657;
3236
-        //    s11 -= s18 * 683901;
3237
-        $s6 += self::mul($s18, 666643, 20);
3238
-        $s7 += self::mul($s18, 470296, 19);
3239
-        $s8 += self::mul($s18, 654183, 20);
3240
-        $s9 -= self::mul($s18, 997805, 20);
3241
-        $s10 += self::mul($s18, 136657, 18);
3242
-        $s11 -= self::mul($s18, 683901, 20);
3243
-
3244
-        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3245
-        //    s7 += carry6;
3246
-        //    s6 -= carry6 * ((uint64_t) 1L << 21);
3247
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3248
-        $s7 += $carry6;
3249
-        $s6 -= $carry6 << 21;
3250
-        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3251
-        //    s9 += carry8;
3252
-        //    s8 -= carry8 * ((uint64_t) 1L << 21);
3253
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3254
-        $s9 += $carry8;
3255
-        $s8 -= $carry8 << 21;
3256
-        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3257
-        //    s11 += carry10;
3258
-        //    s10 -= carry10 * ((uint64_t) 1L << 21);
3259
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3260
-        $s11 += $carry10;
3261
-        $s10 -= $carry10 << 21;
3262
-        //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3263
-        //    s13 += carry12;
3264
-        //    s12 -= carry12 * ((uint64_t) 1L << 21);
3265
-        $carry12 = ($s12 + (1 << 20)) >> 21;
3266
-        $s13 += $carry12;
3267
-        $s12 -= $carry12 << 21;
3268
-        //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3269
-        //    s15 += carry14;
3270
-        //    s14 -= carry14 * ((uint64_t) 1L << 21);
3271
-        $carry14 = ($s14 + (1 << 20)) >> 21;
3272
-        $s15 += $carry14;
3273
-        $s14 -= $carry14 << 21;
3274
-        //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3275
-        //    s17 += carry16;
3276
-        //    s16 -= carry16 * ((uint64_t) 1L << 21);
3277
-        $carry16 = ($s16 + (1 << 20)) >> 21;
3278
-        $s17 += $carry16;
3279
-        $s16 -= $carry16 << 21;
3280
-
3281
-        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3282
-        //    s8 += carry7;
3283
-        //    s7 -= carry7 * ((uint64_t) 1L << 21);
3284
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3285
-        $s8 += $carry7;
3286
-        $s7 -= $carry7 << 21;
3287
-        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3288
-        //    s10 += carry9;
3289
-        //    s9 -= carry9 * ((uint64_t) 1L << 21);
3290
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3291
-        $s10 += $carry9;
3292
-        $s9 -= $carry9 << 21;
3293
-        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3294
-        //    s12 += carry11;
3295
-        //    s11 -= carry11 * ((uint64_t) 1L << 21);
3296
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3297
-        $s12 += $carry11;
3298
-        $s11 -= $carry11 << 21;
3299
-        //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3300
-        //    s14 += carry13;
3301
-        //    s13 -= carry13 * ((uint64_t) 1L << 21);
3302
-        $carry13 = ($s13 + (1 << 20)) >> 21;
3303
-        $s14 += $carry13;
3304
-        $s13 -= $carry13 << 21;
3305
-        //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3306
-        //    s16 += carry15;
3307
-        //    s15 -= carry15 * ((uint64_t) 1L << 21);
3308
-        $carry15 = ($s15 + (1 << 20)) >> 21;
3309
-        $s16 += $carry15;
3310
-        $s15 -= $carry15 << 21;
3311
-
3312
-        //    s5 += s17 * 666643;
3313
-        //    s6 += s17 * 470296;
3314
-        //    s7 += s17 * 654183;
3315
-        //    s8 -= s17 * 997805;
3316
-        //    s9 += s17 * 136657;
3317
-        //    s10 -= s17 * 683901;
3318
-        $s5 += self::mul($s17, 666643, 20);
3319
-        $s6 += self::mul($s17, 470296, 19);
3320
-        $s7 += self::mul($s17, 654183, 20);
3321
-        $s8 -= self::mul($s17, 997805, 20);
3322
-        $s9 += self::mul($s17, 136657, 18);
3323
-        $s10 -= self::mul($s17, 683901, 20);
3324
-
3325
-        //    s4 += s16 * 666643;
3326
-        //    s5 += s16 * 470296;
3327
-        //    s6 += s16 * 654183;
3328
-        //    s7 -= s16 * 997805;
3329
-        //    s8 += s16 * 136657;
3330
-        //    s9 -= s16 * 683901;
3331
-        $s4 += self::mul($s16, 666643, 20);
3332
-        $s5 += self::mul($s16, 470296, 19);
3333
-        $s6 += self::mul($s16, 654183, 20);
3334
-        $s7 -= self::mul($s16, 997805, 20);
3335
-        $s8 += self::mul($s16, 136657, 18);
3336
-        $s9 -= self::mul($s16, 683901, 20);
3337
-
3338
-        //    s3 += s15 * 666643;
3339
-        //    s4 += s15 * 470296;
3340
-        //    s5 += s15 * 654183;
3341
-        //    s6 -= s15 * 997805;
3342
-        //    s7 += s15 * 136657;
3343
-        //    s8 -= s15 * 683901;
3344
-        $s3 += self::mul($s15, 666643, 20);
3345
-        $s4 += self::mul($s15, 470296, 19);
3346
-        $s5 += self::mul($s15, 654183, 20);
3347
-        $s6 -= self::mul($s15, 997805, 20);
3348
-        $s7 += self::mul($s15, 136657, 18);
3349
-        $s8 -= self::mul($s15, 683901, 20);
3350
-
3351
-        //    s2 += s14 * 666643;
3352
-        //    s3 += s14 * 470296;
3353
-        //    s4 += s14 * 654183;
3354
-        //    s5 -= s14 * 997805;
3355
-        //    s6 += s14 * 136657;
3356
-        //    s7 -= s14 * 683901;
3357
-        $s2 += self::mul($s14, 666643, 20);
3358
-        $s3 += self::mul($s14, 470296, 19);
3359
-        $s4 += self::mul($s14, 654183, 20);
3360
-        $s5 -= self::mul($s14, 997805, 20);
3361
-        $s6 += self::mul($s14, 136657, 18);
3362
-        $s7 -= self::mul($s14, 683901, 20);
3363
-
3364
-        //    s1 += s13 * 666643;
3365
-        //    s2 += s13 * 470296;
3366
-        //    s3 += s13 * 654183;
3367
-        //    s4 -= s13 * 997805;
3368
-        //    s5 += s13 * 136657;
3369
-        //    s6 -= s13 * 683901;
3370
-        $s1 += self::mul($s13, 666643, 20);
3371
-        $s2 += self::mul($s13, 470296, 19);
3372
-        $s3 += self::mul($s13, 654183, 20);
3373
-        $s4 -= self::mul($s13, 997805, 20);
3374
-        $s5 += self::mul($s13, 136657, 18);
3375
-        $s6 -= self::mul($s13, 683901, 20);
3376
-
3377
-        //    s0 += s12 * 666643;
3378
-        //    s1 += s12 * 470296;
3379
-        //    s2 += s12 * 654183;
3380
-        //    s3 -= s12 * 997805;
3381
-        //    s4 += s12 * 136657;
3382
-        //    s5 -= s12 * 683901;
3383
-        //    s12 = 0;
3384
-        $s0 += self::mul($s12, 666643, 20);
3385
-        $s1 += self::mul($s12, 470296, 19);
3386
-        $s2 += self::mul($s12, 654183, 20);
3387
-        $s3 -= self::mul($s12, 997805, 20);
3388
-        $s4 += self::mul($s12, 136657, 18);
3389
-        $s5 -= self::mul($s12, 683901, 20);
3390
-        $s12 = 0;
3391
-
3392
-        //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3393
-        //    s1 += carry0;
3394
-        //    s0 -= carry0 * ((uint64_t) 1L << 21);
3395
-        $carry0 = ($s0 + (1 << 20)) >> 21;
3396
-        $s1 += $carry0;
3397
-        $s0 -= $carry0 << 21;
3398
-        //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3399
-        //    s3 += carry2;
3400
-        //    s2 -= carry2 * ((uint64_t) 1L << 21);
3401
-        $carry2 = ($s2 + (1 << 20)) >> 21;
3402
-        $s3 += $carry2;
3403
-        $s2 -= $carry2 << 21;
3404
-        //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3405
-        //    s5 += carry4;
3406
-        //    s4 -= carry4 * ((uint64_t) 1L << 21);
3407
-        $carry4 = ($s4 + (1 << 20)) >> 21;
3408
-        $s5 += $carry4;
3409
-        $s4 -= $carry4 << 21;
3410
-        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3411
-        //    s7 += carry6;
3412
-        //    s6 -= carry6 * ((uint64_t) 1L << 21);
3413
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3414
-        $s7 += $carry6;
3415
-        $s6 -= $carry6 << 21;
3416
-        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3417
-        //    s9 += carry8;
3418
-        //    s8 -= carry8 * ((uint64_t) 1L << 21);
3419
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3420
-        $s9 += $carry8;
3421
-        $s8 -= $carry8 << 21;
3422
-        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3423
-        //    s11 += carry10;
3424
-        //    s10 -= carry10 * ((uint64_t) 1L << 21);
3425
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3426
-        $s11 += $carry10;
3427
-        $s10 -= $carry10 << 21;
3428
-
3429
-        //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3430
-        //    s2 += carry1;
3431
-        //    s1 -= carry1 * ((uint64_t) 1L << 21);
3432
-        $carry1 = ($s1 + (1 << 20)) >> 21;
3433
-        $s2 += $carry1;
3434
-        $s1 -= $carry1 << 21;
3435
-        //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3436
-        //    s4 += carry3;
3437
-        //    s3 -= carry3 * ((uint64_t) 1L << 21);
3438
-        $carry3 = ($s3 + (1 << 20)) >> 21;
3439
-        $s4 += $carry3;
3440
-        $s3 -= $carry3 << 21;
3441
-        //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3442
-        //    s6 += carry5;
3443
-        //    s5 -= carry5 * ((uint64_t) 1L << 21);
3444
-        $carry5 = ($s5 + (1 << 20)) >> 21;
3445
-        $s6 += $carry5;
3446
-        $s5 -= $carry5 << 21;
3447
-        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3448
-        //    s8 += carry7;
3449
-        //    s7 -= carry7 * ((uint64_t) 1L << 21);
3450
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3451
-        $s8 += $carry7;
3452
-        $s7 -= $carry7 << 21;
3453
-        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3454
-        //    s10 += carry9;
3455
-        //    s9 -= carry9 * ((uint64_t) 1L << 21);
3456
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3457
-        $s10 += $carry9;
3458
-        $s9 -= $carry9 << 21;
3459
-        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3460
-        //    s12 += carry11;
3461
-        //    s11 -= carry11 * ((uint64_t) 1L << 21);
3462
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3463
-        $s12 += $carry11;
3464
-        $s11 -= $carry11 << 21;
3465
-
3466
-        //    s0 += s12 * 666643;
3467
-        //    s1 += s12 * 470296;
3468
-        //    s2 += s12 * 654183;
3469
-        //    s3 -= s12 * 997805;
3470
-        //    s4 += s12 * 136657;
3471
-        //    s5 -= s12 * 683901;
3472
-        //    s12 = 0;
3473
-        $s0 += self::mul($s12, 666643, 20);
3474
-        $s1 += self::mul($s12, 470296, 19);
3475
-        $s2 += self::mul($s12, 654183, 20);
3476
-        $s3 -= self::mul($s12, 997805, 20);
3477
-        $s4 += self::mul($s12, 136657, 18);
3478
-        $s5 -= self::mul($s12, 683901, 20);
3479
-        $s12 = 0;
3480
-
3481
-        //    carry0 = s0 >> 21;
3482
-        //    s1 += carry0;
3483
-        //    s0 -= carry0 * ((uint64_t) 1L << 21);
3484
-        $carry0 = $s0 >> 21;
3485
-        $s1 += $carry0;
3486
-        $s0 -= $carry0 << 21;
3487
-        //    carry1 = s1 >> 21;
3488
-        //    s2 += carry1;
3489
-        //    s1 -= carry1 * ((uint64_t) 1L << 21);
3490
-        $carry1 = $s1 >> 21;
3491
-        $s2 += $carry1;
3492
-        $s1 -= $carry1 << 21;
3493
-        //    carry2 = s2 >> 21;
3494
-        //    s3 += carry2;
3495
-        //    s2 -= carry2 * ((uint64_t) 1L << 21);
3496
-        $carry2 = $s2 >> 21;
3497
-        $s3 += $carry2;
3498
-        $s2 -= $carry2 << 21;
3499
-        //    carry3 = s3 >> 21;
3500
-        //    s4 += carry3;
3501
-        //    s3 -= carry3 * ((uint64_t) 1L << 21);
3502
-        $carry3 = $s3 >> 21;
3503
-        $s4 += $carry3;
3504
-        $s3 -= $carry3 << 21;
3505
-        //    carry4 = s4 >> 21;
3506
-        //    s5 += carry4;
3507
-        //    s4 -= carry4 * ((uint64_t) 1L << 21);
3508
-        $carry4 = $s4 >> 21;
3509
-        $s5 += $carry4;
3510
-        $s4 -= $carry4 << 21;
3511
-        //    carry5 = s5 >> 21;
3512
-        //    s6 += carry5;
3513
-        //    s5 -= carry5 * ((uint64_t) 1L << 21);
3514
-        $carry5 = $s5 >> 21;
3515
-        $s6 += $carry5;
3516
-        $s5 -= $carry5 << 21;
3517
-        //    carry6 = s6 >> 21;
3518
-        //    s7 += carry6;
3519
-        //    s6 -= carry6 * ((uint64_t) 1L << 21);
3520
-        $carry6 = $s6 >> 21;
3521
-        $s7 += $carry6;
3522
-        $s6 -= $carry6 << 21;
3523
-        //    carry7 = s7 >> 21;
3524
-        //    s8 += carry7;
3525
-        //    s7 -= carry7 * ((uint64_t) 1L << 21);
3526
-        $carry7 = $s7 >> 21;
3527
-        $s8 += $carry7;
3528
-        $s7 -= $carry7 << 21;
3529
-        //    carry8 = s8 >> 21;
3530
-        //    s9 += carry8;
3531
-        //    s8 -= carry8 * ((uint64_t) 1L << 21);
3532
-        $carry8 = $s8 >> 21;
3533
-        $s9 += $carry8;
3534
-        $s8 -= $carry8 << 21;
3535
-        //    carry9 = s9 >> 21;
3536
-        //    s10 += carry9;
3537
-        //    s9 -= carry9 * ((uint64_t) 1L << 21);
3538
-        $carry9 = $s9 >> 21;
3539
-        $s10 += $carry9;
3540
-        $s9 -= $carry9 << 21;
3541
-        //    carry10 = s10 >> 21;
3542
-        //    s11 += carry10;
3543
-        //    s10 -= carry10 * ((uint64_t) 1L << 21);
3544
-        $carry10 = $s10 >> 21;
3545
-        $s11 += $carry10;
3546
-        $s10 -= $carry10 << 21;
3547
-        //    carry11 = s11 >> 21;
3548
-        //    s12 += carry11;
3549
-        //    s11 -= carry11 * ((uint64_t) 1L << 21);
3550
-        $carry11 = $s11 >> 21;
3551
-        $s12 += $carry11;
3552
-        $s11 -= $carry11 << 21;
3553
-
3554
-        //    s0 += s12 * 666643;
3555
-        //    s1 += s12 * 470296;
3556
-        //    s2 += s12 * 654183;
3557
-        //    s3 -= s12 * 997805;
3558
-        //    s4 += s12 * 136657;
3559
-        //    s5 -= s12 * 683901;
3560
-        $s0 += self::mul($s12, 666643, 20);
3561
-        $s1 += self::mul($s12, 470296, 19);
3562
-        $s2 += self::mul($s12, 654183, 20);
3563
-        $s3 -= self::mul($s12, 997805, 20);
3564
-        $s4 += self::mul($s12, 136657, 18);
3565
-        $s5 -= self::mul($s12, 683901, 20);
3566
-
3567
-        //    carry0 = s0 >> 21;
3568
-        //    s1 += carry0;
3569
-        //    s0 -= carry0 * ((uint64_t) 1L << 21);
3570
-        $carry0 = $s0 >> 21;
3571
-        $s1 += $carry0;
3572
-        $s0 -= $carry0 << 21;
3573
-        //    carry1 = s1 >> 21;
3574
-        //    s2 += carry1;
3575
-        //    s1 -= carry1 * ((uint64_t) 1L << 21);
3576
-        $carry1 = $s1 >> 21;
3577
-        $s2 += $carry1;
3578
-        $s1 -= $carry1 << 21;
3579
-        //    carry2 = s2 >> 21;
3580
-        //    s3 += carry2;
3581
-        //    s2 -= carry2 * ((uint64_t) 1L << 21);
3582
-        $carry2 = $s2 >> 21;
3583
-        $s3 += $carry2;
3584
-        $s2 -= $carry2 << 21;
3585
-        //    carry3 = s3 >> 21;
3586
-        //    s4 += carry3;
3587
-        //    s3 -= carry3 * ((uint64_t) 1L << 21);
3588
-        $carry3 = $s3 >> 21;
3589
-        $s4 += $carry3;
3590
-        $s3 -= $carry3 << 21;
3591
-        //    carry4 = s4 >> 21;
3592
-        //    s5 += carry4;
3593
-        //    s4 -= carry4 * ((uint64_t) 1L << 21);
3594
-        $carry4 = $s4 >> 21;
3595
-        $s5 += $carry4;
3596
-        $s4 -= $carry4 << 21;
3597
-        //    carry5 = s5 >> 21;
3598
-        //    s6 += carry5;
3599
-        //    s5 -= carry5 * ((uint64_t) 1L << 21);
3600
-        $carry5 = $s5 >> 21;
3601
-        $s6 += $carry5;
3602
-        $s5 -= $carry5 << 21;
3603
-        //    carry6 = s6 >> 21;
3604
-        //    s7 += carry6;
3605
-        //    s6 -= carry6 * ((uint64_t) 1L << 21);
3606
-        $carry6 = $s6 >> 21;
3607
-        $s7 += $carry6;
3608
-        $s6 -= $carry6 << 21;
3609
-        //    carry7 = s7 >> 21;
3610
-        //    s8 += carry7;
3611
-        //    s7 -= carry7 * ((uint64_t) 1L << 21);
3612
-        $carry7 = $s7 >> 21;
3613
-        $s8 += $carry7;
3614
-        $s7 -= $carry7 << 21;
3615
-        //    carry8 = s8 >> 21;
3616
-        //    s9 += carry8;
3617
-        //    s8 -= carry8 * ((uint64_t) 1L << 21);
3618
-        $carry8 = $s8 >> 21;
3619
-        $s9 += $carry8;
3620
-        $s8 -= $carry8 << 21;
3621
-        //    carry9 = s9 >> 21;
3622
-        //    s10 += carry9;
3623
-        //    s9 -= carry9 * ((uint64_t) 1L << 21);
3624
-        $carry9 = $s9 >> 21;
3625
-        $s10 += $carry9;
3626
-        $s9 -= $carry9 << 21;
3627
-        //    carry10 = s10 >> 21;
3628
-        //    s11 += carry10;
3629
-        //    s10 -= carry10 * ((uint64_t) 1L << 21);
3630
-        $carry10 = $s10 >> 21;
3631
-        $s11 += $carry10;
3632
-        $s10 -= $carry10 << 21;
3633
-
3634
-        $s = array_fill(0, 32, 0);
3635
-        // s[0]  = s0 >> 0;
3636
-        $s[0]  = $s0 >> 0;
3637
-        // s[1]  = s0 >> 8;
3638
-        $s[1]  = $s0 >> 8;
3639
-        // s[2]  = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5));
3640
-        $s[2]  = ($s0 >> 16) | ($s1 << 5);
3641
-        // s[3]  = s1 >> 3;
3642
-        $s[3]  = $s1 >> 3;
3643
-        // s[4]  = s1 >> 11;
3644
-        $s[4]  = $s1 >> 11;
3645
-        // s[5]  = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2));
3646
-        $s[5]  = ($s1 >> 19) | ($s2 << 2);
3647
-        // s[6]  = s2 >> 6;
3648
-        $s[6]  = $s2 >> 6;
3649
-        // s[7]  = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7));
3650
-        $s[7]  = ($s2 >> 14) | ($s3 << 7);
3651
-        // s[8]  = s3 >> 1;
3652
-        $s[8]  = $s3 >> 1;
3653
-        // s[9]  = s3 >> 9;
3654
-        $s[9]  = $s3 >> 9;
3655
-        // s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4));
3656
-        $s[10] = ($s3 >> 17) | ($s4 << 4);
3657
-        // s[11] = s4 >> 4;
3658
-        $s[11] = $s4 >> 4;
3659
-        // s[12] = s4 >> 12;
3660
-        $s[12] = $s4 >> 12;
3661
-        // s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1));
3662
-        $s[13] = ($s4 >> 20) | ($s5 << 1);
3663
-        // s[14] = s5 >> 7;
3664
-        $s[14] = $s5 >> 7;
3665
-        // s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6));
3666
-        $s[15] = ($s5 >> 15) | ($s6 << 6);
3667
-        // s[16] = s6 >> 2;
3668
-        $s[16] = $s6 >> 2;
3669
-        // s[17] = s6 >> 10;
3670
-        $s[17] = $s6 >> 10;
3671
-        // s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3));
3672
-        $s[18] = ($s6 >> 18) | ($s7 << 3);
3673
-        // s[19] = s7 >> 5;
3674
-        $s[19] = $s7 >> 5;
3675
-        // s[20] = s7 >> 13;
3676
-        $s[20] = $s7 >> 13;
3677
-        // s[21] = s8 >> 0;
3678
-        $s[21] = $s8 >> 0;
3679
-        // s[22] = s8 >> 8;
3680
-        $s[22] = $s8 >> 8;
3681
-        // s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5));
3682
-        $s[23] = ($s8 >> 16) | ($s9 << 5);
3683
-        // s[24] = s9 >> 3;
3684
-        $s[24] = $s9 >> 3;
3685
-        // s[25] = s9 >> 11;
3686
-        $s[25] = $s9 >> 11;
3687
-        // s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2));
3688
-        $s[26] = ($s9 >> 19) | ($s10 << 2);
3689
-        // s[27] = s10 >> 6;
3690
-        $s[27] = $s10 >> 6;
3691
-        // s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7));
3692
-        $s[28] = ($s10 >> 14) | ($s11 << 7);
3693
-        // s[29] = s11 >> 1;
3694
-        $s[29] = $s11 >> 1;
3695
-        // s[30] = s11 >> 9;
3696
-        $s[30] = $s11 >> 9;
3697
-        // s[31] = s11 >> 17;
3698
-        $s[31] = $s11 >> 17;
3699
-        return self::intArrayToString($s);
3700
-    }
3701
-
3702
-    /**
3703
-     * @param string $s
3704
-     * @return string
3705
-     */
3706
-    public static function sc25519_sq($s)
3707
-    {
3708
-        return self::sc25519_mul($s, $s);
3709
-    }
3710
-
3711
-    /**
3712
-     * @param string $s
3713
-     * @param int $n
3714
-     * @param string $a
3715
-     * @return string
3716
-     */
3717
-    public static function sc25519_sqmul($s, $n, $a)
3718
-    {
3719
-        for ($i = 0; $i < $n; ++$i) {
3720
-            $s = self::sc25519_sq($s);
3721
-        }
3722
-        return self::sc25519_mul($s, $a);
3723
-    }
3724
-
3725
-    /**
3726
-     * @param string $s
3727
-     * @return string
3728
-     */
3729
-    public static function sc25519_invert($s)
3730
-    {
3731
-        $_10 = self::sc25519_sq($s);
3732
-        $_11 = self::sc25519_mul($s, $_10);
3733
-        $_100 = self::sc25519_mul($s, $_11);
3734
-        $_1000 = self::sc25519_sq($_100);
3735
-        $_1010 = self::sc25519_mul($_10, $_1000);
3736
-        $_1011 = self::sc25519_mul($s, $_1010);
3737
-        $_10000 = self::sc25519_sq($_1000);
3738
-        $_10110 = self::sc25519_sq($_1011);
3739
-        $_100000 = self::sc25519_mul($_1010, $_10110);
3740
-        $_100110 = self::sc25519_mul($_10000, $_10110);
3741
-        $_1000000 = self::sc25519_sq($_100000);
3742
-        $_1010000 = self::sc25519_mul($_10000, $_1000000);
3743
-        $_1010011 = self::sc25519_mul($_11, $_1010000);
3744
-        $_1100011 = self::sc25519_mul($_10000, $_1010011);
3745
-        $_1100111 = self::sc25519_mul($_100, $_1100011);
3746
-        $_1101011 = self::sc25519_mul($_100, $_1100111);
3747
-        $_10010011 = self::sc25519_mul($_1000000, $_1010011);
3748
-        $_10010111 = self::sc25519_mul($_100, $_10010011);
3749
-        $_10111101 = self::sc25519_mul($_100110, $_10010111);
3750
-        $_11010011 = self::sc25519_mul($_10110, $_10111101);
3751
-        $_11100111 = self::sc25519_mul($_1010000, $_10010111);
3752
-        $_11101011 = self::sc25519_mul($_100, $_11100111);
3753
-        $_11110101 = self::sc25519_mul($_1010, $_11101011);
3754
-
3755
-        $recip = self::sc25519_mul($_1011, $_11110101);
3756
-        $recip = self::sc25519_sqmul($recip, 126, $_1010011);
3757
-        $recip = self::sc25519_sqmul($recip, 9, $_10);
3758
-        $recip = self::sc25519_mul($recip, $_11110101);
3759
-        $recip = self::sc25519_sqmul($recip, 7, $_1100111);
3760
-        $recip = self::sc25519_sqmul($recip, 9, $_11110101);
3761
-        $recip = self::sc25519_sqmul($recip, 11, $_10111101);
3762
-        $recip = self::sc25519_sqmul($recip, 8, $_11100111);
3763
-        $recip = self::sc25519_sqmul($recip, 9, $_1101011);
3764
-        $recip = self::sc25519_sqmul($recip, 6, $_1011);
3765
-        $recip = self::sc25519_sqmul($recip, 14, $_10010011);
3766
-        $recip = self::sc25519_sqmul($recip, 10, $_1100011);
3767
-        $recip = self::sc25519_sqmul($recip, 9, $_10010111);
3768
-        $recip = self::sc25519_sqmul($recip, 10, $_11110101);
3769
-        $recip = self::sc25519_sqmul($recip, 8, $_11010011);
3770
-        return self::sc25519_sqmul($recip, 8, $_11101011);
3771
-    }
3772
-
3773
-    /**
3774
-     * @param string $s
3775
-     * @return string
3776
-     */
3777
-    public static function clamp($s)
3778
-    {
3779
-        $s_ = self::stringToIntArray($s);
3780
-        $s_[0] &= 248;
3781
-        $s_[31] |= 64;
3782
-        $s_[31] &= 128;
3783
-        return self::intArrayToString($s_);
3784
-    }
18
+	/**
19
+	 * Get a field element of size 10 with a value of 0
20
+	 *
21
+	 * @internal You should not use this directly from another application
22
+	 *
23
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
24
+	 */
25
+	public static function fe_0()
26
+	{
27
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
28
+			array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
29
+		);
30
+	}
31
+
32
+	/**
33
+	 * Get a field element of size 10 with a value of 1
34
+	 *
35
+	 * @internal You should not use this directly from another application
36
+	 *
37
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
38
+	 */
39
+	public static function fe_1()
40
+	{
41
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
42
+			array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
43
+		);
44
+	}
45
+
46
+	/**
47
+	 * Add two field elements.
48
+	 *
49
+	 * @internal You should not use this directly from another application
50
+	 *
51
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
52
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
53
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
54
+	 * @psalm-suppress MixedAssignment
55
+	 * @psalm-suppress MixedOperand
56
+	 */
57
+	public static function fe_add(
58
+		ParagonIE_Sodium_Core_Curve25519_Fe $f,
59
+		ParagonIE_Sodium_Core_Curve25519_Fe $g
60
+	) {
61
+		/** @var array<int, int> $arr */
62
+		$arr = array();
63
+		for ($i = 0; $i < 10; ++$i) {
64
+			$arr[$i] = (int) ($f[$i] + $g[$i]);
65
+		}
66
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr);
67
+	}
68
+
69
+	/**
70
+	 * Constant-time conditional move.
71
+	 *
72
+	 * @internal You should not use this directly from another application
73
+	 *
74
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
75
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
76
+	 * @param int $b
77
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
78
+	 * @psalm-suppress MixedAssignment
79
+	 */
80
+	public static function fe_cmov(
81
+		ParagonIE_Sodium_Core_Curve25519_Fe $f,
82
+		ParagonIE_Sodium_Core_Curve25519_Fe $g,
83
+		$b = 0
84
+	) {
85
+		/** @var array<int, int> $h */
86
+		$h = array();
87
+		$b *= -1;
88
+		for ($i = 0; $i < 10; ++$i) {
89
+			$x = (($f[$i] ^ $g[$i]) & $b);
90
+			$h[$i] = ($f[$i]) ^ $x;
91
+		}
92
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h);
93
+	}
94
+
95
+	/**
96
+	 * Create a copy of a field element.
97
+	 *
98
+	 * @internal You should not use this directly from another application
99
+	 *
100
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
101
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
102
+	 */
103
+	public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f)
104
+	{
105
+		$h = clone $f;
106
+		return $h;
107
+	}
108
+
109
+	/**
110
+	 * Give: 32-byte string.
111
+	 * Receive: A field element object to use for internal calculations.
112
+	 *
113
+	 * @internal You should not use this directly from another application
114
+	 *
115
+	 * @param string $s
116
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
117
+	 * @throws RangeException
118
+	 * @throws TypeError
119
+	 */
120
+	public static function fe_frombytes($s)
121
+	{
122
+		if (self::strlen($s) !== 32) {
123
+			throw new RangeException('Expected a 32-byte string.');
124
+		}
125
+		$h0 = self::load_4($s);
126
+		$h1 = self::load_3(self::substr($s, 4, 3)) << 6;
127
+		$h2 = self::load_3(self::substr($s, 7, 3)) << 5;
128
+		$h3 = self::load_3(self::substr($s, 10, 3)) << 3;
129
+		$h4 = self::load_3(self::substr($s, 13, 3)) << 2;
130
+		$h5 = self::load_4(self::substr($s, 16, 4));
131
+		$h6 = self::load_3(self::substr($s, 20, 3)) << 7;
132
+		$h7 = self::load_3(self::substr($s, 23, 3)) << 5;
133
+		$h8 = self::load_3(self::substr($s, 26, 3)) << 4;
134
+		$h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2;
135
+
136
+		$carry9 = ($h9 + (1 << 24)) >> 25;
137
+		$h0 += self::mul($carry9, 19, 5);
138
+		$h9 -= $carry9 << 25;
139
+		$carry1 = ($h1 + (1 << 24)) >> 25;
140
+		$h2 += $carry1;
141
+		$h1 -= $carry1 << 25;
142
+		$carry3 = ($h3 + (1 << 24)) >> 25;
143
+		$h4 += $carry3;
144
+		$h3 -= $carry3 << 25;
145
+		$carry5 = ($h5 + (1 << 24)) >> 25;
146
+		$h6 += $carry5;
147
+		$h5 -= $carry5 << 25;
148
+		$carry7 = ($h7 + (1 << 24)) >> 25;
149
+		$h8 += $carry7;
150
+		$h7 -= $carry7 << 25;
151
+
152
+		$carry0 = ($h0 + (1 << 25)) >> 26;
153
+		$h1 += $carry0;
154
+		$h0 -= $carry0 << 26;
155
+		$carry2 = ($h2 + (1 << 25)) >> 26;
156
+		$h3 += $carry2;
157
+		$h2 -= $carry2 << 26;
158
+		$carry4 = ($h4 + (1 << 25)) >> 26;
159
+		$h5 += $carry4;
160
+		$h4 -= $carry4 << 26;
161
+		$carry6 = ($h6 + (1 << 25)) >> 26;
162
+		$h7 += $carry6;
163
+		$h6 -= $carry6 << 26;
164
+		$carry8 = ($h8 + (1 << 25)) >> 26;
165
+		$h9 += $carry8;
166
+		$h8 -= $carry8 << 26;
167
+
168
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
169
+			array(
170
+				(int) $h0,
171
+				(int) $h1,
172
+				(int) $h2,
173
+				(int) $h3,
174
+				(int) $h4,
175
+				(int) $h5,
176
+				(int) $h6,
177
+				(int) $h7,
178
+				(int) $h8,
179
+				(int) $h9
180
+			)
181
+		);
182
+	}
183
+
184
+	/**
185
+	 * Convert a field element to a byte string.
186
+	 *
187
+	 * @internal You should not use this directly from another application
188
+	 *
189
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $h
190
+	 * @return string
191
+	 */
192
+	public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h)
193
+	{
194
+		$h0 = (int) $h[0];
195
+		$h1 = (int) $h[1];
196
+		$h2 = (int) $h[2];
197
+		$h3 = (int) $h[3];
198
+		$h4 = (int) $h[4];
199
+		$h5 = (int) $h[5];
200
+		$h6 = (int) $h[6];
201
+		$h7 = (int) $h[7];
202
+		$h8 = (int) $h[8];
203
+		$h9 = (int) $h[9];
204
+
205
+		$q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25;
206
+		$q = ($h0 + $q) >> 26;
207
+		$q = ($h1 + $q) >> 25;
208
+		$q = ($h2 + $q) >> 26;
209
+		$q = ($h3 + $q) >> 25;
210
+		$q = ($h4 + $q) >> 26;
211
+		$q = ($h5 + $q) >> 25;
212
+		$q = ($h6 + $q) >> 26;
213
+		$q = ($h7 + $q) >> 25;
214
+		$q = ($h8 + $q) >> 26;
215
+		$q = ($h9 + $q) >> 25;
216
+
217
+		$h0 += self::mul($q, 19, 5);
218
+
219
+		$carry0 = $h0 >> 26;
220
+		$h1 += $carry0;
221
+		$h0 -= $carry0 << 26;
222
+		$carry1 = $h1 >> 25;
223
+		$h2 += $carry1;
224
+		$h1 -= $carry1 << 25;
225
+		$carry2 = $h2 >> 26;
226
+		$h3 += $carry2;
227
+		$h2 -= $carry2 << 26;
228
+		$carry3 = $h3 >> 25;
229
+		$h4 += $carry3;
230
+		$h3 -= $carry3 << 25;
231
+		$carry4 = $h4 >> 26;
232
+		$h5 += $carry4;
233
+		$h4 -= $carry4 << 26;
234
+		$carry5 = $h5 >> 25;
235
+		$h6 += $carry5;
236
+		$h5 -= $carry5 << 25;
237
+		$carry6 = $h6 >> 26;
238
+		$h7 += $carry6;
239
+		$h6 -= $carry6 << 26;
240
+		$carry7 = $h7 >> 25;
241
+		$h8 += $carry7;
242
+		$h7 -= $carry7 << 25;
243
+		$carry8 = $h8 >> 26;
244
+		$h9 += $carry8;
245
+		$h8 -= $carry8 << 26;
246
+		$carry9 = $h9 >> 25;
247
+		$h9 -= $carry9 << 25;
248
+
249
+		/**
250
+		 * @var array<int, int>
251
+		 */
252
+		$s = array(
253
+			(int) (($h0 >> 0) & 0xff),
254
+			(int) (($h0 >> 8) & 0xff),
255
+			(int) (($h0 >> 16) & 0xff),
256
+			(int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
257
+			(int) (($h1 >> 6) & 0xff),
258
+			(int) (($h1 >> 14) & 0xff),
259
+			(int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
260
+			(int) (($h2 >> 5) & 0xff),
261
+			(int) (($h2 >> 13) & 0xff),
262
+			(int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
263
+			(int) (($h3 >> 3) & 0xff),
264
+			(int) (($h3 >> 11) & 0xff),
265
+			(int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
266
+			(int) (($h4 >> 2) & 0xff),
267
+			(int) (($h4 >> 10) & 0xff),
268
+			(int) (($h4 >> 18) & 0xff),
269
+			(int) (($h5 >> 0) & 0xff),
270
+			(int) (($h5 >> 8) & 0xff),
271
+			(int) (($h5 >> 16) & 0xff),
272
+			(int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
273
+			(int) (($h6 >> 7) & 0xff),
274
+			(int) (($h6 >> 15) & 0xff),
275
+			(int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
276
+			(int) (($h7 >> 5) & 0xff),
277
+			(int) (($h7 >> 13) & 0xff),
278
+			(int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
279
+			(int) (($h8 >> 4) & 0xff),
280
+			(int) (($h8 >> 12) & 0xff),
281
+			(int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
282
+			(int) (($h9 >> 2) & 0xff),
283
+			(int) (($h9 >> 10) & 0xff),
284
+			(int) (($h9 >> 18) & 0xff)
285
+		);
286
+		return self::intArrayToString($s);
287
+	}
288
+
289
+	/**
290
+	 * Is a field element negative? (1 = yes, 0 = no. Used in calculations.)
291
+	 *
292
+	 * @internal You should not use this directly from another application
293
+	 *
294
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
295
+	 * @return int
296
+	 * @throws SodiumException
297
+	 * @throws TypeError
298
+	 */
299
+	public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f)
300
+	{
301
+		$str = self::fe_tobytes($f);
302
+		return (int) (self::chrToInt($str[0]) & 1);
303
+	}
304
+
305
+	/**
306
+	 * Returns 0 if this field element results in all NUL bytes.
307
+	 *
308
+	 * @internal You should not use this directly from another application
309
+	 *
310
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
311
+	 * @return bool
312
+	 * @throws SodiumException
313
+	 * @throws TypeError
314
+	 */
315
+	public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
316
+	{
317
+		static $zero;
318
+		if ($zero === null) {
319
+			$zero = str_repeat("\x00", 32);
320
+		}
321
+		/** @var string $zero */
322
+		/** @var string $str */
323
+		$str = self::fe_tobytes($f);
324
+		return !self::verify_32($str, (string) $zero);
325
+	}
326
+
327
+	/**
328
+	 * Multiply two field elements
329
+	 *
330
+	 * h = f * g
331
+	 *
332
+	 * @internal You should not use this directly from another application
333
+	 *
334
+	 * @security Is multiplication a source of timing leaks? If so, can we do
335
+	 *           anything to prevent that from happening?
336
+	 *
337
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
338
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
339
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
340
+	 */
341
+	public static function fe_mul(
342
+		ParagonIE_Sodium_Core_Curve25519_Fe $f,
343
+		ParagonIE_Sodium_Core_Curve25519_Fe $g
344
+	) {
345
+		$f0 = $f[0];
346
+		$f1 = $f[1];
347
+		$f2 = $f[2];
348
+		$f3 = $f[3];
349
+		$f4 = $f[4];
350
+		$f5 = $f[5];
351
+		$f6 = $f[6];
352
+		$f7 = $f[7];
353
+		$f8 = $f[8];
354
+		$f9 = $f[9];
355
+		$g0 = $g[0];
356
+		$g1 = $g[1];
357
+		$g2 = $g[2];
358
+		$g3 = $g[3];
359
+		$g4 = $g[4];
360
+		$g5 = $g[5];
361
+		$g6 = $g[6];
362
+		$g7 = $g[7];
363
+		$g8 = $g[8];
364
+		$g9 = $g[9];
365
+		$g1_19 = self::mul($g1, 19, 5);
366
+		$g2_19 = self::mul($g2, 19, 5);
367
+		$g3_19 = self::mul($g3, 19, 5);
368
+		$g4_19 = self::mul($g4, 19, 5);
369
+		$g5_19 = self::mul($g5, 19, 5);
370
+		$g6_19 = self::mul($g6, 19, 5);
371
+		$g7_19 = self::mul($g7, 19, 5);
372
+		$g8_19 = self::mul($g8, 19, 5);
373
+		$g9_19 = self::mul($g9, 19, 5);
374
+		$f1_2 = $f1 << 1;
375
+		$f3_2 = $f3 << 1;
376
+		$f5_2 = $f5 << 1;
377
+		$f7_2 = $f7 << 1;
378
+		$f9_2 = $f9 << 1;
379
+		$f0g0    = self::mul($f0,    $g0, 26);
380
+		$f0g1    = self::mul($f0,    $g1, 25);
381
+		$f0g2    = self::mul($f0,    $g2, 26);
382
+		$f0g3    = self::mul($f0,    $g3, 25);
383
+		$f0g4    = self::mul($f0,    $g4, 26);
384
+		$f0g5    = self::mul($f0,    $g5, 25);
385
+		$f0g6    = self::mul($f0,    $g6, 26);
386
+		$f0g7    = self::mul($f0,    $g7, 25);
387
+		$f0g8    = self::mul($f0,    $g8, 26);
388
+		$f0g9    = self::mul($f0,    $g9, 26);
389
+		$f1g0    = self::mul($f1,    $g0, 26);
390
+		$f1g1_2  = self::mul($f1_2,  $g1, 25);
391
+		$f1g2    = self::mul($f1,    $g2, 26);
392
+		$f1g3_2  = self::mul($f1_2,  $g3, 25);
393
+		$f1g4    = self::mul($f1,    $g4, 26);
394
+		$f1g5_2  = self::mul($f1_2,  $g5, 25);
395
+		$f1g6    = self::mul($f1,    $g6, 26);
396
+		$f1g7_2  = self::mul($f1_2,  $g7, 25);
397
+		$f1g8    = self::mul($f1,    $g8, 26);
398
+		$f1g9_38 = self::mul($g9_19, $f1_2, 26);
399
+		$f2g0    = self::mul($f2,    $g0, 26);
400
+		$f2g1    = self::mul($f2,    $g1, 25);
401
+		$f2g2    = self::mul($f2,    $g2, 26);
402
+		$f2g3    = self::mul($f2,    $g3, 25);
403
+		$f2g4    = self::mul($f2,    $g4, 26);
404
+		$f2g5    = self::mul($f2,    $g5, 25);
405
+		$f2g6    = self::mul($f2,    $g6, 26);
406
+		$f2g7    = self::mul($f2,    $g7, 25);
407
+		$f2g8_19 = self::mul($g8_19, $f2, 26);
408
+		$f2g9_19 = self::mul($g9_19, $f2, 26);
409
+		$f3g0    = self::mul($f3,    $g0, 26);
410
+		$f3g1_2  = self::mul($f3_2,  $g1, 25);
411
+		$f3g2    = self::mul($f3,    $g2, 26);
412
+		$f3g3_2  = self::mul($f3_2,  $g3, 25);
413
+		$f3g4    = self::mul($f3,    $g4, 26);
414
+		$f3g5_2  = self::mul($f3_2,  $g5, 25);
415
+		$f3g6    = self::mul($f3,    $g6, 26);
416
+		$f3g7_38 = self::mul($g7_19, $f3_2, 26);
417
+		$f3g8_19 = self::mul($g8_19, $f3, 25);
418
+		$f3g9_38 = self::mul($g9_19, $f3_2, 26);
419
+		$f4g0    = self::mul($f4,    $g0, 26);
420
+		$f4g1    = self::mul($f4,    $g1, 25);
421
+		$f4g2    = self::mul($f4,    $g2, 26);
422
+		$f4g3    = self::mul($f4,    $g3, 25);
423
+		$f4g4    = self::mul($f4,    $g4, 26);
424
+		$f4g5    = self::mul($f4,    $g5, 25);
425
+		$f4g6_19 = self::mul($g6_19, $f4, 26);
426
+		$f4g7_19 = self::mul($g7_19, $f4, 26);
427
+		$f4g8_19 = self::mul($g8_19, $f4, 26);
428
+		$f4g9_19 = self::mul($g9_19, $f4, 26);
429
+		$f5g0    = self::mul($f5,    $g0, 26);
430
+		$f5g1_2  = self::mul($f5_2,  $g1, 25);
431
+		$f5g2    = self::mul($f5,    $g2, 26);
432
+		$f5g3_2  = self::mul($f5_2,  $g3, 25);
433
+		$f5g4    = self::mul($f5,    $g4, 26);
434
+		$f5g5_38 = self::mul($g5_19, $f5_2, 26);
435
+		$f5g6_19 = self::mul($g6_19, $f5, 25);
436
+		$f5g7_38 = self::mul($g7_19, $f5_2, 26);
437
+		$f5g8_19 = self::mul($g8_19, $f5, 25);
438
+		$f5g9_38 = self::mul($g9_19, $f5_2, 26);
439
+		$f6g0    = self::mul($f6,    $g0, 26);
440
+		$f6g1    = self::mul($f6,    $g1, 25);
441
+		$f6g2    = self::mul($f6,    $g2, 26);
442
+		$f6g3    = self::mul($f6,    $g3, 25);
443
+		$f6g4_19 = self::mul($g4_19, $f6, 26);
444
+		$f6g5_19 = self::mul($g5_19, $f6, 26);
445
+		$f6g6_19 = self::mul($g6_19, $f6, 26);
446
+		$f6g7_19 = self::mul($g7_19, $f6, 26);
447
+		$f6g8_19 = self::mul($g8_19, $f6, 26);
448
+		$f6g9_19 = self::mul($g9_19, $f6, 26);
449
+		$f7g0    = self::mul($f7,    $g0, 26);
450
+		$f7g1_2  = self::mul($f7_2,  $g1, 25);
451
+		$f7g2    = self::mul($f7,    $g2, 26);
452
+		$f7g3_38 = self::mul($g3_19, $f7_2, 26);
453
+		$f7g4_19 = self::mul($g4_19, $f7, 26);
454
+		$f7g5_38 = self::mul($g5_19, $f7_2, 26);
455
+		$f7g6_19 = self::mul($g6_19, $f7, 25);
456
+		$f7g7_38 = self::mul($g7_19, $f7_2, 26);
457
+		$f7g8_19 = self::mul($g8_19, $f7, 25);
458
+		$f7g9_38 = self::mul($g9_19,$f7_2, 26);
459
+		$f8g0    = self::mul($f8,    $g0, 26);
460
+		$f8g1    = self::mul($f8,    $g1, 25);
461
+		$f8g2_19 = self::mul($g2_19, $f8, 26);
462
+		$f8g3_19 = self::mul($g3_19, $f8, 26);
463
+		$f8g4_19 = self::mul($g4_19, $f8, 26);
464
+		$f8g5_19 = self::mul($g5_19, $f8, 26);
465
+		$f8g6_19 = self::mul($g6_19, $f8, 26);
466
+		$f8g7_19 = self::mul($g7_19, $f8, 26);
467
+		$f8g8_19 = self::mul($g8_19, $f8, 26);
468
+		$f8g9_19 = self::mul($g9_19, $f8, 26);
469
+		$f9g0    = self::mul($f9,    $g0, 26);
470
+		$f9g1_38 = self::mul($g1_19, $f9_2, 26);
471
+		$f9g2_19 = self::mul($g2_19, $f9, 25);
472
+		$f9g3_38 = self::mul($g3_19, $f9_2, 26);
473
+		$f9g4_19 = self::mul($g4_19, $f9, 25);
474
+		$f9g5_38 = self::mul($g5_19, $f9_2, 26);
475
+		$f9g6_19 = self::mul($g6_19, $f9, 25);
476
+		$f9g7_38 = self::mul($g7_19, $f9_2, 26);
477
+		$f9g8_19 = self::mul($g8_19, $f9, 25);
478
+		$f9g9_38 = self::mul($g9_19, $f9_2, 26);
479
+		$h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
480
+		$h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
481
+		$h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
482
+		$h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
483
+		$h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
484
+		$h5 = $f0g5 + $f1g4    + $f2g3    + $f3g2    + $f4g1    + $f5g0    + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
485
+		$h6 = $f0g6 + $f1g5_2  + $f2g4    + $f3g3_2  + $f4g2    + $f5g1_2  + $f6g0    + $f7g9_38 + $f8g8_19 + $f9g7_38;
486
+		$h7 = $f0g7 + $f1g6    + $f2g5    + $f3g4    + $f4g3    + $f5g2    + $f6g1    + $f7g0    + $f8g9_19 + $f9g8_19;
487
+		$h8 = $f0g8 + $f1g7_2  + $f2g6    + $f3g5_2  + $f4g4    + $f5g3_2  + $f6g2    + $f7g1_2  + $f8g0    + $f9g9_38;
488
+		$h9 = $f0g9 + $f1g8    + $f2g7    + $f3g6    + $f4g5    + $f5g4    + $f6g3    + $f7g2    + $f8g1    + $f9g0   ;
489
+
490
+		$carry0 = ($h0 + (1 << 25)) >> 26;
491
+		$h1 += $carry0;
492
+		$h0 -= $carry0 << 26;
493
+		$carry4 = ($h4 + (1 << 25)) >> 26;
494
+		$h5 += $carry4;
495
+		$h4 -= $carry4 << 26;
496
+
497
+		$carry1 = ($h1 + (1 << 24)) >> 25;
498
+		$h2 += $carry1;
499
+		$h1 -= $carry1 << 25;
500
+		$carry5 = ($h5 + (1 << 24)) >> 25;
501
+		$h6 += $carry5;
502
+		$h5 -= $carry5 << 25;
503
+
504
+		$carry2 = ($h2 + (1 << 25)) >> 26;
505
+		$h3 += $carry2;
506
+		$h2 -= $carry2 << 26;
507
+		$carry6 = ($h6 + (1 << 25)) >> 26;
508
+		$h7 += $carry6;
509
+		$h6 -= $carry6 << 26;
510
+
511
+		$carry3 = ($h3 + (1 << 24)) >> 25;
512
+		$h4 += $carry3;
513
+		$h3 -= $carry3 << 25;
514
+		$carry7 = ($h7 + (1 << 24)) >> 25;
515
+		$h8 += $carry7;
516
+		$h7 -= $carry7 << 25;
517
+
518
+		$carry4 = ($h4 + (1 << 25)) >> 26;
519
+		$h5 += $carry4;
520
+		$h4 -= $carry4 << 26;
521
+		$carry8 = ($h8 + (1 << 25)) >> 26;
522
+		$h9 += $carry8;
523
+		$h8 -= $carry8 << 26;
524
+
525
+		$carry9 = ($h9 + (1 << 24)) >> 25;
526
+		$h0 += self::mul($carry9, 19, 5);
527
+		$h9 -= $carry9 << 25;
528
+
529
+		$carry0 = ($h0 + (1 << 25)) >> 26;
530
+		$h1 += $carry0;
531
+		$h0 -= $carry0 << 26;
532
+
533
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
534
+			array(
535
+				(int) $h0,
536
+				(int) $h1,
537
+				(int) $h2,
538
+				(int) $h3,
539
+				(int) $h4,
540
+				(int) $h5,
541
+				(int) $h6,
542
+				(int) $h7,
543
+				(int) $h8,
544
+				(int) $h9
545
+			)
546
+		);
547
+	}
548
+
549
+	/**
550
+	 * Get the negative values for each piece of the field element.
551
+	 *
552
+	 * h = -f
553
+	 *
554
+	 * @internal You should not use this directly from another application
555
+	 *
556
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
557
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
558
+	 * @psalm-suppress MixedAssignment
559
+	 */
560
+	public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f)
561
+	{
562
+		$h = new ParagonIE_Sodium_Core_Curve25519_Fe();
563
+		for ($i = 0; $i < 10; ++$i) {
564
+			$h[$i] = -$f[$i];
565
+		}
566
+		return $h;
567
+	}
568
+
569
+	/**
570
+	 * Square a field element
571
+	 *
572
+	 * h = f * f
573
+	 *
574
+	 * @internal You should not use this directly from another application
575
+	 *
576
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
577
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
578
+	 */
579
+	public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
580
+	{
581
+		$f0 = (int) $f[0];
582
+		$f1 = (int) $f[1];
583
+		$f2 = (int) $f[2];
584
+		$f3 = (int) $f[3];
585
+		$f4 = (int) $f[4];
586
+		$f5 = (int) $f[5];
587
+		$f6 = (int) $f[6];
588
+		$f7 = (int) $f[7];
589
+		$f8 = (int) $f[8];
590
+		$f9 = (int) $f[9];
591
+
592
+		$f0_2 = $f0 << 1;
593
+		$f1_2 = $f1 << 1;
594
+		$f2_2 = $f2 << 1;
595
+		$f3_2 = $f3 << 1;
596
+		$f4_2 = $f4 << 1;
597
+		$f5_2 = $f5 << 1;
598
+		$f6_2 = $f6 << 1;
599
+		$f7_2 = $f7 << 1;
600
+		$f5_38 = self::mul($f5, 38, 6);
601
+		$f6_19 = self::mul($f6, 19, 5);
602
+		$f7_38 = self::mul($f7, 38, 6);
603
+		$f8_19 = self::mul($f8, 19, 5);
604
+		$f9_38 = self::mul($f9, 38, 6);
605
+		$f0f0    = self::mul($f0,    $f0,    26);
606
+		$f0f1_2  = self::mul($f0_2,  $f1,    26);
607
+		$f0f2_2  = self::mul($f0_2,  $f2,    26);
608
+		$f0f3_2  = self::mul($f0_2,  $f3,    26);
609
+		$f0f4_2  = self::mul($f0_2,  $f4,    26);
610
+		$f0f5_2  = self::mul($f0_2,  $f5,    26);
611
+		$f0f6_2  = self::mul($f0_2,  $f6,    26);
612
+		$f0f7_2  = self::mul($f0_2,  $f7,    26);
613
+		$f0f8_2  = self::mul($f0_2,  $f8,    26);
614
+		$f0f9_2  = self::mul($f0_2,  $f9,    26);
615
+		$f1f1_2  = self::mul($f1_2,  $f1,    26);
616
+		$f1f2_2  = self::mul($f1_2,  $f2,    26);
617
+		$f1f3_4  = self::mul($f1_2,  $f3_2,  26);
618
+		$f1f4_2  = self::mul($f1_2,  $f4,    26);
619
+		$f1f5_4  = self::mul($f1_2,  $f5_2,  26);
620
+		$f1f6_2  = self::mul($f1_2,  $f6,    26);
621
+		$f1f7_4  = self::mul($f1_2,  $f7_2,  26);
622
+		$f1f8_2  = self::mul($f1_2,  $f8,    26);
623
+		$f1f9_76 = self::mul($f9_38, $f1_2,  27);
624
+		$f2f2    = self::mul($f2,    $f2,    27);
625
+		$f2f3_2  = self::mul($f2_2,  $f3,    27);
626
+		$f2f4_2  = self::mul($f2_2,  $f4,    27);
627
+		$f2f5_2  = self::mul($f2_2,  $f5,    27);
628
+		$f2f6_2  = self::mul($f2_2,  $f6,    27);
629
+		$f2f7_2  = self::mul($f2_2,  $f7,    27);
630
+		$f2f8_38 = self::mul($f8_19, $f2_2,  27);
631
+		$f2f9_38 = self::mul($f9_38, $f2,    26);
632
+		$f3f3_2  = self::mul($f3_2,  $f3,    26);
633
+		$f3f4_2  = self::mul($f3_2,  $f4,    26);
634
+		$f3f5_4  = self::mul($f3_2,  $f5_2,  26);
635
+		$f3f6_2  = self::mul($f3_2,  $f6,    26);
636
+		$f3f7_76 = self::mul($f7_38, $f3_2,  26);
637
+		$f3f8_38 = self::mul($f8_19, $f3_2,  26);
638
+		$f3f9_76 = self::mul($f9_38, $f3_2,  26);
639
+		$f4f4    = self::mul($f4,    $f4,    26);
640
+		$f4f5_2  = self::mul($f4_2,  $f5,    26);
641
+		$f4f6_38 = self::mul($f6_19, $f4_2,  27);
642
+		$f4f7_38 = self::mul($f7_38, $f4,    26);
643
+		$f4f8_38 = self::mul($f8_19, $f4_2,  27);
644
+		$f4f9_38 = self::mul($f9_38, $f4,    26);
645
+		$f5f5_38 = self::mul($f5_38, $f5,    26);
646
+		$f5f6_38 = self::mul($f6_19, $f5_2,  26);
647
+		$f5f7_76 = self::mul($f7_38, $f5_2,  26);
648
+		$f5f8_38 = self::mul($f8_19, $f5_2,  26);
649
+		$f5f9_76 = self::mul($f9_38, $f5_2,  26);
650
+		$f6f6_19 = self::mul($f6_19, $f6,    26);
651
+		$f6f7_38 = self::mul($f7_38, $f6,    26);
652
+		$f6f8_38 = self::mul($f8_19, $f6_2,  27);
653
+		$f6f9_38 = self::mul($f9_38, $f6,    26);
654
+		$f7f7_38 = self::mul($f7_38, $f7,    26);
655
+		$f7f8_38 = self::mul($f8_19, $f7_2,  26);
656
+		$f7f9_76 = self::mul($f9_38, $f7_2,  26);
657
+		$f8f8_19 = self::mul($f8_19, $f8,    26);
658
+		$f8f9_38 = self::mul($f9_38, $f8,    26);
659
+		$f9f9_38 = self::mul($f9_38, $f9,    26);
660
+		$h0 = $f0f0   + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38;
661
+		$h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38;
662
+		$h2 = $f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19;
663
+		$h3 = $f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38;
664
+		$h4 = $f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38;
665
+		$h5 = $f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38;
666
+		$h6 = $f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19;
667
+		$h7 = $f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38;
668
+		$h8 = $f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38;
669
+		$h9 = $f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2;
670
+
671
+		$carry0 = ($h0 + (1 << 25)) >> 26;
672
+		$h1 += $carry0;
673
+		$h0 -= $carry0 << 26;
674
+		$carry4 = ($h4 + (1 << 25)) >> 26;
675
+		$h5 += $carry4;
676
+		$h4 -= $carry4 << 26;
677
+
678
+		$carry1 = ($h1 + (1 << 24)) >> 25;
679
+		$h2 += $carry1;
680
+		$h1 -= $carry1 << 25;
681
+		$carry5 = ($h5 + (1 << 24)) >> 25;
682
+		$h6 += $carry5;
683
+		$h5 -= $carry5 << 25;
684
+
685
+		$carry2 = ($h2 + (1 << 25)) >> 26;
686
+		$h3 += $carry2;
687
+		$h2 -= $carry2 << 26;
688
+		$carry6 = ($h6 + (1 << 25)) >> 26;
689
+		$h7 += $carry6;
690
+		$h6 -= $carry6 << 26;
691
+
692
+		$carry3 = ($h3 + (1 << 24)) >> 25;
693
+		$h4 += $carry3;
694
+		$h3 -= $carry3 << 25;
695
+		$carry7 = ($h7 + (1 << 24)) >> 25;
696
+		$h8 += $carry7;
697
+		$h7 -= $carry7 << 25;
698
+
699
+		$carry4 = ($h4 + (1 << 25)) >> 26;
700
+		$h5 += $carry4;
701
+		$h4 -= $carry4 << 26;
702
+		$carry8 = ($h8 + (1 << 25)) >> 26;
703
+		$h9 += $carry8;
704
+		$h8 -= $carry8 << 26;
705
+
706
+		$carry9 = ($h9 + (1 << 24)) >> 25;
707
+		$h0 += self::mul($carry9, 19, 5);
708
+		$h9 -= $carry9 << 25;
709
+
710
+		$carry0 = ($h0 + (1 << 25)) >> 26;
711
+		$h1 += $carry0;
712
+		$h0 -= $carry0 << 26;
713
+
714
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
715
+			array(
716
+				(int) $h0,
717
+				(int) $h1,
718
+				(int) $h2,
719
+				(int) $h3,
720
+				(int) $h4,
721
+				(int) $h5,
722
+				(int) $h6,
723
+				(int) $h7,
724
+				(int) $h8,
725
+				(int) $h9
726
+			)
727
+		);
728
+	}
729
+
730
+
731
+	/**
732
+	 * Square and double a field element
733
+	 *
734
+	 * h = 2 * f * f
735
+	 *
736
+	 * @internal You should not use this directly from another application
737
+	 *
738
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
739
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
740
+	 */
741
+	public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
742
+	{
743
+		$f0 = (int) $f[0];
744
+		$f1 = (int) $f[1];
745
+		$f2 = (int) $f[2];
746
+		$f3 = (int) $f[3];
747
+		$f4 = (int) $f[4];
748
+		$f5 = (int) $f[5];
749
+		$f6 = (int) $f[6];
750
+		$f7 = (int) $f[7];
751
+		$f8 = (int) $f[8];
752
+		$f9 = (int) $f[9];
753
+
754
+		$f0_2 = $f0 << 1;
755
+		$f1_2 = $f1 << 1;
756
+		$f2_2 = $f2 << 1;
757
+		$f3_2 = $f3 << 1;
758
+		$f4_2 = $f4 << 1;
759
+		$f5_2 = $f5 << 1;
760
+		$f6_2 = $f6 << 1;
761
+		$f7_2 = $f7 << 1;
762
+		$f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
763
+		$f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
764
+		$f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
765
+		$f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
766
+		$f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */
767
+		$f0f0 = self::mul($f0, $f0, 24);
768
+		$f0f1_2 = self::mul($f0_2, $f1, 24);
769
+		$f0f2_2 = self::mul($f0_2, $f2, 24);
770
+		$f0f3_2 = self::mul($f0_2, $f3, 24);
771
+		$f0f4_2 = self::mul($f0_2, $f4, 24);
772
+		$f0f5_2 = self::mul($f0_2, $f5, 24);
773
+		$f0f6_2 = self::mul($f0_2, $f6, 24);
774
+		$f0f7_2 = self::mul($f0_2, $f7, 24);
775
+		$f0f8_2 = self::mul($f0_2, $f8, 24);
776
+		$f0f9_2 = self::mul($f0_2, $f9, 24);
777
+		$f1f1_2 = self::mul($f1_2,  $f1, 24);
778
+		$f1f2_2 = self::mul($f1_2,  $f2, 24);
779
+		$f1f3_4 = self::mul($f1_2,  $f3_2, 24);
780
+		$f1f4_2 = self::mul($f1_2,  $f4, 24);
781
+		$f1f5_4 = self::mul($f1_2,  $f5_2, 24);
782
+		$f1f6_2 = self::mul($f1_2,  $f6, 24);
783
+		$f1f7_4 = self::mul($f1_2,  $f7_2, 24);
784
+		$f1f8_2 = self::mul($f1_2,  $f8, 24);
785
+		$f1f9_76 = self::mul($f9_38, $f1_2, 24);
786
+		$f2f2 = self::mul($f2,  $f2, 24);
787
+		$f2f3_2 = self::mul($f2_2,  $f3, 24);
788
+		$f2f4_2 = self::mul($f2_2,  $f4, 24);
789
+		$f2f5_2 = self::mul($f2_2,  $f5, 24);
790
+		$f2f6_2 = self::mul($f2_2,  $f6, 24);
791
+		$f2f7_2 = self::mul($f2_2,  $f7, 24);
792
+		$f2f8_38 = self::mul($f8_19, $f2_2, 25);
793
+		$f2f9_38 = self::mul($f9_38, $f2, 24);
794
+		$f3f3_2 = self::mul($f3_2,  $f3, 24);
795
+		$f3f4_2 = self::mul($f3_2,  $f4, 24);
796
+		$f3f5_4 = self::mul($f3_2,  $f5_2, 24);
797
+		$f3f6_2 = self::mul($f3_2,  $f6, 24);
798
+		$f3f7_76 = self::mul($f7_38, $f3_2, 24);
799
+		$f3f8_38 = self::mul($f8_19, $f3_2, 24);
800
+		$f3f9_76 = self::mul($f9_38, $f3_2, 24);
801
+		$f4f4 = self::mul($f4,  $f4, 24);
802
+		$f4f5_2 = self::mul($f4_2,  $f5, 24);
803
+		$f4f6_38 = self::mul($f6_19, $f4_2, 25);
804
+		$f4f7_38 = self::mul($f7_38, $f4, 24);
805
+		$f4f8_38 = self::mul($f8_19, $f4_2, 25);
806
+		$f4f9_38 = self::mul($f9_38, $f4, 24);
807
+		$f5f5_38 = self::mul($f5_38, $f5, 24);
808
+		$f5f6_38 = self::mul($f6_19, $f5_2, 24);
809
+		$f5f7_76 = self::mul($f7_38, $f5_2, 24);
810
+		$f5f8_38 = self::mul($f8_19, $f5_2, 24);
811
+		$f5f9_76 = self::mul($f9_38, $f5_2, 24);
812
+		$f6f6_19 = self::mul($f6_19, $f6, 24);
813
+		$f6f7_38 = self::mul($f7_38, $f6, 24);
814
+		$f6f8_38 = self::mul($f8_19, $f6_2, 25);
815
+		$f6f9_38 = self::mul($f9_38, $f6, 24);
816
+		$f7f7_38 = self::mul($f7_38, $f7, 24);
817
+		$f7f8_38 = self::mul($f8_19, $f7_2, 24);
818
+		$f7f9_76 = self::mul($f9_38, $f7_2, 24);
819
+		$f8f8_19 = self::mul($f8_19, $f8, 24);
820
+		$f8f9_38 = self::mul($f9_38, $f8, 24);
821
+		$f9f9_38 = self::mul($f9_38, $f9, 24);
822
+
823
+		$h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1;
824
+		$h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1;
825
+		$h2 = (int) ($f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1;
826
+		$h3 = (int) ($f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1;
827
+		$h4 = (int) ($f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1;
828
+		$h5 = (int) ($f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38) << 1;
829
+		$h6 = (int) ($f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19) << 1;
830
+		$h7 = (int) ($f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38) << 1;
831
+		$h8 = (int) ($f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38) << 1;
832
+		$h9 = (int) ($f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2) << 1;
833
+
834
+		$carry0 = ($h0 + (1 << 25)) >> 26;
835
+		$h1 += $carry0;
836
+		$h0 -= $carry0 << 26;
837
+		$carry4 = ($h4 + (1 << 25)) >> 26;
838
+		$h5 += $carry4;
839
+		$h4 -= $carry4 << 26;
840
+
841
+		$carry1 = ($h1 + (1 << 24)) >> 25;
842
+		$h2 += $carry1;
843
+		$h1 -= $carry1 << 25;
844
+		$carry5 = ($h5 + (1 << 24)) >> 25;
845
+		$h6 += $carry5;
846
+		$h5 -= $carry5 << 25;
847
+
848
+		$carry2 = ($h2 + (1 << 25)) >> 26;
849
+		$h3 += $carry2;
850
+		$h2 -= $carry2 << 26;
851
+		$carry6 = ($h6 + (1 << 25)) >> 26;
852
+		$h7 += $carry6;
853
+		$h6 -= $carry6 << 26;
854
+
855
+		$carry3 = ($h3 + (1 << 24)) >> 25;
856
+		$h4 += $carry3;
857
+		$h3 -= $carry3 << 25;
858
+		$carry7 = ($h7 + (1 << 24)) >> 25;
859
+		$h8 += $carry7;
860
+		$h7 -= $carry7 << 25;
861
+
862
+		$carry4 = ($h4 + (1 << 25)) >> 26;
863
+		$h5 += $carry4;
864
+		$h4 -= $carry4 << 26;
865
+		$carry8 = ($h8 + (1 << 25)) >> 26;
866
+		$h9 += $carry8;
867
+		$h8 -= $carry8 << 26;
868
+
869
+		$carry9 = ($h9 + (1 << 24)) >> 25;
870
+		$h0 += self::mul($carry9, 19, 5);
871
+		$h9 -= $carry9 << 25;
872
+
873
+		$carry0 = ($h0 + (1 << 25)) >> 26;
874
+		$h1 += $carry0;
875
+		$h0 -= $carry0 << 26;
876
+
877
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
878
+			array(
879
+				(int) $h0,
880
+				(int) $h1,
881
+				(int) $h2,
882
+				(int) $h3,
883
+				(int) $h4,
884
+				(int) $h5,
885
+				(int) $h6,
886
+				(int) $h7,
887
+				(int) $h8,
888
+				(int) $h9
889
+			)
890
+		);
891
+	}
892
+
893
+	/**
894
+	 * @internal You should not use this directly from another application
895
+	 *
896
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z
897
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
898
+	 */
899
+	public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z)
900
+	{
901
+		$z = clone $Z;
902
+		$t0 = self::fe_sq($z);
903
+		$t1 = self::fe_sq($t0);
904
+		$t1 = self::fe_sq($t1);
905
+		$t1 = self::fe_mul($z, $t1);
906
+		$t0 = self::fe_mul($t0, $t1);
907
+		$t2 = self::fe_sq($t0);
908
+		$t1 = self::fe_mul($t1, $t2);
909
+		$t2 = self::fe_sq($t1);
910
+		for ($i = 1; $i < 5; ++$i) {
911
+			$t2 = self::fe_sq($t2);
912
+		}
913
+		$t1 = self::fe_mul($t2, $t1);
914
+		$t2 = self::fe_sq($t1);
915
+		for ($i = 1; $i < 10; ++$i) {
916
+			$t2 = self::fe_sq($t2);
917
+		}
918
+		$t2 = self::fe_mul($t2, $t1);
919
+		$t3 = self::fe_sq($t2);
920
+		for ($i = 1; $i < 20; ++$i) {
921
+			$t3 = self::fe_sq($t3);
922
+		}
923
+		$t2 = self::fe_mul($t3, $t2);
924
+		$t2 = self::fe_sq($t2);
925
+		for ($i = 1; $i < 10; ++$i) {
926
+			$t2 = self::fe_sq($t2);
927
+		}
928
+		$t1 = self::fe_mul($t2, $t1);
929
+		$t2 = self::fe_sq($t1);
930
+		for ($i = 1; $i < 50; ++$i) {
931
+			$t2 = self::fe_sq($t2);
932
+		}
933
+		$t2 = self::fe_mul($t2, $t1);
934
+		$t3 = self::fe_sq($t2);
935
+		for ($i = 1; $i < 100; ++$i) {
936
+			$t3 = self::fe_sq($t3);
937
+		}
938
+		$t2 = self::fe_mul($t3, $t2);
939
+		$t2 = self::fe_sq($t2);
940
+		for ($i = 1; $i < 50; ++$i) {
941
+			$t2 = self::fe_sq($t2);
942
+		}
943
+		$t1 = self::fe_mul($t2, $t1);
944
+		$t1 = self::fe_sq($t1);
945
+		for ($i = 1; $i < 5; ++$i) {
946
+			$t1 = self::fe_sq($t1);
947
+		}
948
+		return self::fe_mul($t1, $t0);
949
+	}
950
+
951
+	/**
952
+	 * @internal You should not use this directly from another application
953
+	 *
954
+	 * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106
955
+	 *
956
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
957
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
958
+	 */
959
+	public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
960
+	{
961
+		# fe_sq(t0, z);
962
+		# fe_sq(t1, t0);
963
+		# fe_sq(t1, t1);
964
+		# fe_mul(t1, z, t1);
965
+		# fe_mul(t0, t0, t1);
966
+		# fe_sq(t0, t0);
967
+		# fe_mul(t0, t1, t0);
968
+		# fe_sq(t1, t0);
969
+		$t0 = self::fe_sq($z);
970
+		$t1 = self::fe_sq($t0);
971
+		$t1 = self::fe_sq($t1);
972
+		$t1 = self::fe_mul($z, $t1);
973
+		$t0 = self::fe_mul($t0, $t1);
974
+		$t0 = self::fe_sq($t0);
975
+		$t0 = self::fe_mul($t1, $t0);
976
+		$t1 = self::fe_sq($t0);
977
+
978
+		# for (i = 1; i < 5; ++i) {
979
+		#     fe_sq(t1, t1);
980
+		# }
981
+		for ($i = 1; $i < 5; ++$i) {
982
+			$t1 = self::fe_sq($t1);
983
+		}
984
+
985
+		# fe_mul(t0, t1, t0);
986
+		# fe_sq(t1, t0);
987
+		$t0 = self::fe_mul($t1, $t0);
988
+		$t1 = self::fe_sq($t0);
989
+
990
+		# for (i = 1; i < 10; ++i) {
991
+		#     fe_sq(t1, t1);
992
+		# }
993
+		for ($i = 1; $i < 10; ++$i) {
994
+			$t1 = self::fe_sq($t1);
995
+		}
996
+
997
+		# fe_mul(t1, t1, t0);
998
+		# fe_sq(t2, t1);
999
+		$t1 = self::fe_mul($t1, $t0);
1000
+		$t2 = self::fe_sq($t1);
1001
+
1002
+		# for (i = 1; i < 20; ++i) {
1003
+		#     fe_sq(t2, t2);
1004
+		# }
1005
+		for ($i = 1; $i < 20; ++$i) {
1006
+			$t2 = self::fe_sq($t2);
1007
+		}
1008
+
1009
+		# fe_mul(t1, t2, t1);
1010
+		# fe_sq(t1, t1);
1011
+		$t1 = self::fe_mul($t2, $t1);
1012
+		$t1 = self::fe_sq($t1);
1013
+
1014
+		# for (i = 1; i < 10; ++i) {
1015
+		#     fe_sq(t1, t1);
1016
+		# }
1017
+		for ($i = 1; $i < 10; ++$i) {
1018
+			$t1 = self::fe_sq($t1);
1019
+		}
1020
+
1021
+		# fe_mul(t0, t1, t0);
1022
+		# fe_sq(t1, t0);
1023
+		$t0 = self::fe_mul($t1, $t0);
1024
+		$t1 = self::fe_sq($t0);
1025
+
1026
+		# for (i = 1; i < 50; ++i) {
1027
+		#     fe_sq(t1, t1);
1028
+		# }
1029
+		for ($i = 1; $i < 50; ++$i) {
1030
+			$t1 = self::fe_sq($t1);
1031
+		}
1032
+
1033
+		# fe_mul(t1, t1, t0);
1034
+		# fe_sq(t2, t1);
1035
+		$t1 = self::fe_mul($t1, $t0);
1036
+		$t2 = self::fe_sq($t1);
1037
+
1038
+		# for (i = 1; i < 100; ++i) {
1039
+		#     fe_sq(t2, t2);
1040
+		# }
1041
+		for ($i = 1; $i < 100; ++$i) {
1042
+			$t2 = self::fe_sq($t2);
1043
+		}
1044
+
1045
+		# fe_mul(t1, t2, t1);
1046
+		# fe_sq(t1, t1);
1047
+		$t1 = self::fe_mul($t2, $t1);
1048
+		$t1 = self::fe_sq($t1);
1049
+
1050
+		# for (i = 1; i < 50; ++i) {
1051
+		#     fe_sq(t1, t1);
1052
+		# }
1053
+		for ($i = 1; $i < 50; ++$i) {
1054
+			$t1 = self::fe_sq($t1);
1055
+		}
1056
+
1057
+		# fe_mul(t0, t1, t0);
1058
+		# fe_sq(t0, t0);
1059
+		# fe_sq(t0, t0);
1060
+		# fe_mul(out, t0, z);
1061
+		$t0 = self::fe_mul($t1, $t0);
1062
+		$t0 = self::fe_sq($t0);
1063
+		$t0 = self::fe_sq($t0);
1064
+		return self::fe_mul($t0, $z);
1065
+	}
1066
+
1067
+	/**
1068
+	 * Subtract two field elements.
1069
+	 *
1070
+	 * h = f - g
1071
+	 *
1072
+	 * Preconditions:
1073
+	 * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
1074
+	 * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
1075
+	 *
1076
+	 * Postconditions:
1077
+	 * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
1078
+	 *
1079
+	 * @internal You should not use this directly from another application
1080
+	 *
1081
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
1082
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
1083
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
1084
+	 * @psalm-suppress MixedOperand
1085
+	 */
1086
+	public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
1087
+	{
1088
+		return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
1089
+			array(
1090
+				(int) ($f[0] - $g[0]),
1091
+				(int) ($f[1] - $g[1]),
1092
+				(int) ($f[2] - $g[2]),
1093
+				(int) ($f[3] - $g[3]),
1094
+				(int) ($f[4] - $g[4]),
1095
+				(int) ($f[5] - $g[5]),
1096
+				(int) ($f[6] - $g[6]),
1097
+				(int) ($f[7] - $g[7]),
1098
+				(int) ($f[8] - $g[8]),
1099
+				(int) ($f[9] - $g[9])
1100
+			)
1101
+		);
1102
+	}
1103
+
1104
+	/**
1105
+	 * Add two group elements.
1106
+	 *
1107
+	 * r = p + q
1108
+	 *
1109
+	 * @internal You should not use this directly from another application
1110
+	 *
1111
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1112
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1113
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1114
+	 */
1115
+	public static function ge_add(
1116
+		ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1117
+		ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1118
+	) {
1119
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1120
+		$r->X = self::fe_add($p->Y, $p->X);
1121
+		$r->Y = self::fe_sub($p->Y, $p->X);
1122
+		$r->Z = self::fe_mul($r->X, $q->YplusX);
1123
+		$r->Y = self::fe_mul($r->Y, $q->YminusX);
1124
+		$r->T = self::fe_mul($q->T2d, $p->T);
1125
+		$r->X = self::fe_mul($p->Z, $q->Z);
1126
+		$t0   = self::fe_add($r->X, $r->X);
1127
+		$r->X = self::fe_sub($r->Z, $r->Y);
1128
+		$r->Y = self::fe_add($r->Z, $r->Y);
1129
+		$r->Z = self::fe_add($t0, $r->T);
1130
+		$r->T = self::fe_sub($t0, $r->T);
1131
+		return $r;
1132
+	}
1133
+
1134
+	/**
1135
+	 * @internal You should not use this directly from another application
1136
+	 *
1137
+	 * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215
1138
+	 * @param string $a
1139
+	 * @return array<int, mixed>
1140
+	 * @throws SodiumException
1141
+	 * @throws TypeError
1142
+	 */
1143
+	public static function slide($a)
1144
+	{
1145
+		if (self::strlen($a) < 256) {
1146
+			if (self::strlen($a) < 16) {
1147
+				$a = str_pad($a, 256, '0', STR_PAD_RIGHT);
1148
+			}
1149
+		}
1150
+		/** @var array<int, int> $r */
1151
+		$r = array();
1152
+
1153
+		/** @var int $i */
1154
+		for ($i = 0; $i < 256; ++$i) {
1155
+			$r[$i] = (int) (
1156
+				1 & (
1157
+					self::chrToInt($a[(int) ($i >> 3)])
1158
+						>>
1159
+					($i & 7)
1160
+				)
1161
+			);
1162
+		}
1163
+
1164
+		for ($i = 0;$i < 256;++$i) {
1165
+			if ($r[$i]) {
1166
+				for ($b = 1;$b <= 6 && $i + $b < 256;++$b) {
1167
+					if ($r[$i + $b]) {
1168
+						if ($r[$i] + ($r[$i + $b] << $b) <= 15) {
1169
+							$r[$i] += $r[$i + $b] << $b;
1170
+							$r[$i + $b] = 0;
1171
+						} elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) {
1172
+							$r[$i] -= $r[$i + $b] << $b;
1173
+							for ($k = $i + $b; $k < 256; ++$k) {
1174
+								if (!$r[$k]) {
1175
+									$r[$k] = 1;
1176
+									break;
1177
+								}
1178
+								$r[$k] = 0;
1179
+							}
1180
+						} else {
1181
+							break;
1182
+						}
1183
+					}
1184
+				}
1185
+			}
1186
+		}
1187
+		return $r;
1188
+	}
1189
+
1190
+	/**
1191
+	 * @internal You should not use this directly from another application
1192
+	 *
1193
+	 * @param string $s
1194
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1195
+	 * @throws SodiumException
1196
+	 * @throws TypeError
1197
+	 */
1198
+	public static function ge_frombytes_negate_vartime($s)
1199
+	{
1200
+		static $d = null;
1201
+		if (!$d) {
1202
+			$d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
1203
+		}
1204
+
1205
+		# fe_frombytes(h->Y,s);
1206
+		# fe_1(h->Z);
1207
+		$h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1208
+			self::fe_0(),
1209
+			self::fe_frombytes($s),
1210
+			self::fe_1()
1211
+		);
1212
+
1213
+		# fe_sq(u,h->Y);
1214
+		# fe_mul(v,u,d);
1215
+		# fe_sub(u,u,h->Z);       /* u = y^2-1 */
1216
+		# fe_add(v,v,h->Z);       /* v = dy^2+1 */
1217
+		$u = self::fe_sq($h->Y);
1218
+		/** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */
1219
+		$v = self::fe_mul($u, $d);
1220
+		$u = self::fe_sub($u, $h->Z); /* u =  y^2 - 1 */
1221
+		$v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */
1222
+
1223
+		# fe_sq(v3,v);
1224
+		# fe_mul(v3,v3,v);        /* v3 = v^3 */
1225
+		# fe_sq(h->X,v3);
1226
+		# fe_mul(h->X,h->X,v);
1227
+		# fe_mul(h->X,h->X,u);    /* x = uv^7 */
1228
+		$v3 = self::fe_sq($v);
1229
+		$v3 = self::fe_mul($v3, $v); /* v3 = v^3 */
1230
+		$h->X = self::fe_sq($v3);
1231
+		$h->X = self::fe_mul($h->X, $v);
1232
+		$h->X = self::fe_mul($h->X, $u); /* x = uv^7 */
1233
+
1234
+		# fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
1235
+		# fe_mul(h->X,h->X,v3);
1236
+		# fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */
1237
+		$h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */
1238
+		$h->X = self::fe_mul($h->X, $v3);
1239
+		$h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */
1240
+
1241
+		# fe_sq(vxx,h->X);
1242
+		# fe_mul(vxx,vxx,v);
1243
+		# fe_sub(check,vxx,u);    /* vx^2-u */
1244
+		$vxx = self::fe_sq($h->X);
1245
+		$vxx = self::fe_mul($vxx, $v);
1246
+		$check = self::fe_sub($vxx, $u); /* vx^2 - u */
1247
+
1248
+		# if (fe_isnonzero(check)) {
1249
+		#     fe_add(check,vxx,u);  /* vx^2+u */
1250
+		#     if (fe_isnonzero(check)) {
1251
+		#         return -1;
1252
+		#     }
1253
+		#     fe_mul(h->X,h->X,sqrtm1);
1254
+		# }
1255
+		if (self::fe_isnonzero($check)) {
1256
+			$check = self::fe_add($vxx, $u); /* vx^2 + u */
1257
+			if (self::fe_isnonzero($check)) {
1258
+				throw new RangeException('Internal check failed.');
1259
+			}
1260
+			$h->X = self::fe_mul(
1261
+				$h->X,
1262
+				ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1)
1263
+			);
1264
+		}
1265
+
1266
+		# if (fe_isnegative(h->X) == (s[31] >> 7)) {
1267
+		#     fe_neg(h->X,h->X);
1268
+		# }
1269
+		$i = self::chrToInt($s[31]);
1270
+		if (self::fe_isnegative($h->X) === ($i >> 7)) {
1271
+			$h->X = self::fe_neg($h->X);
1272
+		}
1273
+
1274
+		# fe_mul(h->T,h->X,h->Y);
1275
+		$h->T = self::fe_mul($h->X, $h->Y);
1276
+		return $h;
1277
+	}
1278
+
1279
+	/**
1280
+	 * @internal You should not use this directly from another application
1281
+	 *
1282
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
1283
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1284
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1285
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1286
+	 */
1287
+	public static function ge_madd(
1288
+		ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
1289
+		ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1290
+		ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1291
+	) {
1292
+		$r = clone $R;
1293
+		$r->X = self::fe_add($p->Y, $p->X);
1294
+		$r->Y = self::fe_sub($p->Y, $p->X);
1295
+		$r->Z = self::fe_mul($r->X, $q->yplusx);
1296
+		$r->Y = self::fe_mul($r->Y, $q->yminusx);
1297
+		$r->T = self::fe_mul($q->xy2d, $p->T);
1298
+		$t0 = self::fe_add(clone $p->Z, clone $p->Z);
1299
+		$r->X = self::fe_sub($r->Z, $r->Y);
1300
+		$r->Y = self::fe_add($r->Z, $r->Y);
1301
+		$r->Z = self::fe_add($t0, $r->T);
1302
+		$r->T = self::fe_sub($t0, $r->T);
1303
+
1304
+		return $r;
1305
+	}
1306
+
1307
+	/**
1308
+	 * @internal You should not use this directly from another application
1309
+	 *
1310
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
1311
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1312
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1313
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1314
+	 */
1315
+	public static function ge_msub(
1316
+		ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
1317
+		ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1318
+		ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1319
+	) {
1320
+		$r = clone $R;
1321
+
1322
+		$r->X = self::fe_add($p->Y, $p->X);
1323
+		$r->Y = self::fe_sub($p->Y, $p->X);
1324
+		$r->Z = self::fe_mul($r->X, $q->yminusx);
1325
+		$r->Y = self::fe_mul($r->Y, $q->yplusx);
1326
+		$r->T = self::fe_mul($q->xy2d, $p->T);
1327
+		$t0 = self::fe_add($p->Z, $p->Z);
1328
+		$r->X = self::fe_sub($r->Z, $r->Y);
1329
+		$r->Y = self::fe_add($r->Z, $r->Y);
1330
+		$r->Z = self::fe_sub($t0, $r->T);
1331
+		$r->T = self::fe_add($t0, $r->T);
1332
+
1333
+		return $r;
1334
+	}
1335
+
1336
+	/**
1337
+	 * @internal You should not use this directly from another application
1338
+	 *
1339
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1340
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1341
+	 */
1342
+	public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1343
+	{
1344
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2();
1345
+		$r->X = self::fe_mul($p->X, $p->T);
1346
+		$r->Y = self::fe_mul($p->Y, $p->Z);
1347
+		$r->Z = self::fe_mul($p->Z, $p->T);
1348
+		return $r;
1349
+	}
1350
+
1351
+	/**
1352
+	 * @internal You should not use this directly from another application
1353
+	 *
1354
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1355
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1356
+	 */
1357
+	public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1358
+	{
1359
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
1360
+		$r->X = self::fe_mul($p->X, $p->T);
1361
+		$r->Y = self::fe_mul($p->Y, $p->Z);
1362
+		$r->Z = self::fe_mul($p->Z, $p->T);
1363
+		$r->T = self::fe_mul($p->X, $p->Y);
1364
+		return $r;
1365
+	}
1366
+
1367
+	/**
1368
+	 * @internal You should not use this directly from another application
1369
+	 *
1370
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1371
+	 */
1372
+	public static function ge_p2_0()
1373
+	{
1374
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1375
+			self::fe_0(),
1376
+			self::fe_1(),
1377
+			self::fe_1()
1378
+		);
1379
+	}
1380
+
1381
+	/**
1382
+	 * @internal You should not use this directly from another application
1383
+	 *
1384
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p
1385
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1386
+	 */
1387
+	public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p)
1388
+	{
1389
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1390
+
1391
+		$r->X = self::fe_sq($p->X);
1392
+		$r->Z = self::fe_sq($p->Y);
1393
+		$r->T = self::fe_sq2($p->Z);
1394
+		$r->Y = self::fe_add($p->X, $p->Y);
1395
+		$t0   = self::fe_sq($r->Y);
1396
+		$r->Y = self::fe_add($r->Z, $r->X);
1397
+		$r->Z = self::fe_sub($r->Z, $r->X);
1398
+		$r->X = self::fe_sub($t0, $r->Y);
1399
+		$r->T = self::fe_sub($r->T, $r->Z);
1400
+
1401
+		return $r;
1402
+	}
1403
+
1404
+	/**
1405
+	 * @internal You should not use this directly from another application
1406
+	 *
1407
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1408
+	 */
1409
+	public static function ge_p3_0()
1410
+	{
1411
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1412
+			self::fe_0(),
1413
+			self::fe_1(),
1414
+			self::fe_1(),
1415
+			self::fe_0()
1416
+		);
1417
+	}
1418
+
1419
+	/**
1420
+	 * @internal You should not use this directly from another application
1421
+	 *
1422
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1423
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1424
+	 */
1425
+	public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1426
+	{
1427
+		static $d2 = null;
1428
+		if ($d2 === null) {
1429
+			$d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2);
1430
+		}
1431
+		/** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */
1432
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1433
+		$r->YplusX = self::fe_add($p->Y, $p->X);
1434
+		$r->YminusX = self::fe_sub($p->Y, $p->X);
1435
+		$r->Z = self::fe_copy($p->Z);
1436
+		$r->T2d = self::fe_mul($p->T, $d2);
1437
+		return $r;
1438
+	}
1439
+
1440
+	/**
1441
+	 * @internal You should not use this directly from another application
1442
+	 *
1443
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1444
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1445
+	 */
1446
+	public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1447
+	{
1448
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1449
+			self::fe_copy($p->X),
1450
+			self::fe_copy($p->Y),
1451
+			self::fe_copy($p->Z)
1452
+		);
1453
+	}
1454
+
1455
+	/**
1456
+	 * @internal You should not use this directly from another application
1457
+	 *
1458
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
1459
+	 * @return string
1460
+	 * @throws SodiumException
1461
+	 * @throws TypeError
1462
+	 */
1463
+	public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
1464
+	{
1465
+		$recip = self::fe_invert($h->Z);
1466
+		$x = self::fe_mul($h->X, $recip);
1467
+		$y = self::fe_mul($h->Y, $recip);
1468
+		$s = self::fe_tobytes($y);
1469
+		$s[31] = self::intToChr(
1470
+			self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1471
+		);
1472
+		return $s;
1473
+	}
1474
+
1475
+	/**
1476
+	 * @internal You should not use this directly from another application
1477
+	 *
1478
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1479
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1480
+	 */
1481
+	public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1482
+	{
1483
+		$q = self::ge_p3_to_p2($p);
1484
+		return self::ge_p2_dbl($q);
1485
+	}
1486
+
1487
+	/**
1488
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1489
+	 */
1490
+	public static function ge_precomp_0()
1491
+	{
1492
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1493
+			self::fe_1(),
1494
+			self::fe_1(),
1495
+			self::fe_0()
1496
+		);
1497
+	}
1498
+
1499
+	/**
1500
+	 * @internal You should not use this directly from another application
1501
+	 *
1502
+	 * @param int $b
1503
+	 * @param int $c
1504
+	 * @return int
1505
+	 */
1506
+	public static function equal($b, $c)
1507
+	{
1508
+		return (int) ((($b ^ $c) - 1) >> 31) & 1;
1509
+	}
1510
+
1511
+	/**
1512
+	 * @internal You should not use this directly from another application
1513
+	 *
1514
+	 * @param int|string $char
1515
+	 * @return int (1 = yes, 0 = no)
1516
+	 * @throws SodiumException
1517
+	 * @throws TypeError
1518
+	 */
1519
+	public static function negative($char)
1520
+	{
1521
+		if (is_int($char)) {
1522
+			return ($char >> 63) & 1;
1523
+		}
1524
+		$x = self::chrToInt(self::substr($char, 0, 1));
1525
+		return (int) ($x >> 63);
1526
+	}
1527
+
1528
+	/**
1529
+	 * Conditional move
1530
+	 *
1531
+	 * @internal You should not use this directly from another application
1532
+	 *
1533
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t
1534
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u
1535
+	 * @param int $b
1536
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1537
+	 */
1538
+	public static function cmov(
1539
+		ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t,
1540
+		ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u,
1541
+		$b
1542
+	) {
1543
+		if (!is_int($b)) {
1544
+			throw new InvalidArgumentException('Expected an integer.');
1545
+		}
1546
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1547
+			self::fe_cmov($t->yplusx,  $u->yplusx,  $b),
1548
+			self::fe_cmov($t->yminusx, $u->yminusx, $b),
1549
+			self::fe_cmov($t->xy2d,    $u->xy2d,    $b)
1550
+		);
1551
+	}
1552
+
1553
+	/**
1554
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t
1555
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u
1556
+	 * @param int $b
1557
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1558
+	 */
1559
+	public static function ge_cmov_cached(
1560
+		ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t,
1561
+		ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u,
1562
+		$b
1563
+	) {
1564
+		$b &= 1;
1565
+		$ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1566
+		$ret->YplusX  = self::fe_cmov($t->YplusX,  $u->YplusX,  $b);
1567
+		$ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b);
1568
+		$ret->Z       = self::fe_cmov($t->Z,       $u->Z,       $b);
1569
+		$ret->T2d     = self::fe_cmov($t->T2d,     $u->T2d,     $b);
1570
+		return $ret;
1571
+	}
1572
+
1573
+	/**
1574
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $cached
1575
+	 * @param int $b
1576
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1577
+	 * @throws SodiumException
1578
+	 */
1579
+	public static function ge_cmov8_cached(array $cached, $b)
1580
+	{
1581
+		// const unsigned char bnegative = negative(b);
1582
+		// const unsigned char babs      = b - (((-bnegative) & b) * ((signed char) 1 << 1));
1583
+		$bnegative = self::negative($b);
1584
+		$babs = $b - (((-$bnegative) & $b) << 1);
1585
+
1586
+		// ge25519_cached_0(t);
1587
+		$t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1588
+			self::fe_1(),
1589
+			self::fe_1(),
1590
+			self::fe_1(),
1591
+			self::fe_0()
1592
+		);
1593
+
1594
+		// ge25519_cmov_cached(t, &cached[0], equal(babs, 1));
1595
+		// ge25519_cmov_cached(t, &cached[1], equal(babs, 2));
1596
+		// ge25519_cmov_cached(t, &cached[2], equal(babs, 3));
1597
+		// ge25519_cmov_cached(t, &cached[3], equal(babs, 4));
1598
+		// ge25519_cmov_cached(t, &cached[4], equal(babs, 5));
1599
+		// ge25519_cmov_cached(t, &cached[5], equal(babs, 6));
1600
+		// ge25519_cmov_cached(t, &cached[6], equal(babs, 7));
1601
+		// ge25519_cmov_cached(t, &cached[7], equal(babs, 8));
1602
+		for ($x = 0; $x < 8; ++$x) {
1603
+			$t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1));
1604
+		}
1605
+
1606
+		// fe25519_copy(minust.YplusX, t->YminusX);
1607
+		// fe25519_copy(minust.YminusX, t->YplusX);
1608
+		// fe25519_copy(minust.Z, t->Z);
1609
+		// fe25519_neg(minust.T2d, t->T2d);
1610
+		$minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1611
+			self::fe_copy($t->YminusX),
1612
+			self::fe_copy($t->YplusX),
1613
+			self::fe_copy($t->Z),
1614
+			self::fe_neg($t->T2d)
1615
+		);
1616
+		return self::ge_cmov_cached($t, $minust, $bnegative);
1617
+	}
1618
+
1619
+	/**
1620
+	 * @internal You should not use this directly from another application
1621
+	 *
1622
+	 * @param int $pos
1623
+	 * @param int $b
1624
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1625
+	 * @throws SodiumException
1626
+	 * @throws TypeError
1627
+	 * @psalm-suppress MixedArgument
1628
+	 * @psalm-suppress MixedArrayAccess
1629
+	 * @psalm-suppress MixedArrayOffset
1630
+	 */
1631
+	public static function ge_select($pos = 0, $b = 0)
1632
+	{
1633
+		static $base = null;
1634
+		if ($base === null) {
1635
+			$base = array();
1636
+			/** @var int $i */
1637
+			foreach (self::$base as $i => $bas) {
1638
+				for ($j = 0; $j < 8; ++$j) {
1639
+					$base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1640
+						ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]),
1641
+						ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]),
1642
+						ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2])
1643
+					);
1644
+				}
1645
+			}
1646
+		}
1647
+		/** @var array<int, array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp>> $base */
1648
+		if (!is_int($pos)) {
1649
+			throw new InvalidArgumentException('Position must be an integer');
1650
+		}
1651
+		if ($pos < 0 || $pos > 31) {
1652
+			throw new RangeException('Position is out of range [0, 31]');
1653
+		}
1654
+
1655
+		$bnegative = self::negative($b);
1656
+		$babs = $b - (((-$bnegative) & $b) << 1);
1657
+
1658
+		$t = self::ge_precomp_0();
1659
+		for ($i = 0; $i < 8; ++$i) {
1660
+			$t = self::cmov(
1661
+				$t,
1662
+				$base[$pos][$i],
1663
+				self::equal($babs, $i + 1)
1664
+			);
1665
+		}
1666
+		$minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1667
+			self::fe_copy($t->yminusx),
1668
+			self::fe_copy($t->yplusx),
1669
+			self::fe_neg($t->xy2d)
1670
+		);
1671
+		return self::cmov($t, $minusT, $bnegative);
1672
+	}
1673
+
1674
+	/**
1675
+	 * Subtract two group elements.
1676
+	 *
1677
+	 * r = p - q
1678
+	 *
1679
+	 * @internal You should not use this directly from another application
1680
+	 *
1681
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1682
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1683
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1684
+	 */
1685
+	public static function ge_sub(
1686
+		ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
1687
+		ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1688
+	) {
1689
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1690
+
1691
+		$r->X = self::fe_add($p->Y, $p->X);
1692
+		$r->Y = self::fe_sub($p->Y, $p->X);
1693
+		$r->Z = self::fe_mul($r->X, $q->YminusX);
1694
+		$r->Y = self::fe_mul($r->Y, $q->YplusX);
1695
+		$r->T = self::fe_mul($q->T2d, $p->T);
1696
+		$r->X = self::fe_mul($p->Z, $q->Z);
1697
+		$t0 = self::fe_add($r->X, $r->X);
1698
+		$r->X = self::fe_sub($r->Z, $r->Y);
1699
+		$r->Y = self::fe_add($r->Z, $r->Y);
1700
+		$r->Z = self::fe_sub($t0, $r->T);
1701
+		$r->T = self::fe_add($t0, $r->T);
1702
+
1703
+		return $r;
1704
+	}
1705
+
1706
+	/**
1707
+	 * Convert a group element to a byte string.
1708
+	 *
1709
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h
1710
+	 * @return string
1711
+	 * @throws SodiumException
1712
+	 * @throws TypeError
1713
+	 */
1714
+	public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h)
1715
+	{
1716
+		$recip = self::fe_invert($h->Z);
1717
+		$x = self::fe_mul($h->X, $recip);
1718
+		$y = self::fe_mul($h->Y, $recip);
1719
+		$s = self::fe_tobytes($y);
1720
+		$s[31] = self::intToChr(
1721
+			self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1722
+		);
1723
+		return $s;
1724
+	}
1725
+
1726
+	/**
1727
+	 * @internal You should not use this directly from another application
1728
+	 *
1729
+	 * @param string $a
1730
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
1731
+	 * @param string $b
1732
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1733
+	 * @throws SodiumException
1734
+	 * @throws TypeError
1735
+	 * @psalm-suppress MixedArgument
1736
+	 * @psalm-suppress MixedArrayAccess
1737
+	 */
1738
+	public static function ge_double_scalarmult_vartime(
1739
+		$a,
1740
+		ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A,
1741
+		$b
1742
+	) {
1743
+		/** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai */
1744
+		$Ai = array();
1745
+
1746
+		/** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp> $Bi */
1747
+		static $Bi = array();
1748
+		if (!$Bi) {
1749
+			for ($i = 0; $i < 8; ++$i) {
1750
+				$Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1751
+					ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]),
1752
+					ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]),
1753
+					ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2])
1754
+				);
1755
+			}
1756
+		}
1757
+		for ($i = 0; $i < 8; ++$i) {
1758
+			$Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1759
+				self::fe_0(),
1760
+				self::fe_0(),
1761
+				self::fe_0(),
1762
+				self::fe_0()
1763
+			);
1764
+		}
1765
+
1766
+		# slide(aslide,a);
1767
+		# slide(bslide,b);
1768
+		/** @var array<int, int> $aslide */
1769
+		$aslide = self::slide($a);
1770
+		/** @var array<int, int> $bslide */
1771
+		$bslide = self::slide($b);
1772
+
1773
+		# ge_p3_to_cached(&Ai[0],A);
1774
+		# ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
1775
+		$Ai[0] = self::ge_p3_to_cached($A);
1776
+		$t = self::ge_p3_dbl($A);
1777
+		$A2 = self::ge_p1p1_to_p3($t);
1778
+
1779
+		# ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
1780
+		# ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
1781
+		# ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);
1782
+		# ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);
1783
+		# ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
1784
+		# ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
1785
+		# ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
1786
+		for ($i = 0; $i < 7; ++$i) {
1787
+			$t = self::ge_add($A2, $Ai[$i]);
1788
+			$u = self::ge_p1p1_to_p3($t);
1789
+			$Ai[$i + 1] = self::ge_p3_to_cached($u);
1790
+		}
1791
+
1792
+		# ge_p2_0(r);
1793
+		$r = self::ge_p2_0();
1794
+
1795
+		# for (i = 255;i >= 0;--i) {
1796
+		#     if (aslide[i] || bslide[i]) break;
1797
+		# }
1798
+		$i = 255;
1799
+		for (; $i >= 0; --$i) {
1800
+			if ($aslide[$i] || $bslide[$i]) {
1801
+				break;
1802
+			}
1803
+		}
1804
+
1805
+		# for (;i >= 0;--i) {
1806
+		for (; $i >= 0; --$i) {
1807
+			# ge_p2_dbl(&t,r);
1808
+			$t = self::ge_p2_dbl($r);
1809
+
1810
+			# if (aslide[i] > 0) {
1811
+			if ($aslide[$i] > 0) {
1812
+				# ge_p1p1_to_p3(&u,&t);
1813
+				# ge_add(&t,&u,&Ai[aslide[i]/2]);
1814
+				$u = self::ge_p1p1_to_p3($t);
1815
+				$t = self::ge_add(
1816
+					$u,
1817
+					$Ai[(int) floor($aslide[$i] / 2)]
1818
+				);
1819
+			# } else if (aslide[i] < 0) {
1820
+			} elseif ($aslide[$i] < 0) {
1821
+				# ge_p1p1_to_p3(&u,&t);
1822
+				# ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
1823
+				$u = self::ge_p1p1_to_p3($t);
1824
+				$t = self::ge_sub(
1825
+					$u,
1826
+					$Ai[(int) floor(-$aslide[$i] / 2)]
1827
+				);
1828
+			}
1829
+
1830
+			# if (bslide[i] > 0) {
1831
+			if ($bslide[$i] > 0) {
1832
+				/** @var int $index */
1833
+				$index = (int) floor($bslide[$i] / 2);
1834
+				# ge_p1p1_to_p3(&u,&t);
1835
+				# ge_madd(&t,&u,&Bi[bslide[i]/2]);
1836
+				$u = self::ge_p1p1_to_p3($t);
1837
+				$t = self::ge_madd($t, $u, $Bi[$index]);
1838
+			# } else if (bslide[i] < 0) {
1839
+			} elseif ($bslide[$i] < 0) {
1840
+				/** @var int $index */
1841
+				$index = (int) floor(-$bslide[$i] / 2);
1842
+				# ge_p1p1_to_p3(&u,&t);
1843
+				# ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
1844
+				$u = self::ge_p1p1_to_p3($t);
1845
+				$t = self::ge_msub($t, $u, $Bi[$index]);
1846
+			}
1847
+			# ge_p1p1_to_p2(r,&t);
1848
+			$r = self::ge_p1p1_to_p2($t);
1849
+		}
1850
+		return $r;
1851
+	}
1852
+
1853
+	/**
1854
+	 * @internal You should not use this directly from another application
1855
+	 *
1856
+	 * @param string $a
1857
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1858
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1859
+	 * @throws SodiumException
1860
+	 * @throws TypeError
1861
+	 * @psalm-suppress MixedAssignment
1862
+	 * @psalm-suppress MixedOperand
1863
+	 */
1864
+	public static function ge_scalarmult($a, $p)
1865
+	{
1866
+		$e = array_fill(0, 64, 0);
1867
+
1868
+		/** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */
1869
+		$pi = array();
1870
+
1871
+		//        ge25519_p3_to_cached(&pi[1 - 1], p);   /* p */
1872
+		$pi[0] = self::ge_p3_to_cached($p);
1873
+
1874
+		//        ge25519_p3_dbl(&t2, p);
1875
+		//        ge25519_p1p1_to_p3(&p2, &t2);
1876
+		//        ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */
1877
+		$t2 = self::ge_p3_dbl($p);
1878
+		$p2 = self::ge_p1p1_to_p3($t2);
1879
+		$pi[1] = self::ge_p3_to_cached($p2);
1880
+
1881
+		//        ge25519_add_cached(&t3, p, &pi[2 - 1]);
1882
+		//        ge25519_p1p1_to_p3(&p3, &t3);
1883
+		//        ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */
1884
+		$t3 = self::ge_add($p, $pi[1]);
1885
+		$p3 = self::ge_p1p1_to_p3($t3);
1886
+		$pi[2] = self::ge_p3_to_cached($p3);
1887
+
1888
+		//        ge25519_p3_dbl(&t4, &p2);
1889
+		//        ge25519_p1p1_to_p3(&p4, &t4);
1890
+		//        ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */
1891
+		$t4 = self::ge_p3_dbl($p2);
1892
+		$p4 = self::ge_p1p1_to_p3($t4);
1893
+		$pi[3] = self::ge_p3_to_cached($p4);
1894
+
1895
+		//        ge25519_add_cached(&t5, p, &pi[4 - 1]);
1896
+		//        ge25519_p1p1_to_p3(&p5, &t5);
1897
+		//        ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */
1898
+		$t5 = self::ge_add($p, $pi[3]);
1899
+		$p5 = self::ge_p1p1_to_p3($t5);
1900
+		$pi[4] = self::ge_p3_to_cached($p5);
1901
+
1902
+		//        ge25519_p3_dbl(&t6, &p3);
1903
+		//        ge25519_p1p1_to_p3(&p6, &t6);
1904
+		//        ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */
1905
+		$t6 = self::ge_p3_dbl($p3);
1906
+		$p6 = self::ge_p1p1_to_p3($t6);
1907
+		$pi[5] = self::ge_p3_to_cached($p6);
1908
+
1909
+		//        ge25519_add_cached(&t7, p, &pi[6 - 1]);
1910
+		//        ge25519_p1p1_to_p3(&p7, &t7);
1911
+		//        ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */
1912
+		$t7 = self::ge_add($p, $pi[5]);
1913
+		$p7 = self::ge_p1p1_to_p3($t7);
1914
+		$pi[6] = self::ge_p3_to_cached($p7);
1915
+
1916
+		//        ge25519_p3_dbl(&t8, &p4);
1917
+		//        ge25519_p1p1_to_p3(&p8, &t8);
1918
+		//        ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */
1919
+		$t8 = self::ge_p3_dbl($p4);
1920
+		$p8 = self::ge_p1p1_to_p3($t8);
1921
+		$pi[7] = self::ge_p3_to_cached($p8);
1922
+
1923
+
1924
+		//        for (i = 0; i < 32; ++i) {
1925
+		//            e[2 * i + 0] = (a[i] >> 0) & 15;
1926
+		//            e[2 * i + 1] = (a[i] >> 4) & 15;
1927
+		//        }
1928
+		for ($i = 0; $i < 32; ++$i) {
1929
+			$e[($i << 1)    ] =  self::chrToInt($a[$i]) & 15;
1930
+			$e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15;
1931
+		}
1932
+		//        /* each e[i] is between 0 and 15 */
1933
+		//        /* e[63] is between 0 and 7 */
1934
+
1935
+		//        carry = 0;
1936
+		//        for (i = 0; i < 63; ++i) {
1937
+		//            e[i] += carry;
1938
+		//            carry = e[i] + 8;
1939
+		//            carry >>= 4;
1940
+		//            e[i] -= carry * ((signed char) 1 << 4);
1941
+		//        }
1942
+		$carry = 0;
1943
+		for ($i = 0; $i < 63; ++$i) {
1944
+			$e[$i] += $carry;
1945
+			$carry = $e[$i] + 8;
1946
+			$carry >>= 4;
1947
+			$e[$i] -= $carry << 4;
1948
+		}
1949
+		//        e[63] += carry;
1950
+		//        /* each e[i] is between -8 and 8 */
1951
+		$e[63] += $carry;
1952
+
1953
+		//        ge25519_p3_0(h);
1954
+		$h = self::ge_p3_0();
1955
+
1956
+		//        for (i = 63; i != 0; i--) {
1957
+		for ($i = 63; $i != 0; --$i) {
1958
+			// ge25519_cmov8_cached(&t, pi, e[i]);
1959
+			$t = self::ge_cmov8_cached($pi, $e[$i]);
1960
+			// ge25519_add_cached(&r, h, &t);
1961
+			$r = self::ge_add($h, $t);
1962
+
1963
+			// ge25519_p1p1_to_p2(&s, &r);
1964
+			// ge25519_p2_dbl(&r, &s);
1965
+			// ge25519_p1p1_to_p2(&s, &r);
1966
+			// ge25519_p2_dbl(&r, &s);
1967
+			// ge25519_p1p1_to_p2(&s, &r);
1968
+			// ge25519_p2_dbl(&r, &s);
1969
+			// ge25519_p1p1_to_p2(&s, &r);
1970
+			// ge25519_p2_dbl(&r, &s);
1971
+			$s = self::ge_p1p1_to_p2($r);
1972
+			$r = self::ge_p2_dbl($s);
1973
+			$s = self::ge_p1p1_to_p2($r);
1974
+			$r = self::ge_p2_dbl($s);
1975
+			$s = self::ge_p1p1_to_p2($r);
1976
+			$r = self::ge_p2_dbl($s);
1977
+			$s = self::ge_p1p1_to_p2($r);
1978
+			$r = self::ge_p2_dbl($s);
1979
+
1980
+			// ge25519_p1p1_to_p3(h, &r);  /* *16 */
1981
+			$h = self::ge_p1p1_to_p3($r); /* *16 */
1982
+		}
1983
+
1984
+		//        ge25519_cmov8_cached(&t, pi, e[i]);
1985
+		//        ge25519_add_cached(&r, h, &t);
1986
+		//        ge25519_p1p1_to_p3(h, &r);
1987
+		$t = self::ge_cmov8_cached($pi, $e[0]);
1988
+		$r = self::ge_add($h, $t);
1989
+		return self::ge_p1p1_to_p3($r);
1990
+	}
1991
+
1992
+	/**
1993
+	 * @internal You should not use this directly from another application
1994
+	 *
1995
+	 * @param string $a
1996
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1997
+	 * @throws SodiumException
1998
+	 * @throws TypeError
1999
+	 * @psalm-suppress MixedAssignment
2000
+	 * @psalm-suppress MixedOperand
2001
+	 */
2002
+	public static function ge_scalarmult_base($a)
2003
+	{
2004
+		/** @var array<int, int> $e */
2005
+		$e = array();
2006
+		$r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
2007
+
2008
+		for ($i = 0; $i < 32; ++$i) {
2009
+			$dbl = (int) $i << 1;
2010
+			$e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
2011
+			$e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
2012
+		}
2013
+
2014
+		$carry = 0;
2015
+		for ($i = 0; $i < 63; ++$i) {
2016
+			$e[$i] += $carry;
2017
+			$carry = $e[$i] + 8;
2018
+			$carry >>= 4;
2019
+			$e[$i] -= $carry << 4;
2020
+		}
2021
+		$e[63] += (int) $carry;
2022
+
2023
+		$h = self::ge_p3_0();
2024
+
2025
+		for ($i = 1; $i < 64; $i += 2) {
2026
+			$t = self::ge_select((int) floor($i / 2), (int) $e[$i]);
2027
+			$r = self::ge_madd($r, $h, $t);
2028
+			$h = self::ge_p1p1_to_p3($r);
2029
+		}
2030
+
2031
+		$r = self::ge_p3_dbl($h);
2032
+
2033
+		$s = self::ge_p1p1_to_p2($r);
2034
+		$r = self::ge_p2_dbl($s);
2035
+		$s = self::ge_p1p1_to_p2($r);
2036
+		$r = self::ge_p2_dbl($s);
2037
+		$s = self::ge_p1p1_to_p2($r);
2038
+		$r = self::ge_p2_dbl($s);
2039
+
2040
+		$h = self::ge_p1p1_to_p3($r);
2041
+
2042
+		for ($i = 0; $i < 64; $i += 2) {
2043
+			$t = self::ge_select($i >> 1, (int) $e[$i]);
2044
+			$r = self::ge_madd($r, $h, $t);
2045
+			$h = self::ge_p1p1_to_p3($r);
2046
+		}
2047
+		return $h;
2048
+	}
2049
+
2050
+	/**
2051
+	 * Calculates (ab + c) mod l
2052
+	 * where l = 2^252 + 27742317777372353535851937790883648493
2053
+	 *
2054
+	 * @internal You should not use this directly from another application
2055
+	 *
2056
+	 * @param string $a
2057
+	 * @param string $b
2058
+	 * @param string $c
2059
+	 * @return string
2060
+	 * @throws TypeError
2061
+	 */
2062
+	public static function sc_muladd($a, $b, $c)
2063
+	{
2064
+		$a0 = 2097151 & self::load_3(self::substr($a, 0, 3));
2065
+		$a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2066
+		$a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2067
+		$a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2068
+		$a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2069
+		$a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2070
+		$a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2071
+		$a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2072
+		$a8 = 2097151 & self::load_3(self::substr($a, 21, 3));
2073
+		$a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2074
+		$a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2075
+		$a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2076
+
2077
+		$b0 = 2097151 & self::load_3(self::substr($b, 0, 3));
2078
+		$b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2079
+		$b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2080
+		$b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2081
+		$b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2082
+		$b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2083
+		$b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2084
+		$b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2085
+		$b8 = 2097151 & self::load_3(self::substr($b, 21, 3));
2086
+		$b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2087
+		$b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2088
+		$b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2089
+
2090
+		$c0 = 2097151 & self::load_3(self::substr($c, 0, 3));
2091
+		$c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5);
2092
+		$c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2);
2093
+		$c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7);
2094
+		$c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4);
2095
+		$c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1);
2096
+		$c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6);
2097
+		$c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3);
2098
+		$c8 = 2097151 & self::load_3(self::substr($c, 21, 3));
2099
+		$c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5);
2100
+		$c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2);
2101
+		$c11 = (self::load_4(self::substr($c, 28, 4)) >> 7);
2102
+
2103
+		/* Can't really avoid the pyramid here: */
2104
+		$s0 = $c0 + self::mul($a0, $b0, 24);
2105
+		$s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24);
2106
+		$s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24);
2107
+		$s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24);
2108
+		$s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) +
2109
+			   self::mul($a4, $b0, 24);
2110
+		$s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) +
2111
+			   self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24);
2112
+		$s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) +
2113
+			   self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24);
2114
+		$s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) +
2115
+			   self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24);
2116
+		$s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) +
2117
+			   self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) +
2118
+			   self::mul($a8, $b0, 24);
2119
+		$s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) +
2120
+			   self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) +
2121
+			   self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24);
2122
+		$s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) +
2123
+			   self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) +
2124
+			   self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24);
2125
+		$s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) +
2126
+			   self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) +
2127
+			   self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24);
2128
+		$s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) +
2129
+			   self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) +
2130
+			   self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24);
2131
+		$s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) +
2132
+			   self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) +
2133
+			   self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24);
2134
+		$s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) +
2135
+			   self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) +
2136
+			   self::mul($a11, $b3, 24);
2137
+		$s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) +
2138
+			   self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24);
2139
+		$s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) +
2140
+			   self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24);
2141
+		$s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) +
2142
+			   self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24);
2143
+		$s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) +
2144
+			   self::mul($a11, $b7, 24);
2145
+		$s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24);
2146
+		$s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24);
2147
+		$s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24);
2148
+		$s22 = self::mul($a11, $b11, 24);
2149
+		$s23 = 0;
2150
+
2151
+		$carry0 = ($s0 + (1 << 20)) >> 21;
2152
+		$s1 += $carry0;
2153
+		$s0 -= $carry0 << 21;
2154
+		$carry2 = ($s2 + (1 << 20)) >> 21;
2155
+		$s3 += $carry2;
2156
+		$s2 -= $carry2 << 21;
2157
+		$carry4 = ($s4 + (1 << 20)) >> 21;
2158
+		$s5 += $carry4;
2159
+		$s4 -= $carry4 << 21;
2160
+		$carry6 = ($s6 + (1 << 20)) >> 21;
2161
+		$s7 += $carry6;
2162
+		$s6 -= $carry6 << 21;
2163
+		$carry8 = ($s8 + (1 << 20)) >> 21;
2164
+		$s9 += $carry8;
2165
+		$s8 -= $carry8 << 21;
2166
+		$carry10 = ($s10 + (1 << 20)) >> 21;
2167
+		$s11 += $carry10;
2168
+		$s10 -= $carry10 << 21;
2169
+		$carry12 = ($s12 + (1 << 20)) >> 21;
2170
+		$s13 += $carry12;
2171
+		$s12 -= $carry12 << 21;
2172
+		$carry14 = ($s14 + (1 << 20)) >> 21;
2173
+		$s15 += $carry14;
2174
+		$s14 -= $carry14 << 21;
2175
+		$carry16 = ($s16 + (1 << 20)) >> 21;
2176
+		$s17 += $carry16;
2177
+		$s16 -= $carry16 << 21;
2178
+		$carry18 = ($s18 + (1 << 20)) >> 21;
2179
+		$s19 += $carry18;
2180
+		$s18 -= $carry18 << 21;
2181
+		$carry20 = ($s20 + (1 << 20)) >> 21;
2182
+		$s21 += $carry20;
2183
+		$s20 -= $carry20 << 21;
2184
+		$carry22 = ($s22 + (1 << 20)) >> 21;
2185
+		$s23 += $carry22;
2186
+		$s22 -= $carry22 << 21;
2187
+
2188
+		$carry1 = ($s1 + (1 << 20)) >> 21;
2189
+		$s2 += $carry1;
2190
+		$s1 -= $carry1 << 21;
2191
+		$carry3 = ($s3 + (1 << 20)) >> 21;
2192
+		$s4 += $carry3;
2193
+		$s3 -= $carry3 << 21;
2194
+		$carry5 = ($s5 + (1 << 20)) >> 21;
2195
+		$s6 += $carry5;
2196
+		$s5 -= $carry5 << 21;
2197
+		$carry7 = ($s7 + (1 << 20)) >> 21;
2198
+		$s8 += $carry7;
2199
+		$s7 -= $carry7 << 21;
2200
+		$carry9 = ($s9 + (1 << 20)) >> 21;
2201
+		$s10 += $carry9;
2202
+		$s9 -= $carry9 << 21;
2203
+		$carry11 = ($s11 + (1 << 20)) >> 21;
2204
+		$s12 += $carry11;
2205
+		$s11 -= $carry11 << 21;
2206
+		$carry13 = ($s13 + (1 << 20)) >> 21;
2207
+		$s14 += $carry13;
2208
+		$s13 -= $carry13 << 21;
2209
+		$carry15 = ($s15 + (1 << 20)) >> 21;
2210
+		$s16 += $carry15;
2211
+		$s15 -= $carry15 << 21;
2212
+		$carry17 = ($s17 + (1 << 20)) >> 21;
2213
+		$s18 += $carry17;
2214
+		$s17 -= $carry17 << 21;
2215
+		$carry19 = ($s19 + (1 << 20)) >> 21;
2216
+		$s20 += $carry19;
2217
+		$s19 -= $carry19 << 21;
2218
+		$carry21 = ($s21 + (1 << 20)) >> 21;
2219
+		$s22 += $carry21;
2220
+		$s21 -= $carry21 << 21;
2221
+
2222
+		$s11 += self::mul($s23, 666643, 20);
2223
+		$s12 += self::mul($s23, 470296, 19);
2224
+		$s13 += self::mul($s23, 654183, 20);
2225
+		$s14 -= self::mul($s23, 997805, 20);
2226
+		$s15 += self::mul($s23, 136657, 18);
2227
+		$s16 -= self::mul($s23, 683901, 20);
2228
+
2229
+		$s10 += self::mul($s22, 666643, 20);
2230
+		$s11 += self::mul($s22, 470296, 19);
2231
+		$s12 += self::mul($s22, 654183, 20);
2232
+		$s13 -= self::mul($s22, 997805, 20);
2233
+		$s14 += self::mul($s22, 136657, 18);
2234
+		$s15 -= self::mul($s22, 683901, 20);
2235
+
2236
+		$s9  += self::mul($s21,  666643, 20);
2237
+		$s10 += self::mul($s21,  470296, 19);
2238
+		$s11 += self::mul($s21,  654183, 20);
2239
+		$s12 -= self::mul($s21,  997805, 20);
2240
+		$s13 += self::mul($s21,  136657, 18);
2241
+		$s14 -= self::mul($s21,  683901, 20);
2242
+
2243
+		$s8  += self::mul($s20,  666643, 20);
2244
+		$s9  += self::mul($s20,  470296, 19);
2245
+		$s10 += self::mul($s20,  654183, 20);
2246
+		$s11 -= self::mul($s20,  997805, 20);
2247
+		$s12 += self::mul($s20,  136657, 18);
2248
+		$s13 -= self::mul($s20,  683901, 20);
2249
+
2250
+		$s7  += self::mul($s19,  666643, 20);
2251
+		$s8  += self::mul($s19,  470296, 19);
2252
+		$s9  += self::mul($s19,  654183, 20);
2253
+		$s10 -= self::mul($s19,  997805, 20);
2254
+		$s11 += self::mul($s19,  136657, 18);
2255
+		$s12 -= self::mul($s19,  683901, 20);
2256
+
2257
+		$s6  += self::mul($s18,  666643, 20);
2258
+		$s7  += self::mul($s18,  470296, 19);
2259
+		$s8  += self::mul($s18,  654183, 20);
2260
+		$s9  -= self::mul($s18,  997805, 20);
2261
+		$s10 += self::mul($s18,  136657, 18);
2262
+		$s11 -= self::mul($s18,  683901, 20);
2263
+
2264
+		$carry6 = ($s6 + (1 << 20)) >> 21;
2265
+		$s7 += $carry6;
2266
+		$s6 -= $carry6 << 21;
2267
+		$carry8 = ($s8 + (1 << 20)) >> 21;
2268
+		$s9 += $carry8;
2269
+		$s8 -= $carry8 << 21;
2270
+		$carry10 = ($s10 + (1 << 20)) >> 21;
2271
+		$s11 += $carry10;
2272
+		$s10 -= $carry10 << 21;
2273
+		$carry12 = ($s12 + (1 << 20)) >> 21;
2274
+		$s13 += $carry12;
2275
+		$s12 -= $carry12 << 21;
2276
+		$carry14 = ($s14 + (1 << 20)) >> 21;
2277
+		$s15 += $carry14;
2278
+		$s14 -= $carry14 << 21;
2279
+		$carry16 = ($s16 + (1 << 20)) >> 21;
2280
+		$s17 += $carry16;
2281
+		$s16 -= $carry16 << 21;
2282
+
2283
+		$carry7 = ($s7 + (1 << 20)) >> 21;
2284
+		$s8 += $carry7;
2285
+		$s7 -= $carry7 << 21;
2286
+		$carry9 = ($s9 + (1 << 20)) >> 21;
2287
+		$s10 += $carry9;
2288
+		$s9 -= $carry9 << 21;
2289
+		$carry11 = ($s11 + (1 << 20)) >> 21;
2290
+		$s12 += $carry11;
2291
+		$s11 -= $carry11 << 21;
2292
+		$carry13 = ($s13 + (1 << 20)) >> 21;
2293
+		$s14 += $carry13;
2294
+		$s13 -= $carry13 << 21;
2295
+		$carry15 = ($s15 + (1 << 20)) >> 21;
2296
+		$s16 += $carry15;
2297
+		$s15 -= $carry15 << 21;
2298
+
2299
+		$s5  += self::mul($s17,  666643, 20);
2300
+		$s6  += self::mul($s17,  470296, 19);
2301
+		$s7  += self::mul($s17,  654183, 20);
2302
+		$s8  -= self::mul($s17,  997805, 20);
2303
+		$s9  += self::mul($s17,  136657, 18);
2304
+		$s10 -= self::mul($s17,  683901, 20);
2305
+
2306
+		$s4 += self::mul($s16,  666643, 20);
2307
+		$s5 += self::mul($s16,  470296, 19);
2308
+		$s6 += self::mul($s16,  654183, 20);
2309
+		$s7 -= self::mul($s16,  997805, 20);
2310
+		$s8 += self::mul($s16,  136657, 18);
2311
+		$s9 -= self::mul($s16,  683901, 20);
2312
+
2313
+		$s3 += self::mul($s15,  666643, 20);
2314
+		$s4 += self::mul($s15,  470296, 19);
2315
+		$s5 += self::mul($s15,  654183, 20);
2316
+		$s6 -= self::mul($s15,  997805, 20);
2317
+		$s7 += self::mul($s15,  136657, 18);
2318
+		$s8 -= self::mul($s15,  683901, 20);
2319
+
2320
+		$s2 += self::mul($s14,  666643, 20);
2321
+		$s3 += self::mul($s14,  470296, 19);
2322
+		$s4 += self::mul($s14,  654183, 20);
2323
+		$s5 -= self::mul($s14,  997805, 20);
2324
+		$s6 += self::mul($s14,  136657, 18);
2325
+		$s7 -= self::mul($s14,  683901, 20);
2326
+
2327
+		$s1 += self::mul($s13,  666643, 20);
2328
+		$s2 += self::mul($s13,  470296, 19);
2329
+		$s3 += self::mul($s13,  654183, 20);
2330
+		$s4 -= self::mul($s13,  997805, 20);
2331
+		$s5 += self::mul($s13,  136657, 18);
2332
+		$s6 -= self::mul($s13,  683901, 20);
2333
+
2334
+		$s0 += self::mul($s12,  666643, 20);
2335
+		$s1 += self::mul($s12,  470296, 19);
2336
+		$s2 += self::mul($s12,  654183, 20);
2337
+		$s3 -= self::mul($s12,  997805, 20);
2338
+		$s4 += self::mul($s12,  136657, 18);
2339
+		$s5 -= self::mul($s12,  683901, 20);
2340
+		$s12 = 0;
2341
+
2342
+		$carry0 = ($s0 + (1 << 20)) >> 21;
2343
+		$s1 += $carry0;
2344
+		$s0 -= $carry0 << 21;
2345
+		$carry2 = ($s2 + (1 << 20)) >> 21;
2346
+		$s3 += $carry2;
2347
+		$s2 -= $carry2 << 21;
2348
+		$carry4 = ($s4 + (1 << 20)) >> 21;
2349
+		$s5 += $carry4;
2350
+		$s4 -= $carry4 << 21;
2351
+		$carry6 = ($s6 + (1 << 20)) >> 21;
2352
+		$s7 += $carry6;
2353
+		$s6 -= $carry6 << 21;
2354
+		$carry8 = ($s8 + (1 << 20)) >> 21;
2355
+		$s9 += $carry8;
2356
+		$s8 -= $carry8 << 21;
2357
+		$carry10 = ($s10 + (1 << 20)) >> 21;
2358
+		$s11 += $carry10;
2359
+		$s10 -= $carry10 << 21;
2360
+
2361
+		$carry1 = ($s1 + (1 << 20)) >> 21;
2362
+		$s2 += $carry1;
2363
+		$s1 -= $carry1 << 21;
2364
+		$carry3 = ($s3 + (1 << 20)) >> 21;
2365
+		$s4 += $carry3;
2366
+		$s3 -= $carry3 << 21;
2367
+		$carry5 = ($s5 + (1 << 20)) >> 21;
2368
+		$s6 += $carry5;
2369
+		$s5 -= $carry5 << 21;
2370
+		$carry7 = ($s7 + (1 << 20)) >> 21;
2371
+		$s8 += $carry7;
2372
+		$s7 -= $carry7 << 21;
2373
+		$carry9 = ($s9 + (1 << 20)) >> 21;
2374
+		$s10 += $carry9;
2375
+		$s9 -= $carry9 << 21;
2376
+		$carry11 = ($s11 + (1 << 20)) >> 21;
2377
+		$s12 += $carry11;
2378
+		$s11 -= $carry11 << 21;
2379
+
2380
+		$s0 += self::mul($s12,  666643, 20);
2381
+		$s1 += self::mul($s12,  470296, 19);
2382
+		$s2 += self::mul($s12,  654183, 20);
2383
+		$s3 -= self::mul($s12,  997805, 20);
2384
+		$s4 += self::mul($s12,  136657, 18);
2385
+		$s5 -= self::mul($s12,  683901, 20);
2386
+		$s12 = 0;
2387
+
2388
+		$carry0 = $s0 >> 21;
2389
+		$s1 += $carry0;
2390
+		$s0 -= $carry0 << 21;
2391
+		$carry1 = $s1 >> 21;
2392
+		$s2 += $carry1;
2393
+		$s1 -= $carry1 << 21;
2394
+		$carry2 = $s2 >> 21;
2395
+		$s3 += $carry2;
2396
+		$s2 -= $carry2 << 21;
2397
+		$carry3 = $s3 >> 21;
2398
+		$s4 += $carry3;
2399
+		$s3 -= $carry3 << 21;
2400
+		$carry4 = $s4 >> 21;
2401
+		$s5 += $carry4;
2402
+		$s4 -= $carry4 << 21;
2403
+		$carry5 = $s5 >> 21;
2404
+		$s6 += $carry5;
2405
+		$s5 -= $carry5 << 21;
2406
+		$carry6 = $s6 >> 21;
2407
+		$s7 += $carry6;
2408
+		$s6 -= $carry6 << 21;
2409
+		$carry7 = $s7 >> 21;
2410
+		$s8 += $carry7;
2411
+		$s7 -= $carry7 << 21;
2412
+		$carry8 = $s8 >> 21;
2413
+		$s9 += $carry8;
2414
+		$s8 -= $carry8 << 21;
2415
+		$carry9 = $s9 >> 21;
2416
+		$s10 += $carry9;
2417
+		$s9 -= $carry9 << 21;
2418
+		$carry10 = $s10 >> 21;
2419
+		$s11 += $carry10;
2420
+		$s10 -= $carry10 << 21;
2421
+		$carry11 = $s11 >> 21;
2422
+		$s12 += $carry11;
2423
+		$s11 -= $carry11 << 21;
2424
+
2425
+		$s0 += self::mul($s12,  666643, 20);
2426
+		$s1 += self::mul($s12,  470296, 19);
2427
+		$s2 += self::mul($s12,  654183, 20);
2428
+		$s3 -= self::mul($s12,  997805, 20);
2429
+		$s4 += self::mul($s12,  136657, 18);
2430
+		$s5 -= self::mul($s12,  683901, 20);
2431
+
2432
+		$carry0 = $s0 >> 21;
2433
+		$s1 += $carry0;
2434
+		$s0 -= $carry0 << 21;
2435
+		$carry1 = $s1 >> 21;
2436
+		$s2 += $carry1;
2437
+		$s1 -= $carry1 << 21;
2438
+		$carry2 = $s2 >> 21;
2439
+		$s3 += $carry2;
2440
+		$s2 -= $carry2 << 21;
2441
+		$carry3 = $s3 >> 21;
2442
+		$s4 += $carry3;
2443
+		$s3 -= $carry3 << 21;
2444
+		$carry4 = $s4 >> 21;
2445
+		$s5 += $carry4;
2446
+		$s4 -= $carry4 << 21;
2447
+		$carry5 = $s5 >> 21;
2448
+		$s6 += $carry5;
2449
+		$s5 -= $carry5 << 21;
2450
+		$carry6 = $s6 >> 21;
2451
+		$s7 += $carry6;
2452
+		$s6 -= $carry6 << 21;
2453
+		$carry7 = $s7 >> 21;
2454
+		$s8 += $carry7;
2455
+		$s7 -= $carry7 << 21;
2456
+		$carry8 = $s8 >> 21;
2457
+		$s9 += $carry8;
2458
+		$s8 -= $carry8 << 21;
2459
+		$carry9 = $s9 >> 21;
2460
+		$s10 += $carry9;
2461
+		$s9 -= $carry9 << 21;
2462
+		$carry10 = $s10 >> 21;
2463
+		$s11 += $carry10;
2464
+		$s10 -= $carry10 << 21;
2465
+
2466
+		/**
2467
+		 * @var array<int, int>
2468
+		 */
2469
+		$arr = array(
2470
+			(int) (0xff & ($s0 >> 0)),
2471
+			(int) (0xff & ($s0 >> 8)),
2472
+			(int) (0xff & (($s0 >> 16) | $s1 << 5)),
2473
+			(int) (0xff & ($s1 >> 3)),
2474
+			(int) (0xff & ($s1 >> 11)),
2475
+			(int) (0xff & (($s1 >> 19) | $s2 << 2)),
2476
+			(int) (0xff & ($s2 >> 6)),
2477
+			(int) (0xff & (($s2 >> 14) | $s3 << 7)),
2478
+			(int) (0xff & ($s3 >> 1)),
2479
+			(int) (0xff & ($s3 >> 9)),
2480
+			(int) (0xff & (($s3 >> 17) | $s4 << 4)),
2481
+			(int) (0xff & ($s4 >> 4)),
2482
+			(int) (0xff & ($s4 >> 12)),
2483
+			(int) (0xff & (($s4 >> 20) | $s5 << 1)),
2484
+			(int) (0xff & ($s5 >> 7)),
2485
+			(int) (0xff & (($s5 >> 15) | $s6 << 6)),
2486
+			(int) (0xff & ($s6 >> 2)),
2487
+			(int) (0xff & ($s6 >> 10)),
2488
+			(int) (0xff & (($s6 >> 18) | $s7 << 3)),
2489
+			(int) (0xff & ($s7 >> 5)),
2490
+			(int) (0xff & ($s7 >> 13)),
2491
+			(int) (0xff & ($s8 >> 0)),
2492
+			(int) (0xff & ($s8 >> 8)),
2493
+			(int) (0xff & (($s8 >> 16) | $s9 << 5)),
2494
+			(int) (0xff & ($s9 >> 3)),
2495
+			(int) (0xff & ($s9 >> 11)),
2496
+			(int) (0xff & (($s9 >> 19) | $s10 << 2)),
2497
+			(int) (0xff & ($s10 >> 6)),
2498
+			(int) (0xff & (($s10 >> 14) | $s11 << 7)),
2499
+			(int) (0xff & ($s11 >> 1)),
2500
+			(int) (0xff & ($s11 >> 9)),
2501
+			0xff & ($s11 >> 17)
2502
+		);
2503
+		return self::intArrayToString($arr);
2504
+	}
2505
+
2506
+	/**
2507
+	 * @internal You should not use this directly from another application
2508
+	 *
2509
+	 * @param string $s
2510
+	 * @return string
2511
+	 * @throws TypeError
2512
+	 */
2513
+	public static function sc_reduce($s)
2514
+	{
2515
+		$s0 = 2097151 & self::load_3(self::substr($s, 0, 3));
2516
+		$s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5);
2517
+		$s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2);
2518
+		$s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7);
2519
+		$s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4);
2520
+		$s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1);
2521
+		$s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6);
2522
+		$s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3);
2523
+		$s8 = 2097151 & self::load_3(self::substr($s, 21, 3));
2524
+		$s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5);
2525
+		$s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2);
2526
+		$s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7);
2527
+		$s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4);
2528
+		$s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1);
2529
+		$s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6);
2530
+		$s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3);
2531
+		$s16 = 2097151 & self::load_3(self::substr($s, 42, 3));
2532
+		$s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5);
2533
+		$s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2);
2534
+		$s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7);
2535
+		$s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4);
2536
+		$s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1);
2537
+		$s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6);
2538
+		$s23 = (self::load_4(self::substr($s, 60, 4)) >> 3);
2539
+
2540
+		$s11 += self::mul($s23,  666643, 20);
2541
+		$s12 += self::mul($s23,  470296, 19);
2542
+		$s13 += self::mul($s23,  654183, 20);
2543
+		$s14 -= self::mul($s23,  997805, 20);
2544
+		$s15 += self::mul($s23,  136657, 18);
2545
+		$s16 -= self::mul($s23,  683901, 20);
2546
+
2547
+		$s10 += self::mul($s22,  666643, 20);
2548
+		$s11 += self::mul($s22,  470296, 19);
2549
+		$s12 += self::mul($s22,  654183, 20);
2550
+		$s13 -= self::mul($s22,  997805, 20);
2551
+		$s14 += self::mul($s22,  136657, 18);
2552
+		$s15 -= self::mul($s22,  683901, 20);
2553
+
2554
+		$s9  += self::mul($s21,  666643, 20);
2555
+		$s10 += self::mul($s21,  470296, 19);
2556
+		$s11 += self::mul($s21,  654183, 20);
2557
+		$s12 -= self::mul($s21,  997805, 20);
2558
+		$s13 += self::mul($s21,  136657, 18);
2559
+		$s14 -= self::mul($s21,  683901, 20);
2560
+
2561
+		$s8  += self::mul($s20,  666643, 20);
2562
+		$s9  += self::mul($s20,  470296, 19);
2563
+		$s10 += self::mul($s20,  654183, 20);
2564
+		$s11 -= self::mul($s20,  997805, 20);
2565
+		$s12 += self::mul($s20,  136657, 18);
2566
+		$s13 -= self::mul($s20,  683901, 20);
2567
+
2568
+		$s7  += self::mul($s19,  666643, 20);
2569
+		$s8  += self::mul($s19,  470296, 19);
2570
+		$s9  += self::mul($s19,  654183, 20);
2571
+		$s10 -= self::mul($s19,  997805, 20);
2572
+		$s11 += self::mul($s19,  136657, 18);
2573
+		$s12 -= self::mul($s19,  683901, 20);
2574
+
2575
+		$s6  += self::mul($s18,  666643, 20);
2576
+		$s7  += self::mul($s18,  470296, 19);
2577
+		$s8  += self::mul($s18,  654183, 20);
2578
+		$s9  -= self::mul($s18,  997805, 20);
2579
+		$s10 += self::mul($s18,  136657, 18);
2580
+		$s11 -= self::mul($s18,  683901, 20);
2581
+
2582
+		$carry6 = ($s6 + (1 << 20)) >> 21;
2583
+		$s7 += $carry6;
2584
+		$s6 -= $carry6 << 21;
2585
+		$carry8 = ($s8 + (1 << 20)) >> 21;
2586
+		$s9 += $carry8;
2587
+		$s8 -= $carry8 << 21;
2588
+		$carry10 = ($s10 + (1 << 20)) >> 21;
2589
+		$s11 += $carry10;
2590
+		$s10 -= $carry10 << 21;
2591
+		$carry12 = ($s12 + (1 << 20)) >> 21;
2592
+		$s13 += $carry12;
2593
+		$s12 -= $carry12 << 21;
2594
+		$carry14 = ($s14 + (1 << 20)) >> 21;
2595
+		$s15 += $carry14;
2596
+		$s14 -= $carry14 << 21;
2597
+		$carry16 = ($s16 + (1 << 20)) >> 21;
2598
+		$s17 += $carry16;
2599
+		$s16 -= $carry16 << 21;
2600
+
2601
+		$carry7 = ($s7 + (1 << 20)) >> 21;
2602
+		$s8 += $carry7;
2603
+		$s7 -= $carry7 << 21;
2604
+		$carry9 = ($s9 + (1 << 20)) >> 21;
2605
+		$s10 += $carry9;
2606
+		$s9 -= $carry9 << 21;
2607
+		$carry11 = ($s11 + (1 << 20)) >> 21;
2608
+		$s12 += $carry11;
2609
+		$s11 -= $carry11 << 21;
2610
+		$carry13 = ($s13 + (1 << 20)) >> 21;
2611
+		$s14 += $carry13;
2612
+		$s13 -= $carry13 << 21;
2613
+		$carry15 = ($s15 + (1 << 20)) >> 21;
2614
+		$s16 += $carry15;
2615
+		$s15 -= $carry15 << 21;
2616
+
2617
+		$s5  += self::mul($s17,  666643, 20);
2618
+		$s6  += self::mul($s17,  470296, 19);
2619
+		$s7  += self::mul($s17,  654183, 20);
2620
+		$s8  -= self::mul($s17,  997805, 20);
2621
+		$s9  += self::mul($s17,  136657, 18);
2622
+		$s10 -= self::mul($s17,  683901, 20);
2623
+
2624
+		$s4 += self::mul($s16,  666643, 20);
2625
+		$s5 += self::mul($s16,  470296, 19);
2626
+		$s6 += self::mul($s16,  654183, 20);
2627
+		$s7 -= self::mul($s16,  997805, 20);
2628
+		$s8 += self::mul($s16,  136657, 18);
2629
+		$s9 -= self::mul($s16,  683901, 20);
2630
+
2631
+		$s3 += self::mul($s15,  666643, 20);
2632
+		$s4 += self::mul($s15,  470296, 19);
2633
+		$s5 += self::mul($s15,  654183, 20);
2634
+		$s6 -= self::mul($s15,  997805, 20);
2635
+		$s7 += self::mul($s15,  136657, 18);
2636
+		$s8 -= self::mul($s15,  683901, 20);
2637
+
2638
+		$s2 += self::mul($s14,  666643, 20);
2639
+		$s3 += self::mul($s14,  470296, 19);
2640
+		$s4 += self::mul($s14,  654183, 20);
2641
+		$s5 -= self::mul($s14,  997805, 20);
2642
+		$s6 += self::mul($s14,  136657, 18);
2643
+		$s7 -= self::mul($s14,  683901, 20);
2644
+
2645
+		$s1 += self::mul($s13,  666643, 20);
2646
+		$s2 += self::mul($s13,  470296, 19);
2647
+		$s3 += self::mul($s13,  654183, 20);
2648
+		$s4 -= self::mul($s13,  997805, 20);
2649
+		$s5 += self::mul($s13,  136657, 18);
2650
+		$s6 -= self::mul($s13,  683901, 20);
2651
+
2652
+		$s0 += self::mul($s12,  666643, 20);
2653
+		$s1 += self::mul($s12,  470296, 19);
2654
+		$s2 += self::mul($s12,  654183, 20);
2655
+		$s3 -= self::mul($s12,  997805, 20);
2656
+		$s4 += self::mul($s12,  136657, 18);
2657
+		$s5 -= self::mul($s12,  683901, 20);
2658
+		$s12 = 0;
2659
+
2660
+		$carry0 = ($s0 + (1 << 20)) >> 21;
2661
+		$s1 += $carry0;
2662
+		$s0 -= $carry0 << 21;
2663
+		$carry2 = ($s2 + (1 << 20)) >> 21;
2664
+		$s3 += $carry2;
2665
+		$s2 -= $carry2 << 21;
2666
+		$carry4 = ($s4 + (1 << 20)) >> 21;
2667
+		$s5 += $carry4;
2668
+		$s4 -= $carry4 << 21;
2669
+		$carry6 = ($s6 + (1 << 20)) >> 21;
2670
+		$s7 += $carry6;
2671
+		$s6 -= $carry6 << 21;
2672
+		$carry8 = ($s8 + (1 << 20)) >> 21;
2673
+		$s9 += $carry8;
2674
+		$s8 -= $carry8 << 21;
2675
+		$carry10 = ($s10 + (1 << 20)) >> 21;
2676
+		$s11 += $carry10;
2677
+		$s10 -= $carry10 << 21;
2678
+
2679
+		$carry1 = ($s1 + (1 << 20)) >> 21;
2680
+		$s2 += $carry1;
2681
+		$s1 -= $carry1 << 21;
2682
+		$carry3 = ($s3 + (1 << 20)) >> 21;
2683
+		$s4 += $carry3;
2684
+		$s3 -= $carry3 << 21;
2685
+		$carry5 = ($s5 + (1 << 20)) >> 21;
2686
+		$s6 += $carry5;
2687
+		$s5 -= $carry5 << 21;
2688
+		$carry7 = ($s7 + (1 << 20)) >> 21;
2689
+		$s8 += $carry7;
2690
+		$s7 -= $carry7 << 21;
2691
+		$carry9 = ($s9 + (1 << 20)) >> 21;
2692
+		$s10 += $carry9;
2693
+		$s9 -= $carry9 << 21;
2694
+		$carry11 = ($s11 + (1 << 20)) >> 21;
2695
+		$s12 += $carry11;
2696
+		$s11 -= $carry11 << 21;
2697
+
2698
+		$s0 += self::mul($s12,  666643, 20);
2699
+		$s1 += self::mul($s12,  470296, 19);
2700
+		$s2 += self::mul($s12,  654183, 20);
2701
+		$s3 -= self::mul($s12,  997805, 20);
2702
+		$s4 += self::mul($s12,  136657, 18);
2703
+		$s5 -= self::mul($s12,  683901, 20);
2704
+		$s12 = 0;
2705
+
2706
+		$carry0 = $s0 >> 21;
2707
+		$s1 += $carry0;
2708
+		$s0 -= $carry0 << 21;
2709
+		$carry1 = $s1 >> 21;
2710
+		$s2 += $carry1;
2711
+		$s1 -= $carry1 << 21;
2712
+		$carry2 = $s2 >> 21;
2713
+		$s3 += $carry2;
2714
+		$s2 -= $carry2 << 21;
2715
+		$carry3 = $s3 >> 21;
2716
+		$s4 += $carry3;
2717
+		$s3 -= $carry3 << 21;
2718
+		$carry4 = $s4 >> 21;
2719
+		$s5 += $carry4;
2720
+		$s4 -= $carry4 << 21;
2721
+		$carry5 = $s5 >> 21;
2722
+		$s6 += $carry5;
2723
+		$s5 -= $carry5 << 21;
2724
+		$carry6 = $s6 >> 21;
2725
+		$s7 += $carry6;
2726
+		$s6 -= $carry6 << 21;
2727
+		$carry7 = $s7 >> 21;
2728
+		$s8 += $carry7;
2729
+		$s7 -= $carry7 << 21;
2730
+		$carry8 = $s8 >> 21;
2731
+		$s9 += $carry8;
2732
+		$s8 -= $carry8 << 21;
2733
+		$carry9 = $s9 >> 21;
2734
+		$s10 += $carry9;
2735
+		$s9 -= $carry9 << 21;
2736
+		$carry10 = $s10 >> 21;
2737
+		$s11 += $carry10;
2738
+		$s10 -= $carry10 << 21;
2739
+		$carry11 = $s11 >> 21;
2740
+		$s12 += $carry11;
2741
+		$s11 -= $carry11 << 21;
2742
+
2743
+		$s0 += self::mul($s12,  666643, 20);
2744
+		$s1 += self::mul($s12,  470296, 19);
2745
+		$s2 += self::mul($s12,  654183, 20);
2746
+		$s3 -= self::mul($s12,  997805, 20);
2747
+		$s4 += self::mul($s12,  136657, 18);
2748
+		$s5 -= self::mul($s12,  683901, 20);
2749
+
2750
+		$carry0 = $s0 >> 21;
2751
+		$s1 += $carry0;
2752
+		$s0 -= $carry0 << 21;
2753
+		$carry1 = $s1 >> 21;
2754
+		$s2 += $carry1;
2755
+		$s1 -= $carry1 << 21;
2756
+		$carry2 = $s2 >> 21;
2757
+		$s3 += $carry2;
2758
+		$s2 -= $carry2 << 21;
2759
+		$carry3 = $s3 >> 21;
2760
+		$s4 += $carry3;
2761
+		$s3 -= $carry3 << 21;
2762
+		$carry4 = $s4 >> 21;
2763
+		$s5 += $carry4;
2764
+		$s4 -= $carry4 << 21;
2765
+		$carry5 = $s5 >> 21;
2766
+		$s6 += $carry5;
2767
+		$s5 -= $carry5 << 21;
2768
+		$carry6 = $s6 >> 21;
2769
+		$s7 += $carry6;
2770
+		$s6 -= $carry6 << 21;
2771
+		$carry7 = $s7 >> 21;
2772
+		$s8 += $carry7;
2773
+		$s7 -= $carry7 << 21;
2774
+		$carry8 = $s8 >> 21;
2775
+		$s9 += $carry8;
2776
+		$s8 -= $carry8 << 21;
2777
+		$carry9 = $s9 >> 21;
2778
+		$s10 += $carry9;
2779
+		$s9 -= $carry9 << 21;
2780
+		$carry10 = $s10 >> 21;
2781
+		$s11 += $carry10;
2782
+		$s10 -= $carry10 << 21;
2783
+
2784
+		/**
2785
+		 * @var array<int, int>
2786
+		 */
2787
+		$arr = array(
2788
+			(int) ($s0 >> 0),
2789
+			(int) ($s0 >> 8),
2790
+			(int) (($s0 >> 16) | $s1 << 5),
2791
+			(int) ($s1 >> 3),
2792
+			(int) ($s1 >> 11),
2793
+			(int) (($s1 >> 19) | $s2 << 2),
2794
+			(int) ($s2 >> 6),
2795
+			(int) (($s2 >> 14) | $s3 << 7),
2796
+			(int) ($s3 >> 1),
2797
+			(int) ($s3 >> 9),
2798
+			(int) (($s3 >> 17) | $s4 << 4),
2799
+			(int) ($s4 >> 4),
2800
+			(int) ($s4 >> 12),
2801
+			(int) (($s4 >> 20) | $s5 << 1),
2802
+			(int) ($s5 >> 7),
2803
+			(int) (($s5 >> 15) | $s6 << 6),
2804
+			(int) ($s6 >> 2),
2805
+			(int) ($s6 >> 10),
2806
+			(int) (($s6 >> 18) | $s7 << 3),
2807
+			(int) ($s7 >> 5),
2808
+			(int) ($s7 >> 13),
2809
+			(int) ($s8 >> 0),
2810
+			(int) ($s8 >> 8),
2811
+			(int) (($s8 >> 16) | $s9 << 5),
2812
+			(int) ($s9 >> 3),
2813
+			(int) ($s9 >> 11),
2814
+			(int) (($s9 >> 19) | $s10 << 2),
2815
+			(int) ($s10 >> 6),
2816
+			(int) (($s10 >> 14) | $s11 << 7),
2817
+			(int) ($s11 >> 1),
2818
+			(int) ($s11 >> 9),
2819
+			(int) $s11 >> 17
2820
+		);
2821
+		return self::intArrayToString($arr);
2822
+	}
2823
+
2824
+	/**
2825
+	 * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493
2826
+	 *
2827
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
2828
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
2829
+	 */
2830
+	public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A)
2831
+	{
2832
+		$aslide = array(
2833
+			13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
2834
+			0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
2835
+			0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0,
2836
+			0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1,
2837
+			0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
2838
+			0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0,
2839
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2840
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2841
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2842
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2843
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2844
+			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
2845
+		);
2846
+
2847
+		/** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai size 8 */
2848
+		$Ai = array();
2849
+
2850
+		# ge_p3_to_cached(&Ai[0], A);
2851
+		$Ai[0] = self::ge_p3_to_cached($A);
2852
+		# ge_p3_dbl(&t, A);
2853
+		$t = self::ge_p3_dbl($A);
2854
+		# ge_p1p1_to_p3(&A2, &t);
2855
+		$A2 = self::ge_p1p1_to_p3($t);
2856
+
2857
+		for ($i = 1; $i < 8; ++$i) {
2858
+			# ge_add(&t, &A2, &Ai[0]);
2859
+			$t = self::ge_add($A2, $Ai[$i - 1]);
2860
+			# ge_p1p1_to_p3(&u, &t);
2861
+			$u = self::ge_p1p1_to_p3($t);
2862
+			# ge_p3_to_cached(&Ai[i], &u);
2863
+			$Ai[$i] = self::ge_p3_to_cached($u);
2864
+		}
2865
+
2866
+		$r = self::ge_p3_0();
2867
+		for ($i = 252; $i >= 0; --$i) {
2868
+			$t = self::ge_p3_dbl($r);
2869
+			if ($aslide[$i] > 0) {
2870
+				# ge_p1p1_to_p3(&u, &t);
2871
+				$u = self::ge_p1p1_to_p3($t);
2872
+				# ge_add(&t, &u, &Ai[aslide[i] / 2]);
2873
+				$t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]);
2874
+			} elseif ($aslide[$i] < 0) {
2875
+				# ge_p1p1_to_p3(&u, &t);
2876
+				$u = self::ge_p1p1_to_p3($t);
2877
+				# ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
2878
+				$t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]);
2879
+			}
2880
+		}
2881
+
2882
+		# ge_p1p1_to_p3(r, &t);
2883
+		return self::ge_p1p1_to_p3($t);
2884
+	}
2885
+
2886
+	/**
2887
+	 * @param string $a
2888
+	 * @param string $b
2889
+	 * @return string
2890
+	 */
2891
+	public static function sc25519_mul($a, $b)
2892
+	{
2893
+		//    int64_t a0  = 2097151 & load_3(a);
2894
+		//    int64_t a1  = 2097151 & (load_4(a + 2) >> 5);
2895
+		//    int64_t a2  = 2097151 & (load_3(a + 5) >> 2);
2896
+		//    int64_t a3  = 2097151 & (load_4(a + 7) >> 7);
2897
+		//    int64_t a4  = 2097151 & (load_4(a + 10) >> 4);
2898
+		//    int64_t a5  = 2097151 & (load_3(a + 13) >> 1);
2899
+		//    int64_t a6  = 2097151 & (load_4(a + 15) >> 6);
2900
+		//    int64_t a7  = 2097151 & (load_3(a + 18) >> 3);
2901
+		//    int64_t a8  = 2097151 & load_3(a + 21);
2902
+		//    int64_t a9  = 2097151 & (load_4(a + 23) >> 5);
2903
+		//    int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
2904
+		//    int64_t a11 = (load_4(a + 28) >> 7);
2905
+		$a0  = 2097151 &  self::load_3(self::substr($a, 0, 3));
2906
+		$a1  = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2907
+		$a2  = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2908
+		$a3  = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2909
+		$a4  = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2910
+		$a5  = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2911
+		$a6  = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2912
+		$a7  = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2913
+		$a8  = 2097151 &  self::load_3(self::substr($a, 21, 3));
2914
+		$a9  = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2915
+		$a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2916
+		$a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2917
+
2918
+		//    int64_t b0  = 2097151 & load_3(b);
2919
+		//    int64_t b1  = 2097151 & (load_4(b + 2) >> 5);
2920
+		//    int64_t b2  = 2097151 & (load_3(b + 5) >> 2);
2921
+		//    int64_t b3  = 2097151 & (load_4(b + 7) >> 7);
2922
+		//    int64_t b4  = 2097151 & (load_4(b + 10) >> 4);
2923
+		//    int64_t b5  = 2097151 & (load_3(b + 13) >> 1);
2924
+		//    int64_t b6  = 2097151 & (load_4(b + 15) >> 6);
2925
+		//    int64_t b7  = 2097151 & (load_3(b + 18) >> 3);
2926
+		//    int64_t b8  = 2097151 & load_3(b + 21);
2927
+		//    int64_t b9  = 2097151 & (load_4(b + 23) >> 5);
2928
+		//    int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
2929
+		//    int64_t b11 = (load_4(b + 28) >> 7);
2930
+		$b0  = 2097151 &  self::load_3(self::substr($b, 0, 3));
2931
+		$b1  = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2932
+		$b2  = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2933
+		$b3  = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2934
+		$b4  = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2935
+		$b5  = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2936
+		$b6  = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2937
+		$b7  = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2938
+		$b8  = 2097151 &  self::load_3(self::substr($b, 21, 3));
2939
+		$b9  = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2940
+		$b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2941
+		$b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2942
+
2943
+		//    s0 = a0 * b0;
2944
+		//    s1 = a0 * b1 + a1 * b0;
2945
+		//    s2 = a0 * b2 + a1 * b1 + a2 * b0;
2946
+		//    s3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
2947
+		//    s4 = a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
2948
+		//    s5 = a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
2949
+		//    s6 = a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
2950
+		//    s7 = a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 +
2951
+		//        a6 * b1 + a7 * b0;
2952
+		//    s8 = a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
2953
+		//        a6 * b2 + a7 * b1 + a8 * b0;
2954
+		//    s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
2955
+		//        a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
2956
+		//    s10 = a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
2957
+		//        a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
2958
+		//    s11 = a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
2959
+		//        a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
2960
+		//    s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 +
2961
+		//        a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
2962
+		//    s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 +
2963
+		//        a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2;
2964
+		//    s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 +
2965
+		//        a9 * b5 + a10 * b4 + a11 * b3;
2966
+		//    s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 +
2967
+		//        a10 * b5 + a11 * b4;
2968
+		//    s16 =
2969
+		//        a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
2970
+		//    s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
2971
+		//    s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
2972
+		//    s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
2973
+		//    s20 = a9 * b11 + a10 * b10 + a11 * b9;
2974
+		//    s21 = a10 * b11 + a11 * b10;
2975
+		//    s22 = a11 * b11;
2976
+		//    s23 = 0;
2977
+		$s0 = self::mul($a0, $b0, 22);
2978
+		$s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22);
2979
+		$s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22);
2980
+		$s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22);
2981
+		$s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) +
2982
+			self::mul($a4, $b0, 22);
2983
+		$s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) +
2984
+			self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22);
2985
+		$s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) +
2986
+			self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22);
2987
+		$s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) +
2988
+			self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22);
2989
+		$s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) +
2990
+			self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) +
2991
+			self::mul($a8, $b0, 22);
2992
+		$s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) +
2993
+			self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) +
2994
+			self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22);
2995
+		$s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) +
2996
+			self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) +
2997
+			self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22);
2998
+		$s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) +
2999
+			self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) +
3000
+			self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22);
3001
+		$s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) +
3002
+			self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) +
3003
+			self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22);
3004
+		$s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) +
3005
+			self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) +
3006
+			self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22);
3007
+		$s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) +
3008
+			self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) +
3009
+			self::mul($a11, $b3, 22);
3010
+		$s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) +
3011
+			self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22);
3012
+		$s16 =
3013
+			self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) +
3014
+			self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22);
3015
+		$s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) +
3016
+			self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22);
3017
+		$s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22)
3018
+			+ self::mul($a11, $b7, 22);
3019
+		$s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) +
3020
+			self::mul($a11, $b8, 22);
3021
+		$s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22);
3022
+		$s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22);
3023
+		$s22 = self::mul($a11, $b11, 22);
3024
+		$s23 = 0;
3025
+
3026
+		//    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3027
+		//    s1 += carry0;
3028
+		//    s0 -= carry0 * ((uint64_t) 1L << 21);
3029
+		$carry0 = ($s0 + (1 << 20)) >> 21;
3030
+		$s1 += $carry0;
3031
+		$s0 -= $carry0 << 21;
3032
+		//    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3033
+		//    s3 += carry2;
3034
+		//    s2 -= carry2 * ((uint64_t) 1L << 21);
3035
+		$carry2 = ($s2 + (1 << 20)) >> 21;
3036
+		$s3 += $carry2;
3037
+		$s2 -= $carry2 << 21;
3038
+		//    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3039
+		//    s5 += carry4;
3040
+		//    s4 -= carry4 * ((uint64_t) 1L << 21);
3041
+		$carry4 = ($s4 + (1 << 20)) >> 21;
3042
+		$s5 += $carry4;
3043
+		$s4 -= $carry4 << 21;
3044
+		//    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3045
+		//    s7 += carry6;
3046
+		//    s6 -= carry6 * ((uint64_t) 1L << 21);
3047
+		$carry6 = ($s6 + (1 << 20)) >> 21;
3048
+		$s7 += $carry6;
3049
+		$s6 -= $carry6 << 21;
3050
+		//    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3051
+		//    s9 += carry8;
3052
+		//    s8 -= carry8 * ((uint64_t) 1L << 21);
3053
+		$carry8 = ($s8 + (1 << 20)) >> 21;
3054
+		$s9 += $carry8;
3055
+		$s8 -= $carry8 << 21;
3056
+		//    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3057
+		//    s11 += carry10;
3058
+		//    s10 -= carry10 * ((uint64_t) 1L << 21);
3059
+		$carry10 = ($s10 + (1 << 20)) >> 21;
3060
+		$s11 += $carry10;
3061
+		$s10 -= $carry10 << 21;
3062
+		//    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3063
+		//    s13 += carry12;
3064
+		//    s12 -= carry12 * ((uint64_t) 1L << 21);
3065
+		$carry12 = ($s12 + (1 << 20)) >> 21;
3066
+		$s13 += $carry12;
3067
+		$s12 -= $carry12 << 21;
3068
+		//    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3069
+		//    s15 += carry14;
3070
+		//    s14 -= carry14 * ((uint64_t) 1L << 21);
3071
+		$carry14 = ($s14 + (1 << 20)) >> 21;
3072
+		$s15 += $carry14;
3073
+		$s14 -= $carry14 << 21;
3074
+		//    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3075
+		//    s17 += carry16;
3076
+		//    s16 -= carry16 * ((uint64_t) 1L << 21);
3077
+		$carry16 = ($s16 + (1 << 20)) >> 21;
3078
+		$s17 += $carry16;
3079
+		$s16 -= $carry16 << 21;
3080
+		//    carry18 = (s18 + (int64_t) (1L << 20)) >> 21;
3081
+		//    s19 += carry18;
3082
+		//    s18 -= carry18 * ((uint64_t) 1L << 21);
3083
+		$carry18 = ($s18 + (1 << 20)) >> 21;
3084
+		$s19 += $carry18;
3085
+		$s18 -= $carry18 << 21;
3086
+		//    carry20 = (s20 + (int64_t) (1L << 20)) >> 21;
3087
+		//    s21 += carry20;
3088
+		//    s20 -= carry20 * ((uint64_t) 1L << 21);
3089
+		$carry20 = ($s20 + (1 << 20)) >> 21;
3090
+		$s21 += $carry20;
3091
+		$s20 -= $carry20 << 21;
3092
+		//    carry22 = (s22 + (int64_t) (1L << 20)) >> 21;
3093
+		//    s23 += carry22;
3094
+		//    s22 -= carry22 * ((uint64_t) 1L << 21);
3095
+		$carry22 = ($s22 + (1 << 20)) >> 21;
3096
+		$s23 += $carry22;
3097
+		$s22 -= $carry22 << 21;
3098
+
3099
+		//    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3100
+		//    s2 += carry1;
3101
+		//    s1 -= carry1 * ((uint64_t) 1L << 21);
3102
+		$carry1 = ($s1 + (1 << 20)) >> 21;
3103
+		$s2 += $carry1;
3104
+		$s1 -= $carry1 << 21;
3105
+		//    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3106
+		//    s4 += carry3;
3107
+		//    s3 -= carry3 * ((uint64_t) 1L << 21);
3108
+		$carry3 = ($s3 + (1 << 20)) >> 21;
3109
+		$s4 += $carry3;
3110
+		$s3 -= $carry3 << 21;
3111
+		//    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3112
+		//    s6 += carry5;
3113
+		//    s5 -= carry5 * ((uint64_t) 1L << 21);
3114
+		$carry5 = ($s5 + (1 << 20)) >> 21;
3115
+		$s6 += $carry5;
3116
+		$s5 -= $carry5 << 21;
3117
+		//    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3118
+		//    s8 += carry7;
3119
+		//    s7 -= carry7 * ((uint64_t) 1L << 21);
3120
+		$carry7 = ($s7 + (1 << 20)) >> 21;
3121
+		$s8 += $carry7;
3122
+		$s7 -= $carry7 << 21;
3123
+		//    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3124
+		//    s10 += carry9;
3125
+		//    s9 -= carry9 * ((uint64_t) 1L << 21);
3126
+		$carry9 = ($s9 + (1 << 20)) >> 21;
3127
+		$s10 += $carry9;
3128
+		$s9 -= $carry9 << 21;
3129
+		//    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3130
+		//    s12 += carry11;
3131
+		//    s11 -= carry11 * ((uint64_t) 1L << 21);
3132
+		$carry11 = ($s11 + (1 << 20)) >> 21;
3133
+		$s12 += $carry11;
3134
+		$s11 -= $carry11 << 21;
3135
+		//    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3136
+		//    s14 += carry13;
3137
+		//    s13 -= carry13 * ((uint64_t) 1L << 21);
3138
+		$carry13 = ($s13 + (1 << 20)) >> 21;
3139
+		$s14 += $carry13;
3140
+		$s13 -= $carry13 << 21;
3141
+		//    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3142
+		//    s16 += carry15;
3143
+		//    s15 -= carry15 * ((uint64_t) 1L << 21);
3144
+		$carry15 = ($s15 + (1 << 20)) >> 21;
3145
+		$s16 += $carry15;
3146
+		$s15 -= $carry15 << 21;
3147
+		//    carry17 = (s17 + (int64_t) (1L << 20)) >> 21;
3148
+		//    s18 += carry17;
3149
+		//    s17 -= carry17 * ((uint64_t) 1L << 21);
3150
+		$carry17 = ($s17 + (1 << 20)) >> 21;
3151
+		$s18 += $carry17;
3152
+		$s17 -= $carry17 << 21;
3153
+		//    carry19 = (s19 + (int64_t) (1L << 20)) >> 21;
3154
+		//    s20 += carry19;
3155
+		//    s19 -= carry19 * ((uint64_t) 1L << 21);
3156
+		$carry19 = ($s19 + (1 << 20)) >> 21;
3157
+		$s20 += $carry19;
3158
+		$s19 -= $carry19 << 21;
3159
+		//    carry21 = (s21 + (int64_t) (1L << 20)) >> 21;
3160
+		//    s22 += carry21;
3161
+		//    s21 -= carry21 * ((uint64_t) 1L << 21);
3162
+		$carry21 = ($s21 + (1 << 20)) >> 21;
3163
+		$s22 += $carry21;
3164
+		$s21 -= $carry21 << 21;
3165
+
3166
+		//    s11 += s23 * 666643;
3167
+		//    s12 += s23 * 470296;
3168
+		//    s13 += s23 * 654183;
3169
+		//    s14 -= s23 * 997805;
3170
+		//    s15 += s23 * 136657;
3171
+		//    s16 -= s23 * 683901;
3172
+		$s11 += self::mul($s23, 666643, 20);
3173
+		$s12 += self::mul($s23, 470296, 19);
3174
+		$s13 += self::mul($s23, 654183, 20);
3175
+		$s14 -= self::mul($s23, 997805, 20);
3176
+		$s15 += self::mul($s23, 136657, 18);
3177
+		$s16 -= self::mul($s23, 683901, 20);
3178
+
3179
+		//    s10 += s22 * 666643;
3180
+		//    s11 += s22 * 470296;
3181
+		//    s12 += s22 * 654183;
3182
+		//    s13 -= s22 * 997805;
3183
+		//    s14 += s22 * 136657;
3184
+		//    s15 -= s22 * 683901;
3185
+		$s10 += self::mul($s22, 666643, 20);
3186
+		$s11 += self::mul($s22, 470296, 19);
3187
+		$s12 += self::mul($s22, 654183, 20);
3188
+		$s13 -= self::mul($s22, 997805, 20);
3189
+		$s14 += self::mul($s22, 136657, 18);
3190
+		$s15 -= self::mul($s22, 683901, 20);
3191
+
3192
+		//    s9 += s21 * 666643;
3193
+		//    s10 += s21 * 470296;
3194
+		//    s11 += s21 * 654183;
3195
+		//    s12 -= s21 * 997805;
3196
+		//    s13 += s21 * 136657;
3197
+		//    s14 -= s21 * 683901;
3198
+		$s9 += self::mul($s21, 666643, 20);
3199
+		$s10 += self::mul($s21, 470296, 19);
3200
+		$s11 += self::mul($s21, 654183, 20);
3201
+		$s12 -= self::mul($s21, 997805, 20);
3202
+		$s13 += self::mul($s21, 136657, 18);
3203
+		$s14 -= self::mul($s21, 683901, 20);
3204
+
3205
+		//    s8 += s20 * 666643;
3206
+		//    s9 += s20 * 470296;
3207
+		//    s10 += s20 * 654183;
3208
+		//    s11 -= s20 * 997805;
3209
+		//    s12 += s20 * 136657;
3210
+		//    s13 -= s20 * 683901;
3211
+		$s8 += self::mul($s20, 666643, 20);
3212
+		$s9 += self::mul($s20, 470296, 19);
3213
+		$s10 += self::mul($s20, 654183, 20);
3214
+		$s11 -= self::mul($s20, 997805, 20);
3215
+		$s12 += self::mul($s20, 136657, 18);
3216
+		$s13 -= self::mul($s20, 683901, 20);
3217
+
3218
+		//    s7 += s19 * 666643;
3219
+		//    s8 += s19 * 470296;
3220
+		//    s9 += s19 * 654183;
3221
+		//    s10 -= s19 * 997805;
3222
+		//    s11 += s19 * 136657;
3223
+		//    s12 -= s19 * 683901;
3224
+		$s7 += self::mul($s19, 666643, 20);
3225
+		$s8 += self::mul($s19, 470296, 19);
3226
+		$s9 += self::mul($s19, 654183, 20);
3227
+		$s10 -= self::mul($s19, 997805, 20);
3228
+		$s11 += self::mul($s19, 136657, 18);
3229
+		$s12 -= self::mul($s19, 683901, 20);
3230
+
3231
+		//    s6 += s18 * 666643;
3232
+		//    s7 += s18 * 470296;
3233
+		//    s8 += s18 * 654183;
3234
+		//    s9 -= s18 * 997805;
3235
+		//    s10 += s18 * 136657;
3236
+		//    s11 -= s18 * 683901;
3237
+		$s6 += self::mul($s18, 666643, 20);
3238
+		$s7 += self::mul($s18, 470296, 19);
3239
+		$s8 += self::mul($s18, 654183, 20);
3240
+		$s9 -= self::mul($s18, 997805, 20);
3241
+		$s10 += self::mul($s18, 136657, 18);
3242
+		$s11 -= self::mul($s18, 683901, 20);
3243
+
3244
+		//    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3245
+		//    s7 += carry6;
3246
+		//    s6 -= carry6 * ((uint64_t) 1L << 21);
3247
+		$carry6 = ($s6 + (1 << 20)) >> 21;
3248
+		$s7 += $carry6;
3249
+		$s6 -= $carry6 << 21;
3250
+		//    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3251
+		//    s9 += carry8;
3252
+		//    s8 -= carry8 * ((uint64_t) 1L << 21);
3253
+		$carry8 = ($s8 + (1 << 20)) >> 21;
3254
+		$s9 += $carry8;
3255
+		$s8 -= $carry8 << 21;
3256
+		//    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3257
+		//    s11 += carry10;
3258
+		//    s10 -= carry10 * ((uint64_t) 1L << 21);
3259
+		$carry10 = ($s10 + (1 << 20)) >> 21;
3260
+		$s11 += $carry10;
3261
+		$s10 -= $carry10 << 21;
3262
+		//    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3263
+		//    s13 += carry12;
3264
+		//    s12 -= carry12 * ((uint64_t) 1L << 21);
3265
+		$carry12 = ($s12 + (1 << 20)) >> 21;
3266
+		$s13 += $carry12;
3267
+		$s12 -= $carry12 << 21;
3268
+		//    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3269
+		//    s15 += carry14;
3270
+		//    s14 -= carry14 * ((uint64_t) 1L << 21);
3271
+		$carry14 = ($s14 + (1 << 20)) >> 21;
3272
+		$s15 += $carry14;
3273
+		$s14 -= $carry14 << 21;
3274
+		//    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3275
+		//    s17 += carry16;
3276
+		//    s16 -= carry16 * ((uint64_t) 1L << 21);
3277
+		$carry16 = ($s16 + (1 << 20)) >> 21;
3278
+		$s17 += $carry16;
3279
+		$s16 -= $carry16 << 21;
3280
+
3281
+		//    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3282
+		//    s8 += carry7;
3283
+		//    s7 -= carry7 * ((uint64_t) 1L << 21);
3284
+		$carry7 = ($s7 + (1 << 20)) >> 21;
3285
+		$s8 += $carry7;
3286
+		$s7 -= $carry7 << 21;
3287
+		//    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3288
+		//    s10 += carry9;
3289
+		//    s9 -= carry9 * ((uint64_t) 1L << 21);
3290
+		$carry9 = ($s9 + (1 << 20)) >> 21;
3291
+		$s10 += $carry9;
3292
+		$s9 -= $carry9 << 21;
3293
+		//    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3294
+		//    s12 += carry11;
3295
+		//    s11 -= carry11 * ((uint64_t) 1L << 21);
3296
+		$carry11 = ($s11 + (1 << 20)) >> 21;
3297
+		$s12 += $carry11;
3298
+		$s11 -= $carry11 << 21;
3299
+		//    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3300
+		//    s14 += carry13;
3301
+		//    s13 -= carry13 * ((uint64_t) 1L << 21);
3302
+		$carry13 = ($s13 + (1 << 20)) >> 21;
3303
+		$s14 += $carry13;
3304
+		$s13 -= $carry13 << 21;
3305
+		//    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3306
+		//    s16 += carry15;
3307
+		//    s15 -= carry15 * ((uint64_t) 1L << 21);
3308
+		$carry15 = ($s15 + (1 << 20)) >> 21;
3309
+		$s16 += $carry15;
3310
+		$s15 -= $carry15 << 21;
3311
+
3312
+		//    s5 += s17 * 666643;
3313
+		//    s6 += s17 * 470296;
3314
+		//    s7 += s17 * 654183;
3315
+		//    s8 -= s17 * 997805;
3316
+		//    s9 += s17 * 136657;
3317
+		//    s10 -= s17 * 683901;
3318
+		$s5 += self::mul($s17, 666643, 20);
3319
+		$s6 += self::mul($s17, 470296, 19);
3320
+		$s7 += self::mul($s17, 654183, 20);
3321
+		$s8 -= self::mul($s17, 997805, 20);
3322
+		$s9 += self::mul($s17, 136657, 18);
3323
+		$s10 -= self::mul($s17, 683901, 20);
3324
+
3325
+		//    s4 += s16 * 666643;
3326
+		//    s5 += s16 * 470296;
3327
+		//    s6 += s16 * 654183;
3328
+		//    s7 -= s16 * 997805;
3329
+		//    s8 += s16 * 136657;
3330
+		//    s9 -= s16 * 683901;
3331
+		$s4 += self::mul($s16, 666643, 20);
3332
+		$s5 += self::mul($s16, 470296, 19);
3333
+		$s6 += self::mul($s16, 654183, 20);
3334
+		$s7 -= self::mul($s16, 997805, 20);
3335
+		$s8 += self::mul($s16, 136657, 18);
3336
+		$s9 -= self::mul($s16, 683901, 20);
3337
+
3338
+		//    s3 += s15 * 666643;
3339
+		//    s4 += s15 * 470296;
3340
+		//    s5 += s15 * 654183;
3341
+		//    s6 -= s15 * 997805;
3342
+		//    s7 += s15 * 136657;
3343
+		//    s8 -= s15 * 683901;
3344
+		$s3 += self::mul($s15, 666643, 20);
3345
+		$s4 += self::mul($s15, 470296, 19);
3346
+		$s5 += self::mul($s15, 654183, 20);
3347
+		$s6 -= self::mul($s15, 997805, 20);
3348
+		$s7 += self::mul($s15, 136657, 18);
3349
+		$s8 -= self::mul($s15, 683901, 20);
3350
+
3351
+		//    s2 += s14 * 666643;
3352
+		//    s3 += s14 * 470296;
3353
+		//    s4 += s14 * 654183;
3354
+		//    s5 -= s14 * 997805;
3355
+		//    s6 += s14 * 136657;
3356
+		//    s7 -= s14 * 683901;
3357
+		$s2 += self::mul($s14, 666643, 20);
3358
+		$s3 += self::mul($s14, 470296, 19);
3359
+		$s4 += self::mul($s14, 654183, 20);
3360
+		$s5 -= self::mul($s14, 997805, 20);
3361
+		$s6 += self::mul($s14, 136657, 18);
3362
+		$s7 -= self::mul($s14, 683901, 20);
3363
+
3364
+		//    s1 += s13 * 666643;
3365
+		//    s2 += s13 * 470296;
3366
+		//    s3 += s13 * 654183;
3367
+		//    s4 -= s13 * 997805;
3368
+		//    s5 += s13 * 136657;
3369
+		//    s6 -= s13 * 683901;
3370
+		$s1 += self::mul($s13, 666643, 20);
3371
+		$s2 += self::mul($s13, 470296, 19);
3372
+		$s3 += self::mul($s13, 654183, 20);
3373
+		$s4 -= self::mul($s13, 997805, 20);
3374
+		$s5 += self::mul($s13, 136657, 18);
3375
+		$s6 -= self::mul($s13, 683901, 20);
3376
+
3377
+		//    s0 += s12 * 666643;
3378
+		//    s1 += s12 * 470296;
3379
+		//    s2 += s12 * 654183;
3380
+		//    s3 -= s12 * 997805;
3381
+		//    s4 += s12 * 136657;
3382
+		//    s5 -= s12 * 683901;
3383
+		//    s12 = 0;
3384
+		$s0 += self::mul($s12, 666643, 20);
3385
+		$s1 += self::mul($s12, 470296, 19);
3386
+		$s2 += self::mul($s12, 654183, 20);
3387
+		$s3 -= self::mul($s12, 997805, 20);
3388
+		$s4 += self::mul($s12, 136657, 18);
3389
+		$s5 -= self::mul($s12, 683901, 20);
3390
+		$s12 = 0;
3391
+
3392
+		//    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3393
+		//    s1 += carry0;
3394
+		//    s0 -= carry0 * ((uint64_t) 1L << 21);
3395
+		$carry0 = ($s0 + (1 << 20)) >> 21;
3396
+		$s1 += $carry0;
3397
+		$s0 -= $carry0 << 21;
3398
+		//    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3399
+		//    s3 += carry2;
3400
+		//    s2 -= carry2 * ((uint64_t) 1L << 21);
3401
+		$carry2 = ($s2 + (1 << 20)) >> 21;
3402
+		$s3 += $carry2;
3403
+		$s2 -= $carry2 << 21;
3404
+		//    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3405
+		//    s5 += carry4;
3406
+		//    s4 -= carry4 * ((uint64_t) 1L << 21);
3407
+		$carry4 = ($s4 + (1 << 20)) >> 21;
3408
+		$s5 += $carry4;
3409
+		$s4 -= $carry4 << 21;
3410
+		//    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3411
+		//    s7 += carry6;
3412
+		//    s6 -= carry6 * ((uint64_t) 1L << 21);
3413
+		$carry6 = ($s6 + (1 << 20)) >> 21;
3414
+		$s7 += $carry6;
3415
+		$s6 -= $carry6 << 21;
3416
+		//    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3417
+		//    s9 += carry8;
3418
+		//    s8 -= carry8 * ((uint64_t) 1L << 21);
3419
+		$carry8 = ($s8 + (1 << 20)) >> 21;
3420
+		$s9 += $carry8;
3421
+		$s8 -= $carry8 << 21;
3422
+		//    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3423
+		//    s11 += carry10;
3424
+		//    s10 -= carry10 * ((uint64_t) 1L << 21);
3425
+		$carry10 = ($s10 + (1 << 20)) >> 21;
3426
+		$s11 += $carry10;
3427
+		$s10 -= $carry10 << 21;
3428
+
3429
+		//    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3430
+		//    s2 += carry1;
3431
+		//    s1 -= carry1 * ((uint64_t) 1L << 21);
3432
+		$carry1 = ($s1 + (1 << 20)) >> 21;
3433
+		$s2 += $carry1;
3434
+		$s1 -= $carry1 << 21;
3435
+		//    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3436
+		//    s4 += carry3;
3437
+		//    s3 -= carry3 * ((uint64_t) 1L << 21);
3438
+		$carry3 = ($s3 + (1 << 20)) >> 21;
3439
+		$s4 += $carry3;
3440
+		$s3 -= $carry3 << 21;
3441
+		//    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3442
+		//    s6 += carry5;
3443
+		//    s5 -= carry5 * ((uint64_t) 1L << 21);
3444
+		$carry5 = ($s5 + (1 << 20)) >> 21;
3445
+		$s6 += $carry5;
3446
+		$s5 -= $carry5 << 21;
3447
+		//    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3448
+		//    s8 += carry7;
3449
+		//    s7 -= carry7 * ((uint64_t) 1L << 21);
3450
+		$carry7 = ($s7 + (1 << 20)) >> 21;
3451
+		$s8 += $carry7;
3452
+		$s7 -= $carry7 << 21;
3453
+		//    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3454
+		//    s10 += carry9;
3455
+		//    s9 -= carry9 * ((uint64_t) 1L << 21);
3456
+		$carry9 = ($s9 + (1 << 20)) >> 21;
3457
+		$s10 += $carry9;
3458
+		$s9 -= $carry9 << 21;
3459
+		//    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3460
+		//    s12 += carry11;
3461
+		//    s11 -= carry11 * ((uint64_t) 1L << 21);
3462
+		$carry11 = ($s11 + (1 << 20)) >> 21;
3463
+		$s12 += $carry11;
3464
+		$s11 -= $carry11 << 21;
3465
+
3466
+		//    s0 += s12 * 666643;
3467
+		//    s1 += s12 * 470296;
3468
+		//    s2 += s12 * 654183;
3469
+		//    s3 -= s12 * 997805;
3470
+		//    s4 += s12 * 136657;
3471
+		//    s5 -= s12 * 683901;
3472
+		//    s12 = 0;
3473
+		$s0 += self::mul($s12, 666643, 20);
3474
+		$s1 += self::mul($s12, 470296, 19);
3475
+		$s2 += self::mul($s12, 654183, 20);
3476
+		$s3 -= self::mul($s12, 997805, 20);
3477
+		$s4 += self::mul($s12, 136657, 18);
3478
+		$s5 -= self::mul($s12, 683901, 20);
3479
+		$s12 = 0;
3480
+
3481
+		//    carry0 = s0 >> 21;
3482
+		//    s1 += carry0;
3483
+		//    s0 -= carry0 * ((uint64_t) 1L << 21);
3484
+		$carry0 = $s0 >> 21;
3485
+		$s1 += $carry0;
3486
+		$s0 -= $carry0 << 21;
3487
+		//    carry1 = s1 >> 21;
3488
+		//    s2 += carry1;
3489
+		//    s1 -= carry1 * ((uint64_t) 1L << 21);
3490
+		$carry1 = $s1 >> 21;
3491
+		$s2 += $carry1;
3492
+		$s1 -= $carry1 << 21;
3493
+		//    carry2 = s2 >> 21;
3494
+		//    s3 += carry2;
3495
+		//    s2 -= carry2 * ((uint64_t) 1L << 21);
3496
+		$carry2 = $s2 >> 21;
3497
+		$s3 += $carry2;
3498
+		$s2 -= $carry2 << 21;
3499
+		//    carry3 = s3 >> 21;
3500
+		//    s4 += carry3;
3501
+		//    s3 -= carry3 * ((uint64_t) 1L << 21);
3502
+		$carry3 = $s3 >> 21;
3503
+		$s4 += $carry3;
3504
+		$s3 -= $carry3 << 21;
3505
+		//    carry4 = s4 >> 21;
3506
+		//    s5 += carry4;
3507
+		//    s4 -= carry4 * ((uint64_t) 1L << 21);
3508
+		$carry4 = $s4 >> 21;
3509
+		$s5 += $carry4;
3510
+		$s4 -= $carry4 << 21;
3511
+		//    carry5 = s5 >> 21;
3512
+		//    s6 += carry5;
3513
+		//    s5 -= carry5 * ((uint64_t) 1L << 21);
3514
+		$carry5 = $s5 >> 21;
3515
+		$s6 += $carry5;
3516
+		$s5 -= $carry5 << 21;
3517
+		//    carry6 = s6 >> 21;
3518
+		//    s7 += carry6;
3519
+		//    s6 -= carry6 * ((uint64_t) 1L << 21);
3520
+		$carry6 = $s6 >> 21;
3521
+		$s7 += $carry6;
3522
+		$s6 -= $carry6 << 21;
3523
+		//    carry7 = s7 >> 21;
3524
+		//    s8 += carry7;
3525
+		//    s7 -= carry7 * ((uint64_t) 1L << 21);
3526
+		$carry7 = $s7 >> 21;
3527
+		$s8 += $carry7;
3528
+		$s7 -= $carry7 << 21;
3529
+		//    carry8 = s8 >> 21;
3530
+		//    s9 += carry8;
3531
+		//    s8 -= carry8 * ((uint64_t) 1L << 21);
3532
+		$carry8 = $s8 >> 21;
3533
+		$s9 += $carry8;
3534
+		$s8 -= $carry8 << 21;
3535
+		//    carry9 = s9 >> 21;
3536
+		//    s10 += carry9;
3537
+		//    s9 -= carry9 * ((uint64_t) 1L << 21);
3538
+		$carry9 = $s9 >> 21;
3539
+		$s10 += $carry9;
3540
+		$s9 -= $carry9 << 21;
3541
+		//    carry10 = s10 >> 21;
3542
+		//    s11 += carry10;
3543
+		//    s10 -= carry10 * ((uint64_t) 1L << 21);
3544
+		$carry10 = $s10 >> 21;
3545
+		$s11 += $carry10;
3546
+		$s10 -= $carry10 << 21;
3547
+		//    carry11 = s11 >> 21;
3548
+		//    s12 += carry11;
3549
+		//    s11 -= carry11 * ((uint64_t) 1L << 21);
3550
+		$carry11 = $s11 >> 21;
3551
+		$s12 += $carry11;
3552
+		$s11 -= $carry11 << 21;
3553
+
3554
+		//    s0 += s12 * 666643;
3555
+		//    s1 += s12 * 470296;
3556
+		//    s2 += s12 * 654183;
3557
+		//    s3 -= s12 * 997805;
3558
+		//    s4 += s12 * 136657;
3559
+		//    s5 -= s12 * 683901;
3560
+		$s0 += self::mul($s12, 666643, 20);
3561
+		$s1 += self::mul($s12, 470296, 19);
3562
+		$s2 += self::mul($s12, 654183, 20);
3563
+		$s3 -= self::mul($s12, 997805, 20);
3564
+		$s4 += self::mul($s12, 136657, 18);
3565
+		$s5 -= self::mul($s12, 683901, 20);
3566
+
3567
+		//    carry0 = s0 >> 21;
3568
+		//    s1 += carry0;
3569
+		//    s0 -= carry0 * ((uint64_t) 1L << 21);
3570
+		$carry0 = $s0 >> 21;
3571
+		$s1 += $carry0;
3572
+		$s0 -= $carry0 << 21;
3573
+		//    carry1 = s1 >> 21;
3574
+		//    s2 += carry1;
3575
+		//    s1 -= carry1 * ((uint64_t) 1L << 21);
3576
+		$carry1 = $s1 >> 21;
3577
+		$s2 += $carry1;
3578
+		$s1 -= $carry1 << 21;
3579
+		//    carry2 = s2 >> 21;
3580
+		//    s3 += carry2;
3581
+		//    s2 -= carry2 * ((uint64_t) 1L << 21);
3582
+		$carry2 = $s2 >> 21;
3583
+		$s3 += $carry2;
3584
+		$s2 -= $carry2 << 21;
3585
+		//    carry3 = s3 >> 21;
3586
+		//    s4 += carry3;
3587
+		//    s3 -= carry3 * ((uint64_t) 1L << 21);
3588
+		$carry3 = $s3 >> 21;
3589
+		$s4 += $carry3;
3590
+		$s3 -= $carry3 << 21;
3591
+		//    carry4 = s4 >> 21;
3592
+		//    s5 += carry4;
3593
+		//    s4 -= carry4 * ((uint64_t) 1L << 21);
3594
+		$carry4 = $s4 >> 21;
3595
+		$s5 += $carry4;
3596
+		$s4 -= $carry4 << 21;
3597
+		//    carry5 = s5 >> 21;
3598
+		//    s6 += carry5;
3599
+		//    s5 -= carry5 * ((uint64_t) 1L << 21);
3600
+		$carry5 = $s5 >> 21;
3601
+		$s6 += $carry5;
3602
+		$s5 -= $carry5 << 21;
3603
+		//    carry6 = s6 >> 21;
3604
+		//    s7 += carry6;
3605
+		//    s6 -= carry6 * ((uint64_t) 1L << 21);
3606
+		$carry6 = $s6 >> 21;
3607
+		$s7 += $carry6;
3608
+		$s6 -= $carry6 << 21;
3609
+		//    carry7 = s7 >> 21;
3610
+		//    s8 += carry7;
3611
+		//    s7 -= carry7 * ((uint64_t) 1L << 21);
3612
+		$carry7 = $s7 >> 21;
3613
+		$s8 += $carry7;
3614
+		$s7 -= $carry7 << 21;
3615
+		//    carry8 = s8 >> 21;
3616
+		//    s9 += carry8;
3617
+		//    s8 -= carry8 * ((uint64_t) 1L << 21);
3618
+		$carry8 = $s8 >> 21;
3619
+		$s9 += $carry8;
3620
+		$s8 -= $carry8 << 21;
3621
+		//    carry9 = s9 >> 21;
3622
+		//    s10 += carry9;
3623
+		//    s9 -= carry9 * ((uint64_t) 1L << 21);
3624
+		$carry9 = $s9 >> 21;
3625
+		$s10 += $carry9;
3626
+		$s9 -= $carry9 << 21;
3627
+		//    carry10 = s10 >> 21;
3628
+		//    s11 += carry10;
3629
+		//    s10 -= carry10 * ((uint64_t) 1L << 21);
3630
+		$carry10 = $s10 >> 21;
3631
+		$s11 += $carry10;
3632
+		$s10 -= $carry10 << 21;
3633
+
3634
+		$s = array_fill(0, 32, 0);
3635
+		// s[0]  = s0 >> 0;
3636
+		$s[0]  = $s0 >> 0;
3637
+		// s[1]  = s0 >> 8;
3638
+		$s[1]  = $s0 >> 8;
3639
+		// s[2]  = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5));
3640
+		$s[2]  = ($s0 >> 16) | ($s1 << 5);
3641
+		// s[3]  = s1 >> 3;
3642
+		$s[3]  = $s1 >> 3;
3643
+		// s[4]  = s1 >> 11;
3644
+		$s[4]  = $s1 >> 11;
3645
+		// s[5]  = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2));
3646
+		$s[5]  = ($s1 >> 19) | ($s2 << 2);
3647
+		// s[6]  = s2 >> 6;
3648
+		$s[6]  = $s2 >> 6;
3649
+		// s[7]  = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7));
3650
+		$s[7]  = ($s2 >> 14) | ($s3 << 7);
3651
+		// s[8]  = s3 >> 1;
3652
+		$s[8]  = $s3 >> 1;
3653
+		// s[9]  = s3 >> 9;
3654
+		$s[9]  = $s3 >> 9;
3655
+		// s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4));
3656
+		$s[10] = ($s3 >> 17) | ($s4 << 4);
3657
+		// s[11] = s4 >> 4;
3658
+		$s[11] = $s4 >> 4;
3659
+		// s[12] = s4 >> 12;
3660
+		$s[12] = $s4 >> 12;
3661
+		// s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1));
3662
+		$s[13] = ($s4 >> 20) | ($s5 << 1);
3663
+		// s[14] = s5 >> 7;
3664
+		$s[14] = $s5 >> 7;
3665
+		// s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6));
3666
+		$s[15] = ($s5 >> 15) | ($s6 << 6);
3667
+		// s[16] = s6 >> 2;
3668
+		$s[16] = $s6 >> 2;
3669
+		// s[17] = s6 >> 10;
3670
+		$s[17] = $s6 >> 10;
3671
+		// s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3));
3672
+		$s[18] = ($s6 >> 18) | ($s7 << 3);
3673
+		// s[19] = s7 >> 5;
3674
+		$s[19] = $s7 >> 5;
3675
+		// s[20] = s7 >> 13;
3676
+		$s[20] = $s7 >> 13;
3677
+		// s[21] = s8 >> 0;
3678
+		$s[21] = $s8 >> 0;
3679
+		// s[22] = s8 >> 8;
3680
+		$s[22] = $s8 >> 8;
3681
+		// s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5));
3682
+		$s[23] = ($s8 >> 16) | ($s9 << 5);
3683
+		// s[24] = s9 >> 3;
3684
+		$s[24] = $s9 >> 3;
3685
+		// s[25] = s9 >> 11;
3686
+		$s[25] = $s9 >> 11;
3687
+		// s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2));
3688
+		$s[26] = ($s9 >> 19) | ($s10 << 2);
3689
+		// s[27] = s10 >> 6;
3690
+		$s[27] = $s10 >> 6;
3691
+		// s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7));
3692
+		$s[28] = ($s10 >> 14) | ($s11 << 7);
3693
+		// s[29] = s11 >> 1;
3694
+		$s[29] = $s11 >> 1;
3695
+		// s[30] = s11 >> 9;
3696
+		$s[30] = $s11 >> 9;
3697
+		// s[31] = s11 >> 17;
3698
+		$s[31] = $s11 >> 17;
3699
+		return self::intArrayToString($s);
3700
+	}
3701
+
3702
+	/**
3703
+	 * @param string $s
3704
+	 * @return string
3705
+	 */
3706
+	public static function sc25519_sq($s)
3707
+	{
3708
+		return self::sc25519_mul($s, $s);
3709
+	}
3710
+
3711
+	/**
3712
+	 * @param string $s
3713
+	 * @param int $n
3714
+	 * @param string $a
3715
+	 * @return string
3716
+	 */
3717
+	public static function sc25519_sqmul($s, $n, $a)
3718
+	{
3719
+		for ($i = 0; $i < $n; ++$i) {
3720
+			$s = self::sc25519_sq($s);
3721
+		}
3722
+		return self::sc25519_mul($s, $a);
3723
+	}
3724
+
3725
+	/**
3726
+	 * @param string $s
3727
+	 * @return string
3728
+	 */
3729
+	public static function sc25519_invert($s)
3730
+	{
3731
+		$_10 = self::sc25519_sq($s);
3732
+		$_11 = self::sc25519_mul($s, $_10);
3733
+		$_100 = self::sc25519_mul($s, $_11);
3734
+		$_1000 = self::sc25519_sq($_100);
3735
+		$_1010 = self::sc25519_mul($_10, $_1000);
3736
+		$_1011 = self::sc25519_mul($s, $_1010);
3737
+		$_10000 = self::sc25519_sq($_1000);
3738
+		$_10110 = self::sc25519_sq($_1011);
3739
+		$_100000 = self::sc25519_mul($_1010, $_10110);
3740
+		$_100110 = self::sc25519_mul($_10000, $_10110);
3741
+		$_1000000 = self::sc25519_sq($_100000);
3742
+		$_1010000 = self::sc25519_mul($_10000, $_1000000);
3743
+		$_1010011 = self::sc25519_mul($_11, $_1010000);
3744
+		$_1100011 = self::sc25519_mul($_10000, $_1010011);
3745
+		$_1100111 = self::sc25519_mul($_100, $_1100011);
3746
+		$_1101011 = self::sc25519_mul($_100, $_1100111);
3747
+		$_10010011 = self::sc25519_mul($_1000000, $_1010011);
3748
+		$_10010111 = self::sc25519_mul($_100, $_10010011);
3749
+		$_10111101 = self::sc25519_mul($_100110, $_10010111);
3750
+		$_11010011 = self::sc25519_mul($_10110, $_10111101);
3751
+		$_11100111 = self::sc25519_mul($_1010000, $_10010111);
3752
+		$_11101011 = self::sc25519_mul($_100, $_11100111);
3753
+		$_11110101 = self::sc25519_mul($_1010, $_11101011);
3754
+
3755
+		$recip = self::sc25519_mul($_1011, $_11110101);
3756
+		$recip = self::sc25519_sqmul($recip, 126, $_1010011);
3757
+		$recip = self::sc25519_sqmul($recip, 9, $_10);
3758
+		$recip = self::sc25519_mul($recip, $_11110101);
3759
+		$recip = self::sc25519_sqmul($recip, 7, $_1100111);
3760
+		$recip = self::sc25519_sqmul($recip, 9, $_11110101);
3761
+		$recip = self::sc25519_sqmul($recip, 11, $_10111101);
3762
+		$recip = self::sc25519_sqmul($recip, 8, $_11100111);
3763
+		$recip = self::sc25519_sqmul($recip, 9, $_1101011);
3764
+		$recip = self::sc25519_sqmul($recip, 6, $_1011);
3765
+		$recip = self::sc25519_sqmul($recip, 14, $_10010011);
3766
+		$recip = self::sc25519_sqmul($recip, 10, $_1100011);
3767
+		$recip = self::sc25519_sqmul($recip, 9, $_10010111);
3768
+		$recip = self::sc25519_sqmul($recip, 10, $_11110101);
3769
+		$recip = self::sc25519_sqmul($recip, 8, $_11010011);
3770
+		return self::sc25519_sqmul($recip, 8, $_11101011);
3771
+	}
3772
+
3773
+	/**
3774
+	 * @param string $s
3775
+	 * @return string
3776
+	 */
3777
+	public static function clamp($s)
3778
+	{
3779
+		$s_ = self::stringToIntArray($s);
3780
+		$s_[0] &= 248;
3781
+		$s_[31] |= 64;
3782
+		$s_[31] &= 128;
3783
+		return self::intArrayToString($s_);
3784
+	}
3785 3785
 }
Please login to merge, or discard this patch.
Braces   +41 added lines, -82 removed lines patch added patch discarded remove patch
@@ -13,8 +13,7 @@  discard block
 block discarded – undo
13 13
  *
14 14
  * @ref https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c
15 15
  */
16
-abstract class ParagonIE_Sodium_Core_Curve25519 extends ParagonIE_Sodium_Core_Curve25519_H
17
-{
16
+abstract class ParagonIE_Sodium_Core_Curve25519 extends ParagonIE_Sodium_Core_Curve25519_H {
18 17
     /**
19 18
      * Get a field element of size 10 with a value of 0
20 19
      *
@@ -22,8 +21,7 @@  discard block
 block discarded – undo
22 21
      *
23 22
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
24 23
      */
25
-    public static function fe_0()
26
-    {
24
+    public static function fe_0() {
27 25
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
28 26
             array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
29 27
         );
@@ -36,8 +34,7 @@  discard block
 block discarded – undo
36 34
      *
37 35
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
38 36
      */
39
-    public static function fe_1()
40
-    {
37
+    public static function fe_1() {
41 38
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
42 39
             array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
43 40
         );
@@ -100,8 +97,7 @@  discard block
 block discarded – undo
100 97
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
101 98
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
102 99
      */
103
-    public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f)
104
-    {
100
+    public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
105 101
         $h = clone $f;
106 102
         return $h;
107 103
     }
@@ -117,8 +113,7 @@  discard block
 block discarded – undo
117 113
      * @throws RangeException
118 114
      * @throws TypeError
119 115
      */
120
-    public static function fe_frombytes($s)
121
-    {
116
+    public static function fe_frombytes($s) {
122 117
         if (self::strlen($s) !== 32) {
123 118
             throw new RangeException('Expected a 32-byte string.');
124 119
         }
@@ -189,8 +184,7 @@  discard block
 block discarded – undo
189 184
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $h
190 185
      * @return string
191 186
      */
192
-    public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h)
193
-    {
187
+    public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) {
194 188
         $h0 = (int) $h[0];
195 189
         $h1 = (int) $h[1];
196 190
         $h2 = (int) $h[2];
@@ -296,8 +290,7 @@  discard block
 block discarded – undo
296 290
      * @throws SodiumException
297 291
      * @throws TypeError
298 292
      */
299
-    public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f)
300
-    {
293
+    public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
301 294
         $str = self::fe_tobytes($f);
302 295
         return (int) (self::chrToInt($str[0]) & 1);
303 296
     }
@@ -312,8 +305,7 @@  discard block
 block discarded – undo
312 305
      * @throws SodiumException
313 306
      * @throws TypeError
314 307
      */
315
-    public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
316
-    {
308
+    public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
317 309
         static $zero;
318 310
         if ($zero === null) {
319 311
             $zero = str_repeat("\x00", 32);
@@ -557,8 +549,7 @@  discard block
 block discarded – undo
557 549
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
558 550
      * @psalm-suppress MixedAssignment
559 551
      */
560
-    public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f)
561
-    {
552
+    public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
562 553
         $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
563 554
         for ($i = 0; $i < 10; ++$i) {
564 555
             $h[$i] = -$f[$i];
@@ -576,8 +567,7 @@  discard block
 block discarded – undo
576 567
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
577 568
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
578 569
      */
579
-    public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
580
-    {
570
+    public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
581 571
         $f0 = (int) $f[0];
582 572
         $f1 = (int) $f[1];
583 573
         $f2 = (int) $f[2];
@@ -738,8 +728,7 @@  discard block
 block discarded – undo
738 728
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
739 729
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
740 730
      */
741
-    public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
742
-    {
731
+    public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
743 732
         $f0 = (int) $f[0];
744 733
         $f1 = (int) $f[1];
745 734
         $f2 = (int) $f[2];
@@ -896,8 +885,7 @@  discard block
 block discarded – undo
896 885
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z
897 886
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
898 887
      */
899
-    public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z)
900
-    {
888
+    public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z) {
901 889
         $z = clone $Z;
902 890
         $t0 = self::fe_sq($z);
903 891
         $t1 = self::fe_sq($t0);
@@ -956,8 +944,7 @@  discard block
 block discarded – undo
956 944
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
957 945
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
958 946
      */
959
-    public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
960
-    {
947
+    public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z) {
961 948
         # fe_sq(t0, z);
962 949
         # fe_sq(t1, t0);
963 950
         # fe_sq(t1, t1);
@@ -1083,8 +1070,7 @@  discard block
 block discarded – undo
1083 1070
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
1084 1071
      * @psalm-suppress MixedOperand
1085 1072
      */
1086
-    public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
1087
-    {
1073
+    public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g) {
1088 1074
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
1089 1075
             array(
1090 1076
                 (int) ($f[0] - $g[0]),
@@ -1140,8 +1126,7 @@  discard block
 block discarded – undo
1140 1126
      * @throws SodiumException
1141 1127
      * @throws TypeError
1142 1128
      */
1143
-    public static function slide($a)
1144
-    {
1129
+    public static function slide($a) {
1145 1130
         if (self::strlen($a) < 256) {
1146 1131
             if (self::strlen($a) < 16) {
1147 1132
                 $a = str_pad($a, 256, '0', STR_PAD_RIGHT);
@@ -1195,8 +1180,7 @@  discard block
 block discarded – undo
1195 1180
      * @throws SodiumException
1196 1181
      * @throws TypeError
1197 1182
      */
1198
-    public static function ge_frombytes_negate_vartime($s)
1199
-    {
1183
+    public static function ge_frombytes_negate_vartime($s) {
1200 1184
         static $d = null;
1201 1185
         if (!$d) {
1202 1186
             $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
@@ -1339,8 +1323,7 @@  discard block
 block discarded – undo
1339 1323
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1340 1324
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1341 1325
      */
1342
-    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1343
-    {
1326
+    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) {
1344 1327
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2();
1345 1328
         $r->X = self::fe_mul($p->X, $p->T);
1346 1329
         $r->Y = self::fe_mul($p->Y, $p->Z);
@@ -1354,8 +1337,7 @@  discard block
 block discarded – undo
1354 1337
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1355 1338
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1356 1339
      */
1357
-    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1358
-    {
1340
+    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) {
1359 1341
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
1360 1342
         $r->X = self::fe_mul($p->X, $p->T);
1361 1343
         $r->Y = self::fe_mul($p->Y, $p->Z);
@@ -1369,8 +1351,7 @@  discard block
 block discarded – undo
1369 1351
      *
1370 1352
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1371 1353
      */
1372
-    public static function ge_p2_0()
1373
-    {
1354
+    public static function ge_p2_0() {
1374 1355
         return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1375 1356
             self::fe_0(),
1376 1357
             self::fe_1(),
@@ -1384,8 +1365,7 @@  discard block
 block discarded – undo
1384 1365
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p
1385 1366
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1386 1367
      */
1387
-    public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p)
1388
-    {
1368
+    public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p) {
1389 1369
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1390 1370
 
1391 1371
         $r->X = self::fe_sq($p->X);
@@ -1406,8 +1386,7 @@  discard block
 block discarded – undo
1406 1386
      *
1407 1387
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1408 1388
      */
1409
-    public static function ge_p3_0()
1410
-    {
1389
+    public static function ge_p3_0() {
1411 1390
         return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1412 1391
             self::fe_0(),
1413 1392
             self::fe_1(),
@@ -1422,8 +1401,7 @@  discard block
 block discarded – undo
1422 1401
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1423 1402
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1424 1403
      */
1425
-    public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1426
-    {
1404
+    public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) {
1427 1405
         static $d2 = null;
1428 1406
         if ($d2 === null) {
1429 1407
             $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2);
@@ -1443,8 +1421,7 @@  discard block
 block discarded – undo
1443 1421
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1444 1422
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1445 1423
      */
1446
-    public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1447
-    {
1424
+    public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) {
1448 1425
         return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1449 1426
             self::fe_copy($p->X),
1450 1427
             self::fe_copy($p->Y),
@@ -1460,8 +1437,7 @@  discard block
 block discarded – undo
1460 1437
      * @throws SodiumException
1461 1438
      * @throws TypeError
1462 1439
      */
1463
-    public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
1464
-    {
1440
+    public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) {
1465 1441
         $recip = self::fe_invert($h->Z);
1466 1442
         $x = self::fe_mul($h->X, $recip);
1467 1443
         $y = self::fe_mul($h->Y, $recip);
@@ -1478,8 +1454,7 @@  discard block
 block discarded – undo
1478 1454
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1479 1455
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1480 1456
      */
1481
-    public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1482
-    {
1457
+    public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) {
1483 1458
         $q = self::ge_p3_to_p2($p);
1484 1459
         return self::ge_p2_dbl($q);
1485 1460
     }
@@ -1487,8 +1462,7 @@  discard block
 block discarded – undo
1487 1462
     /**
1488 1463
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
1489 1464
      */
1490
-    public static function ge_precomp_0()
1491
-    {
1465
+    public static function ge_precomp_0() {
1492 1466
         return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1493 1467
             self::fe_1(),
1494 1468
             self::fe_1(),
@@ -1503,8 +1477,7 @@  discard block
 block discarded – undo
1503 1477
      * @param int $c
1504 1478
      * @return int
1505 1479
      */
1506
-    public static function equal($b, $c)
1507
-    {
1480
+    public static function equal($b, $c) {
1508 1481
         return (int) ((($b ^ $c) - 1) >> 31) & 1;
1509 1482
     }
1510 1483
 
@@ -1516,8 +1489,7 @@  discard block
 block discarded – undo
1516 1489
      * @throws SodiumException
1517 1490
      * @throws TypeError
1518 1491
      */
1519
-    public static function negative($char)
1520
-    {
1492
+    public static function negative($char) {
1521 1493
         if (is_int($char)) {
1522 1494
             return ($char >> 63) & 1;
1523 1495
         }
@@ -1576,8 +1548,7 @@  discard block
 block discarded – undo
1576 1548
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1577 1549
      * @throws SodiumException
1578 1550
      */
1579
-    public static function ge_cmov8_cached(array $cached, $b)
1580
-    {
1551
+    public static function ge_cmov8_cached(array $cached, $b) {
1581 1552
         // const unsigned char bnegative = negative(b);
1582 1553
         // const unsigned char babs      = b - (((-bnegative) & b) * ((signed char) 1 << 1));
1583 1554
         $bnegative = self::negative($b);
@@ -1628,8 +1599,7 @@  discard block
 block discarded – undo
1628 1599
      * @psalm-suppress MixedArrayAccess
1629 1600
      * @psalm-suppress MixedArrayOffset
1630 1601
      */
1631
-    public static function ge_select($pos = 0, $b = 0)
1632
-    {
1602
+    public static function ge_select($pos = 0, $b = 0) {
1633 1603
         static $base = null;
1634 1604
         if ($base === null) {
1635 1605
             $base = array();
@@ -1711,8 +1681,7 @@  discard block
 block discarded – undo
1711 1681
      * @throws SodiumException
1712 1682
      * @throws TypeError
1713 1683
      */
1714
-    public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h)
1715
-    {
1684
+    public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h) {
1716 1685
         $recip = self::fe_invert($h->Z);
1717 1686
         $x = self::fe_mul($h->X, $recip);
1718 1687
         $y = self::fe_mul($h->Y, $recip);
@@ -1861,8 +1830,7 @@  discard block
 block discarded – undo
1861 1830
      * @psalm-suppress MixedAssignment
1862 1831
      * @psalm-suppress MixedOperand
1863 1832
      */
1864
-    public static function ge_scalarmult($a, $p)
1865
-    {
1833
+    public static function ge_scalarmult($a, $p) {
1866 1834
         $e = array_fill(0, 64, 0);
1867 1835
 
1868 1836
         /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */
@@ -1999,8 +1967,7 @@  discard block
 block discarded – undo
1999 1967
      * @psalm-suppress MixedAssignment
2000 1968
      * @psalm-suppress MixedOperand
2001 1969
      */
2002
-    public static function ge_scalarmult_base($a)
2003
-    {
1970
+    public static function ge_scalarmult_base($a) {
2004 1971
         /** @var array<int, int> $e */
2005 1972
         $e = array();
2006 1973
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
@@ -2059,8 +2026,7 @@  discard block
 block discarded – undo
2059 2026
      * @return string
2060 2027
      * @throws TypeError
2061 2028
      */
2062
-    public static function sc_muladd($a, $b, $c)
2063
-    {
2029
+    public static function sc_muladd($a, $b, $c) {
2064 2030
         $a0 = 2097151 & self::load_3(self::substr($a, 0, 3));
2065 2031
         $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2066 2032
         $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
@@ -2510,8 +2476,7 @@  discard block
 block discarded – undo
2510 2476
      * @return string
2511 2477
      * @throws TypeError
2512 2478
      */
2513
-    public static function sc_reduce($s)
2514
-    {
2479
+    public static function sc_reduce($s) {
2515 2480
         $s0 = 2097151 & self::load_3(self::substr($s, 0, 3));
2516 2481
         $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5);
2517 2482
         $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2);
@@ -2827,8 +2792,7 @@  discard block
 block discarded – undo
2827 2792
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
2828 2793
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
2829 2794
      */
2830
-    public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A)
2831
-    {
2795
+    public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) {
2832 2796
         $aslide = array(
2833 2797
             13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
2834 2798
             0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
@@ -2888,8 +2852,7 @@  discard block
 block discarded – undo
2888 2852
      * @param string $b
2889 2853
      * @return string
2890 2854
      */
2891
-    public static function sc25519_mul($a, $b)
2892
-    {
2855
+    public static function sc25519_mul($a, $b) {
2893 2856
         //    int64_t a0  = 2097151 & load_3(a);
2894 2857
         //    int64_t a1  = 2097151 & (load_4(a + 2) >> 5);
2895 2858
         //    int64_t a2  = 2097151 & (load_3(a + 5) >> 2);
@@ -3703,8 +3666,7 @@  discard block
 block discarded – undo
3703 3666
      * @param string $s
3704 3667
      * @return string
3705 3668
      */
3706
-    public static function sc25519_sq($s)
3707
-    {
3669
+    public static function sc25519_sq($s) {
3708 3670
         return self::sc25519_mul($s, $s);
3709 3671
     }
3710 3672
 
@@ -3714,8 +3676,7 @@  discard block
 block discarded – undo
3714 3676
      * @param string $a
3715 3677
      * @return string
3716 3678
      */
3717
-    public static function sc25519_sqmul($s, $n, $a)
3718
-    {
3679
+    public static function sc25519_sqmul($s, $n, $a) {
3719 3680
         for ($i = 0; $i < $n; ++$i) {
3720 3681
             $s = self::sc25519_sq($s);
3721 3682
         }
@@ -3726,8 +3687,7 @@  discard block
 block discarded – undo
3726 3687
      * @param string $s
3727 3688
      * @return string
3728 3689
      */
3729
-    public static function sc25519_invert($s)
3730
-    {
3690
+    public static function sc25519_invert($s) {
3731 3691
         $_10 = self::sc25519_sq($s);
3732 3692
         $_11 = self::sc25519_mul($s, $_10);
3733 3693
         $_100 = self::sc25519_mul($s, $_11);
@@ -3774,8 +3734,7 @@  discard block
 block discarded – undo
3774 3734
      * @param string $s
3775 3735
      * @return string
3776 3736
      */
3777
-    public static function clamp($s)
3778
-    {
3737
+    public static function clamp($s) {
3779 3738
         $s_ = self::stringToIntArray($s);
3780 3739
         $s_[0] &= 248;
3781 3740
         $s_[31] |= 64;
Please login to merge, or discard this patch.
Spacing   +1611 added lines, -1611 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_Curve25519', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_Curve25519', false ) ) {
4 4
     return;
5 5
 }
6 6
 
@@ -25,7 +25,7 @@  discard block
 block discarded – undo
25 25
     public static function fe_0()
26 26
     {
27 27
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
28
-            array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
28
+            array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
29 29
         );
30 30
     }
31 31
 
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
     public static function fe_1()
40 40
     {
41 41
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
42
-            array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
42
+            array( 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
43 43
         );
44 44
     }
45 45
 
@@ -60,10 +60,10 @@  discard block
 block discarded – undo
60 60
     ) {
61 61
         /** @var array<int, int> $arr */
62 62
         $arr = array();
63
-        for ($i = 0; $i < 10; ++$i) {
64
-            $arr[$i] = (int) ($f[$i] + $g[$i]);
63
+        for ( $i = 0; $i < 10; ++$i ) {
64
+            $arr[ $i ] = (int)( $f[ $i ] + $g[ $i ] );
65 65
         }
66
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr);
66
+        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( $arr );
67 67
     }
68 68
 
69 69
     /**
@@ -85,11 +85,11 @@  discard block
 block discarded – undo
85 85
         /** @var array<int, int> $h */
86 86
         $h = array();
87 87
         $b *= -1;
88
-        for ($i = 0; $i < 10; ++$i) {
89
-            $x = (($f[$i] ^ $g[$i]) & $b);
90
-            $h[$i] = ($f[$i]) ^ $x;
88
+        for ( $i = 0; $i < 10; ++$i ) {
89
+            $x = ( ( $f[ $i ] ^ $g[ $i ] ) & $b );
90
+            $h[ $i ] = ( $f[ $i ] ) ^ $x;
91 91
         }
92
-        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h);
92
+        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( $h );
93 93
     }
94 94
 
95 95
     /**
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
101 101
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
102 102
      */
103
-    public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f)
103
+    public static function fe_copy( ParagonIE_Sodium_Core_Curve25519_Fe $f )
104 104
     {
105 105
         $h = clone $f;
106 106
         return $h;
@@ -117,66 +117,66 @@  discard block
 block discarded – undo
117 117
      * @throws RangeException
118 118
      * @throws TypeError
119 119
      */
120
-    public static function fe_frombytes($s)
120
+    public static function fe_frombytes( $s )
121 121
     {
122
-        if (self::strlen($s) !== 32) {
123
-            throw new RangeException('Expected a 32-byte string.');
122
+        if ( self::strlen( $s ) !== 32 ) {
123
+            throw new RangeException( 'Expected a 32-byte string.' );
124 124
         }
125
-        $h0 = self::load_4($s);
126
-        $h1 = self::load_3(self::substr($s, 4, 3)) << 6;
127
-        $h2 = self::load_3(self::substr($s, 7, 3)) << 5;
128
-        $h3 = self::load_3(self::substr($s, 10, 3)) << 3;
129
-        $h4 = self::load_3(self::substr($s, 13, 3)) << 2;
130
-        $h5 = self::load_4(self::substr($s, 16, 4));
131
-        $h6 = self::load_3(self::substr($s, 20, 3)) << 7;
132
-        $h7 = self::load_3(self::substr($s, 23, 3)) << 5;
133
-        $h8 = self::load_3(self::substr($s, 26, 3)) << 4;
134
-        $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2;
135
-
136
-        $carry9 = ($h9 + (1 << 24)) >> 25;
137
-        $h0 += self::mul($carry9, 19, 5);
125
+        $h0 = self::load_4( $s );
126
+        $h1 = self::load_3( self::substr( $s, 4, 3 ) ) << 6;
127
+        $h2 = self::load_3( self::substr( $s, 7, 3 ) ) << 5;
128
+        $h3 = self::load_3( self::substr( $s, 10, 3 ) ) << 3;
129
+        $h4 = self::load_3( self::substr( $s, 13, 3 ) ) << 2;
130
+        $h5 = self::load_4( self::substr( $s, 16, 4 ) );
131
+        $h6 = self::load_3( self::substr( $s, 20, 3 ) ) << 7;
132
+        $h7 = self::load_3( self::substr( $s, 23, 3 ) ) << 5;
133
+        $h8 = self::load_3( self::substr( $s, 26, 3 ) ) << 4;
134
+        $h9 = ( self::load_3( self::substr( $s, 29, 3 ) ) & 8388607 ) << 2;
135
+
136
+        $carry9 = ( $h9 + ( 1 << 24 ) ) >> 25;
137
+        $h0 += self::mul( $carry9, 19, 5 );
138 138
         $h9 -= $carry9 << 25;
139
-        $carry1 = ($h1 + (1 << 24)) >> 25;
139
+        $carry1 = ( $h1 + ( 1 << 24 ) ) >> 25;
140 140
         $h2 += $carry1;
141 141
         $h1 -= $carry1 << 25;
142
-        $carry3 = ($h3 + (1 << 24)) >> 25;
142
+        $carry3 = ( $h3 + ( 1 << 24 ) ) >> 25;
143 143
         $h4 += $carry3;
144 144
         $h3 -= $carry3 << 25;
145
-        $carry5 = ($h5 + (1 << 24)) >> 25;
145
+        $carry5 = ( $h5 + ( 1 << 24 ) ) >> 25;
146 146
         $h6 += $carry5;
147 147
         $h5 -= $carry5 << 25;
148
-        $carry7 = ($h7 + (1 << 24)) >> 25;
148
+        $carry7 = ( $h7 + ( 1 << 24 ) ) >> 25;
149 149
         $h8 += $carry7;
150 150
         $h7 -= $carry7 << 25;
151 151
 
152
-        $carry0 = ($h0 + (1 << 25)) >> 26;
152
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
153 153
         $h1 += $carry0;
154 154
         $h0 -= $carry0 << 26;
155
-        $carry2 = ($h2 + (1 << 25)) >> 26;
155
+        $carry2 = ( $h2 + ( 1 << 25 ) ) >> 26;
156 156
         $h3 += $carry2;
157 157
         $h2 -= $carry2 << 26;
158
-        $carry4 = ($h4 + (1 << 25)) >> 26;
158
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
159 159
         $h5 += $carry4;
160 160
         $h4 -= $carry4 << 26;
161
-        $carry6 = ($h6 + (1 << 25)) >> 26;
161
+        $carry6 = ( $h6 + ( 1 << 25 ) ) >> 26;
162 162
         $h7 += $carry6;
163 163
         $h6 -= $carry6 << 26;
164
-        $carry8 = ($h8 + (1 << 25)) >> 26;
164
+        $carry8 = ( $h8 + ( 1 << 25 ) ) >> 26;
165 165
         $h9 += $carry8;
166 166
         $h8 -= $carry8 << 26;
167 167
 
168 168
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
169 169
             array(
170
-                (int) $h0,
171
-                (int) $h1,
172
-                (int) $h2,
173
-                (int) $h3,
174
-                (int) $h4,
175
-                (int) $h5,
176
-                (int) $h6,
177
-                (int) $h7,
178
-                (int) $h8,
179
-                (int) $h9
170
+                (int)$h0,
171
+                (int)$h1,
172
+                (int)$h2,
173
+                (int)$h3,
174
+                (int)$h4,
175
+                (int)$h5,
176
+                (int)$h6,
177
+                (int)$h7,
178
+                (int)$h8,
179
+                (int)$h9
180 180
             )
181 181
         );
182 182
     }
@@ -189,32 +189,32 @@  discard block
 block discarded – undo
189 189
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $h
190 190
      * @return string
191 191
      */
192
-    public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h)
192
+    public static function fe_tobytes( ParagonIE_Sodium_Core_Curve25519_Fe $h )
193 193
     {
194
-        $h0 = (int) $h[0];
195
-        $h1 = (int) $h[1];
196
-        $h2 = (int) $h[2];
197
-        $h3 = (int) $h[3];
198
-        $h4 = (int) $h[4];
199
-        $h5 = (int) $h[5];
200
-        $h6 = (int) $h[6];
201
-        $h7 = (int) $h[7];
202
-        $h8 = (int) $h[8];
203
-        $h9 = (int) $h[9];
204
-
205
-        $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25;
206
-        $q = ($h0 + $q) >> 26;
207
-        $q = ($h1 + $q) >> 25;
208
-        $q = ($h2 + $q) >> 26;
209
-        $q = ($h3 + $q) >> 25;
210
-        $q = ($h4 + $q) >> 26;
211
-        $q = ($h5 + $q) >> 25;
212
-        $q = ($h6 + $q) >> 26;
213
-        $q = ($h7 + $q) >> 25;
214
-        $q = ($h8 + $q) >> 26;
215
-        $q = ($h9 + $q) >> 25;
216
-
217
-        $h0 += self::mul($q, 19, 5);
194
+        $h0 = (int)$h[ 0 ];
195
+        $h1 = (int)$h[ 1 ];
196
+        $h2 = (int)$h[ 2 ];
197
+        $h3 = (int)$h[ 3 ];
198
+        $h4 = (int)$h[ 4 ];
199
+        $h5 = (int)$h[ 5 ];
200
+        $h6 = (int)$h[ 6 ];
201
+        $h7 = (int)$h[ 7 ];
202
+        $h8 = (int)$h[ 8 ];
203
+        $h9 = (int)$h[ 9 ];
204
+
205
+        $q = ( self::mul( $h9, 19, 5 ) + ( 1 << 24 ) ) >> 25;
206
+        $q = ( $h0 + $q ) >> 26;
207
+        $q = ( $h1 + $q ) >> 25;
208
+        $q = ( $h2 + $q ) >> 26;
209
+        $q = ( $h3 + $q ) >> 25;
210
+        $q = ( $h4 + $q ) >> 26;
211
+        $q = ( $h5 + $q ) >> 25;
212
+        $q = ( $h6 + $q ) >> 26;
213
+        $q = ( $h7 + $q ) >> 25;
214
+        $q = ( $h8 + $q ) >> 26;
215
+        $q = ( $h9 + $q ) >> 25;
216
+
217
+        $h0 += self::mul( $q, 19, 5 );
218 218
 
219 219
         $carry0 = $h0 >> 26;
220 220
         $h1 += $carry0;
@@ -250,40 +250,40 @@  discard block
 block discarded – undo
250 250
          * @var array<int, int>
251 251
          */
252 252
         $s = array(
253
-            (int) (($h0 >> 0) & 0xff),
254
-            (int) (($h0 >> 8) & 0xff),
255
-            (int) (($h0 >> 16) & 0xff),
256
-            (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
257
-            (int) (($h1 >> 6) & 0xff),
258
-            (int) (($h1 >> 14) & 0xff),
259
-            (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
260
-            (int) (($h2 >> 5) & 0xff),
261
-            (int) (($h2 >> 13) & 0xff),
262
-            (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
263
-            (int) (($h3 >> 3) & 0xff),
264
-            (int) (($h3 >> 11) & 0xff),
265
-            (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
266
-            (int) (($h4 >> 2) & 0xff),
267
-            (int) (($h4 >> 10) & 0xff),
268
-            (int) (($h4 >> 18) & 0xff),
269
-            (int) (($h5 >> 0) & 0xff),
270
-            (int) (($h5 >> 8) & 0xff),
271
-            (int) (($h5 >> 16) & 0xff),
272
-            (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
273
-            (int) (($h6 >> 7) & 0xff),
274
-            (int) (($h6 >> 15) & 0xff),
275
-            (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
276
-            (int) (($h7 >> 5) & 0xff),
277
-            (int) (($h7 >> 13) & 0xff),
278
-            (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
279
-            (int) (($h8 >> 4) & 0xff),
280
-            (int) (($h8 >> 12) & 0xff),
281
-            (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
282
-            (int) (($h9 >> 2) & 0xff),
283
-            (int) (($h9 >> 10) & 0xff),
284
-            (int) (($h9 >> 18) & 0xff)
253
+            (int)( ( $h0 >> 0 ) & 0xff ),
254
+            (int)( ( $h0 >> 8 ) & 0xff ),
255
+            (int)( ( $h0 >> 16 ) & 0xff ),
256
+            (int)( ( ( $h0 >> 24 ) | ( $h1 << 2 ) ) & 0xff ),
257
+            (int)( ( $h1 >> 6 ) & 0xff ),
258
+            (int)( ( $h1 >> 14 ) & 0xff ),
259
+            (int)( ( ( $h1 >> 22 ) | ( $h2 << 3 ) ) & 0xff ),
260
+            (int)( ( $h2 >> 5 ) & 0xff ),
261
+            (int)( ( $h2 >> 13 ) & 0xff ),
262
+            (int)( ( ( $h2 >> 21 ) | ( $h3 << 5 ) ) & 0xff ),
263
+            (int)( ( $h3 >> 3 ) & 0xff ),
264
+            (int)( ( $h3 >> 11 ) & 0xff ),
265
+            (int)( ( ( $h3 >> 19 ) | ( $h4 << 6 ) ) & 0xff ),
266
+            (int)( ( $h4 >> 2 ) & 0xff ),
267
+            (int)( ( $h4 >> 10 ) & 0xff ),
268
+            (int)( ( $h4 >> 18 ) & 0xff ),
269
+            (int)( ( $h5 >> 0 ) & 0xff ),
270
+            (int)( ( $h5 >> 8 ) & 0xff ),
271
+            (int)( ( $h5 >> 16 ) & 0xff ),
272
+            (int)( ( ( $h5 >> 24 ) | ( $h6 << 1 ) ) & 0xff ),
273
+            (int)( ( $h6 >> 7 ) & 0xff ),
274
+            (int)( ( $h6 >> 15 ) & 0xff ),
275
+            (int)( ( ( $h6 >> 23 ) | ( $h7 << 3 ) ) & 0xff ),
276
+            (int)( ( $h7 >> 5 ) & 0xff ),
277
+            (int)( ( $h7 >> 13 ) & 0xff ),
278
+            (int)( ( ( $h7 >> 21 ) | ( $h8 << 4 ) ) & 0xff ),
279
+            (int)( ( $h8 >> 4 ) & 0xff ),
280
+            (int)( ( $h8 >> 12 ) & 0xff ),
281
+            (int)( ( ( $h8 >> 20 ) | ( $h9 << 6 ) ) & 0xff ),
282
+            (int)( ( $h9 >> 2 ) & 0xff ),
283
+            (int)( ( $h9 >> 10 ) & 0xff ),
284
+            (int)( ( $h9 >> 18 ) & 0xff )
285 285
         );
286
-        return self::intArrayToString($s);
286
+        return self::intArrayToString( $s );
287 287
     }
288 288
 
289 289
     /**
@@ -296,10 +296,10 @@  discard block
 block discarded – undo
296 296
      * @throws SodiumException
297 297
      * @throws TypeError
298 298
      */
299
-    public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f)
299
+    public static function fe_isnegative( ParagonIE_Sodium_Core_Curve25519_Fe $f )
300 300
     {
301
-        $str = self::fe_tobytes($f);
302
-        return (int) (self::chrToInt($str[0]) & 1);
301
+        $str = self::fe_tobytes( $f );
302
+        return (int)( self::chrToInt( $str[ 0 ] ) & 1 );
303 303
     }
304 304
 
305 305
     /**
@@ -312,16 +312,16 @@  discard block
 block discarded – undo
312 312
      * @throws SodiumException
313 313
      * @throws TypeError
314 314
      */
315
-    public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
315
+    public static function fe_isnonzero( ParagonIE_Sodium_Core_Curve25519_Fe $f )
316 316
     {
317 317
         static $zero;
318
-        if ($zero === null) {
319
-            $zero = str_repeat("\x00", 32);
318
+        if ( $zero === null ) {
319
+            $zero = str_repeat( "\x00", 32 );
320 320
         }
321 321
         /** @var string $zero */
322 322
         /** @var string $str */
323
-        $str = self::fe_tobytes($f);
324
-        return !self::verify_32($str, (string) $zero);
323
+        $str = self::fe_tobytes( $f );
324
+        return ! self::verify_32( $str, (string)$zero );
325 325
     }
326 326
 
327 327
     /**
@@ -342,206 +342,206 @@  discard block
 block discarded – undo
342 342
         ParagonIE_Sodium_Core_Curve25519_Fe $f,
343 343
         ParagonIE_Sodium_Core_Curve25519_Fe $g
344 344
     ) {
345
-        $f0 = $f[0];
346
-        $f1 = $f[1];
347
-        $f2 = $f[2];
348
-        $f3 = $f[3];
349
-        $f4 = $f[4];
350
-        $f5 = $f[5];
351
-        $f6 = $f[6];
352
-        $f7 = $f[7];
353
-        $f8 = $f[8];
354
-        $f9 = $f[9];
355
-        $g0 = $g[0];
356
-        $g1 = $g[1];
357
-        $g2 = $g[2];
358
-        $g3 = $g[3];
359
-        $g4 = $g[4];
360
-        $g5 = $g[5];
361
-        $g6 = $g[6];
362
-        $g7 = $g[7];
363
-        $g8 = $g[8];
364
-        $g9 = $g[9];
365
-        $g1_19 = self::mul($g1, 19, 5);
366
-        $g2_19 = self::mul($g2, 19, 5);
367
-        $g3_19 = self::mul($g3, 19, 5);
368
-        $g4_19 = self::mul($g4, 19, 5);
369
-        $g5_19 = self::mul($g5, 19, 5);
370
-        $g6_19 = self::mul($g6, 19, 5);
371
-        $g7_19 = self::mul($g7, 19, 5);
372
-        $g8_19 = self::mul($g8, 19, 5);
373
-        $g9_19 = self::mul($g9, 19, 5);
345
+        $f0 = $f[ 0 ];
346
+        $f1 = $f[ 1 ];
347
+        $f2 = $f[ 2 ];
348
+        $f3 = $f[ 3 ];
349
+        $f4 = $f[ 4 ];
350
+        $f5 = $f[ 5 ];
351
+        $f6 = $f[ 6 ];
352
+        $f7 = $f[ 7 ];
353
+        $f8 = $f[ 8 ];
354
+        $f9 = $f[ 9 ];
355
+        $g0 = $g[ 0 ];
356
+        $g1 = $g[ 1 ];
357
+        $g2 = $g[ 2 ];
358
+        $g3 = $g[ 3 ];
359
+        $g4 = $g[ 4 ];
360
+        $g5 = $g[ 5 ];
361
+        $g6 = $g[ 6 ];
362
+        $g7 = $g[ 7 ];
363
+        $g8 = $g[ 8 ];
364
+        $g9 = $g[ 9 ];
365
+        $g1_19 = self::mul( $g1, 19, 5 );
366
+        $g2_19 = self::mul( $g2, 19, 5 );
367
+        $g3_19 = self::mul( $g3, 19, 5 );
368
+        $g4_19 = self::mul( $g4, 19, 5 );
369
+        $g5_19 = self::mul( $g5, 19, 5 );
370
+        $g6_19 = self::mul( $g6, 19, 5 );
371
+        $g7_19 = self::mul( $g7, 19, 5 );
372
+        $g8_19 = self::mul( $g8, 19, 5 );
373
+        $g9_19 = self::mul( $g9, 19, 5 );
374 374
         $f1_2 = $f1 << 1;
375 375
         $f3_2 = $f3 << 1;
376 376
         $f5_2 = $f5 << 1;
377 377
         $f7_2 = $f7 << 1;
378 378
         $f9_2 = $f9 << 1;
379
-        $f0g0    = self::mul($f0,    $g0, 26);
380
-        $f0g1    = self::mul($f0,    $g1, 25);
381
-        $f0g2    = self::mul($f0,    $g2, 26);
382
-        $f0g3    = self::mul($f0,    $g3, 25);
383
-        $f0g4    = self::mul($f0,    $g4, 26);
384
-        $f0g5    = self::mul($f0,    $g5, 25);
385
-        $f0g6    = self::mul($f0,    $g6, 26);
386
-        $f0g7    = self::mul($f0,    $g7, 25);
387
-        $f0g8    = self::mul($f0,    $g8, 26);
388
-        $f0g9    = self::mul($f0,    $g9, 26);
389
-        $f1g0    = self::mul($f1,    $g0, 26);
390
-        $f1g1_2  = self::mul($f1_2,  $g1, 25);
391
-        $f1g2    = self::mul($f1,    $g2, 26);
392
-        $f1g3_2  = self::mul($f1_2,  $g3, 25);
393
-        $f1g4    = self::mul($f1,    $g4, 26);
394
-        $f1g5_2  = self::mul($f1_2,  $g5, 25);
395
-        $f1g6    = self::mul($f1,    $g6, 26);
396
-        $f1g7_2  = self::mul($f1_2,  $g7, 25);
397
-        $f1g8    = self::mul($f1,    $g8, 26);
398
-        $f1g9_38 = self::mul($g9_19, $f1_2, 26);
399
-        $f2g0    = self::mul($f2,    $g0, 26);
400
-        $f2g1    = self::mul($f2,    $g1, 25);
401
-        $f2g2    = self::mul($f2,    $g2, 26);
402
-        $f2g3    = self::mul($f2,    $g3, 25);
403
-        $f2g4    = self::mul($f2,    $g4, 26);
404
-        $f2g5    = self::mul($f2,    $g5, 25);
405
-        $f2g6    = self::mul($f2,    $g6, 26);
406
-        $f2g7    = self::mul($f2,    $g7, 25);
407
-        $f2g8_19 = self::mul($g8_19, $f2, 26);
408
-        $f2g9_19 = self::mul($g9_19, $f2, 26);
409
-        $f3g0    = self::mul($f3,    $g0, 26);
410
-        $f3g1_2  = self::mul($f3_2,  $g1, 25);
411
-        $f3g2    = self::mul($f3,    $g2, 26);
412
-        $f3g3_2  = self::mul($f3_2,  $g3, 25);
413
-        $f3g4    = self::mul($f3,    $g4, 26);
414
-        $f3g5_2  = self::mul($f3_2,  $g5, 25);
415
-        $f3g6    = self::mul($f3,    $g6, 26);
416
-        $f3g7_38 = self::mul($g7_19, $f3_2, 26);
417
-        $f3g8_19 = self::mul($g8_19, $f3, 25);
418
-        $f3g9_38 = self::mul($g9_19, $f3_2, 26);
419
-        $f4g0    = self::mul($f4,    $g0, 26);
420
-        $f4g1    = self::mul($f4,    $g1, 25);
421
-        $f4g2    = self::mul($f4,    $g2, 26);
422
-        $f4g3    = self::mul($f4,    $g3, 25);
423
-        $f4g4    = self::mul($f4,    $g4, 26);
424
-        $f4g5    = self::mul($f4,    $g5, 25);
425
-        $f4g6_19 = self::mul($g6_19, $f4, 26);
426
-        $f4g7_19 = self::mul($g7_19, $f4, 26);
427
-        $f4g8_19 = self::mul($g8_19, $f4, 26);
428
-        $f4g9_19 = self::mul($g9_19, $f4, 26);
429
-        $f5g0    = self::mul($f5,    $g0, 26);
430
-        $f5g1_2  = self::mul($f5_2,  $g1, 25);
431
-        $f5g2    = self::mul($f5,    $g2, 26);
432
-        $f5g3_2  = self::mul($f5_2,  $g3, 25);
433
-        $f5g4    = self::mul($f5,    $g4, 26);
434
-        $f5g5_38 = self::mul($g5_19, $f5_2, 26);
435
-        $f5g6_19 = self::mul($g6_19, $f5, 25);
436
-        $f5g7_38 = self::mul($g7_19, $f5_2, 26);
437
-        $f5g8_19 = self::mul($g8_19, $f5, 25);
438
-        $f5g9_38 = self::mul($g9_19, $f5_2, 26);
439
-        $f6g0    = self::mul($f6,    $g0, 26);
440
-        $f6g1    = self::mul($f6,    $g1, 25);
441
-        $f6g2    = self::mul($f6,    $g2, 26);
442
-        $f6g3    = self::mul($f6,    $g3, 25);
443
-        $f6g4_19 = self::mul($g4_19, $f6, 26);
444
-        $f6g5_19 = self::mul($g5_19, $f6, 26);
445
-        $f6g6_19 = self::mul($g6_19, $f6, 26);
446
-        $f6g7_19 = self::mul($g7_19, $f6, 26);
447
-        $f6g8_19 = self::mul($g8_19, $f6, 26);
448
-        $f6g9_19 = self::mul($g9_19, $f6, 26);
449
-        $f7g0    = self::mul($f7,    $g0, 26);
450
-        $f7g1_2  = self::mul($f7_2,  $g1, 25);
451
-        $f7g2    = self::mul($f7,    $g2, 26);
452
-        $f7g3_38 = self::mul($g3_19, $f7_2, 26);
453
-        $f7g4_19 = self::mul($g4_19, $f7, 26);
454
-        $f7g5_38 = self::mul($g5_19, $f7_2, 26);
455
-        $f7g6_19 = self::mul($g6_19, $f7, 25);
456
-        $f7g7_38 = self::mul($g7_19, $f7_2, 26);
457
-        $f7g8_19 = self::mul($g8_19, $f7, 25);
458
-        $f7g9_38 = self::mul($g9_19,$f7_2, 26);
459
-        $f8g0    = self::mul($f8,    $g0, 26);
460
-        $f8g1    = self::mul($f8,    $g1, 25);
461
-        $f8g2_19 = self::mul($g2_19, $f8, 26);
462
-        $f8g3_19 = self::mul($g3_19, $f8, 26);
463
-        $f8g4_19 = self::mul($g4_19, $f8, 26);
464
-        $f8g5_19 = self::mul($g5_19, $f8, 26);
465
-        $f8g6_19 = self::mul($g6_19, $f8, 26);
466
-        $f8g7_19 = self::mul($g7_19, $f8, 26);
467
-        $f8g8_19 = self::mul($g8_19, $f8, 26);
468
-        $f8g9_19 = self::mul($g9_19, $f8, 26);
469
-        $f9g0    = self::mul($f9,    $g0, 26);
470
-        $f9g1_38 = self::mul($g1_19, $f9_2, 26);
471
-        $f9g2_19 = self::mul($g2_19, $f9, 25);
472
-        $f9g3_38 = self::mul($g3_19, $f9_2, 26);
473
-        $f9g4_19 = self::mul($g4_19, $f9, 25);
474
-        $f9g5_38 = self::mul($g5_19, $f9_2, 26);
475
-        $f9g6_19 = self::mul($g6_19, $f9, 25);
476
-        $f9g7_38 = self::mul($g7_19, $f9_2, 26);
477
-        $f9g8_19 = self::mul($g8_19, $f9, 25);
478
-        $f9g9_38 = self::mul($g9_19, $f9_2, 26);
379
+        $f0g0    = self::mul( $f0, $g0, 26 );
380
+        $f0g1    = self::mul( $f0, $g1, 25 );
381
+        $f0g2    = self::mul( $f0, $g2, 26 );
382
+        $f0g3    = self::mul( $f0, $g3, 25 );
383
+        $f0g4    = self::mul( $f0, $g4, 26 );
384
+        $f0g5    = self::mul( $f0, $g5, 25 );
385
+        $f0g6    = self::mul( $f0, $g6, 26 );
386
+        $f0g7    = self::mul( $f0, $g7, 25 );
387
+        $f0g8    = self::mul( $f0, $g8, 26 );
388
+        $f0g9    = self::mul( $f0, $g9, 26 );
389
+        $f1g0    = self::mul( $f1, $g0, 26 );
390
+        $f1g1_2  = self::mul( $f1_2, $g1, 25 );
391
+        $f1g2    = self::mul( $f1, $g2, 26 );
392
+        $f1g3_2  = self::mul( $f1_2, $g3, 25 );
393
+        $f1g4    = self::mul( $f1, $g4, 26 );
394
+        $f1g5_2  = self::mul( $f1_2, $g5, 25 );
395
+        $f1g6    = self::mul( $f1, $g6, 26 );
396
+        $f1g7_2  = self::mul( $f1_2, $g7, 25 );
397
+        $f1g8    = self::mul( $f1, $g8, 26 );
398
+        $f1g9_38 = self::mul( $g9_19, $f1_2, 26 );
399
+        $f2g0    = self::mul( $f2, $g0, 26 );
400
+        $f2g1    = self::mul( $f2, $g1, 25 );
401
+        $f2g2    = self::mul( $f2, $g2, 26 );
402
+        $f2g3    = self::mul( $f2, $g3, 25 );
403
+        $f2g4    = self::mul( $f2, $g4, 26 );
404
+        $f2g5    = self::mul( $f2, $g5, 25 );
405
+        $f2g6    = self::mul( $f2, $g6, 26 );
406
+        $f2g7    = self::mul( $f2, $g7, 25 );
407
+        $f2g8_19 = self::mul( $g8_19, $f2, 26 );
408
+        $f2g9_19 = self::mul( $g9_19, $f2, 26 );
409
+        $f3g0    = self::mul( $f3, $g0, 26 );
410
+        $f3g1_2  = self::mul( $f3_2, $g1, 25 );
411
+        $f3g2    = self::mul( $f3, $g2, 26 );
412
+        $f3g3_2  = self::mul( $f3_2, $g3, 25 );
413
+        $f3g4    = self::mul( $f3, $g4, 26 );
414
+        $f3g5_2  = self::mul( $f3_2, $g5, 25 );
415
+        $f3g6    = self::mul( $f3, $g6, 26 );
416
+        $f3g7_38 = self::mul( $g7_19, $f3_2, 26 );
417
+        $f3g8_19 = self::mul( $g8_19, $f3, 25 );
418
+        $f3g9_38 = self::mul( $g9_19, $f3_2, 26 );
419
+        $f4g0    = self::mul( $f4, $g0, 26 );
420
+        $f4g1    = self::mul( $f4, $g1, 25 );
421
+        $f4g2    = self::mul( $f4, $g2, 26 );
422
+        $f4g3    = self::mul( $f4, $g3, 25 );
423
+        $f4g4    = self::mul( $f4, $g4, 26 );
424
+        $f4g5    = self::mul( $f4, $g5, 25 );
425
+        $f4g6_19 = self::mul( $g6_19, $f4, 26 );
426
+        $f4g7_19 = self::mul( $g7_19, $f4, 26 );
427
+        $f4g8_19 = self::mul( $g8_19, $f4, 26 );
428
+        $f4g9_19 = self::mul( $g9_19, $f4, 26 );
429
+        $f5g0    = self::mul( $f5, $g0, 26 );
430
+        $f5g1_2  = self::mul( $f5_2, $g1, 25 );
431
+        $f5g2    = self::mul( $f5, $g2, 26 );
432
+        $f5g3_2  = self::mul( $f5_2, $g3, 25 );
433
+        $f5g4    = self::mul( $f5, $g4, 26 );
434
+        $f5g5_38 = self::mul( $g5_19, $f5_2, 26 );
435
+        $f5g6_19 = self::mul( $g6_19, $f5, 25 );
436
+        $f5g7_38 = self::mul( $g7_19, $f5_2, 26 );
437
+        $f5g8_19 = self::mul( $g8_19, $f5, 25 );
438
+        $f5g9_38 = self::mul( $g9_19, $f5_2, 26 );
439
+        $f6g0    = self::mul( $f6, $g0, 26 );
440
+        $f6g1    = self::mul( $f6, $g1, 25 );
441
+        $f6g2    = self::mul( $f6, $g2, 26 );
442
+        $f6g3    = self::mul( $f6, $g3, 25 );
443
+        $f6g4_19 = self::mul( $g4_19, $f6, 26 );
444
+        $f6g5_19 = self::mul( $g5_19, $f6, 26 );
445
+        $f6g6_19 = self::mul( $g6_19, $f6, 26 );
446
+        $f6g7_19 = self::mul( $g7_19, $f6, 26 );
447
+        $f6g8_19 = self::mul( $g8_19, $f6, 26 );
448
+        $f6g9_19 = self::mul( $g9_19, $f6, 26 );
449
+        $f7g0    = self::mul( $f7, $g0, 26 );
450
+        $f7g1_2  = self::mul( $f7_2, $g1, 25 );
451
+        $f7g2    = self::mul( $f7, $g2, 26 );
452
+        $f7g3_38 = self::mul( $g3_19, $f7_2, 26 );
453
+        $f7g4_19 = self::mul( $g4_19, $f7, 26 );
454
+        $f7g5_38 = self::mul( $g5_19, $f7_2, 26 );
455
+        $f7g6_19 = self::mul( $g6_19, $f7, 25 );
456
+        $f7g7_38 = self::mul( $g7_19, $f7_2, 26 );
457
+        $f7g8_19 = self::mul( $g8_19, $f7, 25 );
458
+        $f7g9_38 = self::mul( $g9_19, $f7_2, 26 );
459
+        $f8g0    = self::mul( $f8, $g0, 26 );
460
+        $f8g1    = self::mul( $f8, $g1, 25 );
461
+        $f8g2_19 = self::mul( $g2_19, $f8, 26 );
462
+        $f8g3_19 = self::mul( $g3_19, $f8, 26 );
463
+        $f8g4_19 = self::mul( $g4_19, $f8, 26 );
464
+        $f8g5_19 = self::mul( $g5_19, $f8, 26 );
465
+        $f8g6_19 = self::mul( $g6_19, $f8, 26 );
466
+        $f8g7_19 = self::mul( $g7_19, $f8, 26 );
467
+        $f8g8_19 = self::mul( $g8_19, $f8, 26 );
468
+        $f8g9_19 = self::mul( $g9_19, $f8, 26 );
469
+        $f9g0    = self::mul( $f9, $g0, 26 );
470
+        $f9g1_38 = self::mul( $g1_19, $f9_2, 26 );
471
+        $f9g2_19 = self::mul( $g2_19, $f9, 25 );
472
+        $f9g3_38 = self::mul( $g3_19, $f9_2, 26 );
473
+        $f9g4_19 = self::mul( $g4_19, $f9, 25 );
474
+        $f9g5_38 = self::mul( $g5_19, $f9_2, 26 );
475
+        $f9g6_19 = self::mul( $g6_19, $f9, 25 );
476
+        $f9g7_38 = self::mul( $g7_19, $f9_2, 26 );
477
+        $f9g8_19 = self::mul( $g8_19, $f9, 25 );
478
+        $f9g9_38 = self::mul( $g9_19, $f9_2, 26 );
479 479
         $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
480
-        $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
481
-        $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
482
-        $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
483
-        $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
484
-        $h5 = $f0g5 + $f1g4    + $f2g3    + $f3g2    + $f4g1    + $f5g0    + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
485
-        $h6 = $f0g6 + $f1g5_2  + $f2g4    + $f3g3_2  + $f4g2    + $f5g1_2  + $f6g0    + $f7g9_38 + $f8g8_19 + $f9g7_38;
486
-        $h7 = $f0g7 + $f1g6    + $f2g5    + $f3g4    + $f4g3    + $f5g2    + $f6g1    + $f7g0    + $f8g9_19 + $f9g8_19;
487
-        $h8 = $f0g8 + $f1g7_2  + $f2g6    + $f3g5_2  + $f4g4    + $f5g3_2  + $f6g2    + $f7g1_2  + $f8g0    + $f9g9_38;
488
-        $h9 = $f0g9 + $f1g8    + $f2g7    + $f3g6    + $f4g5    + $f5g4    + $f6g3    + $f7g2    + $f8g1    + $f9g0   ;
489
-
490
-        $carry0 = ($h0 + (1 << 25)) >> 26;
480
+        $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
481
+        $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
482
+        $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
483
+        $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
484
+        $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
485
+        $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38;
486
+        $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19;
487
+        $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38;
488
+        $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0;
489
+
490
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
491 491
         $h1 += $carry0;
492 492
         $h0 -= $carry0 << 26;
493
-        $carry4 = ($h4 + (1 << 25)) >> 26;
493
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
494 494
         $h5 += $carry4;
495 495
         $h4 -= $carry4 << 26;
496 496
 
497
-        $carry1 = ($h1 + (1 << 24)) >> 25;
497
+        $carry1 = ( $h1 + ( 1 << 24 ) ) >> 25;
498 498
         $h2 += $carry1;
499 499
         $h1 -= $carry1 << 25;
500
-        $carry5 = ($h5 + (1 << 24)) >> 25;
500
+        $carry5 = ( $h5 + ( 1 << 24 ) ) >> 25;
501 501
         $h6 += $carry5;
502 502
         $h5 -= $carry5 << 25;
503 503
 
504
-        $carry2 = ($h2 + (1 << 25)) >> 26;
504
+        $carry2 = ( $h2 + ( 1 << 25 ) ) >> 26;
505 505
         $h3 += $carry2;
506 506
         $h2 -= $carry2 << 26;
507
-        $carry6 = ($h6 + (1 << 25)) >> 26;
507
+        $carry6 = ( $h6 + ( 1 << 25 ) ) >> 26;
508 508
         $h7 += $carry6;
509 509
         $h6 -= $carry6 << 26;
510 510
 
511
-        $carry3 = ($h3 + (1 << 24)) >> 25;
511
+        $carry3 = ( $h3 + ( 1 << 24 ) ) >> 25;
512 512
         $h4 += $carry3;
513 513
         $h3 -= $carry3 << 25;
514
-        $carry7 = ($h7 + (1 << 24)) >> 25;
514
+        $carry7 = ( $h7 + ( 1 << 24 ) ) >> 25;
515 515
         $h8 += $carry7;
516 516
         $h7 -= $carry7 << 25;
517 517
 
518
-        $carry4 = ($h4 + (1 << 25)) >> 26;
518
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
519 519
         $h5 += $carry4;
520 520
         $h4 -= $carry4 << 26;
521
-        $carry8 = ($h8 + (1 << 25)) >> 26;
521
+        $carry8 = ( $h8 + ( 1 << 25 ) ) >> 26;
522 522
         $h9 += $carry8;
523 523
         $h8 -= $carry8 << 26;
524 524
 
525
-        $carry9 = ($h9 + (1 << 24)) >> 25;
526
-        $h0 += self::mul($carry9, 19, 5);
525
+        $carry9 = ( $h9 + ( 1 << 24 ) ) >> 25;
526
+        $h0 += self::mul( $carry9, 19, 5 );
527 527
         $h9 -= $carry9 << 25;
528 528
 
529
-        $carry0 = ($h0 + (1 << 25)) >> 26;
529
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
530 530
         $h1 += $carry0;
531 531
         $h0 -= $carry0 << 26;
532 532
 
533 533
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
534 534
             array(
535
-                (int) $h0,
536
-                (int) $h1,
537
-                (int) $h2,
538
-                (int) $h3,
539
-                (int) $h4,
540
-                (int) $h5,
541
-                (int) $h6,
542
-                (int) $h7,
543
-                (int) $h8,
544
-                (int) $h9
535
+                (int)$h0,
536
+                (int)$h1,
537
+                (int)$h2,
538
+                (int)$h3,
539
+                (int)$h4,
540
+                (int)$h5,
541
+                (int)$h6,
542
+                (int)$h7,
543
+                (int)$h8,
544
+                (int)$h9
545 545
             )
546 546
         );
547 547
     }
@@ -557,11 +557,11 @@  discard block
 block discarded – undo
557 557
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
558 558
      * @psalm-suppress MixedAssignment
559 559
      */
560
-    public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f)
560
+    public static function fe_neg( ParagonIE_Sodium_Core_Curve25519_Fe $f )
561 561
     {
562 562
         $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
563
-        for ($i = 0; $i < 10; ++$i) {
564
-            $h[$i] = -$f[$i];
563
+        for ( $i = 0; $i < 10; ++$i ) {
564
+            $h[ $i ] = -$f[ $i ];
565 565
         }
566 566
         return $h;
567 567
     }
@@ -576,18 +576,18 @@  discard block
 block discarded – undo
576 576
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
577 577
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
578 578
      */
579
-    public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
579
+    public static function fe_sq( ParagonIE_Sodium_Core_Curve25519_Fe $f )
580 580
     {
581
-        $f0 = (int) $f[0];
582
-        $f1 = (int) $f[1];
583
-        $f2 = (int) $f[2];
584
-        $f3 = (int) $f[3];
585
-        $f4 = (int) $f[4];
586
-        $f5 = (int) $f[5];
587
-        $f6 = (int) $f[6];
588
-        $f7 = (int) $f[7];
589
-        $f8 = (int) $f[8];
590
-        $f9 = (int) $f[9];
581
+        $f0 = (int)$f[ 0 ];
582
+        $f1 = (int)$f[ 1 ];
583
+        $f2 = (int)$f[ 2 ];
584
+        $f3 = (int)$f[ 3 ];
585
+        $f4 = (int)$f[ 4 ];
586
+        $f5 = (int)$f[ 5 ];
587
+        $f6 = (int)$f[ 6 ];
588
+        $f7 = (int)$f[ 7 ];
589
+        $f8 = (int)$f[ 8 ];
590
+        $f9 = (int)$f[ 9 ];
591 591
 
592 592
         $f0_2 = $f0 << 1;
593 593
         $f1_2 = $f1 << 1;
@@ -597,132 +597,132 @@  discard block
 block discarded – undo
597 597
         $f5_2 = $f5 << 1;
598 598
         $f6_2 = $f6 << 1;
599 599
         $f7_2 = $f7 << 1;
600
-        $f5_38 = self::mul($f5, 38, 6);
601
-        $f6_19 = self::mul($f6, 19, 5);
602
-        $f7_38 = self::mul($f7, 38, 6);
603
-        $f8_19 = self::mul($f8, 19, 5);
604
-        $f9_38 = self::mul($f9, 38, 6);
605
-        $f0f0    = self::mul($f0,    $f0,    26);
606
-        $f0f1_2  = self::mul($f0_2,  $f1,    26);
607
-        $f0f2_2  = self::mul($f0_2,  $f2,    26);
608
-        $f0f3_2  = self::mul($f0_2,  $f3,    26);
609
-        $f0f4_2  = self::mul($f0_2,  $f4,    26);
610
-        $f0f5_2  = self::mul($f0_2,  $f5,    26);
611
-        $f0f6_2  = self::mul($f0_2,  $f6,    26);
612
-        $f0f7_2  = self::mul($f0_2,  $f7,    26);
613
-        $f0f8_2  = self::mul($f0_2,  $f8,    26);
614
-        $f0f9_2  = self::mul($f0_2,  $f9,    26);
615
-        $f1f1_2  = self::mul($f1_2,  $f1,    26);
616
-        $f1f2_2  = self::mul($f1_2,  $f2,    26);
617
-        $f1f3_4  = self::mul($f1_2,  $f3_2,  26);
618
-        $f1f4_2  = self::mul($f1_2,  $f4,    26);
619
-        $f1f5_4  = self::mul($f1_2,  $f5_2,  26);
620
-        $f1f6_2  = self::mul($f1_2,  $f6,    26);
621
-        $f1f7_4  = self::mul($f1_2,  $f7_2,  26);
622
-        $f1f8_2  = self::mul($f1_2,  $f8,    26);
623
-        $f1f9_76 = self::mul($f9_38, $f1_2,  27);
624
-        $f2f2    = self::mul($f2,    $f2,    27);
625
-        $f2f3_2  = self::mul($f2_2,  $f3,    27);
626
-        $f2f4_2  = self::mul($f2_2,  $f4,    27);
627
-        $f2f5_2  = self::mul($f2_2,  $f5,    27);
628
-        $f2f6_2  = self::mul($f2_2,  $f6,    27);
629
-        $f2f7_2  = self::mul($f2_2,  $f7,    27);
630
-        $f2f8_38 = self::mul($f8_19, $f2_2,  27);
631
-        $f2f9_38 = self::mul($f9_38, $f2,    26);
632
-        $f3f3_2  = self::mul($f3_2,  $f3,    26);
633
-        $f3f4_2  = self::mul($f3_2,  $f4,    26);
634
-        $f3f5_4  = self::mul($f3_2,  $f5_2,  26);
635
-        $f3f6_2  = self::mul($f3_2,  $f6,    26);
636
-        $f3f7_76 = self::mul($f7_38, $f3_2,  26);
637
-        $f3f8_38 = self::mul($f8_19, $f3_2,  26);
638
-        $f3f9_76 = self::mul($f9_38, $f3_2,  26);
639
-        $f4f4    = self::mul($f4,    $f4,    26);
640
-        $f4f5_2  = self::mul($f4_2,  $f5,    26);
641
-        $f4f6_38 = self::mul($f6_19, $f4_2,  27);
642
-        $f4f7_38 = self::mul($f7_38, $f4,    26);
643
-        $f4f8_38 = self::mul($f8_19, $f4_2,  27);
644
-        $f4f9_38 = self::mul($f9_38, $f4,    26);
645
-        $f5f5_38 = self::mul($f5_38, $f5,    26);
646
-        $f5f6_38 = self::mul($f6_19, $f5_2,  26);
647
-        $f5f7_76 = self::mul($f7_38, $f5_2,  26);
648
-        $f5f8_38 = self::mul($f8_19, $f5_2,  26);
649
-        $f5f9_76 = self::mul($f9_38, $f5_2,  26);
650
-        $f6f6_19 = self::mul($f6_19, $f6,    26);
651
-        $f6f7_38 = self::mul($f7_38, $f6,    26);
652
-        $f6f8_38 = self::mul($f8_19, $f6_2,  27);
653
-        $f6f9_38 = self::mul($f9_38, $f6,    26);
654
-        $f7f7_38 = self::mul($f7_38, $f7,    26);
655
-        $f7f8_38 = self::mul($f8_19, $f7_2,  26);
656
-        $f7f9_76 = self::mul($f9_38, $f7_2,  26);
657
-        $f8f8_19 = self::mul($f8_19, $f8,    26);
658
-        $f8f9_38 = self::mul($f9_38, $f8,    26);
659
-        $f9f9_38 = self::mul($f9_38, $f9,    26);
660
-        $h0 = $f0f0   + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38;
600
+        $f5_38 = self::mul( $f5, 38, 6 );
601
+        $f6_19 = self::mul( $f6, 19, 5 );
602
+        $f7_38 = self::mul( $f7, 38, 6 );
603
+        $f8_19 = self::mul( $f8, 19, 5 );
604
+        $f9_38 = self::mul( $f9, 38, 6 );
605
+        $f0f0    = self::mul( $f0, $f0, 26 );
606
+        $f0f1_2  = self::mul( $f0_2, $f1, 26 );
607
+        $f0f2_2  = self::mul( $f0_2, $f2, 26 );
608
+        $f0f3_2  = self::mul( $f0_2, $f3, 26 );
609
+        $f0f4_2  = self::mul( $f0_2, $f4, 26 );
610
+        $f0f5_2  = self::mul( $f0_2, $f5, 26 );
611
+        $f0f6_2  = self::mul( $f0_2, $f6, 26 );
612
+        $f0f7_2  = self::mul( $f0_2, $f7, 26 );
613
+        $f0f8_2  = self::mul( $f0_2, $f8, 26 );
614
+        $f0f9_2  = self::mul( $f0_2, $f9, 26 );
615
+        $f1f1_2  = self::mul( $f1_2, $f1, 26 );
616
+        $f1f2_2  = self::mul( $f1_2, $f2, 26 );
617
+        $f1f3_4  = self::mul( $f1_2, $f3_2, 26 );
618
+        $f1f4_2  = self::mul( $f1_2, $f4, 26 );
619
+        $f1f5_4  = self::mul( $f1_2, $f5_2, 26 );
620
+        $f1f6_2  = self::mul( $f1_2, $f6, 26 );
621
+        $f1f7_4  = self::mul( $f1_2, $f7_2, 26 );
622
+        $f1f8_2  = self::mul( $f1_2, $f8, 26 );
623
+        $f1f9_76 = self::mul( $f9_38, $f1_2, 27 );
624
+        $f2f2    = self::mul( $f2, $f2, 27 );
625
+        $f2f3_2  = self::mul( $f2_2, $f3, 27 );
626
+        $f2f4_2  = self::mul( $f2_2, $f4, 27 );
627
+        $f2f5_2  = self::mul( $f2_2, $f5, 27 );
628
+        $f2f6_2  = self::mul( $f2_2, $f6, 27 );
629
+        $f2f7_2  = self::mul( $f2_2, $f7, 27 );
630
+        $f2f8_38 = self::mul( $f8_19, $f2_2, 27 );
631
+        $f2f9_38 = self::mul( $f9_38, $f2, 26 );
632
+        $f3f3_2  = self::mul( $f3_2, $f3, 26 );
633
+        $f3f4_2  = self::mul( $f3_2, $f4, 26 );
634
+        $f3f5_4  = self::mul( $f3_2, $f5_2, 26 );
635
+        $f3f6_2  = self::mul( $f3_2, $f6, 26 );
636
+        $f3f7_76 = self::mul( $f7_38, $f3_2, 26 );
637
+        $f3f8_38 = self::mul( $f8_19, $f3_2, 26 );
638
+        $f3f9_76 = self::mul( $f9_38, $f3_2, 26 );
639
+        $f4f4    = self::mul( $f4, $f4, 26 );
640
+        $f4f5_2  = self::mul( $f4_2, $f5, 26 );
641
+        $f4f6_38 = self::mul( $f6_19, $f4_2, 27 );
642
+        $f4f7_38 = self::mul( $f7_38, $f4, 26 );
643
+        $f4f8_38 = self::mul( $f8_19, $f4_2, 27 );
644
+        $f4f9_38 = self::mul( $f9_38, $f4, 26 );
645
+        $f5f5_38 = self::mul( $f5_38, $f5, 26 );
646
+        $f5f6_38 = self::mul( $f6_19, $f5_2, 26 );
647
+        $f5f7_76 = self::mul( $f7_38, $f5_2, 26 );
648
+        $f5f8_38 = self::mul( $f8_19, $f5_2, 26 );
649
+        $f5f9_76 = self::mul( $f9_38, $f5_2, 26 );
650
+        $f6f6_19 = self::mul( $f6_19, $f6, 26 );
651
+        $f6f7_38 = self::mul( $f7_38, $f6, 26 );
652
+        $f6f8_38 = self::mul( $f8_19, $f6_2, 27 );
653
+        $f6f9_38 = self::mul( $f9_38, $f6, 26 );
654
+        $f7f7_38 = self::mul( $f7_38, $f7, 26 );
655
+        $f7f8_38 = self::mul( $f8_19, $f7_2, 26 );
656
+        $f7f9_76 = self::mul( $f9_38, $f7_2, 26 );
657
+        $f8f8_19 = self::mul( $f8_19, $f8, 26 );
658
+        $f8f9_38 = self::mul( $f9_38, $f8, 26 );
659
+        $f9f9_38 = self::mul( $f9_38, $f9, 26 );
660
+        $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38;
661 661
         $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38;
662
-        $h2 = $f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19;
663
-        $h3 = $f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38;
664
-        $h4 = $f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38;
665
-        $h5 = $f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38;
666
-        $h6 = $f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19;
667
-        $h7 = $f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38;
668
-        $h8 = $f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38;
669
-        $h9 = $f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2;
670
-
671
-        $carry0 = ($h0 + (1 << 25)) >> 26;
662
+        $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19;
663
+        $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38;
664
+        $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38;
665
+        $h5 = $f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38;
666
+        $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19;
667
+        $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38;
668
+        $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38;
669
+        $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2;
670
+
671
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
672 672
         $h1 += $carry0;
673 673
         $h0 -= $carry0 << 26;
674
-        $carry4 = ($h4 + (1 << 25)) >> 26;
674
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
675 675
         $h5 += $carry4;
676 676
         $h4 -= $carry4 << 26;
677 677
 
678
-        $carry1 = ($h1 + (1 << 24)) >> 25;
678
+        $carry1 = ( $h1 + ( 1 << 24 ) ) >> 25;
679 679
         $h2 += $carry1;
680 680
         $h1 -= $carry1 << 25;
681
-        $carry5 = ($h5 + (1 << 24)) >> 25;
681
+        $carry5 = ( $h5 + ( 1 << 24 ) ) >> 25;
682 682
         $h6 += $carry5;
683 683
         $h5 -= $carry5 << 25;
684 684
 
685
-        $carry2 = ($h2 + (1 << 25)) >> 26;
685
+        $carry2 = ( $h2 + ( 1 << 25 ) ) >> 26;
686 686
         $h3 += $carry2;
687 687
         $h2 -= $carry2 << 26;
688
-        $carry6 = ($h6 + (1 << 25)) >> 26;
688
+        $carry6 = ( $h6 + ( 1 << 25 ) ) >> 26;
689 689
         $h7 += $carry6;
690 690
         $h6 -= $carry6 << 26;
691 691
 
692
-        $carry3 = ($h3 + (1 << 24)) >> 25;
692
+        $carry3 = ( $h3 + ( 1 << 24 ) ) >> 25;
693 693
         $h4 += $carry3;
694 694
         $h3 -= $carry3 << 25;
695
-        $carry7 = ($h7 + (1 << 24)) >> 25;
695
+        $carry7 = ( $h7 + ( 1 << 24 ) ) >> 25;
696 696
         $h8 += $carry7;
697 697
         $h7 -= $carry7 << 25;
698 698
 
699
-        $carry4 = ($h4 + (1 << 25)) >> 26;
699
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
700 700
         $h5 += $carry4;
701 701
         $h4 -= $carry4 << 26;
702
-        $carry8 = ($h8 + (1 << 25)) >> 26;
702
+        $carry8 = ( $h8 + ( 1 << 25 ) ) >> 26;
703 703
         $h9 += $carry8;
704 704
         $h8 -= $carry8 << 26;
705 705
 
706
-        $carry9 = ($h9 + (1 << 24)) >> 25;
707
-        $h0 += self::mul($carry9, 19, 5);
706
+        $carry9 = ( $h9 + ( 1 << 24 ) ) >> 25;
707
+        $h0 += self::mul( $carry9, 19, 5 );
708 708
         $h9 -= $carry9 << 25;
709 709
 
710
-        $carry0 = ($h0 + (1 << 25)) >> 26;
710
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
711 711
         $h1 += $carry0;
712 712
         $h0 -= $carry0 << 26;
713 713
 
714 714
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
715 715
             array(
716
-                (int) $h0,
717
-                (int) $h1,
718
-                (int) $h2,
719
-                (int) $h3,
720
-                (int) $h4,
721
-                (int) $h5,
722
-                (int) $h6,
723
-                (int) $h7,
724
-                (int) $h8,
725
-                (int) $h9
716
+                (int)$h0,
717
+                (int)$h1,
718
+                (int)$h2,
719
+                (int)$h3,
720
+                (int)$h4,
721
+                (int)$h5,
722
+                (int)$h6,
723
+                (int)$h7,
724
+                (int)$h8,
725
+                (int)$h9
726 726
             )
727 727
         );
728 728
     }
@@ -738,18 +738,18 @@  discard block
 block discarded – undo
738 738
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
739 739
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
740 740
      */
741
-    public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
741
+    public static function fe_sq2( ParagonIE_Sodium_Core_Curve25519_Fe $f )
742 742
     {
743
-        $f0 = (int) $f[0];
744
-        $f1 = (int) $f[1];
745
-        $f2 = (int) $f[2];
746
-        $f3 = (int) $f[3];
747
-        $f4 = (int) $f[4];
748
-        $f5 = (int) $f[5];
749
-        $f6 = (int) $f[6];
750
-        $f7 = (int) $f[7];
751
-        $f8 = (int) $f[8];
752
-        $f9 = (int) $f[9];
743
+        $f0 = (int)$f[ 0 ];
744
+        $f1 = (int)$f[ 1 ];
745
+        $f2 = (int)$f[ 2 ];
746
+        $f3 = (int)$f[ 3 ];
747
+        $f4 = (int)$f[ 4 ];
748
+        $f5 = (int)$f[ 5 ];
749
+        $f6 = (int)$f[ 6 ];
750
+        $f7 = (int)$f[ 7 ];
751
+        $f8 = (int)$f[ 8 ];
752
+        $f9 = (int)$f[ 9 ];
753 753
 
754 754
         $f0_2 = $f0 << 1;
755 755
         $f1_2 = $f1 << 1;
@@ -759,133 +759,133 @@  discard block
 block discarded – undo
759 759
         $f5_2 = $f5 << 1;
760 760
         $f6_2 = $f6 << 1;
761 761
         $f7_2 = $f7 << 1;
762
-        $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
763
-        $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
764
-        $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
765
-        $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
766
-        $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */
767
-        $f0f0 = self::mul($f0, $f0, 24);
768
-        $f0f1_2 = self::mul($f0_2, $f1, 24);
769
-        $f0f2_2 = self::mul($f0_2, $f2, 24);
770
-        $f0f3_2 = self::mul($f0_2, $f3, 24);
771
-        $f0f4_2 = self::mul($f0_2, $f4, 24);
772
-        $f0f5_2 = self::mul($f0_2, $f5, 24);
773
-        $f0f6_2 = self::mul($f0_2, $f6, 24);
774
-        $f0f7_2 = self::mul($f0_2, $f7, 24);
775
-        $f0f8_2 = self::mul($f0_2, $f8, 24);
776
-        $f0f9_2 = self::mul($f0_2, $f9, 24);
777
-        $f1f1_2 = self::mul($f1_2,  $f1, 24);
778
-        $f1f2_2 = self::mul($f1_2,  $f2, 24);
779
-        $f1f3_4 = self::mul($f1_2,  $f3_2, 24);
780
-        $f1f4_2 = self::mul($f1_2,  $f4, 24);
781
-        $f1f5_4 = self::mul($f1_2,  $f5_2, 24);
782
-        $f1f6_2 = self::mul($f1_2,  $f6, 24);
783
-        $f1f7_4 = self::mul($f1_2,  $f7_2, 24);
784
-        $f1f8_2 = self::mul($f1_2,  $f8, 24);
785
-        $f1f9_76 = self::mul($f9_38, $f1_2, 24);
786
-        $f2f2 = self::mul($f2,  $f2, 24);
787
-        $f2f3_2 = self::mul($f2_2,  $f3, 24);
788
-        $f2f4_2 = self::mul($f2_2,  $f4, 24);
789
-        $f2f5_2 = self::mul($f2_2,  $f5, 24);
790
-        $f2f6_2 = self::mul($f2_2,  $f6, 24);
791
-        $f2f7_2 = self::mul($f2_2,  $f7, 24);
792
-        $f2f8_38 = self::mul($f8_19, $f2_2, 25);
793
-        $f2f9_38 = self::mul($f9_38, $f2, 24);
794
-        $f3f3_2 = self::mul($f3_2,  $f3, 24);
795
-        $f3f4_2 = self::mul($f3_2,  $f4, 24);
796
-        $f3f5_4 = self::mul($f3_2,  $f5_2, 24);
797
-        $f3f6_2 = self::mul($f3_2,  $f6, 24);
798
-        $f3f7_76 = self::mul($f7_38, $f3_2, 24);
799
-        $f3f8_38 = self::mul($f8_19, $f3_2, 24);
800
-        $f3f9_76 = self::mul($f9_38, $f3_2, 24);
801
-        $f4f4 = self::mul($f4,  $f4, 24);
802
-        $f4f5_2 = self::mul($f4_2,  $f5, 24);
803
-        $f4f6_38 = self::mul($f6_19, $f4_2, 25);
804
-        $f4f7_38 = self::mul($f7_38, $f4, 24);
805
-        $f4f8_38 = self::mul($f8_19, $f4_2, 25);
806
-        $f4f9_38 = self::mul($f9_38, $f4, 24);
807
-        $f5f5_38 = self::mul($f5_38, $f5, 24);
808
-        $f5f6_38 = self::mul($f6_19, $f5_2, 24);
809
-        $f5f7_76 = self::mul($f7_38, $f5_2, 24);
810
-        $f5f8_38 = self::mul($f8_19, $f5_2, 24);
811
-        $f5f9_76 = self::mul($f9_38, $f5_2, 24);
812
-        $f6f6_19 = self::mul($f6_19, $f6, 24);
813
-        $f6f7_38 = self::mul($f7_38, $f6, 24);
814
-        $f6f8_38 = self::mul($f8_19, $f6_2, 25);
815
-        $f6f9_38 = self::mul($f9_38, $f6, 24);
816
-        $f7f7_38 = self::mul($f7_38, $f7, 24);
817
-        $f7f8_38 = self::mul($f8_19, $f7_2, 24);
818
-        $f7f9_76 = self::mul($f9_38, $f7_2, 24);
819
-        $f8f8_19 = self::mul($f8_19, $f8, 24);
820
-        $f8f9_38 = self::mul($f9_38, $f8, 24);
821
-        $f9f9_38 = self::mul($f9_38, $f9, 24);
822
-
823
-        $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1;
824
-        $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1;
825
-        $h2 = (int) ($f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1;
826
-        $h3 = (int) ($f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1;
827
-        $h4 = (int) ($f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1;
828
-        $h5 = (int) ($f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38) << 1;
829
-        $h6 = (int) ($f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19) << 1;
830
-        $h7 = (int) ($f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38) << 1;
831
-        $h8 = (int) ($f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38) << 1;
832
-        $h9 = (int) ($f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2) << 1;
833
-
834
-        $carry0 = ($h0 + (1 << 25)) >> 26;
762
+        $f5_38 = self::mul( $f5, 38, 6 ); /* 1.959375*2^30 */
763
+        $f6_19 = self::mul( $f6, 19, 5 ); /* 1.959375*2^30 */
764
+        $f7_38 = self::mul( $f7, 38, 6 ); /* 1.959375*2^30 */
765
+        $f8_19 = self::mul( $f8, 19, 5 ); /* 1.959375*2^30 */
766
+        $f9_38 = self::mul( $f9, 38, 6 ); /* 1.959375*2^30 */
767
+        $f0f0 = self::mul( $f0, $f0, 24 );
768
+        $f0f1_2 = self::mul( $f0_2, $f1, 24 );
769
+        $f0f2_2 = self::mul( $f0_2, $f2, 24 );
770
+        $f0f3_2 = self::mul( $f0_2, $f3, 24 );
771
+        $f0f4_2 = self::mul( $f0_2, $f4, 24 );
772
+        $f0f5_2 = self::mul( $f0_2, $f5, 24 );
773
+        $f0f6_2 = self::mul( $f0_2, $f6, 24 );
774
+        $f0f7_2 = self::mul( $f0_2, $f7, 24 );
775
+        $f0f8_2 = self::mul( $f0_2, $f8, 24 );
776
+        $f0f9_2 = self::mul( $f0_2, $f9, 24 );
777
+        $f1f1_2 = self::mul( $f1_2, $f1, 24 );
778
+        $f1f2_2 = self::mul( $f1_2, $f2, 24 );
779
+        $f1f3_4 = self::mul( $f1_2, $f3_2, 24 );
780
+        $f1f4_2 = self::mul( $f1_2, $f4, 24 );
781
+        $f1f5_4 = self::mul( $f1_2, $f5_2, 24 );
782
+        $f1f6_2 = self::mul( $f1_2, $f6, 24 );
783
+        $f1f7_4 = self::mul( $f1_2, $f7_2, 24 );
784
+        $f1f8_2 = self::mul( $f1_2, $f8, 24 );
785
+        $f1f9_76 = self::mul( $f9_38, $f1_2, 24 );
786
+        $f2f2 = self::mul( $f2, $f2, 24 );
787
+        $f2f3_2 = self::mul( $f2_2, $f3, 24 );
788
+        $f2f4_2 = self::mul( $f2_2, $f4, 24 );
789
+        $f2f5_2 = self::mul( $f2_2, $f5, 24 );
790
+        $f2f6_2 = self::mul( $f2_2, $f6, 24 );
791
+        $f2f7_2 = self::mul( $f2_2, $f7, 24 );
792
+        $f2f8_38 = self::mul( $f8_19, $f2_2, 25 );
793
+        $f2f9_38 = self::mul( $f9_38, $f2, 24 );
794
+        $f3f3_2 = self::mul( $f3_2, $f3, 24 );
795
+        $f3f4_2 = self::mul( $f3_2, $f4, 24 );
796
+        $f3f5_4 = self::mul( $f3_2, $f5_2, 24 );
797
+        $f3f6_2 = self::mul( $f3_2, $f6, 24 );
798
+        $f3f7_76 = self::mul( $f7_38, $f3_2, 24 );
799
+        $f3f8_38 = self::mul( $f8_19, $f3_2, 24 );
800
+        $f3f9_76 = self::mul( $f9_38, $f3_2, 24 );
801
+        $f4f4 = self::mul( $f4, $f4, 24 );
802
+        $f4f5_2 = self::mul( $f4_2, $f5, 24 );
803
+        $f4f6_38 = self::mul( $f6_19, $f4_2, 25 );
804
+        $f4f7_38 = self::mul( $f7_38, $f4, 24 );
805
+        $f4f8_38 = self::mul( $f8_19, $f4_2, 25 );
806
+        $f4f9_38 = self::mul( $f9_38, $f4, 24 );
807
+        $f5f5_38 = self::mul( $f5_38, $f5, 24 );
808
+        $f5f6_38 = self::mul( $f6_19, $f5_2, 24 );
809
+        $f5f7_76 = self::mul( $f7_38, $f5_2, 24 );
810
+        $f5f8_38 = self::mul( $f8_19, $f5_2, 24 );
811
+        $f5f9_76 = self::mul( $f9_38, $f5_2, 24 );
812
+        $f6f6_19 = self::mul( $f6_19, $f6, 24 );
813
+        $f6f7_38 = self::mul( $f7_38, $f6, 24 );
814
+        $f6f8_38 = self::mul( $f8_19, $f6_2, 25 );
815
+        $f6f9_38 = self::mul( $f9_38, $f6, 24 );
816
+        $f7f7_38 = self::mul( $f7_38, $f7, 24 );
817
+        $f7f8_38 = self::mul( $f8_19, $f7_2, 24 );
818
+        $f7f9_76 = self::mul( $f9_38, $f7_2, 24 );
819
+        $f8f8_19 = self::mul( $f8_19, $f8, 24 );
820
+        $f8f9_38 = self::mul( $f9_38, $f8, 24 );
821
+        $f9f9_38 = self::mul( $f9_38, $f9, 24 );
822
+
823
+        $h0 = (int)( $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38 ) << 1;
824
+        $h1 = (int)( $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38 ) << 1;
825
+        $h2 = (int)( $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19 ) << 1;
826
+        $h3 = (int)( $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38 ) << 1;
827
+        $h4 = (int)( $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38 ) << 1;
828
+        $h5 = (int)( $f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38 ) << 1;
829
+        $h6 = (int)( $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19 ) << 1;
830
+        $h7 = (int)( $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38 ) << 1;
831
+        $h8 = (int)( $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38 ) << 1;
832
+        $h9 = (int)( $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2 ) << 1;
833
+
834
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
835 835
         $h1 += $carry0;
836 836
         $h0 -= $carry0 << 26;
837
-        $carry4 = ($h4 + (1 << 25)) >> 26;
837
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
838 838
         $h5 += $carry4;
839 839
         $h4 -= $carry4 << 26;
840 840
 
841
-        $carry1 = ($h1 + (1 << 24)) >> 25;
841
+        $carry1 = ( $h1 + ( 1 << 24 ) ) >> 25;
842 842
         $h2 += $carry1;
843 843
         $h1 -= $carry1 << 25;
844
-        $carry5 = ($h5 + (1 << 24)) >> 25;
844
+        $carry5 = ( $h5 + ( 1 << 24 ) ) >> 25;
845 845
         $h6 += $carry5;
846 846
         $h5 -= $carry5 << 25;
847 847
 
848
-        $carry2 = ($h2 + (1 << 25)) >> 26;
848
+        $carry2 = ( $h2 + ( 1 << 25 ) ) >> 26;
849 849
         $h3 += $carry2;
850 850
         $h2 -= $carry2 << 26;
851
-        $carry6 = ($h6 + (1 << 25)) >> 26;
851
+        $carry6 = ( $h6 + ( 1 << 25 ) ) >> 26;
852 852
         $h7 += $carry6;
853 853
         $h6 -= $carry6 << 26;
854 854
 
855
-        $carry3 = ($h3 + (1 << 24)) >> 25;
855
+        $carry3 = ( $h3 + ( 1 << 24 ) ) >> 25;
856 856
         $h4 += $carry3;
857 857
         $h3 -= $carry3 << 25;
858
-        $carry7 = ($h7 + (1 << 24)) >> 25;
858
+        $carry7 = ( $h7 + ( 1 << 24 ) ) >> 25;
859 859
         $h8 += $carry7;
860 860
         $h7 -= $carry7 << 25;
861 861
 
862
-        $carry4 = ($h4 + (1 << 25)) >> 26;
862
+        $carry4 = ( $h4 + ( 1 << 25 ) ) >> 26;
863 863
         $h5 += $carry4;
864 864
         $h4 -= $carry4 << 26;
865
-        $carry8 = ($h8 + (1 << 25)) >> 26;
865
+        $carry8 = ( $h8 + ( 1 << 25 ) ) >> 26;
866 866
         $h9 += $carry8;
867 867
         $h8 -= $carry8 << 26;
868 868
 
869
-        $carry9 = ($h9 + (1 << 24)) >> 25;
870
-        $h0 += self::mul($carry9, 19, 5);
869
+        $carry9 = ( $h9 + ( 1 << 24 ) ) >> 25;
870
+        $h0 += self::mul( $carry9, 19, 5 );
871 871
         $h9 -= $carry9 << 25;
872 872
 
873
-        $carry0 = ($h0 + (1 << 25)) >> 26;
873
+        $carry0 = ( $h0 + ( 1 << 25 ) ) >> 26;
874 874
         $h1 += $carry0;
875 875
         $h0 -= $carry0 << 26;
876 876
 
877 877
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
878 878
             array(
879
-                (int) $h0,
880
-                (int) $h1,
881
-                (int) $h2,
882
-                (int) $h3,
883
-                (int) $h4,
884
-                (int) $h5,
885
-                (int) $h6,
886
-                (int) $h7,
887
-                (int) $h8,
888
-                (int) $h9
879
+                (int)$h0,
880
+                (int)$h1,
881
+                (int)$h2,
882
+                (int)$h3,
883
+                (int)$h4,
884
+                (int)$h5,
885
+                (int)$h6,
886
+                (int)$h7,
887
+                (int)$h8,
888
+                (int)$h9
889 889
             )
890 890
         );
891 891
     }
@@ -896,56 +896,56 @@  discard block
 block discarded – undo
896 896
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z
897 897
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
898 898
      */
899
-    public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z)
899
+    public static function fe_invert( ParagonIE_Sodium_Core_Curve25519_Fe $Z )
900 900
     {
901 901
         $z = clone $Z;
902
-        $t0 = self::fe_sq($z);
903
-        $t1 = self::fe_sq($t0);
904
-        $t1 = self::fe_sq($t1);
905
-        $t1 = self::fe_mul($z, $t1);
906
-        $t0 = self::fe_mul($t0, $t1);
907
-        $t2 = self::fe_sq($t0);
908
-        $t1 = self::fe_mul($t1, $t2);
909
-        $t2 = self::fe_sq($t1);
910
-        for ($i = 1; $i < 5; ++$i) {
911
-            $t2 = self::fe_sq($t2);
902
+        $t0 = self::fe_sq( $z );
903
+        $t1 = self::fe_sq( $t0 );
904
+        $t1 = self::fe_sq( $t1 );
905
+        $t1 = self::fe_mul( $z, $t1 );
906
+        $t0 = self::fe_mul( $t0, $t1 );
907
+        $t2 = self::fe_sq( $t0 );
908
+        $t1 = self::fe_mul( $t1, $t2 );
909
+        $t2 = self::fe_sq( $t1 );
910
+        for ( $i = 1; $i < 5; ++$i ) {
911
+            $t2 = self::fe_sq( $t2 );
912 912
         }
913
-        $t1 = self::fe_mul($t2, $t1);
914
-        $t2 = self::fe_sq($t1);
915
-        for ($i = 1; $i < 10; ++$i) {
916
-            $t2 = self::fe_sq($t2);
913
+        $t1 = self::fe_mul( $t2, $t1 );
914
+        $t2 = self::fe_sq( $t1 );
915
+        for ( $i = 1; $i < 10; ++$i ) {
916
+            $t2 = self::fe_sq( $t2 );
917 917
         }
918
-        $t2 = self::fe_mul($t2, $t1);
919
-        $t3 = self::fe_sq($t2);
920
-        for ($i = 1; $i < 20; ++$i) {
921
-            $t3 = self::fe_sq($t3);
918
+        $t2 = self::fe_mul( $t2, $t1 );
919
+        $t3 = self::fe_sq( $t2 );
920
+        for ( $i = 1; $i < 20; ++$i ) {
921
+            $t3 = self::fe_sq( $t3 );
922 922
         }
923
-        $t2 = self::fe_mul($t3, $t2);
924
-        $t2 = self::fe_sq($t2);
925
-        for ($i = 1; $i < 10; ++$i) {
926
-            $t2 = self::fe_sq($t2);
923
+        $t2 = self::fe_mul( $t3, $t2 );
924
+        $t2 = self::fe_sq( $t2 );
925
+        for ( $i = 1; $i < 10; ++$i ) {
926
+            $t2 = self::fe_sq( $t2 );
927 927
         }
928
-        $t1 = self::fe_mul($t2, $t1);
929
-        $t2 = self::fe_sq($t1);
930
-        for ($i = 1; $i < 50; ++$i) {
931
-            $t2 = self::fe_sq($t2);
928
+        $t1 = self::fe_mul( $t2, $t1 );
929
+        $t2 = self::fe_sq( $t1 );
930
+        for ( $i = 1; $i < 50; ++$i ) {
931
+            $t2 = self::fe_sq( $t2 );
932 932
         }
933
-        $t2 = self::fe_mul($t2, $t1);
934
-        $t3 = self::fe_sq($t2);
935
-        for ($i = 1; $i < 100; ++$i) {
936
-            $t3 = self::fe_sq($t3);
933
+        $t2 = self::fe_mul( $t2, $t1 );
934
+        $t3 = self::fe_sq( $t2 );
935
+        for ( $i = 1; $i < 100; ++$i ) {
936
+            $t3 = self::fe_sq( $t3 );
937 937
         }
938
-        $t2 = self::fe_mul($t3, $t2);
939
-        $t2 = self::fe_sq($t2);
940
-        for ($i = 1; $i < 50; ++$i) {
941
-            $t2 = self::fe_sq($t2);
938
+        $t2 = self::fe_mul( $t3, $t2 );
939
+        $t2 = self::fe_sq( $t2 );
940
+        for ( $i = 1; $i < 50; ++$i ) {
941
+            $t2 = self::fe_sq( $t2 );
942 942
         }
943
-        $t1 = self::fe_mul($t2, $t1);
944
-        $t1 = self::fe_sq($t1);
945
-        for ($i = 1; $i < 5; ++$i) {
946
-            $t1 = self::fe_sq($t1);
943
+        $t1 = self::fe_mul( $t2, $t1 );
944
+        $t1 = self::fe_sq( $t1 );
945
+        for ( $i = 1; $i < 5; ++$i ) {
946
+            $t1 = self::fe_sq( $t1 );
947 947
         }
948
-        return self::fe_mul($t1, $t0);
948
+        return self::fe_mul( $t1, $t0 );
949 949
     }
950 950
 
951 951
     /**
@@ -956,7 +956,7 @@  discard block
 block discarded – undo
956 956
      * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
957 957
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
958 958
      */
959
-    public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
959
+    public static function fe_pow22523( ParagonIE_Sodium_Core_Curve25519_Fe $z )
960 960
     {
961 961
         # fe_sq(t0, z);
962 962
         # fe_sq(t1, t0);
@@ -966,102 +966,102 @@  discard block
 block discarded – undo
966 966
         # fe_sq(t0, t0);
967 967
         # fe_mul(t0, t1, t0);
968 968
         # fe_sq(t1, t0);
969
-        $t0 = self::fe_sq($z);
970
-        $t1 = self::fe_sq($t0);
971
-        $t1 = self::fe_sq($t1);
972
-        $t1 = self::fe_mul($z, $t1);
973
-        $t0 = self::fe_mul($t0, $t1);
974
-        $t0 = self::fe_sq($t0);
975
-        $t0 = self::fe_mul($t1, $t0);
976
-        $t1 = self::fe_sq($t0);
969
+        $t0 = self::fe_sq( $z );
970
+        $t1 = self::fe_sq( $t0 );
971
+        $t1 = self::fe_sq( $t1 );
972
+        $t1 = self::fe_mul( $z, $t1 );
973
+        $t0 = self::fe_mul( $t0, $t1 );
974
+        $t0 = self::fe_sq( $t0 );
975
+        $t0 = self::fe_mul( $t1, $t0 );
976
+        $t1 = self::fe_sq( $t0 );
977 977
 
978 978
         # for (i = 1; i < 5; ++i) {
979 979
         #     fe_sq(t1, t1);
980 980
         # }
981
-        for ($i = 1; $i < 5; ++$i) {
982
-            $t1 = self::fe_sq($t1);
981
+        for ( $i = 1; $i < 5; ++$i ) {
982
+            $t1 = self::fe_sq( $t1 );
983 983
         }
984 984
 
985 985
         # fe_mul(t0, t1, t0);
986 986
         # fe_sq(t1, t0);
987
-        $t0 = self::fe_mul($t1, $t0);
988
-        $t1 = self::fe_sq($t0);
987
+        $t0 = self::fe_mul( $t1, $t0 );
988
+        $t1 = self::fe_sq( $t0 );
989 989
 
990 990
         # for (i = 1; i < 10; ++i) {
991 991
         #     fe_sq(t1, t1);
992 992
         # }
993
-        for ($i = 1; $i < 10; ++$i) {
994
-            $t1 = self::fe_sq($t1);
993
+        for ( $i = 1; $i < 10; ++$i ) {
994
+            $t1 = self::fe_sq( $t1 );
995 995
         }
996 996
 
997 997
         # fe_mul(t1, t1, t0);
998 998
         # fe_sq(t2, t1);
999
-        $t1 = self::fe_mul($t1, $t0);
1000
-        $t2 = self::fe_sq($t1);
999
+        $t1 = self::fe_mul( $t1, $t0 );
1000
+        $t2 = self::fe_sq( $t1 );
1001 1001
 
1002 1002
         # for (i = 1; i < 20; ++i) {
1003 1003
         #     fe_sq(t2, t2);
1004 1004
         # }
1005
-        for ($i = 1; $i < 20; ++$i) {
1006
-            $t2 = self::fe_sq($t2);
1005
+        for ( $i = 1; $i < 20; ++$i ) {
1006
+            $t2 = self::fe_sq( $t2 );
1007 1007
         }
1008 1008
 
1009 1009
         # fe_mul(t1, t2, t1);
1010 1010
         # fe_sq(t1, t1);
1011
-        $t1 = self::fe_mul($t2, $t1);
1012
-        $t1 = self::fe_sq($t1);
1011
+        $t1 = self::fe_mul( $t2, $t1 );
1012
+        $t1 = self::fe_sq( $t1 );
1013 1013
 
1014 1014
         # for (i = 1; i < 10; ++i) {
1015 1015
         #     fe_sq(t1, t1);
1016 1016
         # }
1017
-        for ($i = 1; $i < 10; ++$i) {
1018
-            $t1 = self::fe_sq($t1);
1017
+        for ( $i = 1; $i < 10; ++$i ) {
1018
+            $t1 = self::fe_sq( $t1 );
1019 1019
         }
1020 1020
 
1021 1021
         # fe_mul(t0, t1, t0);
1022 1022
         # fe_sq(t1, t0);
1023
-        $t0 = self::fe_mul($t1, $t0);
1024
-        $t1 = self::fe_sq($t0);
1023
+        $t0 = self::fe_mul( $t1, $t0 );
1024
+        $t1 = self::fe_sq( $t0 );
1025 1025
 
1026 1026
         # for (i = 1; i < 50; ++i) {
1027 1027
         #     fe_sq(t1, t1);
1028 1028
         # }
1029
-        for ($i = 1; $i < 50; ++$i) {
1030
-            $t1 = self::fe_sq($t1);
1029
+        for ( $i = 1; $i < 50; ++$i ) {
1030
+            $t1 = self::fe_sq( $t1 );
1031 1031
         }
1032 1032
 
1033 1033
         # fe_mul(t1, t1, t0);
1034 1034
         # fe_sq(t2, t1);
1035
-        $t1 = self::fe_mul($t1, $t0);
1036
-        $t2 = self::fe_sq($t1);
1035
+        $t1 = self::fe_mul( $t1, $t0 );
1036
+        $t2 = self::fe_sq( $t1 );
1037 1037
 
1038 1038
         # for (i = 1; i < 100; ++i) {
1039 1039
         #     fe_sq(t2, t2);
1040 1040
         # }
1041
-        for ($i = 1; $i < 100; ++$i) {
1042
-            $t2 = self::fe_sq($t2);
1041
+        for ( $i = 1; $i < 100; ++$i ) {
1042
+            $t2 = self::fe_sq( $t2 );
1043 1043
         }
1044 1044
 
1045 1045
         # fe_mul(t1, t2, t1);
1046 1046
         # fe_sq(t1, t1);
1047
-        $t1 = self::fe_mul($t2, $t1);
1048
-        $t1 = self::fe_sq($t1);
1047
+        $t1 = self::fe_mul( $t2, $t1 );
1048
+        $t1 = self::fe_sq( $t1 );
1049 1049
 
1050 1050
         # for (i = 1; i < 50; ++i) {
1051 1051
         #     fe_sq(t1, t1);
1052 1052
         # }
1053
-        for ($i = 1; $i < 50; ++$i) {
1054
-            $t1 = self::fe_sq($t1);
1053
+        for ( $i = 1; $i < 50; ++$i ) {
1054
+            $t1 = self::fe_sq( $t1 );
1055 1055
         }
1056 1056
 
1057 1057
         # fe_mul(t0, t1, t0);
1058 1058
         # fe_sq(t0, t0);
1059 1059
         # fe_sq(t0, t0);
1060 1060
         # fe_mul(out, t0, z);
1061
-        $t0 = self::fe_mul($t1, $t0);
1062
-        $t0 = self::fe_sq($t0);
1063
-        $t0 = self::fe_sq($t0);
1064
-        return self::fe_mul($t0, $z);
1061
+        $t0 = self::fe_mul( $t1, $t0 );
1062
+        $t0 = self::fe_sq( $t0 );
1063
+        $t0 = self::fe_sq( $t0 );
1064
+        return self::fe_mul( $t0, $z );
1065 1065
     }
1066 1066
 
1067 1067
     /**
@@ -1083,20 +1083,20 @@  discard block
 block discarded – undo
1083 1083
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
1084 1084
      * @psalm-suppress MixedOperand
1085 1085
      */
1086
-    public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
1086
+    public static function fe_sub( ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g )
1087 1087
     {
1088 1088
         return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
1089 1089
             array(
1090
-                (int) ($f[0] - $g[0]),
1091
-                (int) ($f[1] - $g[1]),
1092
-                (int) ($f[2] - $g[2]),
1093
-                (int) ($f[3] - $g[3]),
1094
-                (int) ($f[4] - $g[4]),
1095
-                (int) ($f[5] - $g[5]),
1096
-                (int) ($f[6] - $g[6]),
1097
-                (int) ($f[7] - $g[7]),
1098
-                (int) ($f[8] - $g[8]),
1099
-                (int) ($f[9] - $g[9])
1090
+                (int)( $f[ 0 ] - $g[ 0 ] ),
1091
+                (int)( $f[ 1 ] - $g[ 1 ] ),
1092
+                (int)( $f[ 2 ] - $g[ 2 ] ),
1093
+                (int)( $f[ 3 ] - $g[ 3 ] ),
1094
+                (int)( $f[ 4 ] - $g[ 4 ] ),
1095
+                (int)( $f[ 5 ] - $g[ 5 ] ),
1096
+                (int)( $f[ 6 ] - $g[ 6 ] ),
1097
+                (int)( $f[ 7 ] - $g[ 7 ] ),
1098
+                (int)( $f[ 8 ] - $g[ 8 ] ),
1099
+                (int)( $f[ 9 ] - $g[ 9 ] )
1100 1100
             )
1101 1101
         );
1102 1102
     }
@@ -1117,17 +1117,17 @@  discard block
 block discarded – undo
1117 1117
         ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
1118 1118
     ) {
1119 1119
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1120
-        $r->X = self::fe_add($p->Y, $p->X);
1121
-        $r->Y = self::fe_sub($p->Y, $p->X);
1122
-        $r->Z = self::fe_mul($r->X, $q->YplusX);
1123
-        $r->Y = self::fe_mul($r->Y, $q->YminusX);
1124
-        $r->T = self::fe_mul($q->T2d, $p->T);
1125
-        $r->X = self::fe_mul($p->Z, $q->Z);
1126
-        $t0   = self::fe_add($r->X, $r->X);
1127
-        $r->X = self::fe_sub($r->Z, $r->Y);
1128
-        $r->Y = self::fe_add($r->Z, $r->Y);
1129
-        $r->Z = self::fe_add($t0, $r->T);
1130
-        $r->T = self::fe_sub($t0, $r->T);
1120
+        $r->X = self::fe_add( $p->Y, $p->X );
1121
+        $r->Y = self::fe_sub( $p->Y, $p->X );
1122
+        $r->Z = self::fe_mul( $r->X, $q->YplusX );
1123
+        $r->Y = self::fe_mul( $r->Y, $q->YminusX );
1124
+        $r->T = self::fe_mul( $q->T2d, $p->T );
1125
+        $r->X = self::fe_mul( $p->Z, $q->Z );
1126
+        $t0   = self::fe_add( $r->X, $r->X );
1127
+        $r->X = self::fe_sub( $r->Z, $r->Y );
1128
+        $r->Y = self::fe_add( $r->Z, $r->Y );
1129
+        $r->Z = self::fe_add( $t0, $r->T );
1130
+        $r->T = self::fe_sub( $t0, $r->T );
1131 1131
         return $r;
1132 1132
     }
1133 1133
 
@@ -1140,42 +1140,42 @@  discard block
 block discarded – undo
1140 1140
      * @throws SodiumException
1141 1141
      * @throws TypeError
1142 1142
      */
1143
-    public static function slide($a)
1143
+    public static function slide( $a )
1144 1144
     {
1145
-        if (self::strlen($a) < 256) {
1146
-            if (self::strlen($a) < 16) {
1147
-                $a = str_pad($a, 256, '0', STR_PAD_RIGHT);
1145
+        if ( self::strlen( $a ) < 256 ) {
1146
+            if ( self::strlen( $a ) < 16 ) {
1147
+                $a = str_pad( $a, 256, '0', STR_PAD_RIGHT );
1148 1148
             }
1149 1149
         }
1150 1150
         /** @var array<int, int> $r */
1151 1151
         $r = array();
1152 1152
 
1153 1153
         /** @var int $i */
1154
-        for ($i = 0; $i < 256; ++$i) {
1155
-            $r[$i] = (int) (
1154
+        for ( $i = 0; $i < 256; ++$i ) {
1155
+            $r[ $i ] = (int)(
1156 1156
                 1 & (
1157
-                    self::chrToInt($a[(int) ($i >> 3)])
1157
+                    self::chrToInt( $a[ (int)( $i >> 3 ) ] )
1158 1158
                         >>
1159
-                    ($i & 7)
1159
+                    ( $i & 7 )
1160 1160
                 )
1161 1161
             );
1162 1162
         }
1163 1163
 
1164
-        for ($i = 0;$i < 256;++$i) {
1165
-            if ($r[$i]) {
1166
-                for ($b = 1;$b <= 6 && $i + $b < 256;++$b) {
1167
-                    if ($r[$i + $b]) {
1168
-                        if ($r[$i] + ($r[$i + $b] << $b) <= 15) {
1169
-                            $r[$i] += $r[$i + $b] << $b;
1170
-                            $r[$i + $b] = 0;
1171
-                        } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) {
1172
-                            $r[$i] -= $r[$i + $b] << $b;
1173
-                            for ($k = $i + $b; $k < 256; ++$k) {
1174
-                                if (!$r[$k]) {
1175
-                                    $r[$k] = 1;
1164
+        for ( $i = 0; $i < 256; ++$i ) {
1165
+            if ( $r[ $i ] ) {
1166
+                for ( $b = 1; $b <= 6 && $i + $b < 256; ++$b ) {
1167
+                    if ( $r[ $i + $b ] ) {
1168
+                        if ( $r[ $i ] + ( $r[ $i + $b ] << $b ) <= 15 ) {
1169
+                            $r[ $i ] += $r[ $i + $b ] << $b;
1170
+                            $r[ $i + $b ] = 0;
1171
+                        } elseif ( $r[ $i ] - ( $r[ $i + $b ] << $b ) >= -15 ) {
1172
+                            $r[ $i ] -= $r[ $i + $b ] << $b;
1173
+                            for ( $k = $i + $b; $k < 256; ++$k ) {
1174
+                                if ( ! $r[ $k ] ) {
1175
+                                    $r[ $k ] = 1;
1176 1176
                                     break;
1177 1177
                                 }
1178
-                                $r[$k] = 0;
1178
+                                $r[ $k ] = 0;
1179 1179
                             }
1180 1180
                         } else {
1181 1181
                             break;
@@ -1195,18 +1195,18 @@  discard block
 block discarded – undo
1195 1195
      * @throws SodiumException
1196 1196
      * @throws TypeError
1197 1197
      */
1198
-    public static function ge_frombytes_negate_vartime($s)
1198
+    public static function ge_frombytes_negate_vartime( $s )
1199 1199
     {
1200 1200
         static $d = null;
1201
-        if (!$d) {
1202
-            $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
1201
+        if ( ! $d ) {
1202
+            $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$d );
1203 1203
         }
1204 1204
 
1205 1205
         # fe_frombytes(h->Y,s);
1206 1206
         # fe_1(h->Z);
1207 1207
         $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
1208 1208
             self::fe_0(),
1209
-            self::fe_frombytes($s),
1209
+            self::fe_frombytes( $s ),
1210 1210
             self::fe_1()
1211 1211
         );
1212 1212
 
@@ -1214,36 +1214,36 @@  discard block
 block discarded – undo
1214 1214
         # fe_mul(v,u,d);
1215 1215
         # fe_sub(u,u,h->Z);       /* u = y^2-1 */
1216 1216
         # fe_add(v,v,h->Z);       /* v = dy^2+1 */
1217
-        $u = self::fe_sq($h->Y);
1217
+        $u = self::fe_sq( $h->Y );
1218 1218
         /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */
1219
-        $v = self::fe_mul($u, $d);
1220
-        $u = self::fe_sub($u, $h->Z); /* u =  y^2 - 1 */
1221
-        $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */
1219
+        $v = self::fe_mul( $u, $d );
1220
+        $u = self::fe_sub( $u, $h->Z ); /* u =  y^2 - 1 */
1221
+        $v = self::fe_add( $v, $h->Z ); /* v = dy^2 + 1 */
1222 1222
 
1223 1223
         # fe_sq(v3,v);
1224 1224
         # fe_mul(v3,v3,v);        /* v3 = v^3 */
1225 1225
         # fe_sq(h->X,v3);
1226 1226
         # fe_mul(h->X,h->X,v);
1227 1227
         # fe_mul(h->X,h->X,u);    /* x = uv^7 */
1228
-        $v3 = self::fe_sq($v);
1229
-        $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */
1230
-        $h->X = self::fe_sq($v3);
1231
-        $h->X = self::fe_mul($h->X, $v);
1232
-        $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */
1228
+        $v3 = self::fe_sq( $v );
1229
+        $v3 = self::fe_mul( $v3, $v ); /* v3 = v^3 */
1230
+        $h->X = self::fe_sq( $v3 );
1231
+        $h->X = self::fe_mul( $h->X, $v );
1232
+        $h->X = self::fe_mul( $h->X, $u ); /* x = uv^7 */
1233 1233
 
1234 1234
         # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
1235 1235
         # fe_mul(h->X,h->X,v3);
1236 1236
         # fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */
1237
-        $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */
1238
-        $h->X = self::fe_mul($h->X, $v3);
1239
-        $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */
1237
+        $h->X = self::fe_pow22523( $h->X ); /* x = (uv^7)^((q-5)/8) */
1238
+        $h->X = self::fe_mul( $h->X, $v3 );
1239
+        $h->X = self::fe_mul( $h->X, $u ); /* x = uv^3(uv^7)^((q-5)/8) */
1240 1240
 
1241 1241
         # fe_sq(vxx,h->X);
1242 1242
         # fe_mul(vxx,vxx,v);
1243 1243
         # fe_sub(check,vxx,u);    /* vx^2-u */
1244
-        $vxx = self::fe_sq($h->X);
1245
-        $vxx = self::fe_mul($vxx, $v);
1246
-        $check = self::fe_sub($vxx, $u); /* vx^2 - u */
1244
+        $vxx = self::fe_sq( $h->X );
1245
+        $vxx = self::fe_mul( $vxx, $v );
1246
+        $check = self::fe_sub( $vxx, $u ); /* vx^2 - u */
1247 1247
 
1248 1248
         # if (fe_isnonzero(check)) {
1249 1249
         #     fe_add(check,vxx,u);  /* vx^2+u */
@@ -1252,27 +1252,27 @@  discard block
 block discarded – undo
1252 1252
         #     }
1253 1253
         #     fe_mul(h->X,h->X,sqrtm1);
1254 1254
         # }
1255
-        if (self::fe_isnonzero($check)) {
1256
-            $check = self::fe_add($vxx, $u); /* vx^2 + u */
1257
-            if (self::fe_isnonzero($check)) {
1258
-                throw new RangeException('Internal check failed.');
1255
+        if ( self::fe_isnonzero( $check ) ) {
1256
+            $check = self::fe_add( $vxx, $u ); /* vx^2 + u */
1257
+            if ( self::fe_isnonzero( $check ) ) {
1258
+                throw new RangeException( 'Internal check failed.' );
1259 1259
             }
1260 1260
             $h->X = self::fe_mul(
1261 1261
                 $h->X,
1262
-                ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1)
1262
+                ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqrtm1 )
1263 1263
             );
1264 1264
         }
1265 1265
 
1266 1266
         # if (fe_isnegative(h->X) == (s[31] >> 7)) {
1267 1267
         #     fe_neg(h->X,h->X);
1268 1268
         # }
1269
-        $i = self::chrToInt($s[31]);
1270
-        if (self::fe_isnegative($h->X) === ($i >> 7)) {
1271
-            $h->X = self::fe_neg($h->X);
1269
+        $i = self::chrToInt( $s[ 31 ] );
1270
+        if ( self::fe_isnegative( $h->X ) === ( $i >> 7 ) ) {
1271
+            $h->X = self::fe_neg( $h->X );
1272 1272
         }
1273 1273
 
1274 1274
         # fe_mul(h->T,h->X,h->Y);
1275
-        $h->T = self::fe_mul($h->X, $h->Y);
1275
+        $h->T = self::fe_mul( $h->X, $h->Y );
1276 1276
         return $h;
1277 1277
     }
1278 1278
 
@@ -1290,16 +1290,16 @@  discard block
 block discarded – undo
1290 1290
         ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
1291 1291
     ) {
1292 1292
         $r = clone $R;
1293
-        $r->X = self::fe_add($p->Y, $p->X);
1294
-        $r->Y = self::fe_sub($p->Y, $p->X);
1295
-        $r->Z = self::fe_mul($r->X, $q->yplusx);
1296
-        $r->Y = self::fe_mul($r->Y, $q->yminusx);
1297
-        $r->T = self::fe_mul($q->xy2d, $p->T);
1298
-        $t0 = self::fe_add(clone $p->Z, clone $p->Z);
1299
-        $r->X = self::fe_sub($r->Z, $r->Y);
1300
-        $r->Y = self::fe_add($r->Z, $r->Y);
1301
-        $r->Z = self::fe_add($t0, $r->T);
1302
-        $r->T = self::fe_sub($t0, $r->T);
1293
+        $r->X = self::fe_add( $p->Y, $p->X );
1294
+        $r->Y = self::fe_sub( $p->Y, $p->X );
1295
+        $r->Z = self::fe_mul( $r->X, $q->yplusx );
1296
+        $r->Y = self::fe_mul( $r->Y, $q->yminusx );
1297
+        $r->T = self::fe_mul( $q->xy2d, $p->T );
1298
+        $t0 = self::fe_add( clone $p->Z, clone $p->Z );
1299
+        $r->X = self::fe_sub( $r->Z, $r->Y );
1300
+        $r->Y = self::fe_add( $r->Z, $r->Y );
1301
+        $r->Z = self::fe_add( $t0, $r->T );
1302
+        $r->T = self::fe_sub( $t0, $r->T );
1303 1303
 
1304 1304
         return $r;
1305 1305
     }
@@ -1319,16 +1319,16 @@  discard block
 block discarded – undo
1319 1319
     ) {
1320 1320
         $r = clone $R;
1321 1321
 
1322
-        $r->X = self::fe_add($p->Y, $p->X);
1323
-        $r->Y = self::fe_sub($p->Y, $p->X);
1324
-        $r->Z = self::fe_mul($r->X, $q->yminusx);
1325
-        $r->Y = self::fe_mul($r->Y, $q->yplusx);
1326
-        $r->T = self::fe_mul($q->xy2d, $p->T);
1327
-        $t0 = self::fe_add($p->Z, $p->Z);
1328
-        $r->X = self::fe_sub($r->Z, $r->Y);
1329
-        $r->Y = self::fe_add($r->Z, $r->Y);
1330
-        $r->Z = self::fe_sub($t0, $r->T);
1331
-        $r->T = self::fe_add($t0, $r->T);
1322
+        $r->X = self::fe_add( $p->Y, $p->X );
1323
+        $r->Y = self::fe_sub( $p->Y, $p->X );
1324
+        $r->Z = self::fe_mul( $r->X, $q->yminusx );
1325
+        $r->Y = self::fe_mul( $r->Y, $q->yplusx );
1326
+        $r->T = self::fe_mul( $q->xy2d, $p->T );
1327
+        $t0 = self::fe_add( $p->Z, $p->Z );
1328
+        $r->X = self::fe_sub( $r->Z, $r->Y );
1329
+        $r->Y = self::fe_add( $r->Z, $r->Y );
1330
+        $r->Z = self::fe_sub( $t0, $r->T );
1331
+        $r->T = self::fe_add( $t0, $r->T );
1332 1332
 
1333 1333
         return $r;
1334 1334
     }
@@ -1339,12 +1339,12 @@  discard block
 block discarded – undo
1339 1339
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1340 1340
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1341 1341
      */
1342
-    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1342
+    public static function ge_p1p1_to_p2( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p )
1343 1343
     {
1344 1344
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2();
1345
-        $r->X = self::fe_mul($p->X, $p->T);
1346
-        $r->Y = self::fe_mul($p->Y, $p->Z);
1347
-        $r->Z = self::fe_mul($p->Z, $p->T);
1345
+        $r->X = self::fe_mul( $p->X, $p->T );
1346
+        $r->Y = self::fe_mul( $p->Y, $p->Z );
1347
+        $r->Z = self::fe_mul( $p->Z, $p->T );
1348 1348
         return $r;
1349 1349
     }
1350 1350
 
@@ -1354,13 +1354,13 @@  discard block
 block discarded – undo
1354 1354
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
1355 1355
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
1356 1356
      */
1357
-    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
1357
+    public static function ge_p1p1_to_p3( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p )
1358 1358
     {
1359 1359
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
1360
-        $r->X = self::fe_mul($p->X, $p->T);
1361
-        $r->Y = self::fe_mul($p->Y, $p->Z);
1362
-        $r->Z = self::fe_mul($p->Z, $p->T);
1363
-        $r->T = self::fe_mul($p->X, $p->Y);
1360
+        $r->X = self::fe_mul( $p->X, $p->T );
1361
+        $r->Y = self::fe_mul( $p->Y, $p->Z );
1362
+        $r->Z = self::fe_mul( $p->Z, $p->T );
1363
+        $r->T = self::fe_mul( $p->X, $p->Y );
1364 1364
         return $r;
1365 1365
     }
1366 1366
 
@@ -1384,19 +1384,19 @@  discard block
 block discarded – undo
1384 1384
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p
1385 1385
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1386 1386
      */
1387
-    public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p)
1387
+    public static function ge_p2_dbl( ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p )
1388 1388
     {
1389 1389
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1390 1390
 
1391
-        $r->X = self::fe_sq($p->X);
1392
-        $r->Z = self::fe_sq($p->Y);
1393
-        $r->T = self::fe_sq2($p->Z);
1394
-        $r->Y = self::fe_add($p->X, $p->Y);
1395
-        $t0   = self::fe_sq($r->Y);
1396
-        $r->Y = self::fe_add($r->Z, $r->X);
1397
-        $r->Z = self::fe_sub($r->Z, $r->X);
1398
-        $r->X = self::fe_sub($t0, $r->Y);
1399
-        $r->T = self::fe_sub($r->T, $r->Z);
1391
+        $r->X = self::fe_sq( $p->X );
1392
+        $r->Z = self::fe_sq( $p->Y );
1393
+        $r->T = self::fe_sq2( $p->Z );
1394
+        $r->Y = self::fe_add( $p->X, $p->Y );
1395
+        $t0   = self::fe_sq( $r->Y );
1396
+        $r->Y = self::fe_add( $r->Z, $r->X );
1397
+        $r->Z = self::fe_sub( $r->Z, $r->X );
1398
+        $r->X = self::fe_sub( $t0, $r->Y );
1399
+        $r->T = self::fe_sub( $r->T, $r->Z );
1400 1400
 
1401 1401
         return $r;
1402 1402
     }
@@ -1422,18 +1422,18 @@  discard block
 block discarded – undo
1422 1422
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1423 1423
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1424 1424
      */
1425
-    public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1425
+    public static function ge_p3_to_cached( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p )
1426 1426
     {
1427 1427
         static $d2 = null;
1428
-        if ($d2 === null) {
1429
-            $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2);
1428
+        if ( $d2 === null ) {
1429
+            $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$d2 );
1430 1430
         }
1431 1431
         /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */
1432 1432
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1433
-        $r->YplusX = self::fe_add($p->Y, $p->X);
1434
-        $r->YminusX = self::fe_sub($p->Y, $p->X);
1435
-        $r->Z = self::fe_copy($p->Z);
1436
-        $r->T2d = self::fe_mul($p->T, $d2);
1433
+        $r->YplusX = self::fe_add( $p->Y, $p->X );
1434
+        $r->YminusX = self::fe_sub( $p->Y, $p->X );
1435
+        $r->Z = self::fe_copy( $p->Z );
1436
+        $r->T2d = self::fe_mul( $p->T, $d2 );
1437 1437
         return $r;
1438 1438
     }
1439 1439
 
@@ -1443,12 +1443,12 @@  discard block
 block discarded – undo
1443 1443
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1444 1444
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
1445 1445
      */
1446
-    public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1446
+    public static function ge_p3_to_p2( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p )
1447 1447
     {
1448 1448
         return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
1449
-            self::fe_copy($p->X),
1450
-            self::fe_copy($p->Y),
1451
-            self::fe_copy($p->Z)
1449
+            self::fe_copy( $p->X ),
1450
+            self::fe_copy( $p->Y ),
1451
+            self::fe_copy( $p->Z )
1452 1452
         );
1453 1453
     }
1454 1454
 
@@ -1460,14 +1460,14 @@  discard block
 block discarded – undo
1460 1460
      * @throws SodiumException
1461 1461
      * @throws TypeError
1462 1462
      */
1463
-    public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
1463
+    public static function ge_p3_tobytes( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h )
1464 1464
     {
1465
-        $recip = self::fe_invert($h->Z);
1466
-        $x = self::fe_mul($h->X, $recip);
1467
-        $y = self::fe_mul($h->Y, $recip);
1468
-        $s = self::fe_tobytes($y);
1469
-        $s[31] = self::intToChr(
1470
-            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1465
+        $recip = self::fe_invert( $h->Z );
1466
+        $x = self::fe_mul( $h->X, $recip );
1467
+        $y = self::fe_mul( $h->Y, $recip );
1468
+        $s = self::fe_tobytes( $y );
1469
+        $s[ 31 ] = self::intToChr(
1470
+            self::chrToInt( $s[ 31 ] ) ^ ( self::fe_isnegative( $x ) << 7 )
1471 1471
         );
1472 1472
         return $s;
1473 1473
     }
@@ -1478,10 +1478,10 @@  discard block
 block discarded – undo
1478 1478
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
1479 1479
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
1480 1480
      */
1481
-    public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
1481
+    public static function ge_p3_dbl( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p )
1482 1482
     {
1483
-        $q = self::ge_p3_to_p2($p);
1484
-        return self::ge_p2_dbl($q);
1483
+        $q = self::ge_p3_to_p2( $p );
1484
+        return self::ge_p2_dbl( $q );
1485 1485
     }
1486 1486
 
1487 1487
     /**
@@ -1503,9 +1503,9 @@  discard block
 block discarded – undo
1503 1503
      * @param int $c
1504 1504
      * @return int
1505 1505
      */
1506
-    public static function equal($b, $c)
1506
+    public static function equal( $b, $c )
1507 1507
     {
1508
-        return (int) ((($b ^ $c) - 1) >> 31) & 1;
1508
+        return (int)( ( ( $b ^ $c ) - 1 ) >> 31 ) & 1;
1509 1509
     }
1510 1510
 
1511 1511
     /**
@@ -1516,13 +1516,13 @@  discard block
 block discarded – undo
1516 1516
      * @throws SodiumException
1517 1517
      * @throws TypeError
1518 1518
      */
1519
-    public static function negative($char)
1519
+    public static function negative( $char )
1520 1520
     {
1521
-        if (is_int($char)) {
1522
-            return ($char >> 63) & 1;
1521
+        if ( is_int( $char ) ) {
1522
+            return ( $char >> 63 ) & 1;
1523 1523
         }
1524
-        $x = self::chrToInt(self::substr($char, 0, 1));
1525
-        return (int) ($x >> 63);
1524
+        $x = self::chrToInt( self::substr( $char, 0, 1 ) );
1525
+        return (int)( $x >> 63 );
1526 1526
     }
1527 1527
 
1528 1528
     /**
@@ -1540,13 +1540,13 @@  discard block
 block discarded – undo
1540 1540
         ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u,
1541 1541
         $b
1542 1542
     ) {
1543
-        if (!is_int($b)) {
1544
-            throw new InvalidArgumentException('Expected an integer.');
1543
+        if ( ! is_int( $b ) ) {
1544
+            throw new InvalidArgumentException( 'Expected an integer.' );
1545 1545
         }
1546 1546
         return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1547
-            self::fe_cmov($t->yplusx,  $u->yplusx,  $b),
1548
-            self::fe_cmov($t->yminusx, $u->yminusx, $b),
1549
-            self::fe_cmov($t->xy2d,    $u->xy2d,    $b)
1547
+            self::fe_cmov( $t->yplusx, $u->yplusx, $b ),
1548
+            self::fe_cmov( $t->yminusx, $u->yminusx, $b ),
1549
+            self::fe_cmov( $t->xy2d, $u->xy2d, $b )
1550 1550
         );
1551 1551
     }
1552 1552
 
@@ -1563,10 +1563,10 @@  discard block
 block discarded – undo
1563 1563
     ) {
1564 1564
         $b &= 1;
1565 1565
         $ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
1566
-        $ret->YplusX  = self::fe_cmov($t->YplusX,  $u->YplusX,  $b);
1567
-        $ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b);
1568
-        $ret->Z       = self::fe_cmov($t->Z,       $u->Z,       $b);
1569
-        $ret->T2d     = self::fe_cmov($t->T2d,     $u->T2d,     $b);
1566
+        $ret->YplusX  = self::fe_cmov( $t->YplusX, $u->YplusX, $b );
1567
+        $ret->YminusX = self::fe_cmov( $t->YminusX, $u->YminusX, $b );
1568
+        $ret->Z       = self::fe_cmov( $t->Z, $u->Z, $b );
1569
+        $ret->T2d     = self::fe_cmov( $t->T2d, $u->T2d, $b );
1570 1570
         return $ret;
1571 1571
     }
1572 1572
 
@@ -1576,12 +1576,12 @@  discard block
 block discarded – undo
1576 1576
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
1577 1577
      * @throws SodiumException
1578 1578
      */
1579
-    public static function ge_cmov8_cached(array $cached, $b)
1579
+    public static function ge_cmov8_cached( array $cached, $b )
1580 1580
     {
1581 1581
         // const unsigned char bnegative = negative(b);
1582 1582
         // const unsigned char babs      = b - (((-bnegative) & b) * ((signed char) 1 << 1));
1583
-        $bnegative = self::negative($b);
1584
-        $babs = $b - (((-$bnegative) & $b) << 1);
1583
+        $bnegative = self::negative( $b );
1584
+        $babs = $b - ( ( (-$bnegative) & $b ) << 1 );
1585 1585
 
1586 1586
         // ge25519_cached_0(t);
1587 1587
         $t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
@@ -1599,8 +1599,8 @@  discard block
 block discarded – undo
1599 1599
         // ge25519_cmov_cached(t, &cached[5], equal(babs, 6));
1600 1600
         // ge25519_cmov_cached(t, &cached[6], equal(babs, 7));
1601 1601
         // ge25519_cmov_cached(t, &cached[7], equal(babs, 8));
1602
-        for ($x = 0; $x < 8; ++$x) {
1603
-            $t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1));
1602
+        for ( $x = 0; $x < 8; ++$x ) {
1603
+            $t = self::ge_cmov_cached( $t, $cached[ $x ], self::equal( $babs, $x + 1 ) );
1604 1604
         }
1605 1605
 
1606 1606
         // fe25519_copy(minust.YplusX, t->YminusX);
@@ -1608,12 +1608,12 @@  discard block
 block discarded – undo
1608 1608
         // fe25519_copy(minust.Z, t->Z);
1609 1609
         // fe25519_neg(minust.T2d, t->T2d);
1610 1610
         $minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1611
-            self::fe_copy($t->YminusX),
1612
-            self::fe_copy($t->YplusX),
1613
-            self::fe_copy($t->Z),
1614
-            self::fe_neg($t->T2d)
1611
+            self::fe_copy( $t->YminusX ),
1612
+            self::fe_copy( $t->YplusX ),
1613
+            self::fe_copy( $t->Z ),
1614
+            self::fe_neg( $t->T2d )
1615 1615
         );
1616
-        return self::ge_cmov_cached($t, $minust, $bnegative);
1616
+        return self::ge_cmov_cached( $t, $minust, $bnegative );
1617 1617
     }
1618 1618
 
1619 1619
     /**
@@ -1628,47 +1628,47 @@  discard block
 block discarded – undo
1628 1628
      * @psalm-suppress MixedArrayAccess
1629 1629
      * @psalm-suppress MixedArrayOffset
1630 1630
      */
1631
-    public static function ge_select($pos = 0, $b = 0)
1631
+    public static function ge_select( $pos = 0, $b = 0 )
1632 1632
     {
1633 1633
         static $base = null;
1634
-        if ($base === null) {
1634
+        if ( $base === null ) {
1635 1635
             $base = array();
1636 1636
             /** @var int $i */
1637
-            foreach (self::$base as $i => $bas) {
1638
-                for ($j = 0; $j < 8; ++$j) {
1639
-                    $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1640
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]),
1641
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]),
1642
-                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2])
1637
+            foreach ( self::$base as $i => $bas ) {
1638
+                for ( $j = 0; $j < 8; ++$j ) {
1639
+                    $base[ $i ][ $j ] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1640
+                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( $bas[ $j ][ 0 ] ),
1641
+                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( $bas[ $j ][ 1 ] ),
1642
+                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( $bas[ $j ][ 2 ] )
1643 1643
                     );
1644 1644
                 }
1645 1645
             }
1646 1646
         }
1647 1647
         /** @var array<int, array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp>> $base */
1648
-        if (!is_int($pos)) {
1649
-            throw new InvalidArgumentException('Position must be an integer');
1648
+        if ( ! is_int( $pos ) ) {
1649
+            throw new InvalidArgumentException( 'Position must be an integer' );
1650 1650
         }
1651
-        if ($pos < 0 || $pos > 31) {
1652
-            throw new RangeException('Position is out of range [0, 31]');
1651
+        if ( $pos < 0 || $pos > 31 ) {
1652
+            throw new RangeException( 'Position is out of range [0, 31]' );
1653 1653
         }
1654 1654
 
1655
-        $bnegative = self::negative($b);
1656
-        $babs = $b - (((-$bnegative) & $b) << 1);
1655
+        $bnegative = self::negative( $b );
1656
+        $babs = $b - ( ( (-$bnegative) & $b ) << 1 );
1657 1657
 
1658 1658
         $t = self::ge_precomp_0();
1659
-        for ($i = 0; $i < 8; ++$i) {
1659
+        for ( $i = 0; $i < 8; ++$i ) {
1660 1660
             $t = self::cmov(
1661 1661
                 $t,
1662
-                $base[$pos][$i],
1663
-                self::equal($babs, $i + 1)
1662
+                $base[ $pos ][ $i ],
1663
+                self::equal( $babs, $i + 1 )
1664 1664
             );
1665 1665
         }
1666 1666
         $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1667
-            self::fe_copy($t->yminusx),
1668
-            self::fe_copy($t->yplusx),
1669
-            self::fe_neg($t->xy2d)
1667
+            self::fe_copy( $t->yminusx ),
1668
+            self::fe_copy( $t->yplusx ),
1669
+            self::fe_neg( $t->xy2d )
1670 1670
         );
1671
-        return self::cmov($t, $minusT, $bnegative);
1671
+        return self::cmov( $t, $minusT, $bnegative );
1672 1672
     }
1673 1673
 
1674 1674
     /**
@@ -1688,17 +1688,17 @@  discard block
 block discarded – undo
1688 1688
     ) {
1689 1689
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
1690 1690
 
1691
-        $r->X = self::fe_add($p->Y, $p->X);
1692
-        $r->Y = self::fe_sub($p->Y, $p->X);
1693
-        $r->Z = self::fe_mul($r->X, $q->YminusX);
1694
-        $r->Y = self::fe_mul($r->Y, $q->YplusX);
1695
-        $r->T = self::fe_mul($q->T2d, $p->T);
1696
-        $r->X = self::fe_mul($p->Z, $q->Z);
1697
-        $t0 = self::fe_add($r->X, $r->X);
1698
-        $r->X = self::fe_sub($r->Z, $r->Y);
1699
-        $r->Y = self::fe_add($r->Z, $r->Y);
1700
-        $r->Z = self::fe_sub($t0, $r->T);
1701
-        $r->T = self::fe_add($t0, $r->T);
1691
+        $r->X = self::fe_add( $p->Y, $p->X );
1692
+        $r->Y = self::fe_sub( $p->Y, $p->X );
1693
+        $r->Z = self::fe_mul( $r->X, $q->YminusX );
1694
+        $r->Y = self::fe_mul( $r->Y, $q->YplusX );
1695
+        $r->T = self::fe_mul( $q->T2d, $p->T );
1696
+        $r->X = self::fe_mul( $p->Z, $q->Z );
1697
+        $t0 = self::fe_add( $r->X, $r->X );
1698
+        $r->X = self::fe_sub( $r->Z, $r->Y );
1699
+        $r->Y = self::fe_add( $r->Z, $r->Y );
1700
+        $r->Z = self::fe_sub( $t0, $r->T );
1701
+        $r->T = self::fe_add( $t0, $r->T );
1702 1702
 
1703 1703
         return $r;
1704 1704
     }
@@ -1711,14 +1711,14 @@  discard block
 block discarded – undo
1711 1711
      * @throws SodiumException
1712 1712
      * @throws TypeError
1713 1713
      */
1714
-    public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h)
1714
+    public static function ge_tobytes( ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h )
1715 1715
     {
1716
-        $recip = self::fe_invert($h->Z);
1717
-        $x = self::fe_mul($h->X, $recip);
1718
-        $y = self::fe_mul($h->Y, $recip);
1719
-        $s = self::fe_tobytes($y);
1720
-        $s[31] = self::intToChr(
1721
-            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
1716
+        $recip = self::fe_invert( $h->Z );
1717
+        $x = self::fe_mul( $h->X, $recip );
1718
+        $y = self::fe_mul( $h->Y, $recip );
1719
+        $s = self::fe_tobytes( $y );
1720
+        $s[ 31 ] = self::intToChr(
1721
+            self::chrToInt( $s[ 31 ] ) ^ ( self::fe_isnegative( $x ) << 7 )
1722 1722
         );
1723 1723
         return $s;
1724 1724
     }
@@ -1745,17 +1745,17 @@  discard block
 block discarded – undo
1745 1745
 
1746 1746
         /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp> $Bi */
1747 1747
         static $Bi = array();
1748
-        if (!$Bi) {
1749
-            for ($i = 0; $i < 8; ++$i) {
1750
-                $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1751
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]),
1752
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]),
1753
-                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2])
1748
+        if ( ! $Bi ) {
1749
+            for ( $i = 0; $i < 8; ++$i ) {
1750
+                $Bi[ $i ] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
1751
+                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$base2[ $i ][ 0 ] ),
1752
+                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$base2[ $i ][ 1 ] ),
1753
+                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$base2[ $i ][ 2 ] )
1754 1754
                 );
1755 1755
             }
1756 1756
         }
1757
-        for ($i = 0; $i < 8; ++$i) {
1758
-            $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1757
+        for ( $i = 0; $i < 8; ++$i ) {
1758
+            $Ai[ $i ] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
1759 1759
                 self::fe_0(),
1760 1760
                 self::fe_0(),
1761 1761
                 self::fe_0(),
@@ -1766,15 +1766,15 @@  discard block
 block discarded – undo
1766 1766
         # slide(aslide,a);
1767 1767
         # slide(bslide,b);
1768 1768
         /** @var array<int, int> $aslide */
1769
-        $aslide = self::slide($a);
1769
+        $aslide = self::slide( $a );
1770 1770
         /** @var array<int, int> $bslide */
1771
-        $bslide = self::slide($b);
1771
+        $bslide = self::slide( $b );
1772 1772
 
1773 1773
         # ge_p3_to_cached(&Ai[0],A);
1774 1774
         # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
1775
-        $Ai[0] = self::ge_p3_to_cached($A);
1776
-        $t = self::ge_p3_dbl($A);
1777
-        $A2 = self::ge_p1p1_to_p3($t);
1775
+        $Ai[ 0 ] = self::ge_p3_to_cached( $A );
1776
+        $t = self::ge_p3_dbl( $A );
1777
+        $A2 = self::ge_p1p1_to_p3( $t );
1778 1778
 
1779 1779
         # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
1780 1780
         # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
@@ -1783,10 +1783,10 @@  discard block
 block discarded – undo
1783 1783
         # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
1784 1784
         # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
1785 1785
         # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
1786
-        for ($i = 0; $i < 7; ++$i) {
1787
-            $t = self::ge_add($A2, $Ai[$i]);
1788
-            $u = self::ge_p1p1_to_p3($t);
1789
-            $Ai[$i + 1] = self::ge_p3_to_cached($u);
1786
+        for ( $i = 0; $i < 7; ++$i ) {
1787
+            $t = self::ge_add( $A2, $Ai[ $i ] );
1788
+            $u = self::ge_p1p1_to_p3( $t );
1789
+            $Ai[ $i + 1 ] = self::ge_p3_to_cached( $u );
1790 1790
         }
1791 1791
 
1792 1792
         # ge_p2_0(r);
@@ -1796,56 +1796,56 @@  discard block
 block discarded – undo
1796 1796
         #     if (aslide[i] || bslide[i]) break;
1797 1797
         # }
1798 1798
         $i = 255;
1799
-        for (; $i >= 0; --$i) {
1800
-            if ($aslide[$i] || $bslide[$i]) {
1799
+        for ( ; $i >= 0; --$i ) {
1800
+            if ( $aslide[ $i ] || $bslide[ $i ] ) {
1801 1801
                 break;
1802 1802
             }
1803 1803
         }
1804 1804
 
1805 1805
         # for (;i >= 0;--i) {
1806
-        for (; $i >= 0; --$i) {
1806
+        for ( ; $i >= 0; --$i ) {
1807 1807
             # ge_p2_dbl(&t,r);
1808
-            $t = self::ge_p2_dbl($r);
1808
+            $t = self::ge_p2_dbl( $r );
1809 1809
 
1810 1810
             # if (aslide[i] > 0) {
1811
-            if ($aslide[$i] > 0) {
1811
+            if ( $aslide[ $i ] > 0 ) {
1812 1812
                 # ge_p1p1_to_p3(&u,&t);
1813 1813
                 # ge_add(&t,&u,&Ai[aslide[i]/2]);
1814
-                $u = self::ge_p1p1_to_p3($t);
1814
+                $u = self::ge_p1p1_to_p3( $t );
1815 1815
                 $t = self::ge_add(
1816 1816
                     $u,
1817
-                    $Ai[(int) floor($aslide[$i] / 2)]
1817
+                    $Ai[ (int)floor( $aslide[ $i ] / 2 ) ]
1818 1818
                 );
1819 1819
             # } else if (aslide[i] < 0) {
1820
-            } elseif ($aslide[$i] < 0) {
1820
+            } elseif ( $aslide[ $i ] < 0 ) {
1821 1821
                 # ge_p1p1_to_p3(&u,&t);
1822 1822
                 # ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
1823
-                $u = self::ge_p1p1_to_p3($t);
1823
+                $u = self::ge_p1p1_to_p3( $t );
1824 1824
                 $t = self::ge_sub(
1825 1825
                     $u,
1826
-                    $Ai[(int) floor(-$aslide[$i] / 2)]
1826
+                    $Ai[ (int)floor(-$aslide[ $i ] / 2) ]
1827 1827
                 );
1828 1828
             }
1829 1829
 
1830 1830
             # if (bslide[i] > 0) {
1831
-            if ($bslide[$i] > 0) {
1831
+            if ( $bslide[ $i ] > 0 ) {
1832 1832
                 /** @var int $index */
1833
-                $index = (int) floor($bslide[$i] / 2);
1833
+                $index = (int)floor( $bslide[ $i ] / 2 );
1834 1834
                 # ge_p1p1_to_p3(&u,&t);
1835 1835
                 # ge_madd(&t,&u,&Bi[bslide[i]/2]);
1836
-                $u = self::ge_p1p1_to_p3($t);
1837
-                $t = self::ge_madd($t, $u, $Bi[$index]);
1836
+                $u = self::ge_p1p1_to_p3( $t );
1837
+                $t = self::ge_madd( $t, $u, $Bi[ $index ] );
1838 1838
             # } else if (bslide[i] < 0) {
1839
-            } elseif ($bslide[$i] < 0) {
1839
+            } elseif ( $bslide[ $i ] < 0 ) {
1840 1840
                 /** @var int $index */
1841
-                $index = (int) floor(-$bslide[$i] / 2);
1841
+                $index = (int)floor(-$bslide[ $i ] / 2);
1842 1842
                 # ge_p1p1_to_p3(&u,&t);
1843 1843
                 # ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
1844
-                $u = self::ge_p1p1_to_p3($t);
1845
-                $t = self::ge_msub($t, $u, $Bi[$index]);
1844
+                $u = self::ge_p1p1_to_p3( $t );
1845
+                $t = self::ge_msub( $t, $u, $Bi[ $index ] );
1846 1846
             }
1847 1847
             # ge_p1p1_to_p2(r,&t);
1848
-            $r = self::ge_p1p1_to_p2($t);
1848
+            $r = self::ge_p1p1_to_p2( $t );
1849 1849
         }
1850 1850
         return $r;
1851 1851
     }
@@ -1861,73 +1861,73 @@  discard block
 block discarded – undo
1861 1861
      * @psalm-suppress MixedAssignment
1862 1862
      * @psalm-suppress MixedOperand
1863 1863
      */
1864
-    public static function ge_scalarmult($a, $p)
1864
+    public static function ge_scalarmult( $a, $p )
1865 1865
     {
1866
-        $e = array_fill(0, 64, 0);
1866
+        $e = array_fill( 0, 64, 0 );
1867 1867
 
1868 1868
         /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */
1869 1869
         $pi = array();
1870 1870
 
1871 1871
         //        ge25519_p3_to_cached(&pi[1 - 1], p);   /* p */
1872
-        $pi[0] = self::ge_p3_to_cached($p);
1872
+        $pi[ 0 ] = self::ge_p3_to_cached( $p );
1873 1873
 
1874 1874
         //        ge25519_p3_dbl(&t2, p);
1875 1875
         //        ge25519_p1p1_to_p3(&p2, &t2);
1876 1876
         //        ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */
1877
-        $t2 = self::ge_p3_dbl($p);
1878
-        $p2 = self::ge_p1p1_to_p3($t2);
1879
-        $pi[1] = self::ge_p3_to_cached($p2);
1877
+        $t2 = self::ge_p3_dbl( $p );
1878
+        $p2 = self::ge_p1p1_to_p3( $t2 );
1879
+        $pi[ 1 ] = self::ge_p3_to_cached( $p2 );
1880 1880
 
1881 1881
         //        ge25519_add_cached(&t3, p, &pi[2 - 1]);
1882 1882
         //        ge25519_p1p1_to_p3(&p3, &t3);
1883 1883
         //        ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */
1884
-        $t3 = self::ge_add($p, $pi[1]);
1885
-        $p3 = self::ge_p1p1_to_p3($t3);
1886
-        $pi[2] = self::ge_p3_to_cached($p3);
1884
+        $t3 = self::ge_add( $p, $pi[ 1 ] );
1885
+        $p3 = self::ge_p1p1_to_p3( $t3 );
1886
+        $pi[ 2 ] = self::ge_p3_to_cached( $p3 );
1887 1887
 
1888 1888
         //        ge25519_p3_dbl(&t4, &p2);
1889 1889
         //        ge25519_p1p1_to_p3(&p4, &t4);
1890 1890
         //        ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */
1891
-        $t4 = self::ge_p3_dbl($p2);
1892
-        $p4 = self::ge_p1p1_to_p3($t4);
1893
-        $pi[3] = self::ge_p3_to_cached($p4);
1891
+        $t4 = self::ge_p3_dbl( $p2 );
1892
+        $p4 = self::ge_p1p1_to_p3( $t4 );
1893
+        $pi[ 3 ] = self::ge_p3_to_cached( $p4 );
1894 1894
 
1895 1895
         //        ge25519_add_cached(&t5, p, &pi[4 - 1]);
1896 1896
         //        ge25519_p1p1_to_p3(&p5, &t5);
1897 1897
         //        ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */
1898
-        $t5 = self::ge_add($p, $pi[3]);
1899
-        $p5 = self::ge_p1p1_to_p3($t5);
1900
-        $pi[4] = self::ge_p3_to_cached($p5);
1898
+        $t5 = self::ge_add( $p, $pi[ 3 ] );
1899
+        $p5 = self::ge_p1p1_to_p3( $t5 );
1900
+        $pi[ 4 ] = self::ge_p3_to_cached( $p5 );
1901 1901
 
1902 1902
         //        ge25519_p3_dbl(&t6, &p3);
1903 1903
         //        ge25519_p1p1_to_p3(&p6, &t6);
1904 1904
         //        ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */
1905
-        $t6 = self::ge_p3_dbl($p3);
1906
-        $p6 = self::ge_p1p1_to_p3($t6);
1907
-        $pi[5] = self::ge_p3_to_cached($p6);
1905
+        $t6 = self::ge_p3_dbl( $p3 );
1906
+        $p6 = self::ge_p1p1_to_p3( $t6 );
1907
+        $pi[ 5 ] = self::ge_p3_to_cached( $p6 );
1908 1908
 
1909 1909
         //        ge25519_add_cached(&t7, p, &pi[6 - 1]);
1910 1910
         //        ge25519_p1p1_to_p3(&p7, &t7);
1911 1911
         //        ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */
1912
-        $t7 = self::ge_add($p, $pi[5]);
1913
-        $p7 = self::ge_p1p1_to_p3($t7);
1914
-        $pi[6] = self::ge_p3_to_cached($p7);
1912
+        $t7 = self::ge_add( $p, $pi[ 5 ] );
1913
+        $p7 = self::ge_p1p1_to_p3( $t7 );
1914
+        $pi[ 6 ] = self::ge_p3_to_cached( $p7 );
1915 1915
 
1916 1916
         //        ge25519_p3_dbl(&t8, &p4);
1917 1917
         //        ge25519_p1p1_to_p3(&p8, &t8);
1918 1918
         //        ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */
1919
-        $t8 = self::ge_p3_dbl($p4);
1920
-        $p8 = self::ge_p1p1_to_p3($t8);
1921
-        $pi[7] = self::ge_p3_to_cached($p8);
1919
+        $t8 = self::ge_p3_dbl( $p4 );
1920
+        $p8 = self::ge_p1p1_to_p3( $t8 );
1921
+        $pi[ 7 ] = self::ge_p3_to_cached( $p8 );
1922 1922
 
1923 1923
 
1924 1924
         //        for (i = 0; i < 32; ++i) {
1925 1925
         //            e[2 * i + 0] = (a[i] >> 0) & 15;
1926 1926
         //            e[2 * i + 1] = (a[i] >> 4) & 15;
1927 1927
         //        }
1928
-        for ($i = 0; $i < 32; ++$i) {
1929
-            $e[($i << 1)    ] =  self::chrToInt($a[$i]) & 15;
1930
-            $e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15;
1928
+        for ( $i = 0; $i < 32; ++$i ) {
1929
+            $e[ ( $i << 1 ) ] = self::chrToInt( $a[ $i ] ) & 15;
1930
+            $e[ ( $i << 1 ) + 1 ] = ( self::chrToInt( $a[ $i ] ) >> 4 ) & 15;
1931 1931
         }
1932 1932
         //        /* each e[i] is between 0 and 15 */
1933 1933
         //        /* e[63] is between 0 and 7 */
@@ -1940,25 +1940,25 @@  discard block
 block discarded – undo
1940 1940
         //            e[i] -= carry * ((signed char) 1 << 4);
1941 1941
         //        }
1942 1942
         $carry = 0;
1943
-        for ($i = 0; $i < 63; ++$i) {
1944
-            $e[$i] += $carry;
1945
-            $carry = $e[$i] + 8;
1943
+        for ( $i = 0; $i < 63; ++$i ) {
1944
+            $e[ $i ] += $carry;
1945
+            $carry = $e[ $i ] + 8;
1946 1946
             $carry >>= 4;
1947
-            $e[$i] -= $carry << 4;
1947
+            $e[ $i ] -= $carry << 4;
1948 1948
         }
1949 1949
         //        e[63] += carry;
1950 1950
         //        /* each e[i] is between -8 and 8 */
1951
-        $e[63] += $carry;
1951
+        $e[ 63 ] += $carry;
1952 1952
 
1953 1953
         //        ge25519_p3_0(h);
1954 1954
         $h = self::ge_p3_0();
1955 1955
 
1956 1956
         //        for (i = 63; i != 0; i--) {
1957
-        for ($i = 63; $i != 0; --$i) {
1957
+        for ( $i = 63; $i != 0; --$i ) {
1958 1958
             // ge25519_cmov8_cached(&t, pi, e[i]);
1959
-            $t = self::ge_cmov8_cached($pi, $e[$i]);
1959
+            $t = self::ge_cmov8_cached( $pi, $e[ $i ] );
1960 1960
             // ge25519_add_cached(&r, h, &t);
1961
-            $r = self::ge_add($h, $t);
1961
+            $r = self::ge_add( $h, $t );
1962 1962
 
1963 1963
             // ge25519_p1p1_to_p2(&s, &r);
1964 1964
             // ge25519_p2_dbl(&r, &s);
@@ -1968,25 +1968,25 @@  discard block
 block discarded – undo
1968 1968
             // ge25519_p2_dbl(&r, &s);
1969 1969
             // ge25519_p1p1_to_p2(&s, &r);
1970 1970
             // ge25519_p2_dbl(&r, &s);
1971
-            $s = self::ge_p1p1_to_p2($r);
1972
-            $r = self::ge_p2_dbl($s);
1973
-            $s = self::ge_p1p1_to_p2($r);
1974
-            $r = self::ge_p2_dbl($s);
1975
-            $s = self::ge_p1p1_to_p2($r);
1976
-            $r = self::ge_p2_dbl($s);
1977
-            $s = self::ge_p1p1_to_p2($r);
1978
-            $r = self::ge_p2_dbl($s);
1971
+            $s = self::ge_p1p1_to_p2( $r );
1972
+            $r = self::ge_p2_dbl( $s );
1973
+            $s = self::ge_p1p1_to_p2( $r );
1974
+            $r = self::ge_p2_dbl( $s );
1975
+            $s = self::ge_p1p1_to_p2( $r );
1976
+            $r = self::ge_p2_dbl( $s );
1977
+            $s = self::ge_p1p1_to_p2( $r );
1978
+            $r = self::ge_p2_dbl( $s );
1979 1979
 
1980 1980
             // ge25519_p1p1_to_p3(h, &r);  /* *16 */
1981
-            $h = self::ge_p1p1_to_p3($r); /* *16 */
1981
+            $h = self::ge_p1p1_to_p3( $r ); /* *16 */
1982 1982
         }
1983 1983
 
1984 1984
         //        ge25519_cmov8_cached(&t, pi, e[i]);
1985 1985
         //        ge25519_add_cached(&r, h, &t);
1986 1986
         //        ge25519_p1p1_to_p3(h, &r);
1987
-        $t = self::ge_cmov8_cached($pi, $e[0]);
1988
-        $r = self::ge_add($h, $t);
1989
-        return self::ge_p1p1_to_p3($r);
1987
+        $t = self::ge_cmov8_cached( $pi, $e[ 0 ] );
1988
+        $r = self::ge_add( $h, $t );
1989
+        return self::ge_p1p1_to_p3( $r );
1990 1990
     }
1991 1991
 
1992 1992
     /**
@@ -1999,50 +1999,50 @@  discard block
 block discarded – undo
1999 1999
      * @psalm-suppress MixedAssignment
2000 2000
      * @psalm-suppress MixedOperand
2001 2001
      */
2002
-    public static function ge_scalarmult_base($a)
2002
+    public static function ge_scalarmult_base( $a )
2003 2003
     {
2004 2004
         /** @var array<int, int> $e */
2005 2005
         $e = array();
2006 2006
         $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
2007 2007
 
2008
-        for ($i = 0; $i < 32; ++$i) {
2009
-            $dbl = (int) $i << 1;
2010
-            $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
2011
-            $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
2008
+        for ( $i = 0; $i < 32; ++$i ) {
2009
+            $dbl = (int)$i << 1;
2010
+            $e[ $dbl ] = (int)self::chrToInt( $a[ $i ] ) & 15;
2011
+            $e[ $dbl + 1 ] = (int)( self::chrToInt( $a[ $i ] ) >> 4 ) & 15;
2012 2012
         }
2013 2013
 
2014 2014
         $carry = 0;
2015
-        for ($i = 0; $i < 63; ++$i) {
2016
-            $e[$i] += $carry;
2017
-            $carry = $e[$i] + 8;
2015
+        for ( $i = 0; $i < 63; ++$i ) {
2016
+            $e[ $i ] += $carry;
2017
+            $carry = $e[ $i ] + 8;
2018 2018
             $carry >>= 4;
2019
-            $e[$i] -= $carry << 4;
2019
+            $e[ $i ] -= $carry << 4;
2020 2020
         }
2021
-        $e[63] += (int) $carry;
2021
+        $e[ 63 ] += (int)$carry;
2022 2022
 
2023 2023
         $h = self::ge_p3_0();
2024 2024
 
2025
-        for ($i = 1; $i < 64; $i += 2) {
2026
-            $t = self::ge_select((int) floor($i / 2), (int) $e[$i]);
2027
-            $r = self::ge_madd($r, $h, $t);
2028
-            $h = self::ge_p1p1_to_p3($r);
2025
+        for ( $i = 1; $i < 64; $i += 2 ) {
2026
+            $t = self::ge_select( (int)floor( $i / 2 ), (int)$e[ $i ] );
2027
+            $r = self::ge_madd( $r, $h, $t );
2028
+            $h = self::ge_p1p1_to_p3( $r );
2029 2029
         }
2030 2030
 
2031
-        $r = self::ge_p3_dbl($h);
2031
+        $r = self::ge_p3_dbl( $h );
2032 2032
 
2033
-        $s = self::ge_p1p1_to_p2($r);
2034
-        $r = self::ge_p2_dbl($s);
2035
-        $s = self::ge_p1p1_to_p2($r);
2036
-        $r = self::ge_p2_dbl($s);
2037
-        $s = self::ge_p1p1_to_p2($r);
2038
-        $r = self::ge_p2_dbl($s);
2033
+        $s = self::ge_p1p1_to_p2( $r );
2034
+        $r = self::ge_p2_dbl( $s );
2035
+        $s = self::ge_p1p1_to_p2( $r );
2036
+        $r = self::ge_p2_dbl( $s );
2037
+        $s = self::ge_p1p1_to_p2( $r );
2038
+        $r = self::ge_p2_dbl( $s );
2039 2039
 
2040
-        $h = self::ge_p1p1_to_p3($r);
2040
+        $h = self::ge_p1p1_to_p3( $r );
2041 2041
 
2042
-        for ($i = 0; $i < 64; $i += 2) {
2043
-            $t = self::ge_select($i >> 1, (int) $e[$i]);
2044
-            $r = self::ge_madd($r, $h, $t);
2045
-            $h = self::ge_p1p1_to_p3($r);
2042
+        for ( $i = 0; $i < 64; $i += 2 ) {
2043
+            $t = self::ge_select( $i >> 1, (int)$e[ $i ] );
2044
+            $r = self::ge_madd( $r, $h, $t );
2045
+            $h = self::ge_p1p1_to_p3( $r );
2046 2046
         }
2047 2047
         return $h;
2048 2048
     }
@@ -2059,330 +2059,330 @@  discard block
 block discarded – undo
2059 2059
      * @return string
2060 2060
      * @throws TypeError
2061 2061
      */
2062
-    public static function sc_muladd($a, $b, $c)
2062
+    public static function sc_muladd( $a, $b, $c )
2063 2063
     {
2064
-        $a0 = 2097151 & self::load_3(self::substr($a, 0, 3));
2065
-        $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2066
-        $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2067
-        $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2068
-        $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2069
-        $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2070
-        $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2071
-        $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2072
-        $a8 = 2097151 & self::load_3(self::substr($a, 21, 3));
2073
-        $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2074
-        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2075
-        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2076
-
2077
-        $b0 = 2097151 & self::load_3(self::substr($b, 0, 3));
2078
-        $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2079
-        $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2080
-        $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2081
-        $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2082
-        $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2083
-        $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2084
-        $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2085
-        $b8 = 2097151 & self::load_3(self::substr($b, 21, 3));
2086
-        $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2087
-        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2088
-        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2089
-
2090
-        $c0 = 2097151 & self::load_3(self::substr($c, 0, 3));
2091
-        $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5);
2092
-        $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2);
2093
-        $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7);
2094
-        $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4);
2095
-        $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1);
2096
-        $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6);
2097
-        $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3);
2098
-        $c8 = 2097151 & self::load_3(self::substr($c, 21, 3));
2099
-        $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5);
2100
-        $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2);
2101
-        $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7);
2064
+        $a0 = 2097151 & self::load_3( self::substr( $a, 0, 3 ) );
2065
+        $a1 = 2097151 & ( self::load_4( self::substr( $a, 2, 4 ) ) >> 5 );
2066
+        $a2 = 2097151 & ( self::load_3( self::substr( $a, 5, 3 ) ) >> 2 );
2067
+        $a3 = 2097151 & ( self::load_4( self::substr( $a, 7, 4 ) ) >> 7 );
2068
+        $a4 = 2097151 & ( self::load_4( self::substr( $a, 10, 4 ) ) >> 4 );
2069
+        $a5 = 2097151 & ( self::load_3( self::substr( $a, 13, 3 ) ) >> 1 );
2070
+        $a6 = 2097151 & ( self::load_4( self::substr( $a, 15, 4 ) ) >> 6 );
2071
+        $a7 = 2097151 & ( self::load_3( self::substr( $a, 18, 3 ) ) >> 3 );
2072
+        $a8 = 2097151 & self::load_3( self::substr( $a, 21, 3 ) );
2073
+        $a9 = 2097151 & ( self::load_4( self::substr( $a, 23, 4 ) ) >> 5 );
2074
+        $a10 = 2097151 & ( self::load_3( self::substr( $a, 26, 3 ) ) >> 2 );
2075
+        $a11 = ( self::load_4( self::substr( $a, 28, 4 ) ) >> 7 );
2076
+
2077
+        $b0 = 2097151 & self::load_3( self::substr( $b, 0, 3 ) );
2078
+        $b1 = 2097151 & ( self::load_4( self::substr( $b, 2, 4 ) ) >> 5 );
2079
+        $b2 = 2097151 & ( self::load_3( self::substr( $b, 5, 3 ) ) >> 2 );
2080
+        $b3 = 2097151 & ( self::load_4( self::substr( $b, 7, 4 ) ) >> 7 );
2081
+        $b4 = 2097151 & ( self::load_4( self::substr( $b, 10, 4 ) ) >> 4 );
2082
+        $b5 = 2097151 & ( self::load_3( self::substr( $b, 13, 3 ) ) >> 1 );
2083
+        $b6 = 2097151 & ( self::load_4( self::substr( $b, 15, 4 ) ) >> 6 );
2084
+        $b7 = 2097151 & ( self::load_3( self::substr( $b, 18, 3 ) ) >> 3 );
2085
+        $b8 = 2097151 & self::load_3( self::substr( $b, 21, 3 ) );
2086
+        $b9 = 2097151 & ( self::load_4( self::substr( $b, 23, 4 ) ) >> 5 );
2087
+        $b10 = 2097151 & ( self::load_3( self::substr( $b, 26, 3 ) ) >> 2 );
2088
+        $b11 = ( self::load_4( self::substr( $b, 28, 4 ) ) >> 7 );
2089
+
2090
+        $c0 = 2097151 & self::load_3( self::substr( $c, 0, 3 ) );
2091
+        $c1 = 2097151 & ( self::load_4( self::substr( $c, 2, 4 ) ) >> 5 );
2092
+        $c2 = 2097151 & ( self::load_3( self::substr( $c, 5, 3 ) ) >> 2 );
2093
+        $c3 = 2097151 & ( self::load_4( self::substr( $c, 7, 4 ) ) >> 7 );
2094
+        $c4 = 2097151 & ( self::load_4( self::substr( $c, 10, 4 ) ) >> 4 );
2095
+        $c5 = 2097151 & ( self::load_3( self::substr( $c, 13, 3 ) ) >> 1 );
2096
+        $c6 = 2097151 & ( self::load_4( self::substr( $c, 15, 4 ) ) >> 6 );
2097
+        $c7 = 2097151 & ( self::load_3( self::substr( $c, 18, 3 ) ) >> 3 );
2098
+        $c8 = 2097151 & self::load_3( self::substr( $c, 21, 3 ) );
2099
+        $c9 = 2097151 & ( self::load_4( self::substr( $c, 23, 4 ) ) >> 5 );
2100
+        $c10 = 2097151 & ( self::load_3( self::substr( $c, 26, 3 ) ) >> 2 );
2101
+        $c11 = ( self::load_4( self::substr( $c, 28, 4 ) ) >> 7 );
2102 2102
 
2103 2103
         /* Can't really avoid the pyramid here: */
2104
-        $s0 = $c0 + self::mul($a0, $b0, 24);
2105
-        $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24);
2106
-        $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24);
2107
-        $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24);
2108
-        $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) +
2109
-               self::mul($a4, $b0, 24);
2110
-        $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) +
2111
-               self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24);
2112
-        $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) +
2113
-               self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24);
2114
-        $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) +
2115
-               self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24);
2116
-        $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) +
2117
-               self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) +
2118
-               self::mul($a8, $b0, 24);
2119
-        $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) +
2120
-               self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) +
2121
-               self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24);
2122
-        $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) +
2123
-               self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) +
2124
-               self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24);
2125
-        $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) +
2126
-               self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) +
2127
-               self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24);
2128
-        $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) +
2129
-               self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) +
2130
-               self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24);
2131
-        $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) +
2132
-               self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) +
2133
-               self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24);
2134
-        $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) +
2135
-               self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) +
2136
-               self::mul($a11, $b3, 24);
2137
-        $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) +
2138
-               self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24);
2139
-        $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) +
2140
-               self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24);
2141
-        $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) +
2142
-               self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24);
2143
-        $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) +
2144
-               self::mul($a11, $b7, 24);
2145
-        $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24);
2146
-        $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24);
2147
-        $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24);
2148
-        $s22 = self::mul($a11, $b11, 24);
2104
+        $s0 = $c0 + self::mul( $a0, $b0, 24 );
2105
+        $s1 = $c1 + self::mul( $a0, $b1, 24 ) + self::mul( $a1, $b0, 24 );
2106
+        $s2 = $c2 + self::mul( $a0, $b2, 24 ) + self::mul( $a1, $b1, 24 ) + self::mul( $a2, $b0, 24 );
2107
+        $s3 = $c3 + self::mul( $a0, $b3, 24 ) + self::mul( $a1, $b2, 24 ) + self::mul( $a2, $b1, 24 ) + self::mul( $a3, $b0, 24 );
2108
+        $s4 = $c4 + self::mul( $a0, $b4, 24 ) + self::mul( $a1, $b3, 24 ) + self::mul( $a2, $b2, 24 ) + self::mul( $a3, $b1, 24 ) +
2109
+               self::mul( $a4, $b0, 24 );
2110
+        $s5 = $c5 + self::mul( $a0, $b5, 24 ) + self::mul( $a1, $b4, 24 ) + self::mul( $a2, $b3, 24 ) + self::mul( $a3, $b2, 24 ) +
2111
+               self::mul( $a4, $b1, 24 ) + self::mul( $a5, $b0, 24 );
2112
+        $s6 = $c6 + self::mul( $a0, $b6, 24 ) + self::mul( $a1, $b5, 24 ) + self::mul( $a2, $b4, 24 ) + self::mul( $a3, $b3, 24 ) +
2113
+               self::mul( $a4, $b2, 24 ) + self::mul( $a5, $b1, 24 ) + self::mul( $a6, $b0, 24 );
2114
+        $s7 = $c7 + self::mul( $a0, $b7, 24 ) + self::mul( $a1, $b6, 24 ) + self::mul( $a2, $b5, 24 ) + self::mul( $a3, $b4, 24 ) +
2115
+               self::mul( $a4, $b3, 24 ) + self::mul( $a5, $b2, 24 ) + self::mul( $a6, $b1, 24 ) + self::mul( $a7, $b0, 24 );
2116
+        $s8 = $c8 + self::mul( $a0, $b8, 24 ) + self::mul( $a1, $b7, 24 ) + self::mul( $a2, $b6, 24 ) + self::mul( $a3, $b5, 24 ) +
2117
+               self::mul( $a4, $b4, 24 ) + self::mul( $a5, $b3, 24 ) + self::mul( $a6, $b2, 24 ) + self::mul( $a7, $b1, 24 ) +
2118
+               self::mul( $a8, $b0, 24 );
2119
+        $s9 = $c9 + self::mul( $a0, $b9, 24 ) + self::mul( $a1, $b8, 24 ) + self::mul( $a2, $b7, 24 ) + self::mul( $a3, $b6, 24 ) +
2120
+               self::mul( $a4, $b5, 24 ) + self::mul( $a5, $b4, 24 ) + self::mul( $a6, $b3, 24 ) + self::mul( $a7, $b2, 24 ) +
2121
+               self::mul( $a8, $b1, 24 ) + self::mul( $a9, $b0, 24 );
2122
+        $s10 = $c10 + self::mul( $a0, $b10, 24 ) + self::mul( $a1, $b9, 24 ) + self::mul( $a2, $b8, 24 ) + self::mul( $a3, $b7, 24 ) +
2123
+               self::mul( $a4, $b6, 24 ) + self::mul( $a5, $b5, 24 ) + self::mul( $a6, $b4, 24 ) + self::mul( $a7, $b3, 24 ) +
2124
+               self::mul( $a8, $b2, 24 ) + self::mul( $a9, $b1, 24 ) + self::mul( $a10, $b0, 24 );
2125
+        $s11 = $c11 + self::mul( $a0, $b11, 24 ) + self::mul( $a1, $b10, 24 ) + self::mul( $a2, $b9, 24 ) + self::mul( $a3, $b8, 24 ) +
2126
+               self::mul( $a4, $b7, 24 ) + self::mul( $a5, $b6, 24 ) + self::mul( $a6, $b5, 24 ) + self::mul( $a7, $b4, 24 ) +
2127
+               self::mul( $a8, $b3, 24 ) + self::mul( $a9, $b2, 24 ) + self::mul( $a10, $b1, 24 ) + self::mul( $a11, $b0, 24 );
2128
+        $s12 = self::mul( $a1, $b11, 24 ) + self::mul( $a2, $b10, 24 ) + self::mul( $a3, $b9, 24 ) + self::mul( $a4, $b8, 24 ) +
2129
+               self::mul( $a5, $b7, 24 ) + self::mul( $a6, $b6, 24 ) + self::mul( $a7, $b5, 24 ) + self::mul( $a8, $b4, 24 ) +
2130
+               self::mul( $a9, $b3, 24 ) + self::mul( $a10, $b2, 24 ) + self::mul( $a11, $b1, 24 );
2131
+        $s13 = self::mul( $a2, $b11, 24 ) + self::mul( $a3, $b10, 24 ) + self::mul( $a4, $b9, 24 ) + self::mul( $a5, $b8, 24 ) +
2132
+               self::mul( $a6, $b7, 24 ) + self::mul( $a7, $b6, 24 ) + self::mul( $a8, $b5, 24 ) + self::mul( $a9, $b4, 24 ) +
2133
+               self::mul( $a10, $b3, 24 ) + self::mul( $a11, $b2, 24 );
2134
+        $s14 = self::mul( $a3, $b11, 24 ) + self::mul( $a4, $b10, 24 ) + self::mul( $a5, $b9, 24 ) + self::mul( $a6, $b8, 24 ) +
2135
+               self::mul( $a7, $b7, 24 ) + self::mul( $a8, $b6, 24 ) + self::mul( $a9, $b5, 24 ) + self::mul( $a10, $b4, 24 ) +
2136
+               self::mul( $a11, $b3, 24 );
2137
+        $s15 = self::mul( $a4, $b11, 24 ) + self::mul( $a5, $b10, 24 ) + self::mul( $a6, $b9, 24 ) + self::mul( $a7, $b8, 24 ) +
2138
+               self::mul( $a8, $b7, 24 ) + self::mul( $a9, $b6, 24 ) + self::mul( $a10, $b5, 24 ) + self::mul( $a11, $b4, 24 );
2139
+        $s16 = self::mul( $a5, $b11, 24 ) + self::mul( $a6, $b10, 24 ) + self::mul( $a7, $b9, 24 ) + self::mul( $a8, $b8, 24 ) +
2140
+               self::mul( $a9, $b7, 24 ) + self::mul( $a10, $b6, 24 ) + self::mul( $a11, $b5, 24 );
2141
+        $s17 = self::mul( $a6, $b11, 24 ) + self::mul( $a7, $b10, 24 ) + self::mul( $a8, $b9, 24 ) + self::mul( $a9, $b8, 24 ) +
2142
+               self::mul( $a10, $b7, 24 ) + self::mul( $a11, $b6, 24 );
2143
+        $s18 = self::mul( $a7, $b11, 24 ) + self::mul( $a8, $b10, 24 ) + self::mul( $a9, $b9, 24 ) + self::mul( $a10, $b8, 24 ) +
2144
+               self::mul( $a11, $b7, 24 );
2145
+        $s19 = self::mul( $a8, $b11, 24 ) + self::mul( $a9, $b10, 24 ) + self::mul( $a10, $b9, 24 ) + self::mul( $a11, $b8, 24 );
2146
+        $s20 = self::mul( $a9, $b11, 24 ) + self::mul( $a10, $b10, 24 ) + self::mul( $a11, $b9, 24 );
2147
+        $s21 = self::mul( $a10, $b11, 24 ) + self::mul( $a11, $b10, 24 );
2148
+        $s22 = self::mul( $a11, $b11, 24 );
2149 2149
         $s23 = 0;
2150 2150
 
2151
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2151
+        $carry0 = ( $s0 + ( 1 << 20 ) ) >> 21;
2152 2152
         $s1 += $carry0;
2153 2153
         $s0 -= $carry0 << 21;
2154
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2154
+        $carry2 = ( $s2 + ( 1 << 20 ) ) >> 21;
2155 2155
         $s3 += $carry2;
2156 2156
         $s2 -= $carry2 << 21;
2157
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2157
+        $carry4 = ( $s4 + ( 1 << 20 ) ) >> 21;
2158 2158
         $s5 += $carry4;
2159 2159
         $s4 -= $carry4 << 21;
2160
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2160
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
2161 2161
         $s7 += $carry6;
2162 2162
         $s6 -= $carry6 << 21;
2163
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2163
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
2164 2164
         $s9 += $carry8;
2165 2165
         $s8 -= $carry8 << 21;
2166
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2166
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
2167 2167
         $s11 += $carry10;
2168 2168
         $s10 -= $carry10 << 21;
2169
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2169
+        $carry12 = ( $s12 + ( 1 << 20 ) ) >> 21;
2170 2170
         $s13 += $carry12;
2171 2171
         $s12 -= $carry12 << 21;
2172
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2172
+        $carry14 = ( $s14 + ( 1 << 20 ) ) >> 21;
2173 2173
         $s15 += $carry14;
2174 2174
         $s14 -= $carry14 << 21;
2175
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2175
+        $carry16 = ( $s16 + ( 1 << 20 ) ) >> 21;
2176 2176
         $s17 += $carry16;
2177 2177
         $s16 -= $carry16 << 21;
2178
-        $carry18 = ($s18 + (1 << 20)) >> 21;
2178
+        $carry18 = ( $s18 + ( 1 << 20 ) ) >> 21;
2179 2179
         $s19 += $carry18;
2180 2180
         $s18 -= $carry18 << 21;
2181
-        $carry20 = ($s20 + (1 << 20)) >> 21;
2181
+        $carry20 = ( $s20 + ( 1 << 20 ) ) >> 21;
2182 2182
         $s21 += $carry20;
2183 2183
         $s20 -= $carry20 << 21;
2184
-        $carry22 = ($s22 + (1 << 20)) >> 21;
2184
+        $carry22 = ( $s22 + ( 1 << 20 ) ) >> 21;
2185 2185
         $s23 += $carry22;
2186 2186
         $s22 -= $carry22 << 21;
2187 2187
 
2188
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2188
+        $carry1 = ( $s1 + ( 1 << 20 ) ) >> 21;
2189 2189
         $s2 += $carry1;
2190 2190
         $s1 -= $carry1 << 21;
2191
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2191
+        $carry3 = ( $s3 + ( 1 << 20 ) ) >> 21;
2192 2192
         $s4 += $carry3;
2193 2193
         $s3 -= $carry3 << 21;
2194
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2194
+        $carry5 = ( $s5 + ( 1 << 20 ) ) >> 21;
2195 2195
         $s6 += $carry5;
2196 2196
         $s5 -= $carry5 << 21;
2197
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2197
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
2198 2198
         $s8 += $carry7;
2199 2199
         $s7 -= $carry7 << 21;
2200
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2200
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
2201 2201
         $s10 += $carry9;
2202 2202
         $s9 -= $carry9 << 21;
2203
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2203
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
2204 2204
         $s12 += $carry11;
2205 2205
         $s11 -= $carry11 << 21;
2206
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2206
+        $carry13 = ( $s13 + ( 1 << 20 ) ) >> 21;
2207 2207
         $s14 += $carry13;
2208 2208
         $s13 -= $carry13 << 21;
2209
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2209
+        $carry15 = ( $s15 + ( 1 << 20 ) ) >> 21;
2210 2210
         $s16 += $carry15;
2211 2211
         $s15 -= $carry15 << 21;
2212
-        $carry17 = ($s17 + (1 << 20)) >> 21;
2212
+        $carry17 = ( $s17 + ( 1 << 20 ) ) >> 21;
2213 2213
         $s18 += $carry17;
2214 2214
         $s17 -= $carry17 << 21;
2215
-        $carry19 = ($s19 + (1 << 20)) >> 21;
2215
+        $carry19 = ( $s19 + ( 1 << 20 ) ) >> 21;
2216 2216
         $s20 += $carry19;
2217 2217
         $s19 -= $carry19 << 21;
2218
-        $carry21 = ($s21 + (1 << 20)) >> 21;
2218
+        $carry21 = ( $s21 + ( 1 << 20 ) ) >> 21;
2219 2219
         $s22 += $carry21;
2220 2220
         $s21 -= $carry21 << 21;
2221 2221
 
2222
-        $s11 += self::mul($s23, 666643, 20);
2223
-        $s12 += self::mul($s23, 470296, 19);
2224
-        $s13 += self::mul($s23, 654183, 20);
2225
-        $s14 -= self::mul($s23, 997805, 20);
2226
-        $s15 += self::mul($s23, 136657, 18);
2227
-        $s16 -= self::mul($s23, 683901, 20);
2228
-
2229
-        $s10 += self::mul($s22, 666643, 20);
2230
-        $s11 += self::mul($s22, 470296, 19);
2231
-        $s12 += self::mul($s22, 654183, 20);
2232
-        $s13 -= self::mul($s22, 997805, 20);
2233
-        $s14 += self::mul($s22, 136657, 18);
2234
-        $s15 -= self::mul($s22, 683901, 20);
2235
-
2236
-        $s9  += self::mul($s21,  666643, 20);
2237
-        $s10 += self::mul($s21,  470296, 19);
2238
-        $s11 += self::mul($s21,  654183, 20);
2239
-        $s12 -= self::mul($s21,  997805, 20);
2240
-        $s13 += self::mul($s21,  136657, 18);
2241
-        $s14 -= self::mul($s21,  683901, 20);
2242
-
2243
-        $s8  += self::mul($s20,  666643, 20);
2244
-        $s9  += self::mul($s20,  470296, 19);
2245
-        $s10 += self::mul($s20,  654183, 20);
2246
-        $s11 -= self::mul($s20,  997805, 20);
2247
-        $s12 += self::mul($s20,  136657, 18);
2248
-        $s13 -= self::mul($s20,  683901, 20);
2249
-
2250
-        $s7  += self::mul($s19,  666643, 20);
2251
-        $s8  += self::mul($s19,  470296, 19);
2252
-        $s9  += self::mul($s19,  654183, 20);
2253
-        $s10 -= self::mul($s19,  997805, 20);
2254
-        $s11 += self::mul($s19,  136657, 18);
2255
-        $s12 -= self::mul($s19,  683901, 20);
2256
-
2257
-        $s6  += self::mul($s18,  666643, 20);
2258
-        $s7  += self::mul($s18,  470296, 19);
2259
-        $s8  += self::mul($s18,  654183, 20);
2260
-        $s9  -= self::mul($s18,  997805, 20);
2261
-        $s10 += self::mul($s18,  136657, 18);
2262
-        $s11 -= self::mul($s18,  683901, 20);
2263
-
2264
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2222
+        $s11 += self::mul( $s23, 666643, 20 );
2223
+        $s12 += self::mul( $s23, 470296, 19 );
2224
+        $s13 += self::mul( $s23, 654183, 20 );
2225
+        $s14 -= self::mul( $s23, 997805, 20 );
2226
+        $s15 += self::mul( $s23, 136657, 18 );
2227
+        $s16 -= self::mul( $s23, 683901, 20 );
2228
+
2229
+        $s10 += self::mul( $s22, 666643, 20 );
2230
+        $s11 += self::mul( $s22, 470296, 19 );
2231
+        $s12 += self::mul( $s22, 654183, 20 );
2232
+        $s13 -= self::mul( $s22, 997805, 20 );
2233
+        $s14 += self::mul( $s22, 136657, 18 );
2234
+        $s15 -= self::mul( $s22, 683901, 20 );
2235
+
2236
+        $s9  += self::mul( $s21, 666643, 20 );
2237
+        $s10 += self::mul( $s21, 470296, 19 );
2238
+        $s11 += self::mul( $s21, 654183, 20 );
2239
+        $s12 -= self::mul( $s21, 997805, 20 );
2240
+        $s13 += self::mul( $s21, 136657, 18 );
2241
+        $s14 -= self::mul( $s21, 683901, 20 );
2242
+
2243
+        $s8  += self::mul( $s20, 666643, 20 );
2244
+        $s9  += self::mul( $s20, 470296, 19 );
2245
+        $s10 += self::mul( $s20, 654183, 20 );
2246
+        $s11 -= self::mul( $s20, 997805, 20 );
2247
+        $s12 += self::mul( $s20, 136657, 18 );
2248
+        $s13 -= self::mul( $s20, 683901, 20 );
2249
+
2250
+        $s7  += self::mul( $s19, 666643, 20 );
2251
+        $s8  += self::mul( $s19, 470296, 19 );
2252
+        $s9  += self::mul( $s19, 654183, 20 );
2253
+        $s10 -= self::mul( $s19, 997805, 20 );
2254
+        $s11 += self::mul( $s19, 136657, 18 );
2255
+        $s12 -= self::mul( $s19, 683901, 20 );
2256
+
2257
+        $s6  += self::mul( $s18, 666643, 20 );
2258
+        $s7  += self::mul( $s18, 470296, 19 );
2259
+        $s8  += self::mul( $s18, 654183, 20 );
2260
+        $s9  -= self::mul( $s18, 997805, 20 );
2261
+        $s10 += self::mul( $s18, 136657, 18 );
2262
+        $s11 -= self::mul( $s18, 683901, 20 );
2263
+
2264
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
2265 2265
         $s7 += $carry6;
2266 2266
         $s6 -= $carry6 << 21;
2267
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2267
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
2268 2268
         $s9 += $carry8;
2269 2269
         $s8 -= $carry8 << 21;
2270
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2270
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
2271 2271
         $s11 += $carry10;
2272 2272
         $s10 -= $carry10 << 21;
2273
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2273
+        $carry12 = ( $s12 + ( 1 << 20 ) ) >> 21;
2274 2274
         $s13 += $carry12;
2275 2275
         $s12 -= $carry12 << 21;
2276
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2276
+        $carry14 = ( $s14 + ( 1 << 20 ) ) >> 21;
2277 2277
         $s15 += $carry14;
2278 2278
         $s14 -= $carry14 << 21;
2279
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2279
+        $carry16 = ( $s16 + ( 1 << 20 ) ) >> 21;
2280 2280
         $s17 += $carry16;
2281 2281
         $s16 -= $carry16 << 21;
2282 2282
 
2283
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2283
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
2284 2284
         $s8 += $carry7;
2285 2285
         $s7 -= $carry7 << 21;
2286
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2286
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
2287 2287
         $s10 += $carry9;
2288 2288
         $s9 -= $carry9 << 21;
2289
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2289
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
2290 2290
         $s12 += $carry11;
2291 2291
         $s11 -= $carry11 << 21;
2292
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2292
+        $carry13 = ( $s13 + ( 1 << 20 ) ) >> 21;
2293 2293
         $s14 += $carry13;
2294 2294
         $s13 -= $carry13 << 21;
2295
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2295
+        $carry15 = ( $s15 + ( 1 << 20 ) ) >> 21;
2296 2296
         $s16 += $carry15;
2297 2297
         $s15 -= $carry15 << 21;
2298 2298
 
2299
-        $s5  += self::mul($s17,  666643, 20);
2300
-        $s6  += self::mul($s17,  470296, 19);
2301
-        $s7  += self::mul($s17,  654183, 20);
2302
-        $s8  -= self::mul($s17,  997805, 20);
2303
-        $s9  += self::mul($s17,  136657, 18);
2304
-        $s10 -= self::mul($s17,  683901, 20);
2305
-
2306
-        $s4 += self::mul($s16,  666643, 20);
2307
-        $s5 += self::mul($s16,  470296, 19);
2308
-        $s6 += self::mul($s16,  654183, 20);
2309
-        $s7 -= self::mul($s16,  997805, 20);
2310
-        $s8 += self::mul($s16,  136657, 18);
2311
-        $s9 -= self::mul($s16,  683901, 20);
2312
-
2313
-        $s3 += self::mul($s15,  666643, 20);
2314
-        $s4 += self::mul($s15,  470296, 19);
2315
-        $s5 += self::mul($s15,  654183, 20);
2316
-        $s6 -= self::mul($s15,  997805, 20);
2317
-        $s7 += self::mul($s15,  136657, 18);
2318
-        $s8 -= self::mul($s15,  683901, 20);
2319
-
2320
-        $s2 += self::mul($s14,  666643, 20);
2321
-        $s3 += self::mul($s14,  470296, 19);
2322
-        $s4 += self::mul($s14,  654183, 20);
2323
-        $s5 -= self::mul($s14,  997805, 20);
2324
-        $s6 += self::mul($s14,  136657, 18);
2325
-        $s7 -= self::mul($s14,  683901, 20);
2326
-
2327
-        $s1 += self::mul($s13,  666643, 20);
2328
-        $s2 += self::mul($s13,  470296, 19);
2329
-        $s3 += self::mul($s13,  654183, 20);
2330
-        $s4 -= self::mul($s13,  997805, 20);
2331
-        $s5 += self::mul($s13,  136657, 18);
2332
-        $s6 -= self::mul($s13,  683901, 20);
2333
-
2334
-        $s0 += self::mul($s12,  666643, 20);
2335
-        $s1 += self::mul($s12,  470296, 19);
2336
-        $s2 += self::mul($s12,  654183, 20);
2337
-        $s3 -= self::mul($s12,  997805, 20);
2338
-        $s4 += self::mul($s12,  136657, 18);
2339
-        $s5 -= self::mul($s12,  683901, 20);
2299
+        $s5  += self::mul( $s17, 666643, 20 );
2300
+        $s6  += self::mul( $s17, 470296, 19 );
2301
+        $s7  += self::mul( $s17, 654183, 20 );
2302
+        $s8  -= self::mul( $s17, 997805, 20 );
2303
+        $s9  += self::mul( $s17, 136657, 18 );
2304
+        $s10 -= self::mul( $s17, 683901, 20 );
2305
+
2306
+        $s4 += self::mul( $s16, 666643, 20 );
2307
+        $s5 += self::mul( $s16, 470296, 19 );
2308
+        $s6 += self::mul( $s16, 654183, 20 );
2309
+        $s7 -= self::mul( $s16, 997805, 20 );
2310
+        $s8 += self::mul( $s16, 136657, 18 );
2311
+        $s9 -= self::mul( $s16, 683901, 20 );
2312
+
2313
+        $s3 += self::mul( $s15, 666643, 20 );
2314
+        $s4 += self::mul( $s15, 470296, 19 );
2315
+        $s5 += self::mul( $s15, 654183, 20 );
2316
+        $s6 -= self::mul( $s15, 997805, 20 );
2317
+        $s7 += self::mul( $s15, 136657, 18 );
2318
+        $s8 -= self::mul( $s15, 683901, 20 );
2319
+
2320
+        $s2 += self::mul( $s14, 666643, 20 );
2321
+        $s3 += self::mul( $s14, 470296, 19 );
2322
+        $s4 += self::mul( $s14, 654183, 20 );
2323
+        $s5 -= self::mul( $s14, 997805, 20 );
2324
+        $s6 += self::mul( $s14, 136657, 18 );
2325
+        $s7 -= self::mul( $s14, 683901, 20 );
2326
+
2327
+        $s1 += self::mul( $s13, 666643, 20 );
2328
+        $s2 += self::mul( $s13, 470296, 19 );
2329
+        $s3 += self::mul( $s13, 654183, 20 );
2330
+        $s4 -= self::mul( $s13, 997805, 20 );
2331
+        $s5 += self::mul( $s13, 136657, 18 );
2332
+        $s6 -= self::mul( $s13, 683901, 20 );
2333
+
2334
+        $s0 += self::mul( $s12, 666643, 20 );
2335
+        $s1 += self::mul( $s12, 470296, 19 );
2336
+        $s2 += self::mul( $s12, 654183, 20 );
2337
+        $s3 -= self::mul( $s12, 997805, 20 );
2338
+        $s4 += self::mul( $s12, 136657, 18 );
2339
+        $s5 -= self::mul( $s12, 683901, 20 );
2340 2340
         $s12 = 0;
2341 2341
 
2342
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2342
+        $carry0 = ( $s0 + ( 1 << 20 ) ) >> 21;
2343 2343
         $s1 += $carry0;
2344 2344
         $s0 -= $carry0 << 21;
2345
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2345
+        $carry2 = ( $s2 + ( 1 << 20 ) ) >> 21;
2346 2346
         $s3 += $carry2;
2347 2347
         $s2 -= $carry2 << 21;
2348
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2348
+        $carry4 = ( $s4 + ( 1 << 20 ) ) >> 21;
2349 2349
         $s5 += $carry4;
2350 2350
         $s4 -= $carry4 << 21;
2351
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2351
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
2352 2352
         $s7 += $carry6;
2353 2353
         $s6 -= $carry6 << 21;
2354
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2354
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
2355 2355
         $s9 += $carry8;
2356 2356
         $s8 -= $carry8 << 21;
2357
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2357
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
2358 2358
         $s11 += $carry10;
2359 2359
         $s10 -= $carry10 << 21;
2360 2360
 
2361
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2361
+        $carry1 = ( $s1 + ( 1 << 20 ) ) >> 21;
2362 2362
         $s2 += $carry1;
2363 2363
         $s1 -= $carry1 << 21;
2364
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2364
+        $carry3 = ( $s3 + ( 1 << 20 ) ) >> 21;
2365 2365
         $s4 += $carry3;
2366 2366
         $s3 -= $carry3 << 21;
2367
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2367
+        $carry5 = ( $s5 + ( 1 << 20 ) ) >> 21;
2368 2368
         $s6 += $carry5;
2369 2369
         $s5 -= $carry5 << 21;
2370
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2370
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
2371 2371
         $s8 += $carry7;
2372 2372
         $s7 -= $carry7 << 21;
2373
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2373
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
2374 2374
         $s10 += $carry9;
2375 2375
         $s9 -= $carry9 << 21;
2376
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2376
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
2377 2377
         $s12 += $carry11;
2378 2378
         $s11 -= $carry11 << 21;
2379 2379
 
2380
-        $s0 += self::mul($s12,  666643, 20);
2381
-        $s1 += self::mul($s12,  470296, 19);
2382
-        $s2 += self::mul($s12,  654183, 20);
2383
-        $s3 -= self::mul($s12,  997805, 20);
2384
-        $s4 += self::mul($s12,  136657, 18);
2385
-        $s5 -= self::mul($s12,  683901, 20);
2380
+        $s0 += self::mul( $s12, 666643, 20 );
2381
+        $s1 += self::mul( $s12, 470296, 19 );
2382
+        $s2 += self::mul( $s12, 654183, 20 );
2383
+        $s3 -= self::mul( $s12, 997805, 20 );
2384
+        $s4 += self::mul( $s12, 136657, 18 );
2385
+        $s5 -= self::mul( $s12, 683901, 20 );
2386 2386
         $s12 = 0;
2387 2387
 
2388 2388
         $carry0 = $s0 >> 21;
@@ -2422,12 +2422,12 @@  discard block
 block discarded – undo
2422 2422
         $s12 += $carry11;
2423 2423
         $s11 -= $carry11 << 21;
2424 2424
 
2425
-        $s0 += self::mul($s12,  666643, 20);
2426
-        $s1 += self::mul($s12,  470296, 19);
2427
-        $s2 += self::mul($s12,  654183, 20);
2428
-        $s3 -= self::mul($s12,  997805, 20);
2429
-        $s4 += self::mul($s12,  136657, 18);
2430
-        $s5 -= self::mul($s12,  683901, 20);
2425
+        $s0 += self::mul( $s12, 666643, 20 );
2426
+        $s1 += self::mul( $s12, 470296, 19 );
2427
+        $s2 += self::mul( $s12, 654183, 20 );
2428
+        $s3 -= self::mul( $s12, 997805, 20 );
2429
+        $s4 += self::mul( $s12, 136657, 18 );
2430
+        $s5 -= self::mul( $s12, 683901, 20 );
2431 2431
 
2432 2432
         $carry0 = $s0 >> 21;
2433 2433
         $s1 += $carry0;
@@ -2467,40 +2467,40 @@  discard block
 block discarded – undo
2467 2467
          * @var array<int, int>
2468 2468
          */
2469 2469
         $arr = array(
2470
-            (int) (0xff & ($s0 >> 0)),
2471
-            (int) (0xff & ($s0 >> 8)),
2472
-            (int) (0xff & (($s0 >> 16) | $s1 << 5)),
2473
-            (int) (0xff & ($s1 >> 3)),
2474
-            (int) (0xff & ($s1 >> 11)),
2475
-            (int) (0xff & (($s1 >> 19) | $s2 << 2)),
2476
-            (int) (0xff & ($s2 >> 6)),
2477
-            (int) (0xff & (($s2 >> 14) | $s3 << 7)),
2478
-            (int) (0xff & ($s3 >> 1)),
2479
-            (int) (0xff & ($s3 >> 9)),
2480
-            (int) (0xff & (($s3 >> 17) | $s4 << 4)),
2481
-            (int) (0xff & ($s4 >> 4)),
2482
-            (int) (0xff & ($s4 >> 12)),
2483
-            (int) (0xff & (($s4 >> 20) | $s5 << 1)),
2484
-            (int) (0xff & ($s5 >> 7)),
2485
-            (int) (0xff & (($s5 >> 15) | $s6 << 6)),
2486
-            (int) (0xff & ($s6 >> 2)),
2487
-            (int) (0xff & ($s6 >> 10)),
2488
-            (int) (0xff & (($s6 >> 18) | $s7 << 3)),
2489
-            (int) (0xff & ($s7 >> 5)),
2490
-            (int) (0xff & ($s7 >> 13)),
2491
-            (int) (0xff & ($s8 >> 0)),
2492
-            (int) (0xff & ($s8 >> 8)),
2493
-            (int) (0xff & (($s8 >> 16) | $s9 << 5)),
2494
-            (int) (0xff & ($s9 >> 3)),
2495
-            (int) (0xff & ($s9 >> 11)),
2496
-            (int) (0xff & (($s9 >> 19) | $s10 << 2)),
2497
-            (int) (0xff & ($s10 >> 6)),
2498
-            (int) (0xff & (($s10 >> 14) | $s11 << 7)),
2499
-            (int) (0xff & ($s11 >> 1)),
2500
-            (int) (0xff & ($s11 >> 9)),
2501
-            0xff & ($s11 >> 17)
2470
+            (int)( 0xff & ( $s0 >> 0 ) ),
2471
+            (int)( 0xff & ( $s0 >> 8 ) ),
2472
+            (int)( 0xff & ( ( $s0 >> 16 ) | $s1 << 5 ) ),
2473
+            (int)( 0xff & ( $s1 >> 3 ) ),
2474
+            (int)( 0xff & ( $s1 >> 11 ) ),
2475
+            (int)( 0xff & ( ( $s1 >> 19 ) | $s2 << 2 ) ),
2476
+            (int)( 0xff & ( $s2 >> 6 ) ),
2477
+            (int)( 0xff & ( ( $s2 >> 14 ) | $s3 << 7 ) ),
2478
+            (int)( 0xff & ( $s3 >> 1 ) ),
2479
+            (int)( 0xff & ( $s3 >> 9 ) ),
2480
+            (int)( 0xff & ( ( $s3 >> 17 ) | $s4 << 4 ) ),
2481
+            (int)( 0xff & ( $s4 >> 4 ) ),
2482
+            (int)( 0xff & ( $s4 >> 12 ) ),
2483
+            (int)( 0xff & ( ( $s4 >> 20 ) | $s5 << 1 ) ),
2484
+            (int)( 0xff & ( $s5 >> 7 ) ),
2485
+            (int)( 0xff & ( ( $s5 >> 15 ) | $s6 << 6 ) ),
2486
+            (int)( 0xff & ( $s6 >> 2 ) ),
2487
+            (int)( 0xff & ( $s6 >> 10 ) ),
2488
+            (int)( 0xff & ( ( $s6 >> 18 ) | $s7 << 3 ) ),
2489
+            (int)( 0xff & ( $s7 >> 5 ) ),
2490
+            (int)( 0xff & ( $s7 >> 13 ) ),
2491
+            (int)( 0xff & ( $s8 >> 0 ) ),
2492
+            (int)( 0xff & ( $s8 >> 8 ) ),
2493
+            (int)( 0xff & ( ( $s8 >> 16 ) | $s9 << 5 ) ),
2494
+            (int)( 0xff & ( $s9 >> 3 ) ),
2495
+            (int)( 0xff & ( $s9 >> 11 ) ),
2496
+            (int)( 0xff & ( ( $s9 >> 19 ) | $s10 << 2 ) ),
2497
+            (int)( 0xff & ( $s10 >> 6 ) ),
2498
+            (int)( 0xff & ( ( $s10 >> 14 ) | $s11 << 7 ) ),
2499
+            (int)( 0xff & ( $s11 >> 1 ) ),
2500
+            (int)( 0xff & ( $s11 >> 9 ) ),
2501
+            0xff & ( $s11 >> 17 )
2502 2502
         );
2503
-        return self::intArrayToString($arr);
2503
+        return self::intArrayToString( $arr );
2504 2504
     }
2505 2505
 
2506 2506
     /**
@@ -2510,197 +2510,197 @@  discard block
 block discarded – undo
2510 2510
      * @return string
2511 2511
      * @throws TypeError
2512 2512
      */
2513
-    public static function sc_reduce($s)
2513
+    public static function sc_reduce( $s )
2514 2514
     {
2515
-        $s0 = 2097151 & self::load_3(self::substr($s, 0, 3));
2516
-        $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5);
2517
-        $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2);
2518
-        $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7);
2519
-        $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4);
2520
-        $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1);
2521
-        $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6);
2522
-        $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3);
2523
-        $s8 = 2097151 & self::load_3(self::substr($s, 21, 3));
2524
-        $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5);
2525
-        $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2);
2526
-        $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7);
2527
-        $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4);
2528
-        $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1);
2529
-        $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6);
2530
-        $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3);
2531
-        $s16 = 2097151 & self::load_3(self::substr($s, 42, 3));
2532
-        $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5);
2533
-        $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2);
2534
-        $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7);
2535
-        $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4);
2536
-        $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1);
2537
-        $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6);
2538
-        $s23 = (self::load_4(self::substr($s, 60, 4)) >> 3);
2539
-
2540
-        $s11 += self::mul($s23,  666643, 20);
2541
-        $s12 += self::mul($s23,  470296, 19);
2542
-        $s13 += self::mul($s23,  654183, 20);
2543
-        $s14 -= self::mul($s23,  997805, 20);
2544
-        $s15 += self::mul($s23,  136657, 18);
2545
-        $s16 -= self::mul($s23,  683901, 20);
2546
-
2547
-        $s10 += self::mul($s22,  666643, 20);
2548
-        $s11 += self::mul($s22,  470296, 19);
2549
-        $s12 += self::mul($s22,  654183, 20);
2550
-        $s13 -= self::mul($s22,  997805, 20);
2551
-        $s14 += self::mul($s22,  136657, 18);
2552
-        $s15 -= self::mul($s22,  683901, 20);
2553
-
2554
-        $s9  += self::mul($s21,  666643, 20);
2555
-        $s10 += self::mul($s21,  470296, 19);
2556
-        $s11 += self::mul($s21,  654183, 20);
2557
-        $s12 -= self::mul($s21,  997805, 20);
2558
-        $s13 += self::mul($s21,  136657, 18);
2559
-        $s14 -= self::mul($s21,  683901, 20);
2560
-
2561
-        $s8  += self::mul($s20,  666643, 20);
2562
-        $s9  += self::mul($s20,  470296, 19);
2563
-        $s10 += self::mul($s20,  654183, 20);
2564
-        $s11 -= self::mul($s20,  997805, 20);
2565
-        $s12 += self::mul($s20,  136657, 18);
2566
-        $s13 -= self::mul($s20,  683901, 20);
2567
-
2568
-        $s7  += self::mul($s19,  666643, 20);
2569
-        $s8  += self::mul($s19,  470296, 19);
2570
-        $s9  += self::mul($s19,  654183, 20);
2571
-        $s10 -= self::mul($s19,  997805, 20);
2572
-        $s11 += self::mul($s19,  136657, 18);
2573
-        $s12 -= self::mul($s19,  683901, 20);
2574
-
2575
-        $s6  += self::mul($s18,  666643, 20);
2576
-        $s7  += self::mul($s18,  470296, 19);
2577
-        $s8  += self::mul($s18,  654183, 20);
2578
-        $s9  -= self::mul($s18,  997805, 20);
2579
-        $s10 += self::mul($s18,  136657, 18);
2580
-        $s11 -= self::mul($s18,  683901, 20);
2581
-
2582
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2515
+        $s0 = 2097151 & self::load_3( self::substr( $s, 0, 3 ) );
2516
+        $s1 = 2097151 & ( self::load_4( self::substr( $s, 2, 4 ) ) >> 5 );
2517
+        $s2 = 2097151 & ( self::load_3( self::substr( $s, 5, 3 ) ) >> 2 );
2518
+        $s3 = 2097151 & ( self::load_4( self::substr( $s, 7, 4 ) ) >> 7 );
2519
+        $s4 = 2097151 & ( self::load_4( self::substr( $s, 10, 4 ) ) >> 4 );
2520
+        $s5 = 2097151 & ( self::load_3( self::substr( $s, 13, 3 ) ) >> 1 );
2521
+        $s6 = 2097151 & ( self::load_4( self::substr( $s, 15, 4 ) ) >> 6 );
2522
+        $s7 = 2097151 & ( self::load_3( self::substr( $s, 18, 4 ) ) >> 3 );
2523
+        $s8 = 2097151 & self::load_3( self::substr( $s, 21, 3 ) );
2524
+        $s9 = 2097151 & ( self::load_4( self::substr( $s, 23, 4 ) ) >> 5 );
2525
+        $s10 = 2097151 & ( self::load_3( self::substr( $s, 26, 3 ) ) >> 2 );
2526
+        $s11 = 2097151 & ( self::load_4( self::substr( $s, 28, 4 ) ) >> 7 );
2527
+        $s12 = 2097151 & ( self::load_4( self::substr( $s, 31, 4 ) ) >> 4 );
2528
+        $s13 = 2097151 & ( self::load_3( self::substr( $s, 34, 3 ) ) >> 1 );
2529
+        $s14 = 2097151 & ( self::load_4( self::substr( $s, 36, 4 ) ) >> 6 );
2530
+        $s15 = 2097151 & ( self::load_3( self::substr( $s, 39, 4 ) ) >> 3 );
2531
+        $s16 = 2097151 & self::load_3( self::substr( $s, 42, 3 ) );
2532
+        $s17 = 2097151 & ( self::load_4( self::substr( $s, 44, 4 ) ) >> 5 );
2533
+        $s18 = 2097151 & ( self::load_3( self::substr( $s, 47, 3 ) ) >> 2 );
2534
+        $s19 = 2097151 & ( self::load_4( self::substr( $s, 49, 4 ) ) >> 7 );
2535
+        $s20 = 2097151 & ( self::load_4( self::substr( $s, 52, 4 ) ) >> 4 );
2536
+        $s21 = 2097151 & ( self::load_3( self::substr( $s, 55, 3 ) ) >> 1 );
2537
+        $s22 = 2097151 & ( self::load_4( self::substr( $s, 57, 4 ) ) >> 6 );
2538
+        $s23 = ( self::load_4( self::substr( $s, 60, 4 ) ) >> 3 );
2539
+
2540
+        $s11 += self::mul( $s23, 666643, 20 );
2541
+        $s12 += self::mul( $s23, 470296, 19 );
2542
+        $s13 += self::mul( $s23, 654183, 20 );
2543
+        $s14 -= self::mul( $s23, 997805, 20 );
2544
+        $s15 += self::mul( $s23, 136657, 18 );
2545
+        $s16 -= self::mul( $s23, 683901, 20 );
2546
+
2547
+        $s10 += self::mul( $s22, 666643, 20 );
2548
+        $s11 += self::mul( $s22, 470296, 19 );
2549
+        $s12 += self::mul( $s22, 654183, 20 );
2550
+        $s13 -= self::mul( $s22, 997805, 20 );
2551
+        $s14 += self::mul( $s22, 136657, 18 );
2552
+        $s15 -= self::mul( $s22, 683901, 20 );
2553
+
2554
+        $s9  += self::mul( $s21, 666643, 20 );
2555
+        $s10 += self::mul( $s21, 470296, 19 );
2556
+        $s11 += self::mul( $s21, 654183, 20 );
2557
+        $s12 -= self::mul( $s21, 997805, 20 );
2558
+        $s13 += self::mul( $s21, 136657, 18 );
2559
+        $s14 -= self::mul( $s21, 683901, 20 );
2560
+
2561
+        $s8  += self::mul( $s20, 666643, 20 );
2562
+        $s9  += self::mul( $s20, 470296, 19 );
2563
+        $s10 += self::mul( $s20, 654183, 20 );
2564
+        $s11 -= self::mul( $s20, 997805, 20 );
2565
+        $s12 += self::mul( $s20, 136657, 18 );
2566
+        $s13 -= self::mul( $s20, 683901, 20 );
2567
+
2568
+        $s7  += self::mul( $s19, 666643, 20 );
2569
+        $s8  += self::mul( $s19, 470296, 19 );
2570
+        $s9  += self::mul( $s19, 654183, 20 );
2571
+        $s10 -= self::mul( $s19, 997805, 20 );
2572
+        $s11 += self::mul( $s19, 136657, 18 );
2573
+        $s12 -= self::mul( $s19, 683901, 20 );
2574
+
2575
+        $s6  += self::mul( $s18, 666643, 20 );
2576
+        $s7  += self::mul( $s18, 470296, 19 );
2577
+        $s8  += self::mul( $s18, 654183, 20 );
2578
+        $s9  -= self::mul( $s18, 997805, 20 );
2579
+        $s10 += self::mul( $s18, 136657, 18 );
2580
+        $s11 -= self::mul( $s18, 683901, 20 );
2581
+
2582
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
2583 2583
         $s7 += $carry6;
2584 2584
         $s6 -= $carry6 << 21;
2585
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2585
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
2586 2586
         $s9 += $carry8;
2587 2587
         $s8 -= $carry8 << 21;
2588
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2588
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
2589 2589
         $s11 += $carry10;
2590 2590
         $s10 -= $carry10 << 21;
2591
-        $carry12 = ($s12 + (1 << 20)) >> 21;
2591
+        $carry12 = ( $s12 + ( 1 << 20 ) ) >> 21;
2592 2592
         $s13 += $carry12;
2593 2593
         $s12 -= $carry12 << 21;
2594
-        $carry14 = ($s14 + (1 << 20)) >> 21;
2594
+        $carry14 = ( $s14 + ( 1 << 20 ) ) >> 21;
2595 2595
         $s15 += $carry14;
2596 2596
         $s14 -= $carry14 << 21;
2597
-        $carry16 = ($s16 + (1 << 20)) >> 21;
2597
+        $carry16 = ( $s16 + ( 1 << 20 ) ) >> 21;
2598 2598
         $s17 += $carry16;
2599 2599
         $s16 -= $carry16 << 21;
2600 2600
 
2601
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2601
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
2602 2602
         $s8 += $carry7;
2603 2603
         $s7 -= $carry7 << 21;
2604
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2604
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
2605 2605
         $s10 += $carry9;
2606 2606
         $s9 -= $carry9 << 21;
2607
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2607
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
2608 2608
         $s12 += $carry11;
2609 2609
         $s11 -= $carry11 << 21;
2610
-        $carry13 = ($s13 + (1 << 20)) >> 21;
2610
+        $carry13 = ( $s13 + ( 1 << 20 ) ) >> 21;
2611 2611
         $s14 += $carry13;
2612 2612
         $s13 -= $carry13 << 21;
2613
-        $carry15 = ($s15 + (1 << 20)) >> 21;
2613
+        $carry15 = ( $s15 + ( 1 << 20 ) ) >> 21;
2614 2614
         $s16 += $carry15;
2615 2615
         $s15 -= $carry15 << 21;
2616 2616
 
2617
-        $s5  += self::mul($s17,  666643, 20);
2618
-        $s6  += self::mul($s17,  470296, 19);
2619
-        $s7  += self::mul($s17,  654183, 20);
2620
-        $s8  -= self::mul($s17,  997805, 20);
2621
-        $s9  += self::mul($s17,  136657, 18);
2622
-        $s10 -= self::mul($s17,  683901, 20);
2623
-
2624
-        $s4 += self::mul($s16,  666643, 20);
2625
-        $s5 += self::mul($s16,  470296, 19);
2626
-        $s6 += self::mul($s16,  654183, 20);
2627
-        $s7 -= self::mul($s16,  997805, 20);
2628
-        $s8 += self::mul($s16,  136657, 18);
2629
-        $s9 -= self::mul($s16,  683901, 20);
2630
-
2631
-        $s3 += self::mul($s15,  666643, 20);
2632
-        $s4 += self::mul($s15,  470296, 19);
2633
-        $s5 += self::mul($s15,  654183, 20);
2634
-        $s6 -= self::mul($s15,  997805, 20);
2635
-        $s7 += self::mul($s15,  136657, 18);
2636
-        $s8 -= self::mul($s15,  683901, 20);
2637
-
2638
-        $s2 += self::mul($s14,  666643, 20);
2639
-        $s3 += self::mul($s14,  470296, 19);
2640
-        $s4 += self::mul($s14,  654183, 20);
2641
-        $s5 -= self::mul($s14,  997805, 20);
2642
-        $s6 += self::mul($s14,  136657, 18);
2643
-        $s7 -= self::mul($s14,  683901, 20);
2644
-
2645
-        $s1 += self::mul($s13,  666643, 20);
2646
-        $s2 += self::mul($s13,  470296, 19);
2647
-        $s3 += self::mul($s13,  654183, 20);
2648
-        $s4 -= self::mul($s13,  997805, 20);
2649
-        $s5 += self::mul($s13,  136657, 18);
2650
-        $s6 -= self::mul($s13,  683901, 20);
2651
-
2652
-        $s0 += self::mul($s12,  666643, 20);
2653
-        $s1 += self::mul($s12,  470296, 19);
2654
-        $s2 += self::mul($s12,  654183, 20);
2655
-        $s3 -= self::mul($s12,  997805, 20);
2656
-        $s4 += self::mul($s12,  136657, 18);
2657
-        $s5 -= self::mul($s12,  683901, 20);
2617
+        $s5  += self::mul( $s17, 666643, 20 );
2618
+        $s6  += self::mul( $s17, 470296, 19 );
2619
+        $s7  += self::mul( $s17, 654183, 20 );
2620
+        $s8  -= self::mul( $s17, 997805, 20 );
2621
+        $s9  += self::mul( $s17, 136657, 18 );
2622
+        $s10 -= self::mul( $s17, 683901, 20 );
2623
+
2624
+        $s4 += self::mul( $s16, 666643, 20 );
2625
+        $s5 += self::mul( $s16, 470296, 19 );
2626
+        $s6 += self::mul( $s16, 654183, 20 );
2627
+        $s7 -= self::mul( $s16, 997805, 20 );
2628
+        $s8 += self::mul( $s16, 136657, 18 );
2629
+        $s9 -= self::mul( $s16, 683901, 20 );
2630
+
2631
+        $s3 += self::mul( $s15, 666643, 20 );
2632
+        $s4 += self::mul( $s15, 470296, 19 );
2633
+        $s5 += self::mul( $s15, 654183, 20 );
2634
+        $s6 -= self::mul( $s15, 997805, 20 );
2635
+        $s7 += self::mul( $s15, 136657, 18 );
2636
+        $s8 -= self::mul( $s15, 683901, 20 );
2637
+
2638
+        $s2 += self::mul( $s14, 666643, 20 );
2639
+        $s3 += self::mul( $s14, 470296, 19 );
2640
+        $s4 += self::mul( $s14, 654183, 20 );
2641
+        $s5 -= self::mul( $s14, 997805, 20 );
2642
+        $s6 += self::mul( $s14, 136657, 18 );
2643
+        $s7 -= self::mul( $s14, 683901, 20 );
2644
+
2645
+        $s1 += self::mul( $s13, 666643, 20 );
2646
+        $s2 += self::mul( $s13, 470296, 19 );
2647
+        $s3 += self::mul( $s13, 654183, 20 );
2648
+        $s4 -= self::mul( $s13, 997805, 20 );
2649
+        $s5 += self::mul( $s13, 136657, 18 );
2650
+        $s6 -= self::mul( $s13, 683901, 20 );
2651
+
2652
+        $s0 += self::mul( $s12, 666643, 20 );
2653
+        $s1 += self::mul( $s12, 470296, 19 );
2654
+        $s2 += self::mul( $s12, 654183, 20 );
2655
+        $s3 -= self::mul( $s12, 997805, 20 );
2656
+        $s4 += self::mul( $s12, 136657, 18 );
2657
+        $s5 -= self::mul( $s12, 683901, 20 );
2658 2658
         $s12 = 0;
2659 2659
 
2660
-        $carry0 = ($s0 + (1 << 20)) >> 21;
2660
+        $carry0 = ( $s0 + ( 1 << 20 ) ) >> 21;
2661 2661
         $s1 += $carry0;
2662 2662
         $s0 -= $carry0 << 21;
2663
-        $carry2 = ($s2 + (1 << 20)) >> 21;
2663
+        $carry2 = ( $s2 + ( 1 << 20 ) ) >> 21;
2664 2664
         $s3 += $carry2;
2665 2665
         $s2 -= $carry2 << 21;
2666
-        $carry4 = ($s4 + (1 << 20)) >> 21;
2666
+        $carry4 = ( $s4 + ( 1 << 20 ) ) >> 21;
2667 2667
         $s5 += $carry4;
2668 2668
         $s4 -= $carry4 << 21;
2669
-        $carry6 = ($s6 + (1 << 20)) >> 21;
2669
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
2670 2670
         $s7 += $carry6;
2671 2671
         $s6 -= $carry6 << 21;
2672
-        $carry8 = ($s8 + (1 << 20)) >> 21;
2672
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
2673 2673
         $s9 += $carry8;
2674 2674
         $s8 -= $carry8 << 21;
2675
-        $carry10 = ($s10 + (1 << 20)) >> 21;
2675
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
2676 2676
         $s11 += $carry10;
2677 2677
         $s10 -= $carry10 << 21;
2678 2678
 
2679
-        $carry1 = ($s1 + (1 << 20)) >> 21;
2679
+        $carry1 = ( $s1 + ( 1 << 20 ) ) >> 21;
2680 2680
         $s2 += $carry1;
2681 2681
         $s1 -= $carry1 << 21;
2682
-        $carry3 = ($s3 + (1 << 20)) >> 21;
2682
+        $carry3 = ( $s3 + ( 1 << 20 ) ) >> 21;
2683 2683
         $s4 += $carry3;
2684 2684
         $s3 -= $carry3 << 21;
2685
-        $carry5 = ($s5 + (1 << 20)) >> 21;
2685
+        $carry5 = ( $s5 + ( 1 << 20 ) ) >> 21;
2686 2686
         $s6 += $carry5;
2687 2687
         $s5 -= $carry5 << 21;
2688
-        $carry7 = ($s7 + (1 << 20)) >> 21;
2688
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
2689 2689
         $s8 += $carry7;
2690 2690
         $s7 -= $carry7 << 21;
2691
-        $carry9 = ($s9 + (1 << 20)) >> 21;
2691
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
2692 2692
         $s10 += $carry9;
2693 2693
         $s9 -= $carry9 << 21;
2694
-        $carry11 = ($s11 + (1 << 20)) >> 21;
2694
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
2695 2695
         $s12 += $carry11;
2696 2696
         $s11 -= $carry11 << 21;
2697 2697
 
2698
-        $s0 += self::mul($s12,  666643, 20);
2699
-        $s1 += self::mul($s12,  470296, 19);
2700
-        $s2 += self::mul($s12,  654183, 20);
2701
-        $s3 -= self::mul($s12,  997805, 20);
2702
-        $s4 += self::mul($s12,  136657, 18);
2703
-        $s5 -= self::mul($s12,  683901, 20);
2698
+        $s0 += self::mul( $s12, 666643, 20 );
2699
+        $s1 += self::mul( $s12, 470296, 19 );
2700
+        $s2 += self::mul( $s12, 654183, 20 );
2701
+        $s3 -= self::mul( $s12, 997805, 20 );
2702
+        $s4 += self::mul( $s12, 136657, 18 );
2703
+        $s5 -= self::mul( $s12, 683901, 20 );
2704 2704
         $s12 = 0;
2705 2705
 
2706 2706
         $carry0 = $s0 >> 21;
@@ -2740,12 +2740,12 @@  discard block
 block discarded – undo
2740 2740
         $s12 += $carry11;
2741 2741
         $s11 -= $carry11 << 21;
2742 2742
 
2743
-        $s0 += self::mul($s12,  666643, 20);
2744
-        $s1 += self::mul($s12,  470296, 19);
2745
-        $s2 += self::mul($s12,  654183, 20);
2746
-        $s3 -= self::mul($s12,  997805, 20);
2747
-        $s4 += self::mul($s12,  136657, 18);
2748
-        $s5 -= self::mul($s12,  683901, 20);
2743
+        $s0 += self::mul( $s12, 666643, 20 );
2744
+        $s1 += self::mul( $s12, 470296, 19 );
2745
+        $s2 += self::mul( $s12, 654183, 20 );
2746
+        $s3 -= self::mul( $s12, 997805, 20 );
2747
+        $s4 += self::mul( $s12, 136657, 18 );
2748
+        $s5 -= self::mul( $s12, 683901, 20 );
2749 2749
 
2750 2750
         $carry0 = $s0 >> 21;
2751 2751
         $s1 += $carry0;
@@ -2785,40 +2785,40 @@  discard block
 block discarded – undo
2785 2785
          * @var array<int, int>
2786 2786
          */
2787 2787
         $arr = array(
2788
-            (int) ($s0 >> 0),
2789
-            (int) ($s0 >> 8),
2790
-            (int) (($s0 >> 16) | $s1 << 5),
2791
-            (int) ($s1 >> 3),
2792
-            (int) ($s1 >> 11),
2793
-            (int) (($s1 >> 19) | $s2 << 2),
2794
-            (int) ($s2 >> 6),
2795
-            (int) (($s2 >> 14) | $s3 << 7),
2796
-            (int) ($s3 >> 1),
2797
-            (int) ($s3 >> 9),
2798
-            (int) (($s3 >> 17) | $s4 << 4),
2799
-            (int) ($s4 >> 4),
2800
-            (int) ($s4 >> 12),
2801
-            (int) (($s4 >> 20) | $s5 << 1),
2802
-            (int) ($s5 >> 7),
2803
-            (int) (($s5 >> 15) | $s6 << 6),
2804
-            (int) ($s6 >> 2),
2805
-            (int) ($s6 >> 10),
2806
-            (int) (($s6 >> 18) | $s7 << 3),
2807
-            (int) ($s7 >> 5),
2808
-            (int) ($s7 >> 13),
2809
-            (int) ($s8 >> 0),
2810
-            (int) ($s8 >> 8),
2811
-            (int) (($s8 >> 16) | $s9 << 5),
2812
-            (int) ($s9 >> 3),
2813
-            (int) ($s9 >> 11),
2814
-            (int) (($s9 >> 19) | $s10 << 2),
2815
-            (int) ($s10 >> 6),
2816
-            (int) (($s10 >> 14) | $s11 << 7),
2817
-            (int) ($s11 >> 1),
2818
-            (int) ($s11 >> 9),
2819
-            (int) $s11 >> 17
2788
+            (int)( $s0 >> 0 ),
2789
+            (int)( $s0 >> 8 ),
2790
+            (int)( ( $s0 >> 16 ) | $s1 << 5 ),
2791
+            (int)( $s1 >> 3 ),
2792
+            (int)( $s1 >> 11 ),
2793
+            (int)( ( $s1 >> 19 ) | $s2 << 2 ),
2794
+            (int)( $s2 >> 6 ),
2795
+            (int)( ( $s2 >> 14 ) | $s3 << 7 ),
2796
+            (int)( $s3 >> 1 ),
2797
+            (int)( $s3 >> 9 ),
2798
+            (int)( ( $s3 >> 17 ) | $s4 << 4 ),
2799
+            (int)( $s4 >> 4 ),
2800
+            (int)( $s4 >> 12 ),
2801
+            (int)( ( $s4 >> 20 ) | $s5 << 1 ),
2802
+            (int)( $s5 >> 7 ),
2803
+            (int)( ( $s5 >> 15 ) | $s6 << 6 ),
2804
+            (int)( $s6 >> 2 ),
2805
+            (int)( $s6 >> 10 ),
2806
+            (int)( ( $s6 >> 18 ) | $s7 << 3 ),
2807
+            (int)( $s7 >> 5 ),
2808
+            (int)( $s7 >> 13 ),
2809
+            (int)( $s8 >> 0 ),
2810
+            (int)( $s8 >> 8 ),
2811
+            (int)( ( $s8 >> 16 ) | $s9 << 5 ),
2812
+            (int)( $s9 >> 3 ),
2813
+            (int)( $s9 >> 11 ),
2814
+            (int)( ( $s9 >> 19 ) | $s10 << 2 ),
2815
+            (int)( $s10 >> 6 ),
2816
+            (int)( ( $s10 >> 14 ) | $s11 << 7 ),
2817
+            (int)( $s11 >> 1 ),
2818
+            (int)( $s11 >> 9 ),
2819
+            (int)$s11 >> 17
2820 2820
         );
2821
-        return self::intArrayToString($arr);
2821
+        return self::intArrayToString( $arr );
2822 2822
     }
2823 2823
 
2824 2824
     /**
@@ -2827,7 +2827,7 @@  discard block
 block discarded – undo
2827 2827
      * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
2828 2828
      * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
2829 2829
      */
2830
-    public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A)
2830
+    public static function ge_mul_l( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A )
2831 2831
     {
2832 2832
         $aslide = array(
2833 2833
             13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
@@ -2848,39 +2848,39 @@  discard block
 block discarded – undo
2848 2848
         $Ai = array();
2849 2849
 
2850 2850
         # ge_p3_to_cached(&Ai[0], A);
2851
-        $Ai[0] = self::ge_p3_to_cached($A);
2851
+        $Ai[ 0 ] = self::ge_p3_to_cached( $A );
2852 2852
         # ge_p3_dbl(&t, A);
2853
-        $t = self::ge_p3_dbl($A);
2853
+        $t = self::ge_p3_dbl( $A );
2854 2854
         # ge_p1p1_to_p3(&A2, &t);
2855
-        $A2 = self::ge_p1p1_to_p3($t);
2855
+        $A2 = self::ge_p1p1_to_p3( $t );
2856 2856
 
2857
-        for ($i = 1; $i < 8; ++$i) {
2857
+        for ( $i = 1; $i < 8; ++$i ) {
2858 2858
             # ge_add(&t, &A2, &Ai[0]);
2859
-            $t = self::ge_add($A2, $Ai[$i - 1]);
2859
+            $t = self::ge_add( $A2, $Ai[ $i - 1 ] );
2860 2860
             # ge_p1p1_to_p3(&u, &t);
2861
-            $u = self::ge_p1p1_to_p3($t);
2861
+            $u = self::ge_p1p1_to_p3( $t );
2862 2862
             # ge_p3_to_cached(&Ai[i], &u);
2863
-            $Ai[$i] = self::ge_p3_to_cached($u);
2863
+            $Ai[ $i ] = self::ge_p3_to_cached( $u );
2864 2864
         }
2865 2865
 
2866 2866
         $r = self::ge_p3_0();
2867
-        for ($i = 252; $i >= 0; --$i) {
2868
-            $t = self::ge_p3_dbl($r);
2869
-            if ($aslide[$i] > 0) {
2867
+        for ( $i = 252; $i >= 0; --$i ) {
2868
+            $t = self::ge_p3_dbl( $r );
2869
+            if ( $aslide[ $i ] > 0 ) {
2870 2870
                 # ge_p1p1_to_p3(&u, &t);
2871
-                $u = self::ge_p1p1_to_p3($t);
2871
+                $u = self::ge_p1p1_to_p3( $t );
2872 2872
                 # ge_add(&t, &u, &Ai[aslide[i] / 2]);
2873
-                $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]);
2874
-            } elseif ($aslide[$i] < 0) {
2873
+                $t = self::ge_add( $u, $Ai[ (int)( $aslide[ $i ] / 2 ) ] );
2874
+            } elseif ( $aslide[ $i ] < 0 ) {
2875 2875
                 # ge_p1p1_to_p3(&u, &t);
2876
-                $u = self::ge_p1p1_to_p3($t);
2876
+                $u = self::ge_p1p1_to_p3( $t );
2877 2877
                 # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
2878
-                $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]);
2878
+                $t = self::ge_sub( $u, $Ai[ (int)(-$aslide[ $i ] / 2) ] );
2879 2879
             }
2880 2880
         }
2881 2881
 
2882 2882
         # ge_p1p1_to_p3(r, &t);
2883
-        return self::ge_p1p1_to_p3($t);
2883
+        return self::ge_p1p1_to_p3( $t );
2884 2884
     }
2885 2885
 
2886 2886
     /**
@@ -2888,7 +2888,7 @@  discard block
 block discarded – undo
2888 2888
      * @param string $b
2889 2889
      * @return string
2890 2890
      */
2891
-    public static function sc25519_mul($a, $b)
2891
+    public static function sc25519_mul( $a, $b )
2892 2892
     {
2893 2893
         //    int64_t a0  = 2097151 & load_3(a);
2894 2894
         //    int64_t a1  = 2097151 & (load_4(a + 2) >> 5);
@@ -2902,18 +2902,18 @@  discard block
 block discarded – undo
2902 2902
         //    int64_t a9  = 2097151 & (load_4(a + 23) >> 5);
2903 2903
         //    int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
2904 2904
         //    int64_t a11 = (load_4(a + 28) >> 7);
2905
-        $a0  = 2097151 &  self::load_3(self::substr($a, 0, 3));
2906
-        $a1  = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
2907
-        $a2  = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
2908
-        $a3  = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
2909
-        $a4  = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
2910
-        $a5  = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
2911
-        $a6  = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
2912
-        $a7  = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
2913
-        $a8  = 2097151 &  self::load_3(self::substr($a, 21, 3));
2914
-        $a9  = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
2915
-        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
2916
-        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);
2905
+        $a0  = 2097151 &  self::load_3( self::substr( $a, 0, 3 ) );
2906
+        $a1  = 2097151 & ( self::load_4( self::substr( $a, 2, 4 ) ) >> 5 );
2907
+        $a2  = 2097151 & ( self::load_3( self::substr( $a, 5, 3 ) ) >> 2 );
2908
+        $a3  = 2097151 & ( self::load_4( self::substr( $a, 7, 4 ) ) >> 7 );
2909
+        $a4  = 2097151 & ( self::load_4( self::substr( $a, 10, 4 ) ) >> 4 );
2910
+        $a5  = 2097151 & ( self::load_3( self::substr( $a, 13, 3 ) ) >> 1 );
2911
+        $a6  = 2097151 & ( self::load_4( self::substr( $a, 15, 4 ) ) >> 6 );
2912
+        $a7  = 2097151 & ( self::load_3( self::substr( $a, 18, 3 ) ) >> 3 );
2913
+        $a8  = 2097151 &  self::load_3( self::substr( $a, 21, 3 ) );
2914
+        $a9  = 2097151 & ( self::load_4( self::substr( $a, 23, 4 ) ) >> 5 );
2915
+        $a10 = 2097151 & ( self::load_3( self::substr( $a, 26, 3 ) ) >> 2 );
2916
+        $a11 = ( self::load_4( self::substr( $a, 28, 4 ) ) >> 7 );
2917 2917
 
2918 2918
         //    int64_t b0  = 2097151 & load_3(b);
2919 2919
         //    int64_t b1  = 2097151 & (load_4(b + 2) >> 5);
@@ -2927,18 +2927,18 @@  discard block
 block discarded – undo
2927 2927
         //    int64_t b9  = 2097151 & (load_4(b + 23) >> 5);
2928 2928
         //    int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
2929 2929
         //    int64_t b11 = (load_4(b + 28) >> 7);
2930
-        $b0  = 2097151 &  self::load_3(self::substr($b, 0, 3));
2931
-        $b1  = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
2932
-        $b2  = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
2933
-        $b3  = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
2934
-        $b4  = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
2935
-        $b5  = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
2936
-        $b6  = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
2937
-        $b7  = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
2938
-        $b8  = 2097151 &  self::load_3(self::substr($b, 21, 3));
2939
-        $b9  = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
2940
-        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
2941
-        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);
2930
+        $b0  = 2097151 &  self::load_3( self::substr( $b, 0, 3 ) );
2931
+        $b1  = 2097151 & ( self::load_4( self::substr( $b, 2, 4 ) ) >> 5 );
2932
+        $b2  = 2097151 & ( self::load_3( self::substr( $b, 5, 3 ) ) >> 2 );
2933
+        $b3  = 2097151 & ( self::load_4( self::substr( $b, 7, 4 ) ) >> 7 );
2934
+        $b4  = 2097151 & ( self::load_4( self::substr( $b, 10, 4 ) ) >> 4 );
2935
+        $b5  = 2097151 & ( self::load_3( self::substr( $b, 13, 3 ) ) >> 1 );
2936
+        $b6  = 2097151 & ( self::load_4( self::substr( $b, 15, 4 ) ) >> 6 );
2937
+        $b7  = 2097151 & ( self::load_3( self::substr( $b, 18, 3 ) ) >> 3 );
2938
+        $b8  = 2097151 &  self::load_3( self::substr( $b, 21, 3 ) );
2939
+        $b9  = 2097151 & ( self::load_4( self::substr( $b, 23, 4 ) ) >> 5 );
2940
+        $b10 = 2097151 & ( self::load_3( self::substr( $b, 26, 3 ) ) >> 2 );
2941
+        $b11 = ( self::load_4( self::substr( $b, 28, 4 ) ) >> 7 );
2942 2942
 
2943 2943
         //    s0 = a0 * b0;
2944 2944
         //    s1 = a0 * b1 + a1 * b0;
@@ -2974,192 +2974,192 @@  discard block
 block discarded – undo
2974 2974
         //    s21 = a10 * b11 + a11 * b10;
2975 2975
         //    s22 = a11 * b11;
2976 2976
         //    s23 = 0;
2977
-        $s0 = self::mul($a0, $b0, 22);
2978
-        $s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22);
2979
-        $s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22);
2980
-        $s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22);
2981
-        $s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) +
2982
-            self::mul($a4, $b0, 22);
2983
-        $s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) +
2984
-            self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22);
2985
-        $s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) +
2986
-            self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22);
2987
-        $s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) +
2988
-            self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22);
2989
-        $s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) +
2990
-            self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) +
2991
-            self::mul($a8, $b0, 22);
2992
-        $s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) +
2993
-            self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) +
2994
-            self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22);
2995
-        $s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) +
2996
-            self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) +
2997
-            self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22);
2998
-        $s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) +
2999
-            self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) +
3000
-            self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22);
3001
-        $s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) +
3002
-            self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) +
3003
-            self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22);
3004
-        $s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) +
3005
-            self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) +
3006
-            self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22);
3007
-        $s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) +
3008
-            self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) +
3009
-            self::mul($a11, $b3, 22);
3010
-        $s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) +
3011
-            self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22);
2977
+        $s0 = self::mul( $a0, $b0, 22 );
2978
+        $s1 = self::mul( $a0, $b1, 22 ) + self::mul( $a1, $b0, 22 );
2979
+        $s2 = self::mul( $a0, $b2, 22 ) + self::mul( $a1, $b1, 22 ) + self::mul( $a2, $b0, 22 );
2980
+        $s3 = self::mul( $a0, $b3, 22 ) + self::mul( $a1, $b2, 22 ) + self::mul( $a2, $b1, 22 ) + self::mul( $a3, $b0, 22 );
2981
+        $s4 = self::mul( $a0, $b4, 22 ) + self::mul( $a1, $b3, 22 ) + self::mul( $a2, $b2, 22 ) + self::mul( $a3, $b1, 22 ) +
2982
+            self::mul( $a4, $b0, 22 );
2983
+        $s5 = self::mul( $a0, $b5, 22 ) + self::mul( $a1, $b4, 22 ) + self::mul( $a2, $b3, 22 ) + self::mul( $a3, $b2, 22 ) +
2984
+            self::mul( $a4, $b1, 22 ) + self::mul( $a5, $b0, 22 );
2985
+        $s6 = self::mul( $a0, $b6, 22 ) + self::mul( $a1, $b5, 22 ) + self::mul( $a2, $b4, 22 ) + self::mul( $a3, $b3, 22 ) +
2986
+            self::mul( $a4, $b2, 22 ) + self::mul( $a5, $b1, 22 ) + self::mul( $a6, $b0, 22 );
2987
+        $s7 = self::mul( $a0, $b7, 22 ) + self::mul( $a1, $b6, 22 ) + self::mul( $a2, $b5, 22 ) + self::mul( $a3, $b4, 22 ) +
2988
+            self::mul( $a4, $b3, 22 ) + self::mul( $a5, $b2, 22 ) + self::mul( $a6, $b1, 22 ) + self::mul( $a7, $b0, 22 );
2989
+        $s8 = self::mul( $a0, $b8, 22 ) + self::mul( $a1, $b7, 22 ) + self::mul( $a2, $b6, 22 ) + self::mul( $a3, $b5, 22 ) +
2990
+            self::mul( $a4, $b4, 22 ) + self::mul( $a5, $b3, 22 ) + self::mul( $a6, $b2, 22 ) + self::mul( $a7, $b1, 22 ) +
2991
+            self::mul( $a8, $b0, 22 );
2992
+        $s9 = self::mul( $a0, $b9, 22 ) + self::mul( $a1, $b8, 22 ) + self::mul( $a2, $b7, 22 ) + self::mul( $a3, $b6, 22 ) +
2993
+            self::mul( $a4, $b5, 22 ) + self::mul( $a5, $b4, 22 ) + self::mul( $a6, $b3, 22 ) + self::mul( $a7, $b2, 22 ) +
2994
+            self::mul( $a8, $b1, 22 ) + self::mul( $a9, $b0, 22 );
2995
+        $s10 = self::mul( $a0, $b10, 22 ) + self::mul( $a1, $b9, 22 ) + self::mul( $a2, $b8, 22 ) + self::mul( $a3, $b7, 22 ) +
2996
+            self::mul( $a4, $b6, 22 ) + self::mul( $a5, $b5, 22 ) + self::mul( $a6, $b4, 22 ) + self::mul( $a7, $b3, 22 ) +
2997
+            self::mul( $a8, $b2, 22 ) + self::mul( $a9, $b1, 22 ) + self::mul( $a10, $b0, 22 );
2998
+        $s11 = self::mul( $a0, $b11, 22 ) + self::mul( $a1, $b10, 22 ) + self::mul( $a2, $b9, 22 ) + self::mul( $a3, $b8, 22 ) +
2999
+            self::mul( $a4, $b7, 22 ) + self::mul( $a5, $b6, 22 ) + self::mul( $a6, $b5, 22 ) + self::mul( $a7, $b4, 22 ) +
3000
+            self::mul( $a8, $b3, 22 ) + self::mul( $a9, $b2, 22 ) + self::mul( $a10, $b1, 22 ) + self::mul( $a11, $b0, 22 );
3001
+        $s12 = self::mul( $a1, $b11, 22 ) + self::mul( $a2, $b10, 22 ) + self::mul( $a3, $b9, 22 ) + self::mul( $a4, $b8, 22 ) +
3002
+            self::mul( $a5, $b7, 22 ) + self::mul( $a6, $b6, 22 ) + self::mul( $a7, $b5, 22 ) + self::mul( $a8, $b4, 22 ) +
3003
+            self::mul( $a9, $b3, 22 ) + self::mul( $a10, $b2, 22 ) + self::mul( $a11, $b1, 22 );
3004
+        $s13 = self::mul( $a2, $b11, 22 ) + self::mul( $a3, $b10, 22 ) + self::mul( $a4, $b9, 22 ) + self::mul( $a5, $b8, 22 ) +
3005
+            self::mul( $a6, $b7, 22 ) + self::mul( $a7, $b6, 22 ) + self::mul( $a8, $b5, 22 ) + self::mul( $a9, $b4, 22 ) +
3006
+            self::mul( $a10, $b3, 22 ) + self::mul( $a11, $b2, 22 );
3007
+        $s14 = self::mul( $a3, $b11, 22 ) + self::mul( $a4, $b10, 22 ) + self::mul( $a5, $b9, 22 ) + self::mul( $a6, $b8, 22 ) +
3008
+            self::mul( $a7, $b7, 22 ) + self::mul( $a8, $b6, 22 ) + self::mul( $a9, $b5, 22 ) + self::mul( $a10, $b4, 22 ) +
3009
+            self::mul( $a11, $b3, 22 );
3010
+        $s15 = self::mul( $a4, $b11, 22 ) + self::mul( $a5, $b10, 22 ) + self::mul( $a6, $b9, 22 ) + self::mul( $a7, $b8, 22 ) +
3011
+            self::mul( $a8, $b7, 22 ) + self::mul( $a9, $b6, 22 ) + self::mul( $a10, $b5, 22 ) + self::mul( $a11, $b4, 22 );
3012 3012
         $s16 =
3013
-            self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) +
3014
-            self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22);
3015
-        $s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) +
3016
-            self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22);
3017
-        $s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22)
3018
-            + self::mul($a11, $b7, 22);
3019
-        $s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) +
3020
-            self::mul($a11, $b8, 22);
3021
-        $s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22);
3022
-        $s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22);
3023
-        $s22 = self::mul($a11, $b11, 22);
3013
+            self::mul( $a5, $b11, 22 ) + self::mul( $a6, $b10, 22 ) + self::mul( $a7, $b9, 22 ) + self::mul( $a8, $b8, 22 ) +
3014
+            self::mul( $a9, $b7, 22 ) + self::mul( $a10, $b6, 22 ) + self::mul( $a11, $b5, 22 );
3015
+        $s17 = self::mul( $a6, $b11, 22 ) + self::mul( $a7, $b10, 22 ) + self::mul( $a8, $b9, 22 ) + self::mul( $a9, $b8, 22 ) +
3016
+            self::mul( $a10, $b7, 22 ) + self::mul( $a11, $b6, 22 );
3017
+        $s18 = self::mul( $a7, $b11, 22 ) + self::mul( $a8, $b10, 22 ) + self::mul( $a9, $b9, 22 ) + self::mul( $a10, $b8, 22 )
3018
+            + self::mul( $a11, $b7, 22 );
3019
+        $s19 = self::mul( $a8, $b11, 22 ) + self::mul( $a9, $b10, 22 ) + self::mul( $a10, $b9, 22 ) +
3020
+            self::mul( $a11, $b8, 22 );
3021
+        $s20 = self::mul( $a9, $b11, 22 ) + self::mul( $a10, $b10, 22 ) + self::mul( $a11, $b9, 22 );
3022
+        $s21 = self::mul( $a10, $b11, 22 ) + self::mul( $a11, $b10, 22 );
3023
+        $s22 = self::mul( $a11, $b11, 22 );
3024 3024
         $s23 = 0;
3025 3025
 
3026 3026
         //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3027 3027
         //    s1 += carry0;
3028 3028
         //    s0 -= carry0 * ((uint64_t) 1L << 21);
3029
-        $carry0 = ($s0 + (1 << 20)) >> 21;
3029
+        $carry0 = ( $s0 + ( 1 << 20 ) ) >> 21;
3030 3030
         $s1 += $carry0;
3031 3031
         $s0 -= $carry0 << 21;
3032 3032
         //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3033 3033
         //    s3 += carry2;
3034 3034
         //    s2 -= carry2 * ((uint64_t) 1L << 21);
3035
-        $carry2 = ($s2 + (1 << 20)) >> 21;
3035
+        $carry2 = ( $s2 + ( 1 << 20 ) ) >> 21;
3036 3036
         $s3 += $carry2;
3037 3037
         $s2 -= $carry2 << 21;
3038 3038
         //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3039 3039
         //    s5 += carry4;
3040 3040
         //    s4 -= carry4 * ((uint64_t) 1L << 21);
3041
-        $carry4 = ($s4 + (1 << 20)) >> 21;
3041
+        $carry4 = ( $s4 + ( 1 << 20 ) ) >> 21;
3042 3042
         $s5 += $carry4;
3043 3043
         $s4 -= $carry4 << 21;
3044 3044
         //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3045 3045
         //    s7 += carry6;
3046 3046
         //    s6 -= carry6 * ((uint64_t) 1L << 21);
3047
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3047
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
3048 3048
         $s7 += $carry6;
3049 3049
         $s6 -= $carry6 << 21;
3050 3050
         //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3051 3051
         //    s9 += carry8;
3052 3052
         //    s8 -= carry8 * ((uint64_t) 1L << 21);
3053
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3053
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
3054 3054
         $s9 += $carry8;
3055 3055
         $s8 -= $carry8 << 21;
3056 3056
         //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3057 3057
         //    s11 += carry10;
3058 3058
         //    s10 -= carry10 * ((uint64_t) 1L << 21);
3059
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3059
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
3060 3060
         $s11 += $carry10;
3061 3061
         $s10 -= $carry10 << 21;
3062 3062
         //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3063 3063
         //    s13 += carry12;
3064 3064
         //    s12 -= carry12 * ((uint64_t) 1L << 21);
3065
-        $carry12 = ($s12 + (1 << 20)) >> 21;
3065
+        $carry12 = ( $s12 + ( 1 << 20 ) ) >> 21;
3066 3066
         $s13 += $carry12;
3067 3067
         $s12 -= $carry12 << 21;
3068 3068
         //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3069 3069
         //    s15 += carry14;
3070 3070
         //    s14 -= carry14 * ((uint64_t) 1L << 21);
3071
-        $carry14 = ($s14 + (1 << 20)) >> 21;
3071
+        $carry14 = ( $s14 + ( 1 << 20 ) ) >> 21;
3072 3072
         $s15 += $carry14;
3073 3073
         $s14 -= $carry14 << 21;
3074 3074
         //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3075 3075
         //    s17 += carry16;
3076 3076
         //    s16 -= carry16 * ((uint64_t) 1L << 21);
3077
-        $carry16 = ($s16 + (1 << 20)) >> 21;
3077
+        $carry16 = ( $s16 + ( 1 << 20 ) ) >> 21;
3078 3078
         $s17 += $carry16;
3079 3079
         $s16 -= $carry16 << 21;
3080 3080
         //    carry18 = (s18 + (int64_t) (1L << 20)) >> 21;
3081 3081
         //    s19 += carry18;
3082 3082
         //    s18 -= carry18 * ((uint64_t) 1L << 21);
3083
-        $carry18 = ($s18 + (1 << 20)) >> 21;
3083
+        $carry18 = ( $s18 + ( 1 << 20 ) ) >> 21;
3084 3084
         $s19 += $carry18;
3085 3085
         $s18 -= $carry18 << 21;
3086 3086
         //    carry20 = (s20 + (int64_t) (1L << 20)) >> 21;
3087 3087
         //    s21 += carry20;
3088 3088
         //    s20 -= carry20 * ((uint64_t) 1L << 21);
3089
-        $carry20 = ($s20 + (1 << 20)) >> 21;
3089
+        $carry20 = ( $s20 + ( 1 << 20 ) ) >> 21;
3090 3090
         $s21 += $carry20;
3091 3091
         $s20 -= $carry20 << 21;
3092 3092
         //    carry22 = (s22 + (int64_t) (1L << 20)) >> 21;
3093 3093
         //    s23 += carry22;
3094 3094
         //    s22 -= carry22 * ((uint64_t) 1L << 21);
3095
-        $carry22 = ($s22 + (1 << 20)) >> 21;
3095
+        $carry22 = ( $s22 + ( 1 << 20 ) ) >> 21;
3096 3096
         $s23 += $carry22;
3097 3097
         $s22 -= $carry22 << 21;
3098 3098
 
3099 3099
         //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3100 3100
         //    s2 += carry1;
3101 3101
         //    s1 -= carry1 * ((uint64_t) 1L << 21);
3102
-        $carry1 = ($s1 + (1 << 20)) >> 21;
3102
+        $carry1 = ( $s1 + ( 1 << 20 ) ) >> 21;
3103 3103
         $s2 += $carry1;
3104 3104
         $s1 -= $carry1 << 21;
3105 3105
         //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3106 3106
         //    s4 += carry3;
3107 3107
         //    s3 -= carry3 * ((uint64_t) 1L << 21);
3108
-        $carry3 = ($s3 + (1 << 20)) >> 21;
3108
+        $carry3 = ( $s3 + ( 1 << 20 ) ) >> 21;
3109 3109
         $s4 += $carry3;
3110 3110
         $s3 -= $carry3 << 21;
3111 3111
         //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3112 3112
         //    s6 += carry5;
3113 3113
         //    s5 -= carry5 * ((uint64_t) 1L << 21);
3114
-        $carry5 = ($s5 + (1 << 20)) >> 21;
3114
+        $carry5 = ( $s5 + ( 1 << 20 ) ) >> 21;
3115 3115
         $s6 += $carry5;
3116 3116
         $s5 -= $carry5 << 21;
3117 3117
         //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3118 3118
         //    s8 += carry7;
3119 3119
         //    s7 -= carry7 * ((uint64_t) 1L << 21);
3120
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3120
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
3121 3121
         $s8 += $carry7;
3122 3122
         $s7 -= $carry7 << 21;
3123 3123
         //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3124 3124
         //    s10 += carry9;
3125 3125
         //    s9 -= carry9 * ((uint64_t) 1L << 21);
3126
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3126
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
3127 3127
         $s10 += $carry9;
3128 3128
         $s9 -= $carry9 << 21;
3129 3129
         //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3130 3130
         //    s12 += carry11;
3131 3131
         //    s11 -= carry11 * ((uint64_t) 1L << 21);
3132
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3132
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
3133 3133
         $s12 += $carry11;
3134 3134
         $s11 -= $carry11 << 21;
3135 3135
         //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3136 3136
         //    s14 += carry13;
3137 3137
         //    s13 -= carry13 * ((uint64_t) 1L << 21);
3138
-        $carry13 = ($s13 + (1 << 20)) >> 21;
3138
+        $carry13 = ( $s13 + ( 1 << 20 ) ) >> 21;
3139 3139
         $s14 += $carry13;
3140 3140
         $s13 -= $carry13 << 21;
3141 3141
         //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3142 3142
         //    s16 += carry15;
3143 3143
         //    s15 -= carry15 * ((uint64_t) 1L << 21);
3144
-        $carry15 = ($s15 + (1 << 20)) >> 21;
3144
+        $carry15 = ( $s15 + ( 1 << 20 ) ) >> 21;
3145 3145
         $s16 += $carry15;
3146 3146
         $s15 -= $carry15 << 21;
3147 3147
         //    carry17 = (s17 + (int64_t) (1L << 20)) >> 21;
3148 3148
         //    s18 += carry17;
3149 3149
         //    s17 -= carry17 * ((uint64_t) 1L << 21);
3150
-        $carry17 = ($s17 + (1 << 20)) >> 21;
3150
+        $carry17 = ( $s17 + ( 1 << 20 ) ) >> 21;
3151 3151
         $s18 += $carry17;
3152 3152
         $s17 -= $carry17 << 21;
3153 3153
         //    carry19 = (s19 + (int64_t) (1L << 20)) >> 21;
3154 3154
         //    s20 += carry19;
3155 3155
         //    s19 -= carry19 * ((uint64_t) 1L << 21);
3156
-        $carry19 = ($s19 + (1 << 20)) >> 21;
3156
+        $carry19 = ( $s19 + ( 1 << 20 ) ) >> 21;
3157 3157
         $s20 += $carry19;
3158 3158
         $s19 -= $carry19 << 21;
3159 3159
         //    carry21 = (s21 + (int64_t) (1L << 20)) >> 21;
3160 3160
         //    s22 += carry21;
3161 3161
         //    s21 -= carry21 * ((uint64_t) 1L << 21);
3162
-        $carry21 = ($s21 + (1 << 20)) >> 21;
3162
+        $carry21 = ( $s21 + ( 1 << 20 ) ) >> 21;
3163 3163
         $s22 += $carry21;
3164 3164
         $s21 -= $carry21 << 21;
3165 3165
 
@@ -3169,12 +3169,12 @@  discard block
 block discarded – undo
3169 3169
         //    s14 -= s23 * 997805;
3170 3170
         //    s15 += s23 * 136657;
3171 3171
         //    s16 -= s23 * 683901;
3172
-        $s11 += self::mul($s23, 666643, 20);
3173
-        $s12 += self::mul($s23, 470296, 19);
3174
-        $s13 += self::mul($s23, 654183, 20);
3175
-        $s14 -= self::mul($s23, 997805, 20);
3176
-        $s15 += self::mul($s23, 136657, 18);
3177
-        $s16 -= self::mul($s23, 683901, 20);
3172
+        $s11 += self::mul( $s23, 666643, 20 );
3173
+        $s12 += self::mul( $s23, 470296, 19 );
3174
+        $s13 += self::mul( $s23, 654183, 20 );
3175
+        $s14 -= self::mul( $s23, 997805, 20 );
3176
+        $s15 += self::mul( $s23, 136657, 18 );
3177
+        $s16 -= self::mul( $s23, 683901, 20 );
3178 3178
 
3179 3179
         //    s10 += s22 * 666643;
3180 3180
         //    s11 += s22 * 470296;
@@ -3182,12 +3182,12 @@  discard block
 block discarded – undo
3182 3182
         //    s13 -= s22 * 997805;
3183 3183
         //    s14 += s22 * 136657;
3184 3184
         //    s15 -= s22 * 683901;
3185
-        $s10 += self::mul($s22, 666643, 20);
3186
-        $s11 += self::mul($s22, 470296, 19);
3187
-        $s12 += self::mul($s22, 654183, 20);
3188
-        $s13 -= self::mul($s22, 997805, 20);
3189
-        $s14 += self::mul($s22, 136657, 18);
3190
-        $s15 -= self::mul($s22, 683901, 20);
3185
+        $s10 += self::mul( $s22, 666643, 20 );
3186
+        $s11 += self::mul( $s22, 470296, 19 );
3187
+        $s12 += self::mul( $s22, 654183, 20 );
3188
+        $s13 -= self::mul( $s22, 997805, 20 );
3189
+        $s14 += self::mul( $s22, 136657, 18 );
3190
+        $s15 -= self::mul( $s22, 683901, 20 );
3191 3191
 
3192 3192
         //    s9 += s21 * 666643;
3193 3193
         //    s10 += s21 * 470296;
@@ -3195,12 +3195,12 @@  discard block
 block discarded – undo
3195 3195
         //    s12 -= s21 * 997805;
3196 3196
         //    s13 += s21 * 136657;
3197 3197
         //    s14 -= s21 * 683901;
3198
-        $s9 += self::mul($s21, 666643, 20);
3199
-        $s10 += self::mul($s21, 470296, 19);
3200
-        $s11 += self::mul($s21, 654183, 20);
3201
-        $s12 -= self::mul($s21, 997805, 20);
3202
-        $s13 += self::mul($s21, 136657, 18);
3203
-        $s14 -= self::mul($s21, 683901, 20);
3198
+        $s9 += self::mul( $s21, 666643, 20 );
3199
+        $s10 += self::mul( $s21, 470296, 19 );
3200
+        $s11 += self::mul( $s21, 654183, 20 );
3201
+        $s12 -= self::mul( $s21, 997805, 20 );
3202
+        $s13 += self::mul( $s21, 136657, 18 );
3203
+        $s14 -= self::mul( $s21, 683901, 20 );
3204 3204
 
3205 3205
         //    s8 += s20 * 666643;
3206 3206
         //    s9 += s20 * 470296;
@@ -3208,12 +3208,12 @@  discard block
 block discarded – undo
3208 3208
         //    s11 -= s20 * 997805;
3209 3209
         //    s12 += s20 * 136657;
3210 3210
         //    s13 -= s20 * 683901;
3211
-        $s8 += self::mul($s20, 666643, 20);
3212
-        $s9 += self::mul($s20, 470296, 19);
3213
-        $s10 += self::mul($s20, 654183, 20);
3214
-        $s11 -= self::mul($s20, 997805, 20);
3215
-        $s12 += self::mul($s20, 136657, 18);
3216
-        $s13 -= self::mul($s20, 683901, 20);
3211
+        $s8 += self::mul( $s20, 666643, 20 );
3212
+        $s9 += self::mul( $s20, 470296, 19 );
3213
+        $s10 += self::mul( $s20, 654183, 20 );
3214
+        $s11 -= self::mul( $s20, 997805, 20 );
3215
+        $s12 += self::mul( $s20, 136657, 18 );
3216
+        $s13 -= self::mul( $s20, 683901, 20 );
3217 3217
 
3218 3218
         //    s7 += s19 * 666643;
3219 3219
         //    s8 += s19 * 470296;
@@ -3221,12 +3221,12 @@  discard block
 block discarded – undo
3221 3221
         //    s10 -= s19 * 997805;
3222 3222
         //    s11 += s19 * 136657;
3223 3223
         //    s12 -= s19 * 683901;
3224
-        $s7 += self::mul($s19, 666643, 20);
3225
-        $s8 += self::mul($s19, 470296, 19);
3226
-        $s9 += self::mul($s19, 654183, 20);
3227
-        $s10 -= self::mul($s19, 997805, 20);
3228
-        $s11 += self::mul($s19, 136657, 18);
3229
-        $s12 -= self::mul($s19, 683901, 20);
3224
+        $s7 += self::mul( $s19, 666643, 20 );
3225
+        $s8 += self::mul( $s19, 470296, 19 );
3226
+        $s9 += self::mul( $s19, 654183, 20 );
3227
+        $s10 -= self::mul( $s19, 997805, 20 );
3228
+        $s11 += self::mul( $s19, 136657, 18 );
3229
+        $s12 -= self::mul( $s19, 683901, 20 );
3230 3230
 
3231 3231
         //    s6 += s18 * 666643;
3232 3232
         //    s7 += s18 * 470296;
@@ -3234,78 +3234,78 @@  discard block
 block discarded – undo
3234 3234
         //    s9 -= s18 * 997805;
3235 3235
         //    s10 += s18 * 136657;
3236 3236
         //    s11 -= s18 * 683901;
3237
-        $s6 += self::mul($s18, 666643, 20);
3238
-        $s7 += self::mul($s18, 470296, 19);
3239
-        $s8 += self::mul($s18, 654183, 20);
3240
-        $s9 -= self::mul($s18, 997805, 20);
3241
-        $s10 += self::mul($s18, 136657, 18);
3242
-        $s11 -= self::mul($s18, 683901, 20);
3237
+        $s6 += self::mul( $s18, 666643, 20 );
3238
+        $s7 += self::mul( $s18, 470296, 19 );
3239
+        $s8 += self::mul( $s18, 654183, 20 );
3240
+        $s9 -= self::mul( $s18, 997805, 20 );
3241
+        $s10 += self::mul( $s18, 136657, 18 );
3242
+        $s11 -= self::mul( $s18, 683901, 20 );
3243 3243
 
3244 3244
         //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3245 3245
         //    s7 += carry6;
3246 3246
         //    s6 -= carry6 * ((uint64_t) 1L << 21);
3247
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3247
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
3248 3248
         $s7 += $carry6;
3249 3249
         $s6 -= $carry6 << 21;
3250 3250
         //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3251 3251
         //    s9 += carry8;
3252 3252
         //    s8 -= carry8 * ((uint64_t) 1L << 21);
3253
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3253
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
3254 3254
         $s9 += $carry8;
3255 3255
         $s8 -= $carry8 << 21;
3256 3256
         //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3257 3257
         //    s11 += carry10;
3258 3258
         //    s10 -= carry10 * ((uint64_t) 1L << 21);
3259
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3259
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
3260 3260
         $s11 += $carry10;
3261 3261
         $s10 -= $carry10 << 21;
3262 3262
         //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
3263 3263
         //    s13 += carry12;
3264 3264
         //    s12 -= carry12 * ((uint64_t) 1L << 21);
3265
-        $carry12 = ($s12 + (1 << 20)) >> 21;
3265
+        $carry12 = ( $s12 + ( 1 << 20 ) ) >> 21;
3266 3266
         $s13 += $carry12;
3267 3267
         $s12 -= $carry12 << 21;
3268 3268
         //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
3269 3269
         //    s15 += carry14;
3270 3270
         //    s14 -= carry14 * ((uint64_t) 1L << 21);
3271
-        $carry14 = ($s14 + (1 << 20)) >> 21;
3271
+        $carry14 = ( $s14 + ( 1 << 20 ) ) >> 21;
3272 3272
         $s15 += $carry14;
3273 3273
         $s14 -= $carry14 << 21;
3274 3274
         //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
3275 3275
         //    s17 += carry16;
3276 3276
         //    s16 -= carry16 * ((uint64_t) 1L << 21);
3277
-        $carry16 = ($s16 + (1 << 20)) >> 21;
3277
+        $carry16 = ( $s16 + ( 1 << 20 ) ) >> 21;
3278 3278
         $s17 += $carry16;
3279 3279
         $s16 -= $carry16 << 21;
3280 3280
 
3281 3281
         //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3282 3282
         //    s8 += carry7;
3283 3283
         //    s7 -= carry7 * ((uint64_t) 1L << 21);
3284
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3284
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
3285 3285
         $s8 += $carry7;
3286 3286
         $s7 -= $carry7 << 21;
3287 3287
         //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3288 3288
         //    s10 += carry9;
3289 3289
         //    s9 -= carry9 * ((uint64_t) 1L << 21);
3290
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3290
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
3291 3291
         $s10 += $carry9;
3292 3292
         $s9 -= $carry9 << 21;
3293 3293
         //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3294 3294
         //    s12 += carry11;
3295 3295
         //    s11 -= carry11 * ((uint64_t) 1L << 21);
3296
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3296
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
3297 3297
         $s12 += $carry11;
3298 3298
         $s11 -= $carry11 << 21;
3299 3299
         //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
3300 3300
         //    s14 += carry13;
3301 3301
         //    s13 -= carry13 * ((uint64_t) 1L << 21);
3302
-        $carry13 = ($s13 + (1 << 20)) >> 21;
3302
+        $carry13 = ( $s13 + ( 1 << 20 ) ) >> 21;
3303 3303
         $s14 += $carry13;
3304 3304
         $s13 -= $carry13 << 21;
3305 3305
         //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
3306 3306
         //    s16 += carry15;
3307 3307
         //    s15 -= carry15 * ((uint64_t) 1L << 21);
3308
-        $carry15 = ($s15 + (1 << 20)) >> 21;
3308
+        $carry15 = ( $s15 + ( 1 << 20 ) ) >> 21;
3309 3309
         $s16 += $carry15;
3310 3310
         $s15 -= $carry15 << 21;
3311 3311
 
@@ -3315,12 +3315,12 @@  discard block
 block discarded – undo
3315 3315
         //    s8 -= s17 * 997805;
3316 3316
         //    s9 += s17 * 136657;
3317 3317
         //    s10 -= s17 * 683901;
3318
-        $s5 += self::mul($s17, 666643, 20);
3319
-        $s6 += self::mul($s17, 470296, 19);
3320
-        $s7 += self::mul($s17, 654183, 20);
3321
-        $s8 -= self::mul($s17, 997805, 20);
3322
-        $s9 += self::mul($s17, 136657, 18);
3323
-        $s10 -= self::mul($s17, 683901, 20);
3318
+        $s5 += self::mul( $s17, 666643, 20 );
3319
+        $s6 += self::mul( $s17, 470296, 19 );
3320
+        $s7 += self::mul( $s17, 654183, 20 );
3321
+        $s8 -= self::mul( $s17, 997805, 20 );
3322
+        $s9 += self::mul( $s17, 136657, 18 );
3323
+        $s10 -= self::mul( $s17, 683901, 20 );
3324 3324
 
3325 3325
         //    s4 += s16 * 666643;
3326 3326
         //    s5 += s16 * 470296;
@@ -3328,12 +3328,12 @@  discard block
 block discarded – undo
3328 3328
         //    s7 -= s16 * 997805;
3329 3329
         //    s8 += s16 * 136657;
3330 3330
         //    s9 -= s16 * 683901;
3331
-        $s4 += self::mul($s16, 666643, 20);
3332
-        $s5 += self::mul($s16, 470296, 19);
3333
-        $s6 += self::mul($s16, 654183, 20);
3334
-        $s7 -= self::mul($s16, 997805, 20);
3335
-        $s8 += self::mul($s16, 136657, 18);
3336
-        $s9 -= self::mul($s16, 683901, 20);
3331
+        $s4 += self::mul( $s16, 666643, 20 );
3332
+        $s5 += self::mul( $s16, 470296, 19 );
3333
+        $s6 += self::mul( $s16, 654183, 20 );
3334
+        $s7 -= self::mul( $s16, 997805, 20 );
3335
+        $s8 += self::mul( $s16, 136657, 18 );
3336
+        $s9 -= self::mul( $s16, 683901, 20 );
3337 3337
 
3338 3338
         //    s3 += s15 * 666643;
3339 3339
         //    s4 += s15 * 470296;
@@ -3341,12 +3341,12 @@  discard block
 block discarded – undo
3341 3341
         //    s6 -= s15 * 997805;
3342 3342
         //    s7 += s15 * 136657;
3343 3343
         //    s8 -= s15 * 683901;
3344
-        $s3 += self::mul($s15, 666643, 20);
3345
-        $s4 += self::mul($s15, 470296, 19);
3346
-        $s5 += self::mul($s15, 654183, 20);
3347
-        $s6 -= self::mul($s15, 997805, 20);
3348
-        $s7 += self::mul($s15, 136657, 18);
3349
-        $s8 -= self::mul($s15, 683901, 20);
3344
+        $s3 += self::mul( $s15, 666643, 20 );
3345
+        $s4 += self::mul( $s15, 470296, 19 );
3346
+        $s5 += self::mul( $s15, 654183, 20 );
3347
+        $s6 -= self::mul( $s15, 997805, 20 );
3348
+        $s7 += self::mul( $s15, 136657, 18 );
3349
+        $s8 -= self::mul( $s15, 683901, 20 );
3350 3350
 
3351 3351
         //    s2 += s14 * 666643;
3352 3352
         //    s3 += s14 * 470296;
@@ -3354,12 +3354,12 @@  discard block
 block discarded – undo
3354 3354
         //    s5 -= s14 * 997805;
3355 3355
         //    s6 += s14 * 136657;
3356 3356
         //    s7 -= s14 * 683901;
3357
-        $s2 += self::mul($s14, 666643, 20);
3358
-        $s3 += self::mul($s14, 470296, 19);
3359
-        $s4 += self::mul($s14, 654183, 20);
3360
-        $s5 -= self::mul($s14, 997805, 20);
3361
-        $s6 += self::mul($s14, 136657, 18);
3362
-        $s7 -= self::mul($s14, 683901, 20);
3357
+        $s2 += self::mul( $s14, 666643, 20 );
3358
+        $s3 += self::mul( $s14, 470296, 19 );
3359
+        $s4 += self::mul( $s14, 654183, 20 );
3360
+        $s5 -= self::mul( $s14, 997805, 20 );
3361
+        $s6 += self::mul( $s14, 136657, 18 );
3362
+        $s7 -= self::mul( $s14, 683901, 20 );
3363 3363
 
3364 3364
         //    s1 += s13 * 666643;
3365 3365
         //    s2 += s13 * 470296;
@@ -3367,12 +3367,12 @@  discard block
 block discarded – undo
3367 3367
         //    s4 -= s13 * 997805;
3368 3368
         //    s5 += s13 * 136657;
3369 3369
         //    s6 -= s13 * 683901;
3370
-        $s1 += self::mul($s13, 666643, 20);
3371
-        $s2 += self::mul($s13, 470296, 19);
3372
-        $s3 += self::mul($s13, 654183, 20);
3373
-        $s4 -= self::mul($s13, 997805, 20);
3374
-        $s5 += self::mul($s13, 136657, 18);
3375
-        $s6 -= self::mul($s13, 683901, 20);
3370
+        $s1 += self::mul( $s13, 666643, 20 );
3371
+        $s2 += self::mul( $s13, 470296, 19 );
3372
+        $s3 += self::mul( $s13, 654183, 20 );
3373
+        $s4 -= self::mul( $s13, 997805, 20 );
3374
+        $s5 += self::mul( $s13, 136657, 18 );
3375
+        $s6 -= self::mul( $s13, 683901, 20 );
3376 3376
 
3377 3377
         //    s0 += s12 * 666643;
3378 3378
         //    s1 += s12 * 470296;
@@ -3381,85 +3381,85 @@  discard block
 block discarded – undo
3381 3381
         //    s4 += s12 * 136657;
3382 3382
         //    s5 -= s12 * 683901;
3383 3383
         //    s12 = 0;
3384
-        $s0 += self::mul($s12, 666643, 20);
3385
-        $s1 += self::mul($s12, 470296, 19);
3386
-        $s2 += self::mul($s12, 654183, 20);
3387
-        $s3 -= self::mul($s12, 997805, 20);
3388
-        $s4 += self::mul($s12, 136657, 18);
3389
-        $s5 -= self::mul($s12, 683901, 20);
3384
+        $s0 += self::mul( $s12, 666643, 20 );
3385
+        $s1 += self::mul( $s12, 470296, 19 );
3386
+        $s2 += self::mul( $s12, 654183, 20 );
3387
+        $s3 -= self::mul( $s12, 997805, 20 );
3388
+        $s4 += self::mul( $s12, 136657, 18 );
3389
+        $s5 -= self::mul( $s12, 683901, 20 );
3390 3390
         $s12 = 0;
3391 3391
 
3392 3392
         //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
3393 3393
         //    s1 += carry0;
3394 3394
         //    s0 -= carry0 * ((uint64_t) 1L << 21);
3395
-        $carry0 = ($s0 + (1 << 20)) >> 21;
3395
+        $carry0 = ( $s0 + ( 1 << 20 ) ) >> 21;
3396 3396
         $s1 += $carry0;
3397 3397
         $s0 -= $carry0 << 21;
3398 3398
         //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
3399 3399
         //    s3 += carry2;
3400 3400
         //    s2 -= carry2 * ((uint64_t) 1L << 21);
3401
-        $carry2 = ($s2 + (1 << 20)) >> 21;
3401
+        $carry2 = ( $s2 + ( 1 << 20 ) ) >> 21;
3402 3402
         $s3 += $carry2;
3403 3403
         $s2 -= $carry2 << 21;
3404 3404
         //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
3405 3405
         //    s5 += carry4;
3406 3406
         //    s4 -= carry4 * ((uint64_t) 1L << 21);
3407
-        $carry4 = ($s4 + (1 << 20)) >> 21;
3407
+        $carry4 = ( $s4 + ( 1 << 20 ) ) >> 21;
3408 3408
         $s5 += $carry4;
3409 3409
         $s4 -= $carry4 << 21;
3410 3410
         //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
3411 3411
         //    s7 += carry6;
3412 3412
         //    s6 -= carry6 * ((uint64_t) 1L << 21);
3413
-        $carry6 = ($s6 + (1 << 20)) >> 21;
3413
+        $carry6 = ( $s6 + ( 1 << 20 ) ) >> 21;
3414 3414
         $s7 += $carry6;
3415 3415
         $s6 -= $carry6 << 21;
3416 3416
         //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
3417 3417
         //    s9 += carry8;
3418 3418
         //    s8 -= carry8 * ((uint64_t) 1L << 21);
3419
-        $carry8 = ($s8 + (1 << 20)) >> 21;
3419
+        $carry8 = ( $s8 + ( 1 << 20 ) ) >> 21;
3420 3420
         $s9 += $carry8;
3421 3421
         $s8 -= $carry8 << 21;
3422 3422
         //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
3423 3423
         //    s11 += carry10;
3424 3424
         //    s10 -= carry10 * ((uint64_t) 1L << 21);
3425
-        $carry10 = ($s10 + (1 << 20)) >> 21;
3425
+        $carry10 = ( $s10 + ( 1 << 20 ) ) >> 21;
3426 3426
         $s11 += $carry10;
3427 3427
         $s10 -= $carry10 << 21;
3428 3428
 
3429 3429
         //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
3430 3430
         //    s2 += carry1;
3431 3431
         //    s1 -= carry1 * ((uint64_t) 1L << 21);
3432
-        $carry1 = ($s1 + (1 << 20)) >> 21;
3432
+        $carry1 = ( $s1 + ( 1 << 20 ) ) >> 21;
3433 3433
         $s2 += $carry1;
3434 3434
         $s1 -= $carry1 << 21;
3435 3435
         //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
3436 3436
         //    s4 += carry3;
3437 3437
         //    s3 -= carry3 * ((uint64_t) 1L << 21);
3438
-        $carry3 = ($s3 + (1 << 20)) >> 21;
3438
+        $carry3 = ( $s3 + ( 1 << 20 ) ) >> 21;
3439 3439
         $s4 += $carry3;
3440 3440
         $s3 -= $carry3 << 21;
3441 3441
         //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
3442 3442
         //    s6 += carry5;
3443 3443
         //    s5 -= carry5 * ((uint64_t) 1L << 21);
3444
-        $carry5 = ($s5 + (1 << 20)) >> 21;
3444
+        $carry5 = ( $s5 + ( 1 << 20 ) ) >> 21;
3445 3445
         $s6 += $carry5;
3446 3446
         $s5 -= $carry5 << 21;
3447 3447
         //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
3448 3448
         //    s8 += carry7;
3449 3449
         //    s7 -= carry7 * ((uint64_t) 1L << 21);
3450
-        $carry7 = ($s7 + (1 << 20)) >> 21;
3450
+        $carry7 = ( $s7 + ( 1 << 20 ) ) >> 21;
3451 3451
         $s8 += $carry7;
3452 3452
         $s7 -= $carry7 << 21;
3453 3453
         //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
3454 3454
         //    s10 += carry9;
3455 3455
         //    s9 -= carry9 * ((uint64_t) 1L << 21);
3456
-        $carry9 = ($s9 + (1 << 20)) >> 21;
3456
+        $carry9 = ( $s9 + ( 1 << 20 ) ) >> 21;
3457 3457
         $s10 += $carry9;
3458 3458
         $s9 -= $carry9 << 21;
3459 3459
         //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
3460 3460
         //    s12 += carry11;
3461 3461
         //    s11 -= carry11 * ((uint64_t) 1L << 21);
3462
-        $carry11 = ($s11 + (1 << 20)) >> 21;
3462
+        $carry11 = ( $s11 + ( 1 << 20 ) ) >> 21;
3463 3463
         $s12 += $carry11;
3464 3464
         $s11 -= $carry11 << 21;
3465 3465
 
@@ -3470,12 +3470,12 @@  discard block
 block discarded – undo
3470 3470
         //    s4 += s12 * 136657;
3471 3471
         //    s5 -= s12 * 683901;
3472 3472
         //    s12 = 0;
3473
-        $s0 += self::mul($s12, 666643, 20);
3474
-        $s1 += self::mul($s12, 470296, 19);
3475
-        $s2 += self::mul($s12, 654183, 20);
3476
-        $s3 -= self::mul($s12, 997805, 20);
3477
-        $s4 += self::mul($s12, 136657, 18);
3478
-        $s5 -= self::mul($s12, 683901, 20);
3473
+        $s0 += self::mul( $s12, 666643, 20 );
3474
+        $s1 += self::mul( $s12, 470296, 19 );
3475
+        $s2 += self::mul( $s12, 654183, 20 );
3476
+        $s3 -= self::mul( $s12, 997805, 20 );
3477
+        $s4 += self::mul( $s12, 136657, 18 );
3478
+        $s5 -= self::mul( $s12, 683901, 20 );
3479 3479
         $s12 = 0;
3480 3480
 
3481 3481
         //    carry0 = s0 >> 21;
@@ -3557,12 +3557,12 @@  discard block
 block discarded – undo
3557 3557
         //    s3 -= s12 * 997805;
3558 3558
         //    s4 += s12 * 136657;
3559 3559
         //    s5 -= s12 * 683901;
3560
-        $s0 += self::mul($s12, 666643, 20);
3561
-        $s1 += self::mul($s12, 470296, 19);
3562
-        $s2 += self::mul($s12, 654183, 20);
3563
-        $s3 -= self::mul($s12, 997805, 20);
3564
-        $s4 += self::mul($s12, 136657, 18);
3565
-        $s5 -= self::mul($s12, 683901, 20);
3560
+        $s0 += self::mul( $s12, 666643, 20 );
3561
+        $s1 += self::mul( $s12, 470296, 19 );
3562
+        $s2 += self::mul( $s12, 654183, 20 );
3563
+        $s3 -= self::mul( $s12, 997805, 20 );
3564
+        $s4 += self::mul( $s12, 136657, 18 );
3565
+        $s5 -= self::mul( $s12, 683901, 20 );
3566 3566
 
3567 3567
         //    carry0 = s0 >> 21;
3568 3568
         //    s1 += carry0;
@@ -3631,81 +3631,81 @@  discard block
 block discarded – undo
3631 3631
         $s11 += $carry10;
3632 3632
         $s10 -= $carry10 << 21;
3633 3633
 
3634
-        $s = array_fill(0, 32, 0);
3634
+        $s = array_fill( 0, 32, 0 );
3635 3635
         // s[0]  = s0 >> 0;
3636
-        $s[0]  = $s0 >> 0;
3636
+        $s[ 0 ]  = $s0 >> 0;
3637 3637
         // s[1]  = s0 >> 8;
3638
-        $s[1]  = $s0 >> 8;
3638
+        $s[ 1 ]  = $s0 >> 8;
3639 3639
         // s[2]  = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5));
3640
-        $s[2]  = ($s0 >> 16) | ($s1 << 5);
3640
+        $s[ 2 ]  = ( $s0 >> 16 ) | ( $s1 << 5 );
3641 3641
         // s[3]  = s1 >> 3;
3642
-        $s[3]  = $s1 >> 3;
3642
+        $s[ 3 ]  = $s1 >> 3;
3643 3643
         // s[4]  = s1 >> 11;
3644
-        $s[4]  = $s1 >> 11;
3644
+        $s[ 4 ]  = $s1 >> 11;
3645 3645
         // s[5]  = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2));
3646
-        $s[5]  = ($s1 >> 19) | ($s2 << 2);
3646
+        $s[ 5 ]  = ( $s1 >> 19 ) | ( $s2 << 2 );
3647 3647
         // s[6]  = s2 >> 6;
3648
-        $s[6]  = $s2 >> 6;
3648
+        $s[ 6 ]  = $s2 >> 6;
3649 3649
         // s[7]  = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7));
3650
-        $s[7]  = ($s2 >> 14) | ($s3 << 7);
3650
+        $s[ 7 ]  = ( $s2 >> 14 ) | ( $s3 << 7 );
3651 3651
         // s[8]  = s3 >> 1;
3652
-        $s[8]  = $s3 >> 1;
3652
+        $s[ 8 ]  = $s3 >> 1;
3653 3653
         // s[9]  = s3 >> 9;
3654
-        $s[9]  = $s3 >> 9;
3654
+        $s[ 9 ]  = $s3 >> 9;
3655 3655
         // s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4));
3656
-        $s[10] = ($s3 >> 17) | ($s4 << 4);
3656
+        $s[ 10 ] = ( $s3 >> 17 ) | ( $s4 << 4 );
3657 3657
         // s[11] = s4 >> 4;
3658
-        $s[11] = $s4 >> 4;
3658
+        $s[ 11 ] = $s4 >> 4;
3659 3659
         // s[12] = s4 >> 12;
3660
-        $s[12] = $s4 >> 12;
3660
+        $s[ 12 ] = $s4 >> 12;
3661 3661
         // s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1));
3662
-        $s[13] = ($s4 >> 20) | ($s5 << 1);
3662
+        $s[ 13 ] = ( $s4 >> 20 ) | ( $s5 << 1 );
3663 3663
         // s[14] = s5 >> 7;
3664
-        $s[14] = $s5 >> 7;
3664
+        $s[ 14 ] = $s5 >> 7;
3665 3665
         // s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6));
3666
-        $s[15] = ($s5 >> 15) | ($s6 << 6);
3666
+        $s[ 15 ] = ( $s5 >> 15 ) | ( $s6 << 6 );
3667 3667
         // s[16] = s6 >> 2;
3668
-        $s[16] = $s6 >> 2;
3668
+        $s[ 16 ] = $s6 >> 2;
3669 3669
         // s[17] = s6 >> 10;
3670
-        $s[17] = $s6 >> 10;
3670
+        $s[ 17 ] = $s6 >> 10;
3671 3671
         // s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3));
3672
-        $s[18] = ($s6 >> 18) | ($s7 << 3);
3672
+        $s[ 18 ] = ( $s6 >> 18 ) | ( $s7 << 3 );
3673 3673
         // s[19] = s7 >> 5;
3674
-        $s[19] = $s7 >> 5;
3674
+        $s[ 19 ] = $s7 >> 5;
3675 3675
         // s[20] = s7 >> 13;
3676
-        $s[20] = $s7 >> 13;
3676
+        $s[ 20 ] = $s7 >> 13;
3677 3677
         // s[21] = s8 >> 0;
3678
-        $s[21] = $s8 >> 0;
3678
+        $s[ 21 ] = $s8 >> 0;
3679 3679
         // s[22] = s8 >> 8;
3680
-        $s[22] = $s8 >> 8;
3680
+        $s[ 22 ] = $s8 >> 8;
3681 3681
         // s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5));
3682
-        $s[23] = ($s8 >> 16) | ($s9 << 5);
3682
+        $s[ 23 ] = ( $s8 >> 16 ) | ( $s9 << 5 );
3683 3683
         // s[24] = s9 >> 3;
3684
-        $s[24] = $s9 >> 3;
3684
+        $s[ 24 ] = $s9 >> 3;
3685 3685
         // s[25] = s9 >> 11;
3686
-        $s[25] = $s9 >> 11;
3686
+        $s[ 25 ] = $s9 >> 11;
3687 3687
         // s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2));
3688
-        $s[26] = ($s9 >> 19) | ($s10 << 2);
3688
+        $s[ 26 ] = ( $s9 >> 19 ) | ( $s10 << 2 );
3689 3689
         // s[27] = s10 >> 6;
3690
-        $s[27] = $s10 >> 6;
3690
+        $s[ 27 ] = $s10 >> 6;
3691 3691
         // s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7));
3692
-        $s[28] = ($s10 >> 14) | ($s11 << 7);
3692
+        $s[ 28 ] = ( $s10 >> 14 ) | ( $s11 << 7 );
3693 3693
         // s[29] = s11 >> 1;
3694
-        $s[29] = $s11 >> 1;
3694
+        $s[ 29 ] = $s11 >> 1;
3695 3695
         // s[30] = s11 >> 9;
3696
-        $s[30] = $s11 >> 9;
3696
+        $s[ 30 ] = $s11 >> 9;
3697 3697
         // s[31] = s11 >> 17;
3698
-        $s[31] = $s11 >> 17;
3699
-        return self::intArrayToString($s);
3698
+        $s[ 31 ] = $s11 >> 17;
3699
+        return self::intArrayToString( $s );
3700 3700
     }
3701 3701
 
3702 3702
     /**
3703 3703
      * @param string $s
3704 3704
      * @return string
3705 3705
      */
3706
-    public static function sc25519_sq($s)
3706
+    public static function sc25519_sq( $s )
3707 3707
     {
3708
-        return self::sc25519_mul($s, $s);
3708
+        return self::sc25519_mul( $s, $s );
3709 3709
     }
3710 3710
 
3711 3711
     /**
@@ -3714,72 +3714,72 @@  discard block
 block discarded – undo
3714 3714
      * @param string $a
3715 3715
      * @return string
3716 3716
      */
3717
-    public static function sc25519_sqmul($s, $n, $a)
3717
+    public static function sc25519_sqmul( $s, $n, $a )
3718 3718
     {
3719
-        for ($i = 0; $i < $n; ++$i) {
3720
-            $s = self::sc25519_sq($s);
3719
+        for ( $i = 0; $i < $n; ++$i ) {
3720
+            $s = self::sc25519_sq( $s );
3721 3721
         }
3722
-        return self::sc25519_mul($s, $a);
3722
+        return self::sc25519_mul( $s, $a );
3723 3723
     }
3724 3724
 
3725 3725
     /**
3726 3726
      * @param string $s
3727 3727
      * @return string
3728 3728
      */
3729
-    public static function sc25519_invert($s)
3729
+    public static function sc25519_invert( $s )
3730 3730
     {
3731
-        $_10 = self::sc25519_sq($s);
3732
-        $_11 = self::sc25519_mul($s, $_10);
3733
-        $_100 = self::sc25519_mul($s, $_11);
3734
-        $_1000 = self::sc25519_sq($_100);
3735
-        $_1010 = self::sc25519_mul($_10, $_1000);
3736
-        $_1011 = self::sc25519_mul($s, $_1010);
3737
-        $_10000 = self::sc25519_sq($_1000);
3738
-        $_10110 = self::sc25519_sq($_1011);
3739
-        $_100000 = self::sc25519_mul($_1010, $_10110);
3740
-        $_100110 = self::sc25519_mul($_10000, $_10110);
3741
-        $_1000000 = self::sc25519_sq($_100000);
3742
-        $_1010000 = self::sc25519_mul($_10000, $_1000000);
3743
-        $_1010011 = self::sc25519_mul($_11, $_1010000);
3744
-        $_1100011 = self::sc25519_mul($_10000, $_1010011);
3745
-        $_1100111 = self::sc25519_mul($_100, $_1100011);
3746
-        $_1101011 = self::sc25519_mul($_100, $_1100111);
3747
-        $_10010011 = self::sc25519_mul($_1000000, $_1010011);
3748
-        $_10010111 = self::sc25519_mul($_100, $_10010011);
3749
-        $_10111101 = self::sc25519_mul($_100110, $_10010111);
3750
-        $_11010011 = self::sc25519_mul($_10110, $_10111101);
3751
-        $_11100111 = self::sc25519_mul($_1010000, $_10010111);
3752
-        $_11101011 = self::sc25519_mul($_100, $_11100111);
3753
-        $_11110101 = self::sc25519_mul($_1010, $_11101011);
3754
-
3755
-        $recip = self::sc25519_mul($_1011, $_11110101);
3756
-        $recip = self::sc25519_sqmul($recip, 126, $_1010011);
3757
-        $recip = self::sc25519_sqmul($recip, 9, $_10);
3758
-        $recip = self::sc25519_mul($recip, $_11110101);
3759
-        $recip = self::sc25519_sqmul($recip, 7, $_1100111);
3760
-        $recip = self::sc25519_sqmul($recip, 9, $_11110101);
3761
-        $recip = self::sc25519_sqmul($recip, 11, $_10111101);
3762
-        $recip = self::sc25519_sqmul($recip, 8, $_11100111);
3763
-        $recip = self::sc25519_sqmul($recip, 9, $_1101011);
3764
-        $recip = self::sc25519_sqmul($recip, 6, $_1011);
3765
-        $recip = self::sc25519_sqmul($recip, 14, $_10010011);
3766
-        $recip = self::sc25519_sqmul($recip, 10, $_1100011);
3767
-        $recip = self::sc25519_sqmul($recip, 9, $_10010111);
3768
-        $recip = self::sc25519_sqmul($recip, 10, $_11110101);
3769
-        $recip = self::sc25519_sqmul($recip, 8, $_11010011);
3770
-        return self::sc25519_sqmul($recip, 8, $_11101011);
3731
+        $_10 = self::sc25519_sq( $s );
3732
+        $_11 = self::sc25519_mul( $s, $_10 );
3733
+        $_100 = self::sc25519_mul( $s, $_11 );
3734
+        $_1000 = self::sc25519_sq( $_100 );
3735
+        $_1010 = self::sc25519_mul( $_10, $_1000 );
3736
+        $_1011 = self::sc25519_mul( $s, $_1010 );
3737
+        $_10000 = self::sc25519_sq( $_1000 );
3738
+        $_10110 = self::sc25519_sq( $_1011 );
3739
+        $_100000 = self::sc25519_mul( $_1010, $_10110 );
3740
+        $_100110 = self::sc25519_mul( $_10000, $_10110 );
3741
+        $_1000000 = self::sc25519_sq( $_100000 );
3742
+        $_1010000 = self::sc25519_mul( $_10000, $_1000000 );
3743
+        $_1010011 = self::sc25519_mul( $_11, $_1010000 );
3744
+        $_1100011 = self::sc25519_mul( $_10000, $_1010011 );
3745
+        $_1100111 = self::sc25519_mul( $_100, $_1100011 );
3746
+        $_1101011 = self::sc25519_mul( $_100, $_1100111 );
3747
+        $_10010011 = self::sc25519_mul( $_1000000, $_1010011 );
3748
+        $_10010111 = self::sc25519_mul( $_100, $_10010011 );
3749
+        $_10111101 = self::sc25519_mul( $_100110, $_10010111 );
3750
+        $_11010011 = self::sc25519_mul( $_10110, $_10111101 );
3751
+        $_11100111 = self::sc25519_mul( $_1010000, $_10010111 );
3752
+        $_11101011 = self::sc25519_mul( $_100, $_11100111 );
3753
+        $_11110101 = self::sc25519_mul( $_1010, $_11101011 );
3754
+
3755
+        $recip = self::sc25519_mul( $_1011, $_11110101 );
3756
+        $recip = self::sc25519_sqmul( $recip, 126, $_1010011 );
3757
+        $recip = self::sc25519_sqmul( $recip, 9, $_10 );
3758
+        $recip = self::sc25519_mul( $recip, $_11110101 );
3759
+        $recip = self::sc25519_sqmul( $recip, 7, $_1100111 );
3760
+        $recip = self::sc25519_sqmul( $recip, 9, $_11110101 );
3761
+        $recip = self::sc25519_sqmul( $recip, 11, $_10111101 );
3762
+        $recip = self::sc25519_sqmul( $recip, 8, $_11100111 );
3763
+        $recip = self::sc25519_sqmul( $recip, 9, $_1101011 );
3764
+        $recip = self::sc25519_sqmul( $recip, 6, $_1011 );
3765
+        $recip = self::sc25519_sqmul( $recip, 14, $_10010011 );
3766
+        $recip = self::sc25519_sqmul( $recip, 10, $_1100011 );
3767
+        $recip = self::sc25519_sqmul( $recip, 9, $_10010111 );
3768
+        $recip = self::sc25519_sqmul( $recip, 10, $_11110101 );
3769
+        $recip = self::sc25519_sqmul( $recip, 8, $_11010011 );
3770
+        return self::sc25519_sqmul( $recip, 8, $_11101011 );
3771 3771
     }
3772 3772
 
3773 3773
     /**
3774 3774
      * @param string $s
3775 3775
      * @return string
3776 3776
      */
3777
-    public static function clamp($s)
3777
+    public static function clamp( $s )
3778 3778
     {
3779
-        $s_ = self::stringToIntArray($s);
3780
-        $s_[0] &= 248;
3781
-        $s_[31] |= 64;
3782
-        $s_[31] &= 128;
3783
-        return self::intArrayToString($s_);
3779
+        $s_ = self::stringToIntArray( $s );
3780
+        $s_[ 0 ] &= 248;
3781
+        $s_[ 31 ] |= 64;
3782
+        $s_[ 31 ] &= 128;
3783
+        return self::intArrayToString( $s_ );
3784 3784
     }
3785 3785
 }
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/Ristretto255.php 3 patches
Indentation   +699 added lines, -699 removed lines patch added patch discarded remove patch
@@ -5,703 +5,703 @@
 block discarded – undo
5 5
  */
6 6
 class ParagonIE_Sodium_Core_Ristretto255 extends ParagonIE_Sodium_Core_Ed25519
7 7
 {
8
-    const crypto_core_ristretto255_HASHBYTES = 64;
9
-    const HASH_SC_L = 48;
10
-    const CORE_H2C_SHA256 = 1;
11
-    const CORE_H2C_SHA512 = 2;
12
-
13
-    /**
14
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
15
-     * @param int $b
16
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
17
-     */
18
-    public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
19
-    {
20
-        $negf = self::fe_neg($f);
21
-        return self::fe_cmov($f, $negf, $b);
22
-    }
23
-
24
-    /**
25
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
26
-     * @return ParagonIE_Sodium_Core_Curve25519_Fe
27
-     * @throws SodiumException
28
-     */
29
-    public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
30
-    {
31
-        return self::fe_cneg($f, self::fe_isnegative($f));
32
-    }
33
-
34
-    /**
35
-     * Returns 0 if this field element results in all NUL bytes.
36
-     *
37
-     * @internal You should not use this directly from another application
38
-     *
39
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
40
-     * @return int
41
-     * @throws SodiumException
42
-     */
43
-    public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
44
-    {
45
-        static $zero;
46
-        if ($zero === null) {
47
-            $zero = str_repeat("\x00", 32);
48
-        }
49
-        /** @var string $zero */
50
-        $str = self::fe_tobytes($f);
51
-
52
-        $d = 0;
53
-        for ($i = 0; $i < 32; ++$i) {
54
-            $d |= self::chrToInt($str[$i]);
55
-        }
56
-        return (($d - 1) >> 31) & 1;
57
-    }
58
-
59
-
60
-    /**
61
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $u
62
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $v
63
-     * @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int}
64
-     *
65
-     * @throws SodiumException
66
-     */
67
-    public static function ristretto255_sqrt_ratio_m1(
68
-        ParagonIE_Sodium_Core_Curve25519_Fe $u,
69
-        ParagonIE_Sodium_Core_Curve25519_Fe $v
70
-    ) {
71
-        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
72
-
73
-        $v3 = self::fe_mul(
74
-            self::fe_sq($v),
75
-            $v
76
-        ); /* v3 = v^3 */
77
-        $x = self::fe_mul(
78
-            self::fe_mul(
79
-                self::fe_sq($v3),
80
-                $u
81
-            ),
82
-            $v
83
-        ); /* x = uv^7 */
84
-
85
-        $x = self::fe_mul(
86
-            self::fe_mul(
87
-                self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */
88
-                $v3
89
-            ),
90
-            $u
91
-        ); /* x = uv^3(uv^7)^((q-5)/8) */
92
-
93
-        $vxx = self::fe_mul(
94
-            self::fe_sq($x),
95
-            $v
96
-        ); /* vx^2 */
97
-
98
-        $m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */
99
-        $p_root_check = self::fe_add($vxx, $u); /* vx^2+u */
100
-        $f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */
101
-        $f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */
102
-
103
-        $has_m_root = self::fe_iszero($m_root_check);
104
-        $has_p_root = self::fe_iszero($p_root_check);
105
-        $has_f_root = self::fe_iszero($f_root_check);
106
-
107
-        $x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */
108
-
109
-        $x = self::fe_abs(
110
-            self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root)
111
-        );
112
-        return array(
113
-            'x' => $x,
114
-            'nonsquare' => $has_m_root | $has_p_root
115
-        );
116
-    }
117
-
118
-    /**
119
-     * @param string $s
120
-     * @return int
121
-     * @throws SodiumException
122
-     */
123
-    public static function ristretto255_point_is_canonical($s)
124
-    {
125
-        $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
126
-        for ($i = 30; $i > 0; --$i) {
127
-            $c |= self::chrToInt($s[$i]) ^ 0xff;
128
-        }
129
-        $c = ($c - 1) >> 8;
130
-        $d = (0xed - 1 - self::chrToInt($s[0])) >> 8;
131
-        $e = self::chrToInt($s[31]) >> 7;
132
-
133
-        return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1);
134
-    }
135
-
136
-    /**
137
-     * @param string $s
138
-     * @param bool $skipCanonicalCheck
139
-     * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
140
-     * @throws SodiumException
141
-     */
142
-    public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
143
-    {
144
-        if (!$skipCanonicalCheck) {
145
-            if (!self::ristretto255_point_is_canonical($s)) {
146
-                throw new SodiumException('S is not canonical');
147
-            }
148
-        }
149
-
150
-        $s_ = self::fe_frombytes($s);
151
-        $ss = self::fe_sq($s_); /* ss = s^2 */
152
-
153
-        $u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */
154
-        $u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */
155
-
156
-        $u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */
157
-        $u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */
158
-
159
-        $v = self::fe_mul(
160
-            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d),
161
-            $u1u1
162
-        ); /* v = d*u1^2 */
163
-        $v = self::fe_neg($v); /* v = -d*u1^2 */
164
-        $v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */
165
-        $v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */
166
-
167
-        // fe25519_1(one);
168
-        // notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2);
169
-        $one = self::fe_1();
170
-        $result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2);
171
-        $inv_sqrt = $result['x'];
172
-        $notsquare = $result['nonsquare'];
173
-
174
-        $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
175
-
176
-        $h->X = self::fe_mul($inv_sqrt, $u2);
177
-        $h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v);
178
-
179
-        $h->X = self::fe_mul($h->X, $s_);
180
-        $h->X = self::fe_abs(
181
-            self::fe_add($h->X, $h->X)
182
-        );
183
-        $h->Y = self::fe_mul($u1, $h->Y);
184
-        $h->Z = self::fe_1();
185
-        $h->T = self::fe_mul($h->X, $h->Y);
186
-
187
-        $res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y));
188
-        return array('h' => $h, 'res' => $res);
189
-    }
190
-
191
-    /**
192
-     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
193
-     * @return string
194
-     * @throws SodiumException
195
-     */
196
-    public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
197
-    {
198
-        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
199
-        $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);
200
-
201
-        $u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */
202
-        $zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */
203
-        $u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */
204
-        $u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */
205
-
206
-        $u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */
207
-        $one = self::fe_1();
208
-
209
-        // fe25519_1(one);
210
-        // (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
211
-        $result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2);
212
-        $inv_sqrt = $result['x'];
213
-
214
-        $den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */
215
-        $den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */
216
-        $z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */
217
-
218
-        $ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */
219
-        $iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */
220
-        $eden = self::fe_mul($den1, $invsqrtamd);
221
-
222
-        $t_z_inv =  self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */
223
-        $rotate = self::fe_isnegative($t_z_inv);
224
-
225
-        $x_ = self::fe_copy($h->X);
226
-        $y_ = self::fe_copy($h->Y);
227
-        $den_inv = self::fe_copy($den2);
228
-
229
-        $x_ = self::fe_cmov($x_, $iy, $rotate);
230
-        $y_ = self::fe_cmov($y_, $ix, $rotate);
231
-        $den_inv = self::fe_cmov($den_inv, $eden, $rotate);
232
-
233
-        $x_z_inv = self::fe_mul($x_, $z_inv);
234
-        $y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv));
235
-
236
-
237
-        // fe25519_sub(s_, h->Z, y_);
238
-        // fe25519_mul(s_, den_inv, s_);
239
-        // fe25519_abs(s_, s_);
240
-        // fe25519_tobytes(s, s_);
241
-        return self::fe_tobytes(
242
-            self::fe_abs(
243
-                self::fe_mul(
244
-                    $den_inv,
245
-                    self::fe_sub($h->Z, $y_)
246
-                )
247
-            )
248
-        );
249
-    }
250
-
251
-    /**
252
-     * @param ParagonIE_Sodium_Core_Curve25519_Fe $t
253
-     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
254
-     *
255
-     * @throws SodiumException
256
-     */
257
-    public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
258
-    {
259
-        $sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
260
-        $onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
261
-        $d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
262
-        $sqdmone  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone);
263
-        $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1);
264
-
265
-        $one = self::fe_1();
266
-        $r   = self::fe_mul($sqrtm1, self::fe_sq($t));         /* r = sqrt(-1)*t^2 */
267
-        $u   = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */
268
-        $c   = self::fe_neg(self::fe_1());                     /* c = -1 */
269
-        $rpd = self::fe_add($r, $d);                           /* rpd = r+d */
270
-
271
-        $v = self::fe_mul(
272
-            self::fe_sub(
273
-                $c,
274
-                self::fe_mul($r, $d)
275
-            ),
276
-            $rpd
277
-        ); /* v = (c-r*d)*(r+d) */
278
-
279
-        $result = self::ristretto255_sqrt_ratio_m1($u, $v);
280
-        $s = $result['x'];
281
-        $wasnt_square = 1 - $result['nonsquare'];
282
-
283
-        $s_prime = self::fe_neg(
284
-            self::fe_abs(
285
-                self::fe_mul($s, $t)
286
-            )
287
-        ); /* s_prime = -|s*t| */
288
-        $s = self::fe_cmov($s, $s_prime, $wasnt_square);
289
-        $c = self::fe_cmov($c, $r, $wasnt_square);
290
-
291
-        // fe25519_sub(n, r, one);            /* n = r-1 */
292
-        // fe25519_mul(n, n, c);              /* n = c*(r-1) */
293
-        // fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */
294
-        // fe25519_sub(n, n, v);              /* n =  c*(r-1)*(d-1)^2-v */
295
-        $n = self::fe_sub(
296
-            self::fe_mul(
297
-                self::fe_mul(
298
-                    self::fe_sub($r, $one),
299
-                    $c
300
-                ),
301
-                $sqdmone
302
-            ),
303
-            $v
304
-        ); /* n =  c*(r-1)*(d-1)^2-v */
305
-
306
-        $w0 = self::fe_mul(
307
-            self::fe_add($s, $s),
308
-            $v
309
-        ); /* w0 = 2s*v */
310
-
311
-        $w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */
312
-        $ss = self::fe_sq($s); /* ss = s^2 */
313
-        $w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */
314
-        $w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */
315
-
316
-        return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
317
-            self::fe_mul($w0, $w3),
318
-            self::fe_mul($w2, $w1),
319
-            self::fe_mul($w1, $w3),
320
-            self::fe_mul($w0, $w2)
321
-        );
322
-    }
323
-
324
-    /**
325
-     * @param string $h
326
-     * @return string
327
-     * @throws SodiumException
328
-     */
329
-    public static function ristretto255_from_hash($h)
330
-    {
331
-        if (self::strlen($h) !== 64) {
332
-            throw new SodiumException('Hash must be 64 bytes');
333
-        }
334
-        //fe25519_frombytes(r0, h);
335
-        //fe25519_frombytes(r1, h + 32);
336
-        $r0 = self::fe_frombytes(self::substr($h, 0, 32));
337
-        $r1 = self::fe_frombytes(self::substr($h, 32, 32));
338
-
339
-        //ristretto255_elligator(&p0, r0);
340
-        //ristretto255_elligator(&p1, r1);
341
-        $p0 = self::ristretto255_elligator($r0);
342
-        $p1 = self::ristretto255_elligator($r1);
343
-
344
-        //ge25519_p3_to_cached(&p1_cached, &p1);
345
-        //ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
346
-        $p_p1p1 = self::ge_add(
347
-            $p0,
348
-            self::ge_p3_to_cached($p1)
349
-        );
350
-
351
-        //ge25519_p1p1_to_p3(&p, &p_p1p1);
352
-        //ristretto255_p3_tobytes(s, &p);
353
-        return self::ristretto255_p3_tobytes(
354
-            self::ge_p1p1_to_p3($p_p1p1)
355
-        );
356
-    }
357
-
358
-    /**
359
-     * @param string $p
360
-     * @return int
361
-     * @throws SodiumException
362
-     */
363
-    public static function is_valid_point($p)
364
-    {
365
-        $result = self::ristretto255_frombytes($p);
366
-        if ($result['res'] !== 0) {
367
-            return 0;
368
-        }
369
-        return 1;
370
-    }
371
-
372
-    /**
373
-     * @param string $p
374
-     * @param string $q
375
-     * @return string
376
-     * @throws SodiumException
377
-     */
378
-    public static function ristretto255_add($p, $q)
379
-    {
380
-        $p_res = self::ristretto255_frombytes($p);
381
-        $q_res = self::ristretto255_frombytes($q);
382
-        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
383
-            throw new SodiumException('Could not add points');
384
-        }
385
-        $p_p3 = $p_res['h'];
386
-        $q_p3 = $q_res['h'];
387
-        $q_cached = self::ge_p3_to_cached($q_p3);
388
-        $r_p1p1 = self::ge_add($p_p3, $q_cached);
389
-        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
390
-        return self::ristretto255_p3_tobytes($r_p3);
391
-    }
392
-
393
-    /**
394
-     * @param string $p
395
-     * @param string $q
396
-     * @return string
397
-     * @throws SodiumException
398
-     */
399
-    public static function ristretto255_sub($p, $q)
400
-    {
401
-        $p_res = self::ristretto255_frombytes($p);
402
-        $q_res = self::ristretto255_frombytes($q);
403
-        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
404
-            throw new SodiumException('Could not add points');
405
-        }
406
-        $p_p3 = $p_res['h'];
407
-        $q_p3 = $q_res['h'];
408
-        $q_cached = self::ge_p3_to_cached($q_p3);
409
-        $r_p1p1 = self::ge_sub($p_p3, $q_cached);
410
-        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
411
-        return self::ristretto255_p3_tobytes($r_p3);
412
-    }
413
-
414
-
415
-    /**
416
-     * @param int $hLen
417
-     * @param ?string $ctx
418
-     * @param string $msg
419
-     * @return string
420
-     * @throws SodiumException
421
-     * @psalm-suppress PossiblyInvalidArgument hash API
422
-     */
423
-    protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
424
-    {
425
-        $h = array_fill(0, $hLen, 0);
426
-        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
427
-        if ($hLen > 0xff) {
428
-            throw new SodiumException('Hash must be less than 256 bytes');
429
-        }
430
-
431
-        if ($ctx_len > 0xff) {
432
-            $st = hash_init('sha256');
433
-            self::hash_update($st, "H2C-OVERSIZE-DST-");
434
-            self::hash_update($st, $ctx);
435
-            $ctx = hash_final($st, true);
436
-            $ctx_len = 32;
437
-        }
438
-        $t = array(0, $hLen, 0);
439
-        $ux = str_repeat("\0", 64);
440
-        $st = hash_init('sha256');
441
-        self::hash_update($st, $ux);
442
-        self::hash_update($st, $msg);
443
-        self::hash_update($st, self::intArrayToString($t));
444
-        self::hash_update($st, $ctx);
445
-        self::hash_update($st, self::intToChr($ctx_len));
446
-        $u0 = hash_final($st, true);
447
-
448
-        for ($i = 0; $i < $hLen; $i += 64) {
449
-            $ux = self::xorStrings($ux, $u0);
450
-            ++$t[2];
451
-            $st = hash_init('sha256');
452
-            self::hash_update($st, $ux);
453
-            self::hash_update($st, self::intToChr($t[2]));
454
-            self::hash_update($st, $ctx);
455
-            self::hash_update($st, self::intToChr($ctx_len));
456
-            $ux = hash_final($st, true);
457
-            $amount = min($hLen - $i, 64);
458
-            for ($j = 0; $j < $amount; ++$j) {
459
-                $h[$i + $j] = self::chrToInt($ux[$i]);
460
-            }
461
-        }
462
-        return self::intArrayToString(array_slice($h, 0, $hLen));
463
-    }
464
-
465
-    /**
466
-     * @param int $hLen
467
-     * @param ?string $ctx
468
-     * @param string $msg
469
-     * @return string
470
-     * @throws SodiumException
471
-     * @psalm-suppress PossiblyInvalidArgument hash API
472
-     */
473
-    protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
474
-    {
475
-        $h = array_fill(0, $hLen, 0);
476
-        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
477
-        if ($hLen > 0xff) {
478
-            throw new SodiumException('Hash must be less than 256 bytes');
479
-        }
480
-
481
-        if ($ctx_len > 0xff) {
482
-            $st = hash_init('sha256');
483
-            self::hash_update($st, "H2C-OVERSIZE-DST-");
484
-            self::hash_update($st, $ctx);
485
-            $ctx = hash_final($st, true);
486
-            $ctx_len = 32;
487
-        }
488
-        $t = array(0, $hLen, 0);
489
-        $ux = str_repeat("\0", 128);
490
-        $st = hash_init('sha512');
491
-        self::hash_update($st, $ux);
492
-        self::hash_update($st, $msg);
493
-        self::hash_update($st, self::intArrayToString($t));
494
-        self::hash_update($st, $ctx);
495
-        self::hash_update($st, self::intToChr($ctx_len));
496
-        $u0 = hash_final($st, true);
497
-
498
-        for ($i = 0; $i < $hLen; $i += 128) {
499
-            $ux = self::xorStrings($ux, $u0);
500
-            ++$t[2];
501
-            $st = hash_init('sha512');
502
-            self::hash_update($st, $ux);
503
-            self::hash_update($st, self::intToChr($t[2]));
504
-            self::hash_update($st, $ctx);
505
-            self::hash_update($st, self::intToChr($ctx_len));
506
-            $ux = hash_final($st, true);
507
-            $amount = min($hLen - $i, 128);
508
-            for ($j = 0; $j < $amount; ++$j) {
509
-                $h[$i + $j] = self::chrToInt($ux[$i]);
510
-            }
511
-        }
512
-        return self::intArrayToString(array_slice($h, 0, $hLen));
513
-    }
514
-
515
-    /**
516
-     * @param int $hLen
517
-     * @param ?string $ctx
518
-     * @param string $msg
519
-     * @param int $hash_alg
520
-     * @return string
521
-     * @throws SodiumException
522
-     */
523
-    public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
524
-    {
525
-        switch ($hash_alg) {
526
-            case self::CORE_H2C_SHA256:
527
-                return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
528
-            case self::CORE_H2C_SHA512:
529
-                return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg);
530
-            default:
531
-                throw new SodiumException('Invalid H2C hash algorithm');
532
-        }
533
-    }
534
-
535
-    /**
536
-     * @param ?string $ctx
537
-     * @param string $msg
538
-     * @param int $hash_alg
539
-     * @return string
540
-     * @throws SodiumException
541
-     */
542
-    protected static function _string_to_element($ctx, $msg, $hash_alg)
543
-    {
544
-        return self::ristretto255_from_hash(
545
-            self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
546
-        );
547
-    }
548
-
549
-    /**
550
-     * @return string
551
-     * @throws SodiumException
552
-     * @throws Exception
553
-     */
554
-    public static function ristretto255_random()
555
-    {
556
-        return self::ristretto255_from_hash(
557
-            ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
558
-        );
559
-    }
560
-
561
-    /**
562
-     * @return string
563
-     * @throws SodiumException
564
-     */
565
-    public static function ristretto255_scalar_random()
566
-    {
567
-        return self::scalar_random();
568
-    }
569
-
570
-    /**
571
-     * @param string $s
572
-     * @return string
573
-     * @throws SodiumException
574
-     */
575
-    public static function ristretto255_scalar_complement($s)
576
-    {
577
-        return self::scalar_complement($s);
578
-    }
579
-
580
-
581
-    /**
582
-     * @param string $s
583
-     * @return string
584
-     */
585
-    public static function ristretto255_scalar_invert($s)
586
-    {
587
-        return self::sc25519_invert($s);
588
-    }
589
-
590
-    /**
591
-     * @param string $s
592
-     * @return string
593
-     * @throws SodiumException
594
-     */
595
-    public static function ristretto255_scalar_negate($s)
596
-    {
597
-        return self::scalar_negate($s);
598
-    }
599
-
600
-    /**
601
-     * @param string $x
602
-     * @param string $y
603
-     * @return string
604
-     */
605
-    public static function ristretto255_scalar_add($x, $y)
606
-    {
607
-        return self::scalar_add($x, $y);
608
-    }
609
-
610
-    /**
611
-     * @param string $x
612
-     * @param string $y
613
-     * @return string
614
-     */
615
-    public static function ristretto255_scalar_sub($x, $y)
616
-    {
617
-        return self::scalar_sub($x, $y);
618
-    }
619
-
620
-    /**
621
-     * @param string $x
622
-     * @param string $y
623
-     * @return string
624
-     */
625
-    public static function ristretto255_scalar_mul($x, $y)
626
-    {
627
-        return self::sc25519_mul($x, $y);
628
-    }
629
-
630
-    /**
631
-     * @param string $ctx
632
-     * @param string $msg
633
-     * @param int $hash_alg
634
-     * @return string
635
-     * @throws SodiumException
636
-     */
637
-    public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
638
-    {
639
-        $h = array_fill(0, 64, 0);
640
-        $h_be = self::stringToIntArray(
641
-            self::h2c_string_to_hash(
642
-                self::HASH_SC_L, $ctx, $msg, $hash_alg
643
-            )
644
-        );
645
-
646
-        for ($i = 0; $i < self::HASH_SC_L; ++$i) {
647
-            $h[$i] = $h_be[self::HASH_SC_L - 1 - $i];
648
-        }
649
-        return self::ristretto255_scalar_reduce(self::intArrayToString($h));
650
-    }
651
-
652
-    /**
653
-     * @param string $s
654
-     * @return string
655
-     */
656
-    public static function ristretto255_scalar_reduce($s)
657
-    {
658
-        return self::sc_reduce($s);
659
-    }
660
-
661
-    /**
662
-     * @param string $n
663
-     * @param string $p
664
-     * @return string
665
-     * @throws SodiumException
666
-     */
667
-    public static function scalarmult_ristretto255($n, $p)
668
-    {
669
-        if (self::strlen($n) !== 32) {
670
-            throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
671
-        }
672
-        if (self::strlen($p) !== 32) {
673
-            throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.');
674
-        }
675
-        $result = self::ristretto255_frombytes($p);
676
-        if ($result['res'] !== 0) {
677
-            throw new SodiumException('Could not multiply points');
678
-        }
679
-        $P = $result['h'];
680
-
681
-        $t = self::stringToIntArray($n);
682
-        $t[31] &= 0x7f;
683
-        $Q = self::ge_scalarmult(self::intArrayToString($t), $P);
684
-        $q = self::ristretto255_p3_tobytes($Q);
685
-        if (ParagonIE_Sodium_Compat::is_zero($q)) {
686
-            throw new SodiumException('An unknown error has occurred');
687
-        }
688
-        return $q;
689
-    }
690
-
691
-    /**
692
-     * @param string $n
693
-     * @return string
694
-     * @throws SodiumException
695
-     */
696
-    public static function scalarmult_ristretto255_base($n)
697
-    {
698
-        $t = self::stringToIntArray($n);
699
-        $t[31] &= 0x7f;
700
-        $Q = self::ge_scalarmult_base(self::intArrayToString($t));
701
-        $q = self::ristretto255_p3_tobytes($Q);
702
-        if (ParagonIE_Sodium_Compat::is_zero($q)) {
703
-            throw new SodiumException('An unknown error has occurred');
704
-        }
705
-        return $q;
706
-    }
8
+	const crypto_core_ristretto255_HASHBYTES = 64;
9
+	const HASH_SC_L = 48;
10
+	const CORE_H2C_SHA256 = 1;
11
+	const CORE_H2C_SHA512 = 2;
12
+
13
+	/**
14
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
15
+	 * @param int $b
16
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
17
+	 */
18
+	public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
19
+	{
20
+		$negf = self::fe_neg($f);
21
+		return self::fe_cmov($f, $negf, $b);
22
+	}
23
+
24
+	/**
25
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
26
+	 * @return ParagonIE_Sodium_Core_Curve25519_Fe
27
+	 * @throws SodiumException
28
+	 */
29
+	public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
30
+	{
31
+		return self::fe_cneg($f, self::fe_isnegative($f));
32
+	}
33
+
34
+	/**
35
+	 * Returns 0 if this field element results in all NUL bytes.
36
+	 *
37
+	 * @internal You should not use this directly from another application
38
+	 *
39
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
40
+	 * @return int
41
+	 * @throws SodiumException
42
+	 */
43
+	public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
44
+	{
45
+		static $zero;
46
+		if ($zero === null) {
47
+			$zero = str_repeat("\x00", 32);
48
+		}
49
+		/** @var string $zero */
50
+		$str = self::fe_tobytes($f);
51
+
52
+		$d = 0;
53
+		for ($i = 0; $i < 32; ++$i) {
54
+			$d |= self::chrToInt($str[$i]);
55
+		}
56
+		return (($d - 1) >> 31) & 1;
57
+	}
58
+
59
+
60
+	/**
61
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $u
62
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $v
63
+	 * @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int}
64
+	 *
65
+	 * @throws SodiumException
66
+	 */
67
+	public static function ristretto255_sqrt_ratio_m1(
68
+		ParagonIE_Sodium_Core_Curve25519_Fe $u,
69
+		ParagonIE_Sodium_Core_Curve25519_Fe $v
70
+	) {
71
+		$sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
72
+
73
+		$v3 = self::fe_mul(
74
+			self::fe_sq($v),
75
+			$v
76
+		); /* v3 = v^3 */
77
+		$x = self::fe_mul(
78
+			self::fe_mul(
79
+				self::fe_sq($v3),
80
+				$u
81
+			),
82
+			$v
83
+		); /* x = uv^7 */
84
+
85
+		$x = self::fe_mul(
86
+			self::fe_mul(
87
+				self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */
88
+				$v3
89
+			),
90
+			$u
91
+		); /* x = uv^3(uv^7)^((q-5)/8) */
92
+
93
+		$vxx = self::fe_mul(
94
+			self::fe_sq($x),
95
+			$v
96
+		); /* vx^2 */
97
+
98
+		$m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */
99
+		$p_root_check = self::fe_add($vxx, $u); /* vx^2+u */
100
+		$f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */
101
+		$f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */
102
+
103
+		$has_m_root = self::fe_iszero($m_root_check);
104
+		$has_p_root = self::fe_iszero($p_root_check);
105
+		$has_f_root = self::fe_iszero($f_root_check);
106
+
107
+		$x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */
108
+
109
+		$x = self::fe_abs(
110
+			self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root)
111
+		);
112
+		return array(
113
+			'x' => $x,
114
+			'nonsquare' => $has_m_root | $has_p_root
115
+		);
116
+	}
117
+
118
+	/**
119
+	 * @param string $s
120
+	 * @return int
121
+	 * @throws SodiumException
122
+	 */
123
+	public static function ristretto255_point_is_canonical($s)
124
+	{
125
+		$c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
126
+		for ($i = 30; $i > 0; --$i) {
127
+			$c |= self::chrToInt($s[$i]) ^ 0xff;
128
+		}
129
+		$c = ($c - 1) >> 8;
130
+		$d = (0xed - 1 - self::chrToInt($s[0])) >> 8;
131
+		$e = self::chrToInt($s[31]) >> 7;
132
+
133
+		return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1);
134
+	}
135
+
136
+	/**
137
+	 * @param string $s
138
+	 * @param bool $skipCanonicalCheck
139
+	 * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
140
+	 * @throws SodiumException
141
+	 */
142
+	public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
143
+	{
144
+		if (!$skipCanonicalCheck) {
145
+			if (!self::ristretto255_point_is_canonical($s)) {
146
+				throw new SodiumException('S is not canonical');
147
+			}
148
+		}
149
+
150
+		$s_ = self::fe_frombytes($s);
151
+		$ss = self::fe_sq($s_); /* ss = s^2 */
152
+
153
+		$u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */
154
+		$u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */
155
+
156
+		$u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */
157
+		$u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */
158
+
159
+		$v = self::fe_mul(
160
+			ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d),
161
+			$u1u1
162
+		); /* v = d*u1^2 */
163
+		$v = self::fe_neg($v); /* v = -d*u1^2 */
164
+		$v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */
165
+		$v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */
166
+
167
+		// fe25519_1(one);
168
+		// notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2);
169
+		$one = self::fe_1();
170
+		$result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2);
171
+		$inv_sqrt = $result['x'];
172
+		$notsquare = $result['nonsquare'];
173
+
174
+		$h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
175
+
176
+		$h->X = self::fe_mul($inv_sqrt, $u2);
177
+		$h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v);
178
+
179
+		$h->X = self::fe_mul($h->X, $s_);
180
+		$h->X = self::fe_abs(
181
+			self::fe_add($h->X, $h->X)
182
+		);
183
+		$h->Y = self::fe_mul($u1, $h->Y);
184
+		$h->Z = self::fe_1();
185
+		$h->T = self::fe_mul($h->X, $h->Y);
186
+
187
+		$res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y));
188
+		return array('h' => $h, 'res' => $res);
189
+	}
190
+
191
+	/**
192
+	 * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
193
+	 * @return string
194
+	 * @throws SodiumException
195
+	 */
196
+	public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
197
+	{
198
+		$sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
199
+		$invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);
200
+
201
+		$u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */
202
+		$zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */
203
+		$u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */
204
+		$u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */
205
+
206
+		$u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */
207
+		$one = self::fe_1();
208
+
209
+		// fe25519_1(one);
210
+		// (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
211
+		$result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2);
212
+		$inv_sqrt = $result['x'];
213
+
214
+		$den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */
215
+		$den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */
216
+		$z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */
217
+
218
+		$ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */
219
+		$iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */
220
+		$eden = self::fe_mul($den1, $invsqrtamd);
221
+
222
+		$t_z_inv =  self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */
223
+		$rotate = self::fe_isnegative($t_z_inv);
224
+
225
+		$x_ = self::fe_copy($h->X);
226
+		$y_ = self::fe_copy($h->Y);
227
+		$den_inv = self::fe_copy($den2);
228
+
229
+		$x_ = self::fe_cmov($x_, $iy, $rotate);
230
+		$y_ = self::fe_cmov($y_, $ix, $rotate);
231
+		$den_inv = self::fe_cmov($den_inv, $eden, $rotate);
232
+
233
+		$x_z_inv = self::fe_mul($x_, $z_inv);
234
+		$y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv));
235
+
236
+
237
+		// fe25519_sub(s_, h->Z, y_);
238
+		// fe25519_mul(s_, den_inv, s_);
239
+		// fe25519_abs(s_, s_);
240
+		// fe25519_tobytes(s, s_);
241
+		return self::fe_tobytes(
242
+			self::fe_abs(
243
+				self::fe_mul(
244
+					$den_inv,
245
+					self::fe_sub($h->Z, $y_)
246
+				)
247
+			)
248
+		);
249
+	}
250
+
251
+	/**
252
+	 * @param ParagonIE_Sodium_Core_Curve25519_Fe $t
253
+	 * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
254
+	 *
255
+	 * @throws SodiumException
256
+	 */
257
+	public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
258
+	{
259
+		$sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
260
+		$onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
261
+		$d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
262
+		$sqdmone  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone);
263
+		$sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1);
264
+
265
+		$one = self::fe_1();
266
+		$r   = self::fe_mul($sqrtm1, self::fe_sq($t));         /* r = sqrt(-1)*t^2 */
267
+		$u   = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */
268
+		$c   = self::fe_neg(self::fe_1());                     /* c = -1 */
269
+		$rpd = self::fe_add($r, $d);                           /* rpd = r+d */
270
+
271
+		$v = self::fe_mul(
272
+			self::fe_sub(
273
+				$c,
274
+				self::fe_mul($r, $d)
275
+			),
276
+			$rpd
277
+		); /* v = (c-r*d)*(r+d) */
278
+
279
+		$result = self::ristretto255_sqrt_ratio_m1($u, $v);
280
+		$s = $result['x'];
281
+		$wasnt_square = 1 - $result['nonsquare'];
282
+
283
+		$s_prime = self::fe_neg(
284
+			self::fe_abs(
285
+				self::fe_mul($s, $t)
286
+			)
287
+		); /* s_prime = -|s*t| */
288
+		$s = self::fe_cmov($s, $s_prime, $wasnt_square);
289
+		$c = self::fe_cmov($c, $r, $wasnt_square);
290
+
291
+		// fe25519_sub(n, r, one);            /* n = r-1 */
292
+		// fe25519_mul(n, n, c);              /* n = c*(r-1) */
293
+		// fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */
294
+		// fe25519_sub(n, n, v);              /* n =  c*(r-1)*(d-1)^2-v */
295
+		$n = self::fe_sub(
296
+			self::fe_mul(
297
+				self::fe_mul(
298
+					self::fe_sub($r, $one),
299
+					$c
300
+				),
301
+				$sqdmone
302
+			),
303
+			$v
304
+		); /* n =  c*(r-1)*(d-1)^2-v */
305
+
306
+		$w0 = self::fe_mul(
307
+			self::fe_add($s, $s),
308
+			$v
309
+		); /* w0 = 2s*v */
310
+
311
+		$w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */
312
+		$ss = self::fe_sq($s); /* ss = s^2 */
313
+		$w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */
314
+		$w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */
315
+
316
+		return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
317
+			self::fe_mul($w0, $w3),
318
+			self::fe_mul($w2, $w1),
319
+			self::fe_mul($w1, $w3),
320
+			self::fe_mul($w0, $w2)
321
+		);
322
+	}
323
+
324
+	/**
325
+	 * @param string $h
326
+	 * @return string
327
+	 * @throws SodiumException
328
+	 */
329
+	public static function ristretto255_from_hash($h)
330
+	{
331
+		if (self::strlen($h) !== 64) {
332
+			throw new SodiumException('Hash must be 64 bytes');
333
+		}
334
+		//fe25519_frombytes(r0, h);
335
+		//fe25519_frombytes(r1, h + 32);
336
+		$r0 = self::fe_frombytes(self::substr($h, 0, 32));
337
+		$r1 = self::fe_frombytes(self::substr($h, 32, 32));
338
+
339
+		//ristretto255_elligator(&p0, r0);
340
+		//ristretto255_elligator(&p1, r1);
341
+		$p0 = self::ristretto255_elligator($r0);
342
+		$p1 = self::ristretto255_elligator($r1);
343
+
344
+		//ge25519_p3_to_cached(&p1_cached, &p1);
345
+		//ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
346
+		$p_p1p1 = self::ge_add(
347
+			$p0,
348
+			self::ge_p3_to_cached($p1)
349
+		);
350
+
351
+		//ge25519_p1p1_to_p3(&p, &p_p1p1);
352
+		//ristretto255_p3_tobytes(s, &p);
353
+		return self::ristretto255_p3_tobytes(
354
+			self::ge_p1p1_to_p3($p_p1p1)
355
+		);
356
+	}
357
+
358
+	/**
359
+	 * @param string $p
360
+	 * @return int
361
+	 * @throws SodiumException
362
+	 */
363
+	public static function is_valid_point($p)
364
+	{
365
+		$result = self::ristretto255_frombytes($p);
366
+		if ($result['res'] !== 0) {
367
+			return 0;
368
+		}
369
+		return 1;
370
+	}
371
+
372
+	/**
373
+	 * @param string $p
374
+	 * @param string $q
375
+	 * @return string
376
+	 * @throws SodiumException
377
+	 */
378
+	public static function ristretto255_add($p, $q)
379
+	{
380
+		$p_res = self::ristretto255_frombytes($p);
381
+		$q_res = self::ristretto255_frombytes($q);
382
+		if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
383
+			throw new SodiumException('Could not add points');
384
+		}
385
+		$p_p3 = $p_res['h'];
386
+		$q_p3 = $q_res['h'];
387
+		$q_cached = self::ge_p3_to_cached($q_p3);
388
+		$r_p1p1 = self::ge_add($p_p3, $q_cached);
389
+		$r_p3 = self::ge_p1p1_to_p3($r_p1p1);
390
+		return self::ristretto255_p3_tobytes($r_p3);
391
+	}
392
+
393
+	/**
394
+	 * @param string $p
395
+	 * @param string $q
396
+	 * @return string
397
+	 * @throws SodiumException
398
+	 */
399
+	public static function ristretto255_sub($p, $q)
400
+	{
401
+		$p_res = self::ristretto255_frombytes($p);
402
+		$q_res = self::ristretto255_frombytes($q);
403
+		if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
404
+			throw new SodiumException('Could not add points');
405
+		}
406
+		$p_p3 = $p_res['h'];
407
+		$q_p3 = $q_res['h'];
408
+		$q_cached = self::ge_p3_to_cached($q_p3);
409
+		$r_p1p1 = self::ge_sub($p_p3, $q_cached);
410
+		$r_p3 = self::ge_p1p1_to_p3($r_p1p1);
411
+		return self::ristretto255_p3_tobytes($r_p3);
412
+	}
413
+
414
+
415
+	/**
416
+	 * @param int $hLen
417
+	 * @param ?string $ctx
418
+	 * @param string $msg
419
+	 * @return string
420
+	 * @throws SodiumException
421
+	 * @psalm-suppress PossiblyInvalidArgument hash API
422
+	 */
423
+	protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
424
+	{
425
+		$h = array_fill(0, $hLen, 0);
426
+		$ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
427
+		if ($hLen > 0xff) {
428
+			throw new SodiumException('Hash must be less than 256 bytes');
429
+		}
430
+
431
+		if ($ctx_len > 0xff) {
432
+			$st = hash_init('sha256');
433
+			self::hash_update($st, "H2C-OVERSIZE-DST-");
434
+			self::hash_update($st, $ctx);
435
+			$ctx = hash_final($st, true);
436
+			$ctx_len = 32;
437
+		}
438
+		$t = array(0, $hLen, 0);
439
+		$ux = str_repeat("\0", 64);
440
+		$st = hash_init('sha256');
441
+		self::hash_update($st, $ux);
442
+		self::hash_update($st, $msg);
443
+		self::hash_update($st, self::intArrayToString($t));
444
+		self::hash_update($st, $ctx);
445
+		self::hash_update($st, self::intToChr($ctx_len));
446
+		$u0 = hash_final($st, true);
447
+
448
+		for ($i = 0; $i < $hLen; $i += 64) {
449
+			$ux = self::xorStrings($ux, $u0);
450
+			++$t[2];
451
+			$st = hash_init('sha256');
452
+			self::hash_update($st, $ux);
453
+			self::hash_update($st, self::intToChr($t[2]));
454
+			self::hash_update($st, $ctx);
455
+			self::hash_update($st, self::intToChr($ctx_len));
456
+			$ux = hash_final($st, true);
457
+			$amount = min($hLen - $i, 64);
458
+			for ($j = 0; $j < $amount; ++$j) {
459
+				$h[$i + $j] = self::chrToInt($ux[$i]);
460
+			}
461
+		}
462
+		return self::intArrayToString(array_slice($h, 0, $hLen));
463
+	}
464
+
465
+	/**
466
+	 * @param int $hLen
467
+	 * @param ?string $ctx
468
+	 * @param string $msg
469
+	 * @return string
470
+	 * @throws SodiumException
471
+	 * @psalm-suppress PossiblyInvalidArgument hash API
472
+	 */
473
+	protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
474
+	{
475
+		$h = array_fill(0, $hLen, 0);
476
+		$ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
477
+		if ($hLen > 0xff) {
478
+			throw new SodiumException('Hash must be less than 256 bytes');
479
+		}
480
+
481
+		if ($ctx_len > 0xff) {
482
+			$st = hash_init('sha256');
483
+			self::hash_update($st, "H2C-OVERSIZE-DST-");
484
+			self::hash_update($st, $ctx);
485
+			$ctx = hash_final($st, true);
486
+			$ctx_len = 32;
487
+		}
488
+		$t = array(0, $hLen, 0);
489
+		$ux = str_repeat("\0", 128);
490
+		$st = hash_init('sha512');
491
+		self::hash_update($st, $ux);
492
+		self::hash_update($st, $msg);
493
+		self::hash_update($st, self::intArrayToString($t));
494
+		self::hash_update($st, $ctx);
495
+		self::hash_update($st, self::intToChr($ctx_len));
496
+		$u0 = hash_final($st, true);
497
+
498
+		for ($i = 0; $i < $hLen; $i += 128) {
499
+			$ux = self::xorStrings($ux, $u0);
500
+			++$t[2];
501
+			$st = hash_init('sha512');
502
+			self::hash_update($st, $ux);
503
+			self::hash_update($st, self::intToChr($t[2]));
504
+			self::hash_update($st, $ctx);
505
+			self::hash_update($st, self::intToChr($ctx_len));
506
+			$ux = hash_final($st, true);
507
+			$amount = min($hLen - $i, 128);
508
+			for ($j = 0; $j < $amount; ++$j) {
509
+				$h[$i + $j] = self::chrToInt($ux[$i]);
510
+			}
511
+		}
512
+		return self::intArrayToString(array_slice($h, 0, $hLen));
513
+	}
514
+
515
+	/**
516
+	 * @param int $hLen
517
+	 * @param ?string $ctx
518
+	 * @param string $msg
519
+	 * @param int $hash_alg
520
+	 * @return string
521
+	 * @throws SodiumException
522
+	 */
523
+	public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
524
+	{
525
+		switch ($hash_alg) {
526
+			case self::CORE_H2C_SHA256:
527
+				return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
528
+			case self::CORE_H2C_SHA512:
529
+				return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg);
530
+			default:
531
+				throw new SodiumException('Invalid H2C hash algorithm');
532
+		}
533
+	}
534
+
535
+	/**
536
+	 * @param ?string $ctx
537
+	 * @param string $msg
538
+	 * @param int $hash_alg
539
+	 * @return string
540
+	 * @throws SodiumException
541
+	 */
542
+	protected static function _string_to_element($ctx, $msg, $hash_alg)
543
+	{
544
+		return self::ristretto255_from_hash(
545
+			self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
546
+		);
547
+	}
548
+
549
+	/**
550
+	 * @return string
551
+	 * @throws SodiumException
552
+	 * @throws Exception
553
+	 */
554
+	public static function ristretto255_random()
555
+	{
556
+		return self::ristretto255_from_hash(
557
+			ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
558
+		);
559
+	}
560
+
561
+	/**
562
+	 * @return string
563
+	 * @throws SodiumException
564
+	 */
565
+	public static function ristretto255_scalar_random()
566
+	{
567
+		return self::scalar_random();
568
+	}
569
+
570
+	/**
571
+	 * @param string $s
572
+	 * @return string
573
+	 * @throws SodiumException
574
+	 */
575
+	public static function ristretto255_scalar_complement($s)
576
+	{
577
+		return self::scalar_complement($s);
578
+	}
579
+
580
+
581
+	/**
582
+	 * @param string $s
583
+	 * @return string
584
+	 */
585
+	public static function ristretto255_scalar_invert($s)
586
+	{
587
+		return self::sc25519_invert($s);
588
+	}
589
+
590
+	/**
591
+	 * @param string $s
592
+	 * @return string
593
+	 * @throws SodiumException
594
+	 */
595
+	public static function ristretto255_scalar_negate($s)
596
+	{
597
+		return self::scalar_negate($s);
598
+	}
599
+
600
+	/**
601
+	 * @param string $x
602
+	 * @param string $y
603
+	 * @return string
604
+	 */
605
+	public static function ristretto255_scalar_add($x, $y)
606
+	{
607
+		return self::scalar_add($x, $y);
608
+	}
609
+
610
+	/**
611
+	 * @param string $x
612
+	 * @param string $y
613
+	 * @return string
614
+	 */
615
+	public static function ristretto255_scalar_sub($x, $y)
616
+	{
617
+		return self::scalar_sub($x, $y);
618
+	}
619
+
620
+	/**
621
+	 * @param string $x
622
+	 * @param string $y
623
+	 * @return string
624
+	 */
625
+	public static function ristretto255_scalar_mul($x, $y)
626
+	{
627
+		return self::sc25519_mul($x, $y);
628
+	}
629
+
630
+	/**
631
+	 * @param string $ctx
632
+	 * @param string $msg
633
+	 * @param int $hash_alg
634
+	 * @return string
635
+	 * @throws SodiumException
636
+	 */
637
+	public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
638
+	{
639
+		$h = array_fill(0, 64, 0);
640
+		$h_be = self::stringToIntArray(
641
+			self::h2c_string_to_hash(
642
+				self::HASH_SC_L, $ctx, $msg, $hash_alg
643
+			)
644
+		);
645
+
646
+		for ($i = 0; $i < self::HASH_SC_L; ++$i) {
647
+			$h[$i] = $h_be[self::HASH_SC_L - 1 - $i];
648
+		}
649
+		return self::ristretto255_scalar_reduce(self::intArrayToString($h));
650
+	}
651
+
652
+	/**
653
+	 * @param string $s
654
+	 * @return string
655
+	 */
656
+	public static function ristretto255_scalar_reduce($s)
657
+	{
658
+		return self::sc_reduce($s);
659
+	}
660
+
661
+	/**
662
+	 * @param string $n
663
+	 * @param string $p
664
+	 * @return string
665
+	 * @throws SodiumException
666
+	 */
667
+	public static function scalarmult_ristretto255($n, $p)
668
+	{
669
+		if (self::strlen($n) !== 32) {
670
+			throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
671
+		}
672
+		if (self::strlen($p) !== 32) {
673
+			throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.');
674
+		}
675
+		$result = self::ristretto255_frombytes($p);
676
+		if ($result['res'] !== 0) {
677
+			throw new SodiumException('Could not multiply points');
678
+		}
679
+		$P = $result['h'];
680
+
681
+		$t = self::stringToIntArray($n);
682
+		$t[31] &= 0x7f;
683
+		$Q = self::ge_scalarmult(self::intArrayToString($t), $P);
684
+		$q = self::ristretto255_p3_tobytes($Q);
685
+		if (ParagonIE_Sodium_Compat::is_zero($q)) {
686
+			throw new SodiumException('An unknown error has occurred');
687
+		}
688
+		return $q;
689
+	}
690
+
691
+	/**
692
+	 * @param string $n
693
+	 * @return string
694
+	 * @throws SodiumException
695
+	 */
696
+	public static function scalarmult_ristretto255_base($n)
697
+	{
698
+		$t = self::stringToIntArray($n);
699
+		$t[31] &= 0x7f;
700
+		$Q = self::ge_scalarmult_base(self::intArrayToString($t));
701
+		$q = self::ristretto255_p3_tobytes($Q);
702
+		if (ParagonIE_Sodium_Compat::is_zero($q)) {
703
+			throw new SodiumException('An unknown error has occurred');
704
+		}
705
+		return $q;
706
+	}
707 707
 }
Please login to merge, or discard this patch.
Spacing   +263 added lines, -263 removed lines patch added patch discarded remove patch
@@ -15,10 +15,10 @@  discard block
 block discarded – undo
15 15
      * @param int $b
16 16
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
17 17
      */
18
-    public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
18
+    public static function fe_cneg( ParagonIE_Sodium_Core_Curve25519_Fe $f, $b )
19 19
     {
20
-        $negf = self::fe_neg($f);
21
-        return self::fe_cmov($f, $negf, $b);
20
+        $negf = self::fe_neg( $f );
21
+        return self::fe_cmov( $f, $negf, $b );
22 22
     }
23 23
 
24 24
     /**
@@ -26,9 +26,9 @@  discard block
 block discarded – undo
26 26
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
27 27
      * @throws SodiumException
28 28
      */
29
-    public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
29
+    public static function fe_abs( ParagonIE_Sodium_Core_Curve25519_Fe $f )
30 30
     {
31
-        return self::fe_cneg($f, self::fe_isnegative($f));
31
+        return self::fe_cneg( $f, self::fe_isnegative( $f ) );
32 32
     }
33 33
 
34 34
     /**
@@ -40,20 +40,20 @@  discard block
 block discarded – undo
40 40
      * @return int
41 41
      * @throws SodiumException
42 42
      */
43
-    public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
43
+    public static function fe_iszero( ParagonIE_Sodium_Core_Curve25519_Fe $f )
44 44
     {
45 45
         static $zero;
46
-        if ($zero === null) {
47
-            $zero = str_repeat("\x00", 32);
46
+        if ( $zero === null ) {
47
+            $zero = str_repeat( "\x00", 32 );
48 48
         }
49 49
         /** @var string $zero */
50
-        $str = self::fe_tobytes($f);
50
+        $str = self::fe_tobytes( $f );
51 51
 
52 52
         $d = 0;
53
-        for ($i = 0; $i < 32; ++$i) {
54
-            $d |= self::chrToInt($str[$i]);
53
+        for ( $i = 0; $i < 32; ++$i ) {
54
+            $d |= self::chrToInt( $str[ $i ] );
55 55
         }
56
-        return (($d - 1) >> 31) & 1;
56
+        return ( ( $d - 1 ) >> 31 ) & 1;
57 57
     }
58 58
 
59 59
 
@@ -68,15 +68,15 @@  discard block
 block discarded – undo
68 68
         ParagonIE_Sodium_Core_Curve25519_Fe $u,
69 69
         ParagonIE_Sodium_Core_Curve25519_Fe $v
70 70
     ) {
71
-        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
71
+        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqrtm1 );
72 72
 
73 73
         $v3 = self::fe_mul(
74
-            self::fe_sq($v),
74
+            self::fe_sq( $v ),
75 75
             $v
76 76
         ); /* v3 = v^3 */
77 77
         $x = self::fe_mul(
78 78
             self::fe_mul(
79
-                self::fe_sq($v3),
79
+                self::fe_sq( $v3 ),
80 80
                 $u
81 81
             ),
82 82
             $v
@@ -84,30 +84,30 @@  discard block
 block discarded – undo
84 84
 
85 85
         $x = self::fe_mul(
86 86
             self::fe_mul(
87
-                self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */
87
+                self::fe_pow22523( $x ), /* x = (uv^7)^((q-5)/8) */
88 88
                 $v3
89 89
             ),
90 90
             $u
91 91
         ); /* x = uv^3(uv^7)^((q-5)/8) */
92 92
 
93 93
         $vxx = self::fe_mul(
94
-            self::fe_sq($x),
94
+            self::fe_sq( $x ),
95 95
             $v
96 96
         ); /* vx^2 */
97 97
 
98
-        $m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */
99
-        $p_root_check = self::fe_add($vxx, $u); /* vx^2+u */
100
-        $f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */
101
-        $f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */
98
+        $m_root_check = self::fe_sub( $vxx, $u ); /* vx^2-u */
99
+        $p_root_check = self::fe_add( $vxx, $u ); /* vx^2+u */
100
+        $f_root_check = self::fe_mul( $u, $sqrtm1 ); /* u*sqrt(-1) */
101
+        $f_root_check = self::fe_add( $vxx, $f_root_check ); /* vx^2+u*sqrt(-1) */
102 102
 
103
-        $has_m_root = self::fe_iszero($m_root_check);
104
-        $has_p_root = self::fe_iszero($p_root_check);
105
-        $has_f_root = self::fe_iszero($f_root_check);
103
+        $has_m_root = self::fe_iszero( $m_root_check );
104
+        $has_p_root = self::fe_iszero( $p_root_check );
105
+        $has_f_root = self::fe_iszero( $f_root_check );
106 106
 
107
-        $x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */
107
+        $x_sqrtm1 = self::fe_mul( $x, $sqrtm1 ); /* x*sqrt(-1) */
108 108
 
109 109
         $x = self::fe_abs(
110
-            self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root)
110
+            self::fe_cmov( $x, $x_sqrtm1, $has_p_root | $has_f_root )
111 111
         );
112 112
         return array(
113 113
             'x' => $x,
@@ -120,17 +120,17 @@  discard block
 block discarded – undo
120 120
      * @return int
121 121
      * @throws SodiumException
122 122
      */
123
-    public static function ristretto255_point_is_canonical($s)
123
+    public static function ristretto255_point_is_canonical( $s )
124 124
     {
125
-        $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
126
-        for ($i = 30; $i > 0; --$i) {
127
-            $c |= self::chrToInt($s[$i]) ^ 0xff;
125
+        $c = ( self::chrToInt( $s[ 31 ] ) & 0x7f ) ^ 0x7f;
126
+        for ( $i = 30; $i > 0; --$i ) {
127
+            $c |= self::chrToInt( $s[ $i ] ) ^ 0xff;
128 128
         }
129
-        $c = ($c - 1) >> 8;
130
-        $d = (0xed - 1 - self::chrToInt($s[0])) >> 8;
131
-        $e = self::chrToInt($s[31]) >> 7;
129
+        $c = ( $c - 1 ) >> 8;
130
+        $d = ( 0xed - 1 - self::chrToInt( $s[ 0 ] ) ) >> 8;
131
+        $e = self::chrToInt( $s[ 31 ] ) >> 7;
132 132
 
133
-        return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1);
133
+        return 1 - ( ( ( $c & $d ) | $e | self::chrToInt( $s[ 0 ] ) ) & 1 );
134 134
     }
135 135
 
136 136
     /**
@@ -139,53 +139,53 @@  discard block
 block discarded – undo
139 139
      * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
140 140
      * @throws SodiumException
141 141
      */
142
-    public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
142
+    public static function ristretto255_frombytes( $s, $skipCanonicalCheck = false )
143 143
     {
144
-        if (!$skipCanonicalCheck) {
145
-            if (!self::ristretto255_point_is_canonical($s)) {
146
-                throw new SodiumException('S is not canonical');
144
+        if ( ! $skipCanonicalCheck ) {
145
+            if ( ! self::ristretto255_point_is_canonical( $s ) ) {
146
+                throw new SodiumException( 'S is not canonical' );
147 147
             }
148 148
         }
149 149
 
150
-        $s_ = self::fe_frombytes($s);
151
-        $ss = self::fe_sq($s_); /* ss = s^2 */
150
+        $s_ = self::fe_frombytes( $s );
151
+        $ss = self::fe_sq( $s_ ); /* ss = s^2 */
152 152
 
153
-        $u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */
154
-        $u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */
153
+        $u1 = self::fe_sub( self::fe_1(), $ss ); /* u1 = 1-ss */
154
+        $u1u1 = self::fe_sq( $u1 ); /* u1u1 = u1^2 */
155 155
 
156
-        $u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */
157
-        $u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */
156
+        $u2 = self::fe_add( self::fe_1(), $ss ); /* u2 = 1+ss */
157
+        $u2u2 = self::fe_sq( $u2 ); /* u2u2 = u2^2 */
158 158
 
159 159
         $v = self::fe_mul(
160
-            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d),
160
+            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$d ),
161 161
             $u1u1
162 162
         ); /* v = d*u1^2 */
163
-        $v = self::fe_neg($v); /* v = -d*u1^2 */
164
-        $v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */
165
-        $v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */
163
+        $v = self::fe_neg( $v ); /* v = -d*u1^2 */
164
+        $v = self::fe_sub( $v, $u2u2 ); /* v = -(d*u1^2)-u2^2 */
165
+        $v_u2u2 = self::fe_mul( $v, $u2u2 ); /* v_u2u2 = v*u2^2 */
166 166
 
167 167
         // fe25519_1(one);
168 168
         // notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2);
169 169
         $one = self::fe_1();
170
-        $result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2);
171
-        $inv_sqrt = $result['x'];
172
-        $notsquare = $result['nonsquare'];
170
+        $result = self::ristretto255_sqrt_ratio_m1( $one, $v_u2u2 );
171
+        $inv_sqrt = $result[ 'x' ];
172
+        $notsquare = $result[ 'nonsquare' ];
173 173
 
174 174
         $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
175 175
 
176
-        $h->X = self::fe_mul($inv_sqrt, $u2);
177
-        $h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v);
176
+        $h->X = self::fe_mul( $inv_sqrt, $u2 );
177
+        $h->Y = self::fe_mul( self::fe_mul( $inv_sqrt, $h->X ), $v );
178 178
 
179
-        $h->X = self::fe_mul($h->X, $s_);
179
+        $h->X = self::fe_mul( $h->X, $s_ );
180 180
         $h->X = self::fe_abs(
181
-            self::fe_add($h->X, $h->X)
181
+            self::fe_add( $h->X, $h->X )
182 182
         );
183
-        $h->Y = self::fe_mul($u1, $h->Y);
183
+        $h->Y = self::fe_mul( $u1, $h->Y );
184 184
         $h->Z = self::fe_1();
185
-        $h->T = self::fe_mul($h->X, $h->Y);
185
+        $h->T = self::fe_mul( $h->X, $h->Y );
186 186
 
187
-        $res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y));
188
-        return array('h' => $h, 'res' => $res);
187
+        $res = - ( ( 1 - $notsquare ) | self::fe_isnegative( $h->T ) | self::fe_iszero( $h->Y ) );
188
+        return array( 'h' => $h, 'res' => $res );
189 189
     }
190 190
 
191 191
     /**
@@ -193,45 +193,45 @@  discard block
 block discarded – undo
193 193
      * @return string
194 194
      * @throws SodiumException
195 195
      */
196
-    public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
196
+    public static function ristretto255_p3_tobytes( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h )
197 197
     {
198
-        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
199
-        $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);
198
+        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqrtm1 );
199
+        $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$invsqrtamd );
200 200
 
201
-        $u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */
202
-        $zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */
203
-        $u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */
204
-        $u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */
201
+        $u1 = self::fe_add( $h->Z, $h->Y ); /* u1 = Z+Y */
202
+        $zmy = self::fe_sub( $h->Z, $h->Y ); /* zmy = Z-Y */
203
+        $u1 = self::fe_mul( $u1, $zmy ); /* u1 = (Z+Y)*(Z-Y) */
204
+        $u2 = self::fe_mul( $h->X, $h->Y ); /* u2 = X*Y */
205 205
 
206
-        $u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */
206
+        $u1_u2u2 = self::fe_mul( self::fe_sq( $u2 ), $u1 ); /* u1_u2u2 = u1*u2^2 */
207 207
         $one = self::fe_1();
208 208
 
209 209
         // fe25519_1(one);
210 210
         // (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
211
-        $result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2);
212
-        $inv_sqrt = $result['x'];
211
+        $result = self::ristretto255_sqrt_ratio_m1( $one, $u1_u2u2 );
212
+        $inv_sqrt = $result[ 'x' ];
213 213
 
214
-        $den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */
215
-        $den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */
216
-        $z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */
214
+        $den1 = self::fe_mul( $inv_sqrt, $u1 ); /* den1 = inv_sqrt*u1 */
215
+        $den2 = self::fe_mul( $inv_sqrt, $u2 ); /* den2 = inv_sqrt*u2 */
216
+        $z_inv = self::fe_mul( $h->T, self::fe_mul( $den1, $den2 ) ); /* z_inv = den1*den2*T */
217 217
 
218
-        $ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */
219
-        $iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */
220
-        $eden = self::fe_mul($den1, $invsqrtamd);
218
+        $ix = self::fe_mul( $h->X, $sqrtm1 ); /* ix = X*sqrt(-1) */
219
+        $iy = self::fe_mul( $h->Y, $sqrtm1 ); /* iy = Y*sqrt(-1) */
220
+        $eden = self::fe_mul( $den1, $invsqrtamd );
221 221
 
222
-        $t_z_inv =  self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */
223
-        $rotate = self::fe_isnegative($t_z_inv);
222
+        $t_z_inv = self::fe_mul( $h->T, $z_inv ); /* t_z_inv = T*z_inv */
223
+        $rotate = self::fe_isnegative( $t_z_inv );
224 224
 
225
-        $x_ = self::fe_copy($h->X);
226
-        $y_ = self::fe_copy($h->Y);
227
-        $den_inv = self::fe_copy($den2);
225
+        $x_ = self::fe_copy( $h->X );
226
+        $y_ = self::fe_copy( $h->Y );
227
+        $den_inv = self::fe_copy( $den2 );
228 228
 
229
-        $x_ = self::fe_cmov($x_, $iy, $rotate);
230
-        $y_ = self::fe_cmov($y_, $ix, $rotate);
231
-        $den_inv = self::fe_cmov($den_inv, $eden, $rotate);
229
+        $x_ = self::fe_cmov( $x_, $iy, $rotate );
230
+        $y_ = self::fe_cmov( $y_, $ix, $rotate );
231
+        $den_inv = self::fe_cmov( $den_inv, $eden, $rotate );
232 232
 
233
-        $x_z_inv = self::fe_mul($x_, $z_inv);
234
-        $y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv));
233
+        $x_z_inv = self::fe_mul( $x_, $z_inv );
234
+        $y_ = self::fe_cneg( $y_, self::fe_isnegative( $x_z_inv ) );
235 235
 
236 236
 
237 237
         // fe25519_sub(s_, h->Z, y_);
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
             self::fe_abs(
243 243
                 self::fe_mul(
244 244
                     $den_inv,
245
-                    self::fe_sub($h->Z, $y_)
245
+                    self::fe_sub( $h->Z, $y_ )
246 246
                 )
247 247
             )
248 248
         );
@@ -254,39 +254,39 @@  discard block
 block discarded – undo
254 254
      *
255 255
      * @throws SodiumException
256 256
      */
257
-    public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
257
+    public static function ristretto255_elligator( ParagonIE_Sodium_Core_Curve25519_Fe $t )
258 258
     {
259
-        $sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
260
-        $onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
261
-        $d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
262
-        $sqdmone  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone);
263
-        $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1);
259
+        $sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqrtm1 );
260
+        $onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$onemsqd );
261
+        $d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$d );
262
+        $sqdmone  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqdmone );
263
+        $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( self::$sqrtadm1 );
264 264
 
265 265
         $one = self::fe_1();
266
-        $r   = self::fe_mul($sqrtm1, self::fe_sq($t));         /* r = sqrt(-1)*t^2 */
267
-        $u   = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */
268
-        $c   = self::fe_neg(self::fe_1());                     /* c = -1 */
269
-        $rpd = self::fe_add($r, $d);                           /* rpd = r+d */
266
+        $r   = self::fe_mul( $sqrtm1, self::fe_sq( $t ) ); /* r = sqrt(-1)*t^2 */
267
+        $u   = self::fe_mul( self::fe_add( $r, $one ), $onemsqd ); /* u = (r+1)*(1-d^2) */
268
+        $c   = self::fe_neg( self::fe_1() ); /* c = -1 */
269
+        $rpd = self::fe_add( $r, $d ); /* rpd = r+d */
270 270
 
271 271
         $v = self::fe_mul(
272 272
             self::fe_sub(
273 273
                 $c,
274
-                self::fe_mul($r, $d)
274
+                self::fe_mul( $r, $d )
275 275
             ),
276 276
             $rpd
277 277
         ); /* v = (c-r*d)*(r+d) */
278 278
 
279
-        $result = self::ristretto255_sqrt_ratio_m1($u, $v);
280
-        $s = $result['x'];
281
-        $wasnt_square = 1 - $result['nonsquare'];
279
+        $result = self::ristretto255_sqrt_ratio_m1( $u, $v );
280
+        $s = $result[ 'x' ];
281
+        $wasnt_square = 1 - $result[ 'nonsquare' ];
282 282
 
283 283
         $s_prime = self::fe_neg(
284 284
             self::fe_abs(
285
-                self::fe_mul($s, $t)
285
+                self::fe_mul( $s, $t )
286 286
             )
287 287
         ); /* s_prime = -|s*t| */
288
-        $s = self::fe_cmov($s, $s_prime, $wasnt_square);
289
-        $c = self::fe_cmov($c, $r, $wasnt_square);
288
+        $s = self::fe_cmov( $s, $s_prime, $wasnt_square );
289
+        $c = self::fe_cmov( $c, $r, $wasnt_square );
290 290
 
291 291
         // fe25519_sub(n, r, one);            /* n = r-1 */
292 292
         // fe25519_mul(n, n, c);              /* n = c*(r-1) */
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
         $n = self::fe_sub(
296 296
             self::fe_mul(
297 297
                 self::fe_mul(
298
-                    self::fe_sub($r, $one),
298
+                    self::fe_sub( $r, $one ),
299 299
                     $c
300 300
                 ),
301 301
                 $sqdmone
@@ -304,20 +304,20 @@  discard block
 block discarded – undo
304 304
         ); /* n =  c*(r-1)*(d-1)^2-v */
305 305
 
306 306
         $w0 = self::fe_mul(
307
-            self::fe_add($s, $s),
307
+            self::fe_add( $s, $s ),
308 308
             $v
309 309
         ); /* w0 = 2s*v */
310 310
 
311
-        $w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */
312
-        $ss = self::fe_sq($s); /* ss = s^2 */
313
-        $w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */
314
-        $w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */
311
+        $w1 = self::fe_mul( $n, $sqrtadm1 ); /* w1 = n*sqrt(ad-1) */
312
+        $ss = self::fe_sq( $s ); /* ss = s^2 */
313
+        $w2 = self::fe_sub( $one, $ss ); /* w2 = 1-s^2 */
314
+        $w3 = self::fe_add( $one, $ss ); /* w3 = 1+s^2 */
315 315
 
316 316
         return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
317
-            self::fe_mul($w0, $w3),
318
-            self::fe_mul($w2, $w1),
319
-            self::fe_mul($w1, $w3),
320
-            self::fe_mul($w0, $w2)
317
+            self::fe_mul( $w0, $w3 ),
318
+            self::fe_mul( $w2, $w1 ),
319
+            self::fe_mul( $w1, $w3 ),
320
+            self::fe_mul( $w0, $w2 )
321 321
         );
322 322
     }
323 323
 
@@ -326,32 +326,32 @@  discard block
 block discarded – undo
326 326
      * @return string
327 327
      * @throws SodiumException
328 328
      */
329
-    public static function ristretto255_from_hash($h)
329
+    public static function ristretto255_from_hash( $h )
330 330
     {
331
-        if (self::strlen($h) !== 64) {
332
-            throw new SodiumException('Hash must be 64 bytes');
331
+        if ( self::strlen( $h ) !== 64 ) {
332
+            throw new SodiumException( 'Hash must be 64 bytes' );
333 333
         }
334 334
         //fe25519_frombytes(r0, h);
335 335
         //fe25519_frombytes(r1, h + 32);
336
-        $r0 = self::fe_frombytes(self::substr($h, 0, 32));
337
-        $r1 = self::fe_frombytes(self::substr($h, 32, 32));
336
+        $r0 = self::fe_frombytes( self::substr( $h, 0, 32 ) );
337
+        $r1 = self::fe_frombytes( self::substr( $h, 32, 32 ) );
338 338
 
339 339
         //ristretto255_elligator(&p0, r0);
340 340
         //ristretto255_elligator(&p1, r1);
341
-        $p0 = self::ristretto255_elligator($r0);
342
-        $p1 = self::ristretto255_elligator($r1);
341
+        $p0 = self::ristretto255_elligator( $r0 );
342
+        $p1 = self::ristretto255_elligator( $r1 );
343 343
 
344 344
         //ge25519_p3_to_cached(&p1_cached, &p1);
345 345
         //ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
346 346
         $p_p1p1 = self::ge_add(
347 347
             $p0,
348
-            self::ge_p3_to_cached($p1)
348
+            self::ge_p3_to_cached( $p1 )
349 349
         );
350 350
 
351 351
         //ge25519_p1p1_to_p3(&p, &p_p1p1);
352 352
         //ristretto255_p3_tobytes(s, &p);
353 353
         return self::ristretto255_p3_tobytes(
354
-            self::ge_p1p1_to_p3($p_p1p1)
354
+            self::ge_p1p1_to_p3( $p_p1p1 )
355 355
         );
356 356
     }
357 357
 
@@ -360,10 +360,10 @@  discard block
 block discarded – undo
360 360
      * @return int
361 361
      * @throws SodiumException
362 362
      */
363
-    public static function is_valid_point($p)
363
+    public static function is_valid_point( $p )
364 364
     {
365
-        $result = self::ristretto255_frombytes($p);
366
-        if ($result['res'] !== 0) {
365
+        $result = self::ristretto255_frombytes( $p );
366
+        if ( $result[ 'res' ] !== 0 ) {
367 367
             return 0;
368 368
         }
369 369
         return 1;
@@ -375,19 +375,19 @@  discard block
 block discarded – undo
375 375
      * @return string
376 376
      * @throws SodiumException
377 377
      */
378
-    public static function ristretto255_add($p, $q)
378
+    public static function ristretto255_add( $p, $q )
379 379
     {
380
-        $p_res = self::ristretto255_frombytes($p);
381
-        $q_res = self::ristretto255_frombytes($q);
382
-        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
383
-            throw new SodiumException('Could not add points');
380
+        $p_res = self::ristretto255_frombytes( $p );
381
+        $q_res = self::ristretto255_frombytes( $q );
382
+        if ( $p_res[ 'res' ] !== 0 || $q_res[ 'res' ] !== 0 ) {
383
+            throw new SodiumException( 'Could not add points' );
384 384
         }
385
-        $p_p3 = $p_res['h'];
386
-        $q_p3 = $q_res['h'];
387
-        $q_cached = self::ge_p3_to_cached($q_p3);
388
-        $r_p1p1 = self::ge_add($p_p3, $q_cached);
389
-        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
390
-        return self::ristretto255_p3_tobytes($r_p3);
385
+        $p_p3 = $p_res[ 'h' ];
386
+        $q_p3 = $q_res[ 'h' ];
387
+        $q_cached = self::ge_p3_to_cached( $q_p3 );
388
+        $r_p1p1 = self::ge_add( $p_p3, $q_cached );
389
+        $r_p3 = self::ge_p1p1_to_p3( $r_p1p1 );
390
+        return self::ristretto255_p3_tobytes( $r_p3 );
391 391
     }
392 392
 
393 393
     /**
@@ -396,19 +396,19 @@  discard block
 block discarded – undo
396 396
      * @return string
397 397
      * @throws SodiumException
398 398
      */
399
-    public static function ristretto255_sub($p, $q)
399
+    public static function ristretto255_sub( $p, $q )
400 400
     {
401
-        $p_res = self::ristretto255_frombytes($p);
402
-        $q_res = self::ristretto255_frombytes($q);
403
-        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
404
-            throw new SodiumException('Could not add points');
401
+        $p_res = self::ristretto255_frombytes( $p );
402
+        $q_res = self::ristretto255_frombytes( $q );
403
+        if ( $p_res[ 'res' ] !== 0 || $q_res[ 'res' ] !== 0 ) {
404
+            throw new SodiumException( 'Could not add points' );
405 405
         }
406
-        $p_p3 = $p_res['h'];
407
-        $q_p3 = $q_res['h'];
408
-        $q_cached = self::ge_p3_to_cached($q_p3);
409
-        $r_p1p1 = self::ge_sub($p_p3, $q_cached);
410
-        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
411
-        return self::ristretto255_p3_tobytes($r_p3);
406
+        $p_p3 = $p_res[ 'h' ];
407
+        $q_p3 = $q_res[ 'h' ];
408
+        $q_cached = self::ge_p3_to_cached( $q_p3 );
409
+        $r_p1p1 = self::ge_sub( $p_p3, $q_cached );
410
+        $r_p3 = self::ge_p1p1_to_p3( $r_p1p1 );
411
+        return self::ristretto255_p3_tobytes( $r_p3 );
412 412
     }
413 413
 
414 414
 
@@ -420,46 +420,46 @@  discard block
 block discarded – undo
420 420
      * @throws SodiumException
421 421
      * @psalm-suppress PossiblyInvalidArgument hash API
422 422
      */
423
-    protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
423
+    protected static function h2c_string_to_hash_sha256( $hLen, $ctx, $msg )
424 424
     {
425
-        $h = array_fill(0, $hLen, 0);
426
-        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
427
-        if ($hLen > 0xff) {
428
-            throw new SodiumException('Hash must be less than 256 bytes');
425
+        $h = array_fill( 0, $hLen, 0 );
426
+        $ctx_len = ! is_null( $ctx ) ? self::strlen( $ctx ) : 0;
427
+        if ( $hLen > 0xff ) {
428
+            throw new SodiumException( 'Hash must be less than 256 bytes' );
429 429
         }
430 430
 
431
-        if ($ctx_len > 0xff) {
432
-            $st = hash_init('sha256');
433
-            self::hash_update($st, "H2C-OVERSIZE-DST-");
434
-            self::hash_update($st, $ctx);
435
-            $ctx = hash_final($st, true);
431
+        if ( $ctx_len > 0xff ) {
432
+            $st = hash_init( 'sha256' );
433
+            self::hash_update( $st, "H2C-OVERSIZE-DST-" );
434
+            self::hash_update( $st, $ctx );
435
+            $ctx = hash_final( $st, true );
436 436
             $ctx_len = 32;
437 437
         }
438
-        $t = array(0, $hLen, 0);
439
-        $ux = str_repeat("\0", 64);
440
-        $st = hash_init('sha256');
441
-        self::hash_update($st, $ux);
442
-        self::hash_update($st, $msg);
443
-        self::hash_update($st, self::intArrayToString($t));
444
-        self::hash_update($st, $ctx);
445
-        self::hash_update($st, self::intToChr($ctx_len));
446
-        $u0 = hash_final($st, true);
447
-
448
-        for ($i = 0; $i < $hLen; $i += 64) {
449
-            $ux = self::xorStrings($ux, $u0);
450
-            ++$t[2];
451
-            $st = hash_init('sha256');
452
-            self::hash_update($st, $ux);
453
-            self::hash_update($st, self::intToChr($t[2]));
454
-            self::hash_update($st, $ctx);
455
-            self::hash_update($st, self::intToChr($ctx_len));
456
-            $ux = hash_final($st, true);
457
-            $amount = min($hLen - $i, 64);
458
-            for ($j = 0; $j < $amount; ++$j) {
459
-                $h[$i + $j] = self::chrToInt($ux[$i]);
438
+        $t = array( 0, $hLen, 0 );
439
+        $ux = str_repeat( "\0", 64 );
440
+        $st = hash_init( 'sha256' );
441
+        self::hash_update( $st, $ux );
442
+        self::hash_update( $st, $msg );
443
+        self::hash_update( $st, self::intArrayToString( $t ) );
444
+        self::hash_update( $st, $ctx );
445
+        self::hash_update( $st, self::intToChr( $ctx_len ) );
446
+        $u0 = hash_final( $st, true );
447
+
448
+        for ( $i = 0; $i < $hLen; $i += 64 ) {
449
+            $ux = self::xorStrings( $ux, $u0 );
450
+            ++$t[ 2 ];
451
+            $st = hash_init( 'sha256' );
452
+            self::hash_update( $st, $ux );
453
+            self::hash_update( $st, self::intToChr( $t[ 2 ] ) );
454
+            self::hash_update( $st, $ctx );
455
+            self::hash_update( $st, self::intToChr( $ctx_len ) );
456
+            $ux = hash_final( $st, true );
457
+            $amount = min( $hLen - $i, 64 );
458
+            for ( $j = 0; $j < $amount; ++$j ) {
459
+                $h[ $i + $j ] = self::chrToInt( $ux[ $i ] );
460 460
             }
461 461
         }
462
-        return self::intArrayToString(array_slice($h, 0, $hLen));
462
+        return self::intArrayToString( array_slice( $h, 0, $hLen ) );
463 463
     }
464 464
 
465 465
     /**
@@ -470,46 +470,46 @@  discard block
 block discarded – undo
470 470
      * @throws SodiumException
471 471
      * @psalm-suppress PossiblyInvalidArgument hash API
472 472
      */
473
-    protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
473
+    protected static function h2c_string_to_hash_sha512( $hLen, $ctx, $msg )
474 474
     {
475
-        $h = array_fill(0, $hLen, 0);
476
-        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
477
-        if ($hLen > 0xff) {
478
-            throw new SodiumException('Hash must be less than 256 bytes');
475
+        $h = array_fill( 0, $hLen, 0 );
476
+        $ctx_len = ! is_null( $ctx ) ? self::strlen( $ctx ) : 0;
477
+        if ( $hLen > 0xff ) {
478
+            throw new SodiumException( 'Hash must be less than 256 bytes' );
479 479
         }
480 480
 
481
-        if ($ctx_len > 0xff) {
482
-            $st = hash_init('sha256');
483
-            self::hash_update($st, "H2C-OVERSIZE-DST-");
484
-            self::hash_update($st, $ctx);
485
-            $ctx = hash_final($st, true);
481
+        if ( $ctx_len > 0xff ) {
482
+            $st = hash_init( 'sha256' );
483
+            self::hash_update( $st, "H2C-OVERSIZE-DST-" );
484
+            self::hash_update( $st, $ctx );
485
+            $ctx = hash_final( $st, true );
486 486
             $ctx_len = 32;
487 487
         }
488
-        $t = array(0, $hLen, 0);
489
-        $ux = str_repeat("\0", 128);
490
-        $st = hash_init('sha512');
491
-        self::hash_update($st, $ux);
492
-        self::hash_update($st, $msg);
493
-        self::hash_update($st, self::intArrayToString($t));
494
-        self::hash_update($st, $ctx);
495
-        self::hash_update($st, self::intToChr($ctx_len));
496
-        $u0 = hash_final($st, true);
497
-
498
-        for ($i = 0; $i < $hLen; $i += 128) {
499
-            $ux = self::xorStrings($ux, $u0);
500
-            ++$t[2];
501
-            $st = hash_init('sha512');
502
-            self::hash_update($st, $ux);
503
-            self::hash_update($st, self::intToChr($t[2]));
504
-            self::hash_update($st, $ctx);
505
-            self::hash_update($st, self::intToChr($ctx_len));
506
-            $ux = hash_final($st, true);
507
-            $amount = min($hLen - $i, 128);
508
-            for ($j = 0; $j < $amount; ++$j) {
509
-                $h[$i + $j] = self::chrToInt($ux[$i]);
488
+        $t = array( 0, $hLen, 0 );
489
+        $ux = str_repeat( "\0", 128 );
490
+        $st = hash_init( 'sha512' );
491
+        self::hash_update( $st, $ux );
492
+        self::hash_update( $st, $msg );
493
+        self::hash_update( $st, self::intArrayToString( $t ) );
494
+        self::hash_update( $st, $ctx );
495
+        self::hash_update( $st, self::intToChr( $ctx_len ) );
496
+        $u0 = hash_final( $st, true );
497
+
498
+        for ( $i = 0; $i < $hLen; $i += 128 ) {
499
+            $ux = self::xorStrings( $ux, $u0 );
500
+            ++$t[ 2 ];
501
+            $st = hash_init( 'sha512' );
502
+            self::hash_update( $st, $ux );
503
+            self::hash_update( $st, self::intToChr( $t[ 2 ] ) );
504
+            self::hash_update( $st, $ctx );
505
+            self::hash_update( $st, self::intToChr( $ctx_len ) );
506
+            $ux = hash_final( $st, true );
507
+            $amount = min( $hLen - $i, 128 );
508
+            for ( $j = 0; $j < $amount; ++$j ) {
509
+                $h[ $i + $j ] = self::chrToInt( $ux[ $i ] );
510 510
             }
511 511
         }
512
-        return self::intArrayToString(array_slice($h, 0, $hLen));
512
+        return self::intArrayToString( array_slice( $h, 0, $hLen ) );
513 513
     }
514 514
 
515 515
     /**
@@ -520,15 +520,15 @@  discard block
 block discarded – undo
520 520
      * @return string
521 521
      * @throws SodiumException
522 522
      */
523
-    public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
523
+    public static function h2c_string_to_hash( $hLen, $ctx, $msg, $hash_alg )
524 524
     {
525
-        switch ($hash_alg) {
525
+        switch ( $hash_alg ) {
526 526
             case self::CORE_H2C_SHA256:
527
-                return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
527
+                return self::h2c_string_to_hash_sha256( $hLen, $ctx, $msg );
528 528
             case self::CORE_H2C_SHA512:
529
-                return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg);
529
+                return self::h2c_string_to_hash_sha512( $hLen, $ctx, $msg );
530 530
             default:
531
-                throw new SodiumException('Invalid H2C hash algorithm');
531
+                throw new SodiumException( 'Invalid H2C hash algorithm' );
532 532
         }
533 533
     }
534 534
 
@@ -539,10 +539,10 @@  discard block
 block discarded – undo
539 539
      * @return string
540 540
      * @throws SodiumException
541 541
      */
542
-    protected static function _string_to_element($ctx, $msg, $hash_alg)
542
+    protected static function _string_to_element( $ctx, $msg, $hash_alg )
543 543
     {
544 544
         return self::ristretto255_from_hash(
545
-            self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
545
+            self::h2c_string_to_hash( self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg )
546 546
         );
547 547
     }
548 548
 
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
     public static function ristretto255_random()
555 555
     {
556 556
         return self::ristretto255_from_hash(
557
-            ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
557
+            ParagonIE_Sodium_Compat::randombytes_buf( self::crypto_core_ristretto255_HASHBYTES )
558 558
         );
559 559
     }
560 560
 
@@ -572,9 +572,9 @@  discard block
 block discarded – undo
572 572
      * @return string
573 573
      * @throws SodiumException
574 574
      */
575
-    public static function ristretto255_scalar_complement($s)
575
+    public static function ristretto255_scalar_complement( $s )
576 576
     {
577
-        return self::scalar_complement($s);
577
+        return self::scalar_complement( $s );
578 578
     }
579 579
 
580 580
 
@@ -582,9 +582,9 @@  discard block
 block discarded – undo
582 582
      * @param string $s
583 583
      * @return string
584 584
      */
585
-    public static function ristretto255_scalar_invert($s)
585
+    public static function ristretto255_scalar_invert( $s )
586 586
     {
587
-        return self::sc25519_invert($s);
587
+        return self::sc25519_invert( $s );
588 588
     }
589 589
 
590 590
     /**
@@ -592,9 +592,9 @@  discard block
 block discarded – undo
592 592
      * @return string
593 593
      * @throws SodiumException
594 594
      */
595
-    public static function ristretto255_scalar_negate($s)
595
+    public static function ristretto255_scalar_negate( $s )
596 596
     {
597
-        return self::scalar_negate($s);
597
+        return self::scalar_negate( $s );
598 598
     }
599 599
 
600 600
     /**
@@ -602,9 +602,9 @@  discard block
 block discarded – undo
602 602
      * @param string $y
603 603
      * @return string
604 604
      */
605
-    public static function ristretto255_scalar_add($x, $y)
605
+    public static function ristretto255_scalar_add( $x, $y )
606 606
     {
607
-        return self::scalar_add($x, $y);
607
+        return self::scalar_add( $x, $y );
608 608
     }
609 609
 
610 610
     /**
@@ -612,9 +612,9 @@  discard block
 block discarded – undo
612 612
      * @param string $y
613 613
      * @return string
614 614
      */
615
-    public static function ristretto255_scalar_sub($x, $y)
615
+    public static function ristretto255_scalar_sub( $x, $y )
616 616
     {
617
-        return self::scalar_sub($x, $y);
617
+        return self::scalar_sub( $x, $y );
618 618
     }
619 619
 
620 620
     /**
@@ -622,9 +622,9 @@  discard block
 block discarded – undo
622 622
      * @param string $y
623 623
      * @return string
624 624
      */
625
-    public static function ristretto255_scalar_mul($x, $y)
625
+    public static function ristretto255_scalar_mul( $x, $y )
626 626
     {
627
-        return self::sc25519_mul($x, $y);
627
+        return self::sc25519_mul( $x, $y );
628 628
     }
629 629
 
630 630
     /**
@@ -634,28 +634,28 @@  discard block
 block discarded – undo
634 634
      * @return string
635 635
      * @throws SodiumException
636 636
      */
637
-    public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
637
+    public static function ristretto255_scalar_from_string( $ctx, $msg, $hash_alg )
638 638
     {
639
-        $h = array_fill(0, 64, 0);
639
+        $h = array_fill( 0, 64, 0 );
640 640
         $h_be = self::stringToIntArray(
641 641
             self::h2c_string_to_hash(
642 642
                 self::HASH_SC_L, $ctx, $msg, $hash_alg
643 643
             )
644 644
         );
645 645
 
646
-        for ($i = 0; $i < self::HASH_SC_L; ++$i) {
647
-            $h[$i] = $h_be[self::HASH_SC_L - 1 - $i];
646
+        for ( $i = 0; $i < self::HASH_SC_L; ++$i ) {
647
+            $h[ $i ] = $h_be[ self::HASH_SC_L - 1 - $i ];
648 648
         }
649
-        return self::ristretto255_scalar_reduce(self::intArrayToString($h));
649
+        return self::ristretto255_scalar_reduce( self::intArrayToString( $h ) );
650 650
     }
651 651
 
652 652
     /**
653 653
      * @param string $s
654 654
      * @return string
655 655
      */
656
-    public static function ristretto255_scalar_reduce($s)
656
+    public static function ristretto255_scalar_reduce( $s )
657 657
     {
658
-        return self::sc_reduce($s);
658
+        return self::sc_reduce( $s );
659 659
     }
660 660
 
661 661
     /**
@@ -664,26 +664,26 @@  discard block
 block discarded – undo
664 664
      * @return string
665 665
      * @throws SodiumException
666 666
      */
667
-    public static function scalarmult_ristretto255($n, $p)
667
+    public static function scalarmult_ristretto255( $n, $p )
668 668
     {
669
-        if (self::strlen($n) !== 32) {
670
-            throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
669
+        if ( self::strlen( $n ) !== 32 ) {
670
+            throw new SodiumException( 'Scalar must be 32 bytes, ' . self::strlen( $p ) . ' given.' );
671 671
         }
672
-        if (self::strlen($p) !== 32) {
673
-            throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.');
672
+        if ( self::strlen( $p ) !== 32 ) {
673
+            throw new SodiumException( 'Point must be 32 bytes, ' . self::strlen( $p ) . ' given.' );
674 674
         }
675
-        $result = self::ristretto255_frombytes($p);
676
-        if ($result['res'] !== 0) {
677
-            throw new SodiumException('Could not multiply points');
675
+        $result = self::ristretto255_frombytes( $p );
676
+        if ( $result[ 'res' ] !== 0 ) {
677
+            throw new SodiumException( 'Could not multiply points' );
678 678
         }
679
-        $P = $result['h'];
680
-
681
-        $t = self::stringToIntArray($n);
682
-        $t[31] &= 0x7f;
683
-        $Q = self::ge_scalarmult(self::intArrayToString($t), $P);
684
-        $q = self::ristretto255_p3_tobytes($Q);
685
-        if (ParagonIE_Sodium_Compat::is_zero($q)) {
686
-            throw new SodiumException('An unknown error has occurred');
679
+        $P = $result[ 'h' ];
680
+
681
+        $t = self::stringToIntArray( $n );
682
+        $t[ 31 ] &= 0x7f;
683
+        $Q = self::ge_scalarmult( self::intArrayToString( $t ), $P );
684
+        $q = self::ristretto255_p3_tobytes( $Q );
685
+        if ( ParagonIE_Sodium_Compat::is_zero( $q ) ) {
686
+            throw new SodiumException( 'An unknown error has occurred' );
687 687
         }
688 688
         return $q;
689 689
     }
@@ -693,14 +693,14 @@  discard block
 block discarded – undo
693 693
      * @return string
694 694
      * @throws SodiumException
695 695
      */
696
-    public static function scalarmult_ristretto255_base($n)
696
+    public static function scalarmult_ristretto255_base( $n )
697 697
     {
698
-        $t = self::stringToIntArray($n);
699
-        $t[31] &= 0x7f;
700
-        $Q = self::ge_scalarmult_base(self::intArrayToString($t));
701
-        $q = self::ristretto255_p3_tobytes($Q);
702
-        if (ParagonIE_Sodium_Compat::is_zero($q)) {
703
-            throw new SodiumException('An unknown error has occurred');
698
+        $t = self::stringToIntArray( $n );
699
+        $t[ 31 ] &= 0x7f;
700
+        $Q = self::ge_scalarmult_base( self::intArrayToString( $t ) );
701
+        $q = self::ristretto255_p3_tobytes( $Q );
702
+        if ( ParagonIE_Sodium_Compat::is_zero( $q ) ) {
703
+            throw new SodiumException( 'An unknown error has occurred' );
704 704
         }
705 705
         return $q;
706 706
     }
Please login to merge, or discard this patch.
Braces   +28 added lines, -56 removed lines patch added patch discarded remove patch
@@ -3,8 +3,7 @@  discard block
 block discarded – undo
3 3
 /**
4 4
  * Class ParagonIE_Sodium_Core_Ristretto255
5 5
  */
6
-class ParagonIE_Sodium_Core_Ristretto255 extends ParagonIE_Sodium_Core_Ed25519
7
-{
6
+class ParagonIE_Sodium_Core_Ristretto255 extends ParagonIE_Sodium_Core_Ed25519 {
8 7
     const crypto_core_ristretto255_HASHBYTES = 64;
9 8
     const HASH_SC_L = 48;
10 9
     const CORE_H2C_SHA256 = 1;
@@ -15,8 +14,7 @@  discard block
 block discarded – undo
15 14
      * @param int $b
16 15
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
17 16
      */
18
-    public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
19
-    {
17
+    public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b) {
20 18
         $negf = self::fe_neg($f);
21 19
         return self::fe_cmov($f, $negf, $b);
22 20
     }
@@ -26,8 +24,7 @@  discard block
 block discarded – undo
26 24
      * @return ParagonIE_Sodium_Core_Curve25519_Fe
27 25
      * @throws SodiumException
28 26
      */
29
-    public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
30
-    {
27
+    public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
31 28
         return self::fe_cneg($f, self::fe_isnegative($f));
32 29
     }
33 30
 
@@ -40,8 +37,7 @@  discard block
 block discarded – undo
40 37
      * @return int
41 38
      * @throws SodiumException
42 39
      */
43
-    public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
44
-    {
40
+    public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f) {
45 41
         static $zero;
46 42
         if ($zero === null) {
47 43
             $zero = str_repeat("\x00", 32);
@@ -120,8 +116,7 @@  discard block
 block discarded – undo
120 116
      * @return int
121 117
      * @throws SodiumException
122 118
      */
123
-    public static function ristretto255_point_is_canonical($s)
124
-    {
119
+    public static function ristretto255_point_is_canonical($s) {
125 120
         $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
126 121
         for ($i = 30; $i > 0; --$i) {
127 122
             $c |= self::chrToInt($s[$i]) ^ 0xff;
@@ -139,8 +134,7 @@  discard block
 block discarded – undo
139 134
      * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
140 135
      * @throws SodiumException
141 136
      */
142
-    public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
143
-    {
137
+    public static function ristretto255_frombytes($s, $skipCanonicalCheck = false) {
144 138
         if (!$skipCanonicalCheck) {
145 139
             if (!self::ristretto255_point_is_canonical($s)) {
146 140
                 throw new SodiumException('S is not canonical');
@@ -193,8 +187,7 @@  discard block
 block discarded – undo
193 187
      * @return string
194 188
      * @throws SodiumException
195 189
      */
196
-    public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
197
-    {
190
+    public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) {
198 191
         $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
199 192
         $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);
200 193
 
@@ -254,8 +247,7 @@  discard block
 block discarded – undo
254 247
      *
255 248
      * @throws SodiumException
256 249
      */
257
-    public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
258
-    {
250
+    public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t) {
259 251
         $sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
260 252
         $onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
261 253
         $d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
@@ -326,8 +318,7 @@  discard block
 block discarded – undo
326 318
      * @return string
327 319
      * @throws SodiumException
328 320
      */
329
-    public static function ristretto255_from_hash($h)
330
-    {
321
+    public static function ristretto255_from_hash($h) {
331 322
         if (self::strlen($h) !== 64) {
332 323
             throw new SodiumException('Hash must be 64 bytes');
333 324
         }
@@ -360,8 +351,7 @@  discard block
 block discarded – undo
360 351
      * @return int
361 352
      * @throws SodiumException
362 353
      */
363
-    public static function is_valid_point($p)
364
-    {
354
+    public static function is_valid_point($p) {
365 355
         $result = self::ristretto255_frombytes($p);
366 356
         if ($result['res'] !== 0) {
367 357
             return 0;
@@ -375,8 +365,7 @@  discard block
 block discarded – undo
375 365
      * @return string
376 366
      * @throws SodiumException
377 367
      */
378
-    public static function ristretto255_add($p, $q)
379
-    {
368
+    public static function ristretto255_add($p, $q) {
380 369
         $p_res = self::ristretto255_frombytes($p);
381 370
         $q_res = self::ristretto255_frombytes($q);
382 371
         if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
@@ -396,8 +385,7 @@  discard block
 block discarded – undo
396 385
      * @return string
397 386
      * @throws SodiumException
398 387
      */
399
-    public static function ristretto255_sub($p, $q)
400
-    {
388
+    public static function ristretto255_sub($p, $q) {
401 389
         $p_res = self::ristretto255_frombytes($p);
402 390
         $q_res = self::ristretto255_frombytes($q);
403 391
         if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
@@ -420,8 +408,7 @@  discard block
 block discarded – undo
420 408
      * @throws SodiumException
421 409
      * @psalm-suppress PossiblyInvalidArgument hash API
422 410
      */
423
-    protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
424
-    {
411
+    protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg) {
425 412
         $h = array_fill(0, $hLen, 0);
426 413
         $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
427 414
         if ($hLen > 0xff) {
@@ -470,8 +457,7 @@  discard block
 block discarded – undo
470 457
      * @throws SodiumException
471 458
      * @psalm-suppress PossiblyInvalidArgument hash API
472 459
      */
473
-    protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
474
-    {
460
+    protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg) {
475 461
         $h = array_fill(0, $hLen, 0);
476 462
         $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
477 463
         if ($hLen > 0xff) {
@@ -520,8 +506,7 @@  discard block
 block discarded – undo
520 506
      * @return string
521 507
      * @throws SodiumException
522 508
      */
523
-    public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
524
-    {
509
+    public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg) {
525 510
         switch ($hash_alg) {
526 511
             case self::CORE_H2C_SHA256:
527 512
                 return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
@@ -539,8 +524,7 @@  discard block
 block discarded – undo
539 524
      * @return string
540 525
      * @throws SodiumException
541 526
      */
542
-    protected static function _string_to_element($ctx, $msg, $hash_alg)
543
-    {
527
+    protected static function _string_to_element($ctx, $msg, $hash_alg) {
544 528
         return self::ristretto255_from_hash(
545 529
             self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
546 530
         );
@@ -551,8 +535,7 @@  discard block
 block discarded – undo
551 535
      * @throws SodiumException
552 536
      * @throws Exception
553 537
      */
554
-    public static function ristretto255_random()
555
-    {
538
+    public static function ristretto255_random() {
556 539
         return self::ristretto255_from_hash(
557 540
             ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
558 541
         );
@@ -562,8 +545,7 @@  discard block
 block discarded – undo
562 545
      * @return string
563 546
      * @throws SodiumException
564 547
      */
565
-    public static function ristretto255_scalar_random()
566
-    {
548
+    public static function ristretto255_scalar_random() {
567 549
         return self::scalar_random();
568 550
     }
569 551
 
@@ -572,8 +554,7 @@  discard block
 block discarded – undo
572 554
      * @return string
573 555
      * @throws SodiumException
574 556
      */
575
-    public static function ristretto255_scalar_complement($s)
576
-    {
557
+    public static function ristretto255_scalar_complement($s) {
577 558
         return self::scalar_complement($s);
578 559
     }
579 560
 
@@ -582,8 +563,7 @@  discard block
 block discarded – undo
582 563
      * @param string $s
583 564
      * @return string
584 565
      */
585
-    public static function ristretto255_scalar_invert($s)
586
-    {
566
+    public static function ristretto255_scalar_invert($s) {
587 567
         return self::sc25519_invert($s);
588 568
     }
589 569
 
@@ -592,8 +572,7 @@  discard block
 block discarded – undo
592 572
      * @return string
593 573
      * @throws SodiumException
594 574
      */
595
-    public static function ristretto255_scalar_negate($s)
596
-    {
575
+    public static function ristretto255_scalar_negate($s) {
597 576
         return self::scalar_negate($s);
598 577
     }
599 578
 
@@ -602,8 +581,7 @@  discard block
 block discarded – undo
602 581
      * @param string $y
603 582
      * @return string
604 583
      */
605
-    public static function ristretto255_scalar_add($x, $y)
606
-    {
584
+    public static function ristretto255_scalar_add($x, $y) {
607 585
         return self::scalar_add($x, $y);
608 586
     }
609 587
 
@@ -612,8 +590,7 @@  discard block
 block discarded – undo
612 590
      * @param string $y
613 591
      * @return string
614 592
      */
615
-    public static function ristretto255_scalar_sub($x, $y)
616
-    {
593
+    public static function ristretto255_scalar_sub($x, $y) {
617 594
         return self::scalar_sub($x, $y);
618 595
     }
619 596
 
@@ -622,8 +599,7 @@  discard block
 block discarded – undo
622 599
      * @param string $y
623 600
      * @return string
624 601
      */
625
-    public static function ristretto255_scalar_mul($x, $y)
626
-    {
602
+    public static function ristretto255_scalar_mul($x, $y) {
627 603
         return self::sc25519_mul($x, $y);
628 604
     }
629 605
 
@@ -634,8 +610,7 @@  discard block
 block discarded – undo
634 610
      * @return string
635 611
      * @throws SodiumException
636 612
      */
637
-    public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
638
-    {
613
+    public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg) {
639 614
         $h = array_fill(0, 64, 0);
640 615
         $h_be = self::stringToIntArray(
641 616
             self::h2c_string_to_hash(
@@ -653,8 +628,7 @@  discard block
 block discarded – undo
653 628
      * @param string $s
654 629
      * @return string
655 630
      */
656
-    public static function ristretto255_scalar_reduce($s)
657
-    {
631
+    public static function ristretto255_scalar_reduce($s) {
658 632
         return self::sc_reduce($s);
659 633
     }
660 634
 
@@ -664,8 +638,7 @@  discard block
 block discarded – undo
664 638
      * @return string
665 639
      * @throws SodiumException
666 640
      */
667
-    public static function scalarmult_ristretto255($n, $p)
668
-    {
641
+    public static function scalarmult_ristretto255($n, $p) {
669 642
         if (self::strlen($n) !== 32) {
670 643
             throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
671 644
         }
@@ -693,8 +666,7 @@  discard block
 block discarded – undo
693 666
      * @return string
694 667
      * @throws SodiumException
695 668
      */
696
-    public static function scalarmult_ristretto255_base($n)
697
-    {
669
+    public static function scalarmult_ristretto255_base($n) {
698 670
         $t = self::stringToIntArray($n);
699 671
         $t[31] &= 0x7f;
700 672
         $Q = self::ge_scalarmult_base(self::intArrayToString($t));
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/ChaCha20/Ctx.php 3 patches
Indentation   +105 added lines, -105 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 
7 7
 /**
@@ -9,115 +9,115 @@  discard block
 block discarded – undo
9 9
  */
10 10
 class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util implements ArrayAccess
11 11
 {
12
-    /**
13
-     * @var SplFixedArray internally, <int, int>
14
-     */
15
-    protected $container;
12
+	/**
13
+	 * @var SplFixedArray internally, <int, int>
14
+	 */
15
+	protected $container;
16 16
 
17
-    /**
18
-     * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
19
-     *
20
-     * @internal You should not use this directly from another application
21
-     *
22
-     * @param string $key     ChaCha20 key.
23
-     * @param string $iv      Initialization Vector (a.k.a. nonce).
24
-     * @param string $counter The initial counter value.
25
-     *                        Defaults to 8 0x00 bytes.
26
-     * @throws InvalidArgumentException
27
-     * @throws TypeError
28
-     */
29
-    public function __construct($key = '', $iv = '', $counter = '')
30
-    {
31
-        if (self::strlen($key) !== 32) {
32
-            throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
33
-        }
34
-        if (self::strlen($iv) !== 8) {
35
-            throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
36
-        }
37
-        $this->container = new SplFixedArray(16);
17
+	/**
18
+	 * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
19
+	 *
20
+	 * @internal You should not use this directly from another application
21
+	 *
22
+	 * @param string $key     ChaCha20 key.
23
+	 * @param string $iv      Initialization Vector (a.k.a. nonce).
24
+	 * @param string $counter The initial counter value.
25
+	 *                        Defaults to 8 0x00 bytes.
26
+	 * @throws InvalidArgumentException
27
+	 * @throws TypeError
28
+	 */
29
+	public function __construct($key = '', $iv = '', $counter = '')
30
+	{
31
+		if (self::strlen($key) !== 32) {
32
+			throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
33
+		}
34
+		if (self::strlen($iv) !== 8) {
35
+			throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
36
+		}
37
+		$this->container = new SplFixedArray(16);
38 38
 
39
-        /* "expand 32-byte k" as per ChaCha20 spec */
40
-        $this->container[0]  = 0x61707865;
41
-        $this->container[1]  = 0x3320646e;
42
-        $this->container[2]  = 0x79622d32;
43
-        $this->container[3]  = 0x6b206574;
44
-        $this->container[4]  = self::load_4(self::substr($key, 0, 4));
45
-        $this->container[5]  = self::load_4(self::substr($key, 4, 4));
46
-        $this->container[6]  = self::load_4(self::substr($key, 8, 4));
47
-        $this->container[7]  = self::load_4(self::substr($key, 12, 4));
48
-        $this->container[8]  = self::load_4(self::substr($key, 16, 4));
49
-        $this->container[9]  = self::load_4(self::substr($key, 20, 4));
50
-        $this->container[10] = self::load_4(self::substr($key, 24, 4));
51
-        $this->container[11] = self::load_4(self::substr($key, 28, 4));
39
+		/* "expand 32-byte k" as per ChaCha20 spec */
40
+		$this->container[0]  = 0x61707865;
41
+		$this->container[1]  = 0x3320646e;
42
+		$this->container[2]  = 0x79622d32;
43
+		$this->container[3]  = 0x6b206574;
44
+		$this->container[4]  = self::load_4(self::substr($key, 0, 4));
45
+		$this->container[5]  = self::load_4(self::substr($key, 4, 4));
46
+		$this->container[6]  = self::load_4(self::substr($key, 8, 4));
47
+		$this->container[7]  = self::load_4(self::substr($key, 12, 4));
48
+		$this->container[8]  = self::load_4(self::substr($key, 16, 4));
49
+		$this->container[9]  = self::load_4(self::substr($key, 20, 4));
50
+		$this->container[10] = self::load_4(self::substr($key, 24, 4));
51
+		$this->container[11] = self::load_4(self::substr($key, 28, 4));
52 52
 
53
-        if (empty($counter)) {
54
-            $this->container[12] = 0;
55
-            $this->container[13] = 0;
56
-        } else {
57
-            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
58
-            $this->container[13] = self::load_4(self::substr($counter, 4, 4));
59
-        }
60
-        $this->container[14] = self::load_4(self::substr($iv, 0, 4));
61
-        $this->container[15] = self::load_4(self::substr($iv, 4, 4));
62
-    }
53
+		if (empty($counter)) {
54
+			$this->container[12] = 0;
55
+			$this->container[13] = 0;
56
+		} else {
57
+			$this->container[12] = self::load_4(self::substr($counter, 0, 4));
58
+			$this->container[13] = self::load_4(self::substr($counter, 4, 4));
59
+		}
60
+		$this->container[14] = self::load_4(self::substr($iv, 0, 4));
61
+		$this->container[15] = self::load_4(self::substr($iv, 4, 4));
62
+	}
63 63
 
64
-    /**
65
-     * @internal You should not use this directly from another application
66
-     *
67
-     * @param int $offset
68
-     * @param int $value
69
-     * @return void
70
-     * @psalm-suppress MixedArrayOffset
71
-     */
72
-    #[ReturnTypeWillChange]
73
-    public function offsetSet($offset, $value)
74
-    {
75
-        if (!is_int($offset)) {
76
-            throw new InvalidArgumentException('Expected an integer');
77
-        }
78
-        if (!is_int($value)) {
79
-            throw new InvalidArgumentException('Expected an integer');
80
-        }
81
-        $this->container[$offset] = $value;
82
-    }
64
+	/**
65
+	 * @internal You should not use this directly from another application
66
+	 *
67
+	 * @param int $offset
68
+	 * @param int $value
69
+	 * @return void
70
+	 * @psalm-suppress MixedArrayOffset
71
+	 */
72
+	#[ReturnTypeWillChange]
73
+	public function offsetSet($offset, $value)
74
+	{
75
+		if (!is_int($offset)) {
76
+			throw new InvalidArgumentException('Expected an integer');
77
+		}
78
+		if (!is_int($value)) {
79
+			throw new InvalidArgumentException('Expected an integer');
80
+		}
81
+		$this->container[$offset] = $value;
82
+	}
83 83
 
84
-    /**
85
-     * @internal You should not use this directly from another application
86
-     *
87
-     * @param int $offset
88
-     * @return bool
89
-     */
90
-    #[ReturnTypeWillChange]
91
-    public function offsetExists($offset)
92
-    {
93
-        return isset($this->container[$offset]);
94
-    }
84
+	/**
85
+	 * @internal You should not use this directly from another application
86
+	 *
87
+	 * @param int $offset
88
+	 * @return bool
89
+	 */
90
+	#[ReturnTypeWillChange]
91
+	public function offsetExists($offset)
92
+	{
93
+		return isset($this->container[$offset]);
94
+	}
95 95
 
96
-    /**
97
-     * @internal You should not use this directly from another application
98
-     *
99
-     * @param int $offset
100
-     * @return void
101
-     * @psalm-suppress MixedArrayOffset
102
-     */
103
-    #[ReturnTypeWillChange]
104
-    public function offsetUnset($offset)
105
-    {
106
-        unset($this->container[$offset]);
107
-    }
96
+	/**
97
+	 * @internal You should not use this directly from another application
98
+	 *
99
+	 * @param int $offset
100
+	 * @return void
101
+	 * @psalm-suppress MixedArrayOffset
102
+	 */
103
+	#[ReturnTypeWillChange]
104
+	public function offsetUnset($offset)
105
+	{
106
+		unset($this->container[$offset]);
107
+	}
108 108
 
109
-    /**
110
-     * @internal You should not use this directly from another application
111
-     *
112
-     * @param int $offset
113
-     * @return mixed|null
114
-     * @psalm-suppress MixedArrayOffset
115
-     */
116
-    #[ReturnTypeWillChange]
117
-    public function offsetGet($offset)
118
-    {
119
-        return isset($this->container[$offset])
120
-            ? $this->container[$offset]
121
-            : null;
122
-    }
109
+	/**
110
+	 * @internal You should not use this directly from another application
111
+	 *
112
+	 * @param int $offset
113
+	 * @return mixed|null
114
+	 * @psalm-suppress MixedArrayOffset
115
+	 */
116
+	#[ReturnTypeWillChange]
117
+	public function offsetGet($offset)
118
+	{
119
+		return isset($this->container[$offset])
120
+			? $this->container[$offset]
121
+			: null;
122
+	}
123 123
 }
Please login to merge, or discard this patch.
Braces   +6 added lines, -12 removed lines patch added patch discarded remove patch
@@ -7,8 +7,7 @@  discard block
 block discarded – undo
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_ChaCha20_Ctx
9 9
  */
10
-class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util implements ArrayAccess
11
-{
10
+class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util implements ArrayAccess {
12 11
     /**
13 12
      * @var SplFixedArray internally, <int, int>
14 13
      */
@@ -26,8 +25,7 @@  discard block
 block discarded – undo
26 25
      * @throws InvalidArgumentException
27 26
      * @throws TypeError
28 27
      */
29
-    public function __construct($key = '', $iv = '', $counter = '')
30
-    {
28
+    public function __construct($key = '', $iv = '', $counter = '') {
31 29
         if (self::strlen($key) !== 32) {
32 30
             throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
33 31
         }
@@ -70,8 +68,7 @@  discard block
 block discarded – undo
70 68
      * @psalm-suppress MixedArrayOffset
71 69
      */
72 70
     #[ReturnTypeWillChange]
73
-    public function offsetSet($offset, $value)
74
-    {
71
+    public function offsetSet($offset, $value) {
75 72
         if (!is_int($offset)) {
76 73
             throw new InvalidArgumentException('Expected an integer');
77 74
         }
@@ -88,8 +85,7 @@  discard block
 block discarded – undo
88 85
      * @return bool
89 86
      */
90 87
     #[ReturnTypeWillChange]
91
-    public function offsetExists($offset)
92
-    {
88
+    public function offsetExists($offset) {
93 89
         return isset($this->container[$offset]);
94 90
     }
95 91
 
@@ -101,8 +97,7 @@  discard block
 block discarded – undo
101 97
      * @psalm-suppress MixedArrayOffset
102 98
      */
103 99
     #[ReturnTypeWillChange]
104
-    public function offsetUnset($offset)
105
-    {
100
+    public function offsetUnset($offset) {
106 101
         unset($this->container[$offset]);
107 102
     }
108 103
 
@@ -114,8 +109,7 @@  discard block
 block discarded – undo
114 109
      * @psalm-suppress MixedArrayOffset
115 110
      */
116 111
     #[ReturnTypeWillChange]
117
-    public function offsetGet($offset)
118
-    {
112
+    public function offsetGet($offset) {
119 113
         return isset($this->container[$offset])
120 114
             ? $this->container[$offset]
121 115
             : null;
Please login to merge, or discard this patch.
Spacing   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_ChaCha20_Ctx', false ) ) {
4 4
     return;
5 5
 }
6 6
 
@@ -26,39 +26,39 @@  discard block
 block discarded – undo
26 26
      * @throws InvalidArgumentException
27 27
      * @throws TypeError
28 28
      */
29
-    public function __construct($key = '', $iv = '', $counter = '')
29
+    public function __construct( $key = '', $iv = '', $counter = '' )
30 30
     {
31
-        if (self::strlen($key) !== 32) {
32
-            throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
31
+        if ( self::strlen( $key ) !== 32 ) {
32
+            throw new InvalidArgumentException( 'ChaCha20 expects a 256-bit key.' );
33 33
         }
34
-        if (self::strlen($iv) !== 8) {
35
-            throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
34
+        if ( self::strlen( $iv ) !== 8 ) {
35
+            throw new InvalidArgumentException( 'ChaCha20 expects a 64-bit nonce.' );
36 36
         }
37
-        $this->container = new SplFixedArray(16);
37
+        $this->container = new SplFixedArray( 16 );
38 38
 
39 39
         /* "expand 32-byte k" as per ChaCha20 spec */
40
-        $this->container[0]  = 0x61707865;
41
-        $this->container[1]  = 0x3320646e;
42
-        $this->container[2]  = 0x79622d32;
43
-        $this->container[3]  = 0x6b206574;
44
-        $this->container[4]  = self::load_4(self::substr($key, 0, 4));
45
-        $this->container[5]  = self::load_4(self::substr($key, 4, 4));
46
-        $this->container[6]  = self::load_4(self::substr($key, 8, 4));
47
-        $this->container[7]  = self::load_4(self::substr($key, 12, 4));
48
-        $this->container[8]  = self::load_4(self::substr($key, 16, 4));
49
-        $this->container[9]  = self::load_4(self::substr($key, 20, 4));
50
-        $this->container[10] = self::load_4(self::substr($key, 24, 4));
51
-        $this->container[11] = self::load_4(self::substr($key, 28, 4));
40
+        $this->container[ 0 ]  = 0x61707865;
41
+        $this->container[ 1 ]  = 0x3320646e;
42
+        $this->container[ 2 ]  = 0x79622d32;
43
+        $this->container[ 3 ]  = 0x6b206574;
44
+        $this->container[ 4 ]  = self::load_4( self::substr( $key, 0, 4 ) );
45
+        $this->container[ 5 ]  = self::load_4( self::substr( $key, 4, 4 ) );
46
+        $this->container[ 6 ]  = self::load_4( self::substr( $key, 8, 4 ) );
47
+        $this->container[ 7 ]  = self::load_4( self::substr( $key, 12, 4 ) );
48
+        $this->container[ 8 ]  = self::load_4( self::substr( $key, 16, 4 ) );
49
+        $this->container[ 9 ]  = self::load_4( self::substr( $key, 20, 4 ) );
50
+        $this->container[ 10 ] = self::load_4( self::substr( $key, 24, 4 ) );
51
+        $this->container[ 11 ] = self::load_4( self::substr( $key, 28, 4 ) );
52 52
 
53
-        if (empty($counter)) {
54
-            $this->container[12] = 0;
55
-            $this->container[13] = 0;
53
+        if ( empty( $counter ) ) {
54
+            $this->container[ 12 ] = 0;
55
+            $this->container[ 13 ] = 0;
56 56
         } else {
57
-            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
58
-            $this->container[13] = self::load_4(self::substr($counter, 4, 4));
57
+            $this->container[ 12 ] = self::load_4( self::substr( $counter, 0, 4 ) );
58
+            $this->container[ 13 ] = self::load_4( self::substr( $counter, 4, 4 ) );
59 59
         }
60
-        $this->container[14] = self::load_4(self::substr($iv, 0, 4));
61
-        $this->container[15] = self::load_4(self::substr($iv, 4, 4));
60
+        $this->container[ 14 ] = self::load_4( self::substr( $iv, 0, 4 ) );
61
+        $this->container[ 15 ] = self::load_4( self::substr( $iv, 4, 4 ) );
62 62
     }
63 63
 
64 64
     /**
@@ -69,16 +69,16 @@  discard block
 block discarded – undo
69 69
      * @return void
70 70
      * @psalm-suppress MixedArrayOffset
71 71
      */
72
-    #[ReturnTypeWillChange]
73
-    public function offsetSet($offset, $value)
72
+    #[ReturnTypeWillChange ]
73
+    public function offsetSet( $offset, $value )
74 74
     {
75
-        if (!is_int($offset)) {
76
-            throw new InvalidArgumentException('Expected an integer');
75
+        if ( ! is_int( $offset ) ) {
76
+            throw new InvalidArgumentException( 'Expected an integer' );
77 77
         }
78
-        if (!is_int($value)) {
79
-            throw new InvalidArgumentException('Expected an integer');
78
+        if ( ! is_int( $value ) ) {
79
+            throw new InvalidArgumentException( 'Expected an integer' );
80 80
         }
81
-        $this->container[$offset] = $value;
81
+        $this->container[ $offset ] = $value;
82 82
     }
83 83
 
84 84
     /**
@@ -87,10 +87,10 @@  discard block
 block discarded – undo
87 87
      * @param int $offset
88 88
      * @return bool
89 89
      */
90
-    #[ReturnTypeWillChange]
91
-    public function offsetExists($offset)
90
+    #[ReturnTypeWillChange ]
91
+    public function offsetExists( $offset )
92 92
     {
93
-        return isset($this->container[$offset]);
93
+        return isset( $this->container[ $offset ] );
94 94
     }
95 95
 
96 96
     /**
@@ -100,10 +100,10 @@  discard block
 block discarded – undo
100 100
      * @return void
101 101
      * @psalm-suppress MixedArrayOffset
102 102
      */
103
-    #[ReturnTypeWillChange]
104
-    public function offsetUnset($offset)
103
+    #[ReturnTypeWillChange ]
104
+    public function offsetUnset( $offset )
105 105
     {
106
-        unset($this->container[$offset]);
106
+        unset( $this->container[ $offset ] );
107 107
     }
108 108
 
109 109
     /**
@@ -113,11 +113,11 @@  discard block
 block discarded – undo
113 113
      * @return mixed|null
114 114
      * @psalm-suppress MixedArrayOffset
115 115
      */
116
-    #[ReturnTypeWillChange]
117
-    public function offsetGet($offset)
116
+    #[ReturnTypeWillChange ]
117
+    public function offsetGet( $offset )
118 118
     {
119
-        return isset($this->container[$offset])
120
-            ? $this->container[$offset]
119
+        return isset( $this->container[ $offset ] )
120
+            ? $this->container[ $offset ]
121 121
             : null;
122 122
     }
123 123
 }
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/Core/ChaCha20/IetfCtx.php 3 patches
Indentation   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) {
4
-    return;
4
+	return;
5 5
 }
6 6
 
7 7
 /**
@@ -9,30 +9,30 @@  discard block
 block discarded – undo
9 9
  */
10 10
 class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx
11 11
 {
12
-    /**
13
-     * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
14
-     *
15
-     * @internal You should not use this directly from another application
16
-     *
17
-     * @param string $key     ChaCha20 key.
18
-     * @param string $iv      Initialization Vector (a.k.a. nonce).
19
-     * @param string $counter The initial counter value.
20
-     *                        Defaults to 4 0x00 bytes.
21
-     * @throws InvalidArgumentException
22
-     * @throws TypeError
23
-     */
24
-    public function __construct($key = '', $iv = '', $counter = '')
25
-    {
26
-        if (self::strlen($iv) !== 12) {
27
-            throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
28
-        }
29
-        parent::__construct($key, self::substr($iv, 0, 8), $counter);
12
+	/**
13
+	 * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
14
+	 *
15
+	 * @internal You should not use this directly from another application
16
+	 *
17
+	 * @param string $key     ChaCha20 key.
18
+	 * @param string $iv      Initialization Vector (a.k.a. nonce).
19
+	 * @param string $counter The initial counter value.
20
+	 *                        Defaults to 4 0x00 bytes.
21
+	 * @throws InvalidArgumentException
22
+	 * @throws TypeError
23
+	 */
24
+	public function __construct($key = '', $iv = '', $counter = '')
25
+	{
26
+		if (self::strlen($iv) !== 12) {
27
+			throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
28
+		}
29
+		parent::__construct($key, self::substr($iv, 0, 8), $counter);
30 30
 
31
-        if (!empty($counter)) {
32
-            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
33
-        }
34
-        $this->container[13] = self::load_4(self::substr($iv, 0, 4));
35
-        $this->container[14] = self::load_4(self::substr($iv, 4, 4));
36
-        $this->container[15] = self::load_4(self::substr($iv, 8, 4));
37
-    }
31
+		if (!empty($counter)) {
32
+			$this->container[12] = self::load_4(self::substr($counter, 0, 4));
33
+		}
34
+		$this->container[13] = self::load_4(self::substr($iv, 0, 4));
35
+		$this->container[14] = self::load_4(self::substr($iv, 4, 4));
36
+		$this->container[15] = self::load_4(self::substr($iv, 8, 4));
37
+	}
38 38
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) {
3
+if ( class_exists( 'ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false ) ) {
4 4
     return;
5 5
 }
6 6
 
@@ -21,18 +21,18 @@  discard block
 block discarded – undo
21 21
      * @throws InvalidArgumentException
22 22
      * @throws TypeError
23 23
      */
24
-    public function __construct($key = '', $iv = '', $counter = '')
24
+    public function __construct( $key = '', $iv = '', $counter = '' )
25 25
     {
26
-        if (self::strlen($iv) !== 12) {
27
-            throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
26
+        if ( self::strlen( $iv ) !== 12 ) {
27
+            throw new InvalidArgumentException( 'ChaCha20 expects a 96-bit nonce in IETF mode.' );
28 28
         }
29
-        parent::__construct($key, self::substr($iv, 0, 8), $counter);
29
+        parent::__construct( $key, self::substr( $iv, 0, 8 ), $counter );
30 30
 
31
-        if (!empty($counter)) {
32
-            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
31
+        if ( ! empty( $counter ) ) {
32
+            $this->container[ 12 ] = self::load_4( self::substr( $counter, 0, 4 ) );
33 33
         }
34
-        $this->container[13] = self::load_4(self::substr($iv, 0, 4));
35
-        $this->container[14] = self::load_4(self::substr($iv, 4, 4));
36
-        $this->container[15] = self::load_4(self::substr($iv, 8, 4));
34
+        $this->container[ 13 ] = self::load_4( self::substr( $iv, 0, 4 ) );
35
+        $this->container[ 14 ] = self::load_4( self::substr( $iv, 4, 4 ) );
36
+        $this->container[ 15 ] = self::load_4( self::substr( $iv, 8, 4 ) );
37 37
     }
38 38
 }
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -7,8 +7,7 @@  discard block
 block discarded – undo
7 7
 /**
8 8
  * Class ParagonIE_Sodium_Core_ChaCha20_IetfCtx
9 9
  */
10
-class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx
11
-{
10
+class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx {
12 11
     /**
13 12
      * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
14 13
      *
@@ -21,8 +20,7 @@  discard block
 block discarded – undo
21 20
      * @throws InvalidArgumentException
22 21
      * @throws TypeError
23 22
      */
24
-    public function __construct($key = '', $iv = '', $counter = '')
25
-    {
23
+    public function __construct($key = '', $iv = '', $counter = '') {
26 24
         if (self::strlen($iv) !== 12) {
27 25
             throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
28 26
         }
Please login to merge, or discard this patch.
vendor/paragonie/sodium_compat/src/SodiumException.php 3 patches
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -1,11 +1,11 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (!class_exists('SodiumException', false)) {
4
-    /**
5
-     * Class SodiumException
6
-     */
7
-    class SodiumException extends Exception
8
-    {
4
+	/**
5
+	 * Class SodiumException
6
+	 */
7
+	class SodiumException extends Exception
8
+	{
9 9
 
10
-    }
10
+	}
11 11
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (!class_exists('SodiumException', false)) {
3
+if ( ! class_exists( 'SodiumException', false ) ) {
4 4
     /**
5 5
      * Class SodiumException
6 6
      */
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -4,8 +4,7 @@
 block discarded – undo
4 4
     /**
5 5
      * Class SodiumException
6 6
      */
7
-    class SodiumException extends Exception
8
-    {
7
+    class SodiumException extends Exception {
9 8
 
10 9
     }
11 10
 }
Please login to merge, or discard this patch.