Every CVE Search/ Get API key

CVE-2026-84308

phpseclib — non-constant-time X25519 scalar multiplication permits full private-key recovery

6.3 MediumFix available

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Attack profile

How easy it is to exploit

Attack vector
Local
Complexity
High
Privileges needed
Low
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
None

Exploit likelihood

0.33%Up 0.1 points since Sep 2, 2026
90%50%10%1%

What each source reports

CVE List Score used 6.3

phpseclib — non-constant-time X25519 scalar multiplication permits full private-key recovery

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
CVE-2026-84308
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-208, CWE-385
Updated
2026-11-02
EUVDEUVD-2026-69576 6.3

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
EUVD-2026-69576
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-q97c-8qh3-fpc6 6.3

phpseclib — non-constant-time X25519 scalar multiplication permits full private-key recovery

The pure-PHP X25519 scalar multiplication in phpseclib is not constant-time. Field addition and subtraction each perform a data-dependent conditional modular reduction, so the cost of each Montgomery-ladder step is a linear function of that step's reduction count which is a quantity determined by the secret scalar's prefix.

An observer with per-ladder-step resolution recovers the 251-bit clamped private scalar. This is a per-step leak, not an aggregate one: an instrumented code proof-of-concept recovers 20/20 test keys from 32 observed operations, and an observer that counts libgmp calls instead of timing them recovers a key from a single operation.

This is not a low-order-input issue. Recovery works with the RFC 7748 base point u = 9, with no attacker-chosen input at all. Rejecting low-order public values does not close it.

2. Affected component

Confirmed on phpseclib 3.0.56 (338 files under phpseclib/,sha256(sorted(relpath NUL file_sha256 LF)) = cc7250b611f520e809131aab0931503457c44d8cbfb10d535251c6fec5f62a2b). The code appears unchanged across the 3.0 series wherever Curve25519 is supported, please confirm the affected range.

| file:line | role | |---|---| | Math/PrimeField/Integer.php:189 | add() — conditional subtract($modulo) when the sum ≥ p | | Math/PrimeField/Integer.php:207 | subtract() — conditional add($modulo) when the result is negative | | Crypt/EC/BaseCurves/Montgomery.php:229–234 | ladder branch on the secret bit, selecting argument order of doubleAndAddPoint | | Crypt/EC/Formats/Keys/MontgomeryPrivate.php:66 | multiplyPoint(getBasePoint(), dA) — no engine check of any kind | | Crypt/EC/Formats/Keys/PKCS8.php:194–200 | the same derivation, correctly gated on ext-sodium — the pattern MontgomeryPrivate is missing |

3. Technical description

Operation counts in the ladder are already constant — 10 field multiplications, 4 additions and 4 subtractions per step, 2560 multiplications per 256-step ladder. Operand values are not. Each PrimeField\Integer::add() / subtract() takes a data-dependent branch costing ~0.85–1.0 µs on the GMP engine, against a ~32 µs step period, so per-step cost is α + β·c where c is that step's conditional-reduction count. Measured across 20 keys: R² = 0.91–0.98, β = 838–920 ns.

c depends on the whole scalar prefix, not on the current bit, so per-step thresholding is useless — it saturates at ~93% per bit for u = p−1 and at chance for u = 9, and recovers 0/20 keys either way, because the bit string is a prefix-XOR in which one flipped step inverts the entire tail. Conditioning on the prefix removes the ambiguity: a beam search replays both branches from each candidate ladder state, reads off the exact c for each, and scores against the observation. The victim's public key adjudicates the small residual search.

Two facts bound the problem and are worth stating precisely, because they determine whether a fix is needed at all:

  • Aggregate observation is provably useless. The adjacent-bit transition count T(k) has exact entropy H(T) = 4.0357 bits over clamped scalars, so a noiseless transition-count oracle still leaves ~2^247 candidates. The summed reduction count Σc is richer (~6.6–6.9 bits) and still leaves ~2^244. Any measurement that collapses the call to one number is safe. Per-step measurement is not.
  • The libgmp call counts are exactly determined. Per ladder step, __gmpz_add = 4 + csub, __gmpz_sub = 4 + cadd, __gmpz_mul = __gmpz_mod = 10. Verified by differencing gdb breakpoint counts against phpseclib's own doubleAndAddPoint — 27/27 steps exact, extended independently to 64/64 and 38/38 by our two reviewers. An observer that only counts these calls needs no timing, no calibration and no repetition.

Results, 20 keys × 3 sampling seeds, 800 traces per path collected from 800 distinct PHP processes (so the observations are…

Record
GHSA-q97c-8qh3-fpc6
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-208, CWE-385
Updated
2026-11-02
NVD 6.3

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
CVE-2026-84308
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-208, CWE-385
Updated
2026-11-02
OSV 6.3

phpseclib — non-constant-time X25519 scalar multiplication permits full private-key recovery

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
CVE-2026-84308
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-208, CWE-385
Updated
2026-11-02
OSVDEBIAN-CVE-2026-84308 6.3

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
DEBIAN-CVE-2026-84308
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
OSVGHSA-q97c-8qh3-fpc6 6.3

phpseclib — non-constant-time X25519 scalar multiplication permits full private-key recovery

The pure-PHP X25519 scalar multiplication in phpseclib is not constant-time. Field addition and subtraction each perform a data-dependent conditional modular reduction, so the cost of each Montgomery-ladder step is a linear function of that step's reduction count which is a quantity determined by the secret scalar's prefix.

An observer with per-ladder-step resolution recovers the 251-bit clamped private scalar. This is a per-step leak, not an aggregate one: an instrumented code proof-of-concept recovers 20/20 test keys from 32 observed operations, and an observer that counts libgmp calls instead of timing them recovers a key from a single operation.

This is not a low-order-input issue. Recovery works with the RFC 7748 base point u = 9, with no attacker-chosen input at all. Rejecting low-order public values does not close it.

2. Affected component

Confirmed on phpseclib 3.0.56 (338 files under phpseclib/,sha256(sorted(relpath NUL file_sha256 LF)) = cc7250b611f520e809131aab0931503457c44d8cbfb10d535251c6fec5f62a2b). The code appears unchanged across the 3.0 series wherever Curve25519 is supported, please confirm the affected range.

| file:line | role | |---|---| | Math/PrimeField/Integer.php:189 | add() — conditional subtract($modulo) when the sum ≥ p | | Math/PrimeField/Integer.php:207 | subtract() — conditional add($modulo) when the result is negative | | Crypt/EC/BaseCurves/Montgomery.php:229–234 | ladder branch on the secret bit, selecting argument order of doubleAndAddPoint | | Crypt/EC/Formats/Keys/MontgomeryPrivate.php:66 | multiplyPoint(getBasePoint(), dA) — no engine check of any kind | | Crypt/EC/Formats/Keys/PKCS8.php:194–200 | the same derivation, correctly gated on ext-sodium — the pattern MontgomeryPrivate is missing |

3. Technical description

Operation counts in the ladder are already constant — 10 field multiplications, 4 additions and 4 subtractions per step, 2560 multiplications per 256-step ladder. Operand values are not. Each PrimeField\Integer::add() / subtract() takes a data-dependent branch costing ~0.85–1.0 µs on the GMP engine, against a ~32 µs step period, so per-step cost is α + β·c where c is that step's conditional-reduction count. Measured across 20 keys: R² = 0.91–0.98, β = 838–920 ns.

c depends on the whole scalar prefix, not on the current bit, so per-step thresholding is useless — it saturates at ~93% per bit for u = p−1 and at chance for u = 9, and recovers 0/20 keys either way, because the bit string is a prefix-XOR in which one flipped step inverts the entire tail. Conditioning on the prefix removes the ambiguity: a beam search replays both branches from each candidate ladder state, reads off the exact c for each, and scores against the observation. The victim's public key adjudicates the small residual search.

Two facts bound the problem and are worth stating precisely, because they determine whether a fix is needed at all:

  • Aggregate observation is provably useless. The adjacent-bit transition count T(k) has exact entropy H(T) = 4.0357 bits over clamped scalars, so a noiseless transition-count oracle still leaves ~2^247 candidates. The summed reduction count Σc is richer (~6.6–6.9 bits) and still leaves ~2^244. Any measurement that collapses the call to one number is safe. Per-step measurement is not.
  • The libgmp call counts are exactly determined. Per ladder step, __gmpz_add = 4 + csub, __gmpz_sub = 4 + cadd, __gmpz_mul = __gmpz_mod = 10. Verified by differencing gdb breakpoint counts against phpseclib's own doubleAndAddPoint — 27/27 steps exact, extended independently to 64/64 and 38/38 by our two reviewers. An observer that only counts these calls needs no timing, no calibration and no repetition.

Results, 20 keys × 3 sampling seeds, 800 traces per path collected from 800 distinct PHP processes (so the observations are…

Record
GHSA-q97c-8qh3-fpc6
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-208, CWE-385
Updated
2026-11-02
OSVUBUNTU-CVE-2026-84308 6.3

phpseclib is a PHP secure communications library. Prior to 3.0.57 and 4.0.1, pure-PHP X25519 scalar multiplication in phpseclib/Math/PrimeField/Integer.php performs data-dependent conditional modular reductions in add() and subtract(). During the Montgomery ladder in phpseclib/Crypt/EC/BaseCurves/Montgomery.php, the reduction behavior of each step depends on the secret scalar prefix, creating per-step timing and libgmp call-count observations that can reveal a reused 251-bit clamped private scalar. The phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php derivation path invokes the pure-PHP multiplication without a native-engine check, while phpseclib/Crypt/EC/Formats/Keys/PKCS8.php reaches it when ext-sodium is unavailable. Exploitation requires a reused or long-lived X25519 private key, knowledge of the corresponding public key, execution of the pure-PHP path, and a local observer capable of resolving individual ladder steps or libgmp entry-point calls. Ephemeral X25519 keys, including phpseclib's normal SSH exchange path, are not affected. Recovery of the scalar permanently compromises operations that reuse that key. This issue is fixed in versions 3.0.57 and 4.0.1.

Record
UBUNTU-CVE-2026-84308
CVSS 3.1
6.3 MediumCVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
phpseclib/phpseclib
Packagist
before 3.0.57
3.0.57
phpseclib/phpseclib
Packagist
4.0.0 up to 4.0.1
4.0.1
php-phpseclib3
Debian:12
All versions, plus listed versions
3.0.19-13.0.19-1+deb12u13.0.19-1+deb12u23.0.19-1+deb12u33.0.19-1+deb12u4
Show 33 moreShow less
3.0.19-1+deb12u63.0.20-13.0.21-13.0.21-23.0.22-13.0.23-13.0.33-13.0.34-13.0.35-13.0.36-13.0.37-13.0.38-13.0.39-13.0.41-13.0.42-13.0.43-13.0.43-23.0.44-13.0.44-23.0.45-13.0.46-13.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-13.0.55-13.0.56-13.0.57-1
None known
php-phpseclib3
Debian:13
All versions, plus listed versions
3.0.43-23.0.43-2+deb13u13.0.43-2+deb13u33.0.44-13.0.44-2
Show 14 moreShow less
3.0.45-13.0.46-13.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-13.0.55-13.0.56-13.0.57-1
None known
php-phpseclib3
Debian:14
before 3.0.57-1, plus listed versions
3.0.43-23.0.44-13.0.44-23.0.45-13.0.46-1
Show 11 moreShow less
3.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-13.0.55-13.0.56-1
3.0.57-1
php-phpseclib4
Debian:14
before 4.0.1-1, plus listed versions
4.0.0-1
4.0.1-1
phpseclib/phpseclib
Packagist
before 3.0.57, plus listed versions
0.3.00.3.10.3.100.3.50.3.6
Show 45 moreShow less
0.3.70.3.80.3.91.0.01.0.11.0.101.0.111.0.121.0.131.0.141.0.151.0.161.0.171.0.181.0.191.0.21.0.201.0.211.0.221.0.231.0.241.0.251.0.261.0.271.0.281.0.291.0.31.0.301.0.41.0.51.0.61.0.71.0.81.0.92.0.02.0.12.0.102.0.112.0.122.0.132.0.142.0.152.0.162.0.172.0.18
3.0.57
php-phpseclib
Ubuntu:Pro:16.04:LTS
All versions, plus listed versions
2.0.1-12.0.1-1build12.0.1-1ubuntu0.1~esm12.0.1-1ubuntu0.1~esm2
None known
phpseclib
Ubuntu:Pro:16.04:LTS
All versions, plus listed versions
0.3.10-31.0.0-21.0.0-31.0.1-11.0.1-31.0.1-3ubuntu0.11.0.1-3ubuntu0.1+esm1
None known
php-phpseclib
Ubuntu:Pro:18.04:LTS
All versions, plus listed versions
2.0.6-12.0.7-12.0.9-12.0.9-1ubuntu0.1~esm22.0.9-1ubuntu0.1~esm3
None known
Show 15 moreShow less
Affected packages
PackageAffectedFixed
phpseclib
Ubuntu:Pro:18.04:LTS
All versions, plus listed versions
1.0.7-11.0.8-11.0.9-11.0.9-1ubuntu0.1~esm11.0.9-1ubuntu0.1~esm2
None known
php-phpseclib
Ubuntu:Pro:20.04:LTS
All versions, plus listed versions
2.0.21-22.0.23-22.0.23-2ubuntu0.1~esm22.0.23-2ubuntu0.1~esm3
None known
phpseclib
Ubuntu:Pro:20.04:LTS
All versions, plus listed versions
1.0.16-21.0.18-21.0.18-2ubuntu0.1~esm11.0.18-2ubuntu0.1~esm2
None known
php-phpseclib
Ubuntu:Pro:22.04:LTS
All versions, plus listed versions
2.0.30-2ubuntu12.0.34-12.0.35-12.0.36-12.0.36-1ubuntu0.1~esm22.0.36-1ubuntu0.1~esm3
None known
php-phpseclib3
Ubuntu:Pro:22.04:LTS
All versions, plus listed versions
3.0.9-13.0.10-13.0.12-23.0.13-13.0.13-1ubuntu0.1~esm1
None known
phpseclib
Ubuntu:22.04:LTS
All versions, plus listed versions
1.0.19-3ubuntu21.0.19-3ubuntu31.0.20-11.0.20-1ubuntu0.1~esm11.0.20-1+deb12u3build0.22.04.1
None known
php-phpseclib3
Ubuntu:24.04:LTS
All versions, plus listed versions
3.0.21-23.0.33-13.0.34-13.0.35-13.0.37-1
None known
php-phpseclib
Ubuntu:Pro:24.04:LTS
All versions, plus listed versions
2.0.44-12.0.45-12.0.46-12.0.47-12.0.47-1ubuntu0.1~esm1
None known
phpseclib
Ubuntu:Pro:24.04:LTS
All versions, plus listed versions
1.0.21-21.0.22-11.0.23-11.0.23-1ubuntu0.1~esm1
None known
php-phpseclib
Ubuntu:26.10
All versions, plus listed versions
2.0.51-12.0.54-12.0.55-1
None known
php-phpseclib3
Ubuntu:26.10
All versions, plus listed versions
3.0.49-1ubuntu13.0.57-1
None known
phpseclib
Ubuntu:26.10
All versions, plus listed versions
1.0.24-11.0.29-11.0.30-1
None known
php-phpseclib3
Ubuntu:26.04:LTS
All versions, plus listed versions
3.0.43-23.0.44-13.0.47-13.0.49-13.0.49-1ubuntu1
None known
php-phpseclib
Ubuntu:Pro:26.04:LTS
All versions, plus listed versions
2.0.48-32.0.49-12.0.51-12.0.51-1ubuntu0.1~esm1
None known
phpseclib
Ubuntu:Pro:26.04:LTS
All versions, plus listed versions
1.0.23-61.0.24-11.0.24-1ubuntu0.1~esm1
None known

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-84308 is a medium vulnerability (CVSS 6.3) in Phpseclib, published September 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.33%, the 25th percentile. Fixed in phpseclib/phpseclib 3.0.57.

References

Show 5 moreShow less
This page doesn't list everything

Left out here: 93 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open