From 3d7acde1833f7b78140feb0d2a349875c531d7a9 Mon Sep 17 00:00:00 2001 From: terrafrost Date: Sun, 26 May 2019 03:10:43 -0500 Subject: [PATCH 1/3] Tests/X509: add unit test for long tags --- tests/Unit/File/X509/X509Test.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Unit/File/X509/X509Test.php b/tests/Unit/File/X509/X509Test.php index 61362d11..6600872b 100644 --- a/tests/Unit/File/X509/X509Test.php +++ b/tests/Unit/File/X509/X509Test.php @@ -672,4 +672,22 @@ IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q== $this->assertFalse($x509->validateDate('Nov 22, 2018')); $this->assertTrue($x509->validateDate('Nov 22, 2012')); } + + public function testLongTag() + { + $x509 = new File_X509(); + $r = $x509->loadX509('-----BEGIN CERTIFICATE----- +MIIBjDCCATGgAwIBAgIJAJSiNCIEEiyyMAoGCCqGSM49BAMCMA0xCzAJBgNVBAMM +AkNBMB4XDTE5MDUwOTAzMTUzMFoXDTE5MDYwODAzMTUzMFowDTELMAkGA1UEAwwC +Q0FNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUU4K0R0TDM0Syt0 +RzZGR3o2QXJ2QzlySnlmN1Y5N09wY3ZWeG1IbjRXQStXc0E2L0dxLzZ1cUFBdG5Y +RDZOQUxsRVVSVFZCcmlvNjB4L0xZN1ZoTmx0UT09o1kwVzAgBgNVHQ4BAf8EFgQU +25GbjmtucxjEGkWrB2R6AB6/yrkwIgYDVR0jAQH/BBgwFoAU25GbjmtucxjEGkWr +B2R6AB6/yrkwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEA6ZB6 ++KlUM1ZXFrxtDxLWqp51myWDulWjnK6cl7b5AVgCIQCRdthTn8JlN5bRSnJ6qiCk +A9bhRA0cVk7bAEU2c44CYg== +-----END CERTIFICATE-----'); + + $this->assertInternalType('array', $r); + } } From 70c0a0ddf4311464eedef0011ed7b1f971a68de4 Mon Sep 17 00:00:00 2001 From: terrafrost Date: Sun, 26 May 2019 03:18:06 -0500 Subject: [PATCH 2/3] ASN1: correctly handle long tags --- phpseclib/File/ASN1.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/phpseclib/File/ASN1.php b/phpseclib/File/ASN1.php index d76306f9..abab574a 100644 --- a/phpseclib/File/ASN1.php +++ b/phpseclib/File/ASN1.php @@ -326,9 +326,10 @@ class File_ASN1 $tag = 0; // process septets (since the eighth bit is ignored, it's not an octet) do { - $loop = ord($encoded[0]) >> 7; + $temp = ord($encoded[$encoded_pos++]); + $loop = $temp >> 7; $tag <<= 7; - $tag |= ord($encoded[$encoded_pos++]) & 0x7F; + $tag |= $temp & 0x7F; $start++; } while ($loop); } From 9e31808f617ab3db74d2917249ee79c625d419af Mon Sep 17 00:00:00 2001 From: terrafrost Date: Sun, 26 May 2019 10:28:21 -0500 Subject: [PATCH 3/3] Tests/X509: fix for last unit test --- tests/Unit/File/X509/X509Test.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Unit/File/X509/X509Test.php b/tests/Unit/File/X509/X509Test.php index 6600872b..60509a68 100644 --- a/tests/Unit/File/X509/X509Test.php +++ b/tests/Unit/File/X509/X509Test.php @@ -673,10 +673,11 @@ IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q== $this->assertTrue($x509->validateDate('Nov 22, 2012')); } - public function testLongTag() + public function testLongTagOnBadCert() { + // the problem with this cert is that it'd cause an infinite loop $x509 = new File_X509(); - $r = $x509->loadX509('-----BEGIN CERTIFICATE----- + $r = @$x509->loadX509('-----BEGIN CERTIFICATE----- MIIBjDCCATGgAwIBAgIJAJSiNCIEEiyyMAoGCCqGSM49BAMCMA0xCzAJBgNVBAMM AkNBMB4XDTE5MDUwOTAzMTUzMFoXDTE5MDYwODAzMTUzMFowDTELMAkGA1UEAwwC Q0FNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUU4K0R0TDM0Syt0 @@ -688,6 +689,6 @@ B2R6AB6/yrkwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEA6ZB6 A9bhRA0cVk7bAEU2c44CYg== -----END CERTIFICATE-----'); - $this->assertInternalType('array', $r); + $this->assertFalse($r); } }