From c6ad2b69baf4d5916b9ab0de10488db8ae58d823 Mon Sep 17 00:00:00 2001 From: terrafrost Date: Mon, 22 Sep 2014 01:01:34 -0500 Subject: [PATCH] ASN1: fix issue with non-constructed context-specific tags --- phpseclib/File/ASN1.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/phpseclib/File/ASN1.php b/phpseclib/File/ASN1.php index 4bdf13ea..f4a7591e 100644 --- a/phpseclib/File/ASN1.php +++ b/phpseclib/File/ASN1.php @@ -347,10 +347,15 @@ class File_ASN1 case FILE_ASN1_CLASS_APPLICATION: case FILE_ASN1_CLASS_PRIVATE: case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: - $newcontent = $this->_decode_ber($content, $start); - $length = $newcontent['length']; - if (substr($content, $length, 2) == "\0\0") { - $length+= 2; + if ($constructed) { + $newcontent = $this->_decode_ber($content, $start); + $length = $newcontent['length']; + if (substr($content, $length, 2) == "\0\0") { + $length+= 2; + } + + // the array encapsulation is for BC with the old format + $content = array($newcontent); } $start+= $length; @@ -359,7 +364,7 @@ class File_ASN1 'type' => $class, 'constant' => $tag, // the array encapsulation is for BC with the old format - 'content' => array($newcontent), + 'content' => $content, // the only time when $content['headerlength'] isn't defined is when the length is indefinite. // the absence of $content['headerlength'] is how we know if something is indefinite or not. // technically, it could be defined to be 2 and then another indicator could be used but whatever. @@ -1343,4 +1348,4 @@ class File_ASN1 } return $out; } -} +} \ No newline at end of file