diff --git a/phpseclib/File/ASN1.php b/phpseclib/File/ASN1.php index ea693f10..3eb746a2 100644 --- a/phpseclib/File/ASN1.php +++ b/phpseclib/File/ASN1.php @@ -1136,6 +1136,11 @@ abstract class ASN1 $oid = []; $pos = 0; $len = strlen($content); + // see https://github.com/openjdk/jdk/blob/2deb318c9f047ec5a4b160d66a4b52f93688ec42/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java#L55 + if ($len > 4096) { + //throw new \RuntimeException("Object identifier size is limited to 4096 bytes ($len bytes present)"); + return false; + } if (ord($content[$len - 1]) & 0x80) { return false; diff --git a/phpseclib/Math/BigInteger/Engines/Engine.php b/phpseclib/Math/BigInteger/Engines/Engine.php index 887a000d..bc6636be 100644 --- a/phpseclib/Math/BigInteger/Engines/Engine.php +++ b/phpseclib/Math/BigInteger/Engines/Engine.php @@ -593,7 +593,7 @@ abstract class Engine implements \JsonSerializable */ public function getLengthInBytes(): int { - return strlen($this->toBytes()); + return (int) ceil($this->getLength() / 8); } /** diff --git a/phpseclib/Math/BigInteger/Engines/PHP.php b/phpseclib/Math/BigInteger/Engines/PHP.php index 961c04c0..d9d4d645 100644 --- a/phpseclib/Math/BigInteger/Engines/PHP.php +++ b/phpseclib/Math/BigInteger/Engines/PHP.php @@ -1251,4 +1251,17 @@ abstract class PHP extends Engine } return false; } + + /** + * Return the size of a BigInteger in bits + * + * @return int + */ + public function getLength() + { + $max = count($this->value) - 1; + return $max != -1 ? + $max * static::BASE + intval(ceil(log($this->value[$max] + 1, 2))) : + 0; + } } diff --git a/tests/Unit/File/ASN1/mal-cert-02.der b/tests/Unit/File/ASN1/mal-cert-02.der new file mode 100644 index 00000000..981c3557 Binary files /dev/null and b/tests/Unit/File/ASN1/mal-cert-02.der differ diff --git a/tests/Unit/File/ASN1Test.php b/tests/Unit/File/ASN1Test.php index 9c7e3f4a..70e415bf 100644 --- a/tests/Unit/File/ASN1Test.php +++ b/tests/Unit/File/ASN1Test.php @@ -452,4 +452,15 @@ class ASN1Test extends PhpseclibTestCase $decoded = ASN1::decodeBER($em); $this->assertNull($decoded); } + + public function testLongOID() + { + $cert = file_get_contents(dirname(__FILE__) . '/ASN1/mal-cert-02.der'); + + $decoded = ASN1::decodeBER($cert); + $this->assertNull($decoded); + + //$x509 = new X509(); + //$x509->loadX509($cert); + } }