Moved global constants into class constants and updated all references

This commit is contained in:
Clint Nelissen 2014-12-03 18:08:22 -08:00
parent b771ca36cf
commit a9925941b0
3 changed files with 510 additions and 510 deletions

View File

@ -23,72 +23,6 @@
use \phpseclib\Math\BigInteger; use \phpseclib\Math\BigInteger;
/**#@+
* Tag Classes
*
* @access private
* @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12
*/
define('FILE_ASN1_CLASS_UNIVERSAL', 0);
define('FILE_ASN1_CLASS_APPLICATION', 1);
define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2);
define('FILE_ASN1_CLASS_PRIVATE', 3);
/**#@-*/
/**#@+
* Tag Classes
*
* @access private
* @link http://www.obj-sys.com/asn1tutorial/node124.html
*/
define('FILE_ASN1_TYPE_BOOLEAN', 1);
define('FILE_ASN1_TYPE_INTEGER', 2);
define('FILE_ASN1_TYPE_BIT_STRING', 3);
define('FILE_ASN1_TYPE_OCTET_STRING', 4);
define('FILE_ASN1_TYPE_NULL', 5);
define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6);
//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7);
//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL
define('FILE_ASN1_TYPE_REAL', 9);
define('FILE_ASN1_TYPE_ENUMERATED', 10);
//define('FILE_ASN1_TYPE_EMBEDDED', 11);
define('FILE_ASN1_TYPE_UTF8_STRING', 12);
//define('FILE_ASN1_TYPE_RELATIVE_OID', 13);
define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF
define('FILE_ASN1_TYPE_SET', 17); // SET OF
/**#@-*/
/**#@+
* More Tag Classes
*
* @access private
* @link http://www.obj-sys.com/asn1tutorial/node10.html
*/
define('FILE_ASN1_TYPE_NUMERIC_STRING', 18);
define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19);
define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String
define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21);
define('FILE_ASN1_TYPE_IA5_STRING', 22);
define('FILE_ASN1_TYPE_UTC_TIME', 23);
define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24);
define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25);
define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String
define('FILE_ASN1_TYPE_GENERAL_STRING', 27);
define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28);
//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29);
define('FILE_ASN1_TYPE_BMP_STRING', 30);
/**#@-*/
/**#@+
* Tag Aliases
*
* These tags are kinda place holders for other tags.
*
* @access private
*/
define('FILE_ASN1_TYPE_CHOICE', -1);
define('FILE_ASN1_TYPE_ANY', -2);
/**#@-*/
/** /**
* Include File_ASN1_Element * Include File_ASN1_Element
*/ */
@ -105,6 +39,72 @@ if (!class_exists('File_ASN1_Element')) {
*/ */
class File_ASN1 class File_ASN1
{ {
/**#@+
* Tag Classes
*
* @access private
* @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12
*/
const CLASS_UNIVERSAL = 0;
const CLASS_APPLICATION = 1;
const CLASS_CONTEXT_SPECIFIC = 2;
const CLASS_PRIVATE = 3;
/**#@-*/
/**#@+
* Tag Classes
*
* @access private
* @link http://www.obj-sys.com/asn1tutorial/node124.html
*/
const TYPE_BOOLEAN = 1;
const TYPE_INTEGER = 2;
const TYPE_BIT_STRING = 3;
const TYPE_OCTET_STRING = 4;
const TYPE_NULL = 5;
const TYPE_OBJECT_IDENTIFIER = 6;
//const TYPE_OBJECT_DESCRIPTOR = 7;
//const TYPE_INSTANCE_OF = 8; // EXTERNAL
const TYPE_REAL = 9;
const TYPE_ENUMERATED = 10;
//const TYPE_EMBEDDED = 11;
const TYPE_UTF8_STRING = 12;
//const TYPE_RELATIVE_OID = 13;
const TYPE_SEQUENCE = 16; // SEQUENCE OF
const TYPE_SET = 17; // SET OF
/**#@-*/
/**#@+
* More Tag Classes
*
* @access private
* @link http://www.obj-sys.com/asn1tutorial/node10.html
*/
const TYPE_NUMERIC_STRING = 18;
const TYPE_PRINTABLE_STRING = 19;
const TYPE_TELETEX_STRING = 20; // T61String
const TYPE_VIDEOTEX_STRING = 21;
const TYPE_IA5_STRING = 22;
const TYPE_UTC_TIME = 23;
const TYPE_GENERALIZED_TIME = 24;
const TYPE_GRAPHIC_STRING = 25;
const TYPE_VISIBLE_STRING = 26; // ISO646String
const TYPE_GENERAL_STRING = 27;
const TYPE_UNIVERSAL_STRING = 28;
//const TYPE_CHARACTER_STRING = 29;
const TYPE_BMP_STRING = 30;
/**#@-*/
/**#@+
* Tag Aliases
*
* These tags are kinda place holders for other tags.
*
* @access private
*/
const TYPE_CHOICE = -1;
const TYPE_ANY = -2;
/**#@-*/
/** /**
* ASN.1 object identifier * ASN.1 object identifier
* *
@ -137,7 +137,7 @@ class File_ASN1
/** /**
* Filters * Filters
* *
* If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as? * If the mapping type is self::TYPE_ANY what do we actually encode it as?
* *
* @var Array * @var Array
* @access private * @access private
@ -148,7 +148,7 @@ class File_ASN1
/** /**
* Type mapping table for the ANY type. * Type mapping table for the ANY type.
* *
* Structured or unknown types are mapped to a FILE_ASN1_Element. * Structured or unknown types are mapped to a File\ASN1\Element.
* Unambiguous types get the direct mapping (int/real/bool). * Unambiguous types get the direct mapping (int/real/bool).
* Others are mapped as a choice, with an extra indexing level. * Others are mapped as a choice, with an extra indexing level.
* *
@ -156,28 +156,28 @@ class File_ASN1
* @access public * @access public
*/ */
var $ANYmap = array( var $ANYmap = array(
FILE_ASN1_TYPE_BOOLEAN => true, self::TYPE_BOOLEAN => true,
FILE_ASN1_TYPE_INTEGER => true, self::TYPE_INTEGER => true,
FILE_ASN1_TYPE_BIT_STRING => 'bitString', self::TYPE_BIT_STRING => 'bitString',
FILE_ASN1_TYPE_OCTET_STRING => 'octetString', self::TYPE_OCTET_STRING => 'octetString',
FILE_ASN1_TYPE_NULL => 'null', self::TYPE_NULL => 'null',
FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', self::TYPE_OBJECT_IDENTIFIER => 'objectIdentifier',
FILE_ASN1_TYPE_REAL => true, self::TYPE_REAL => true,
FILE_ASN1_TYPE_ENUMERATED => 'enumerated', self::TYPE_ENUMERATED => 'enumerated',
FILE_ASN1_TYPE_UTF8_STRING => 'utf8String', self::TYPE_UTF8_STRING => 'utf8String',
FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString', self::TYPE_NUMERIC_STRING => 'numericString',
FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString', self::TYPE_PRINTABLE_STRING => 'printableString',
FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString', self::TYPE_TELETEX_STRING => 'teletexString',
FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString', self::TYPE_VIDEOTEX_STRING => 'videotexString',
FILE_ASN1_TYPE_IA5_STRING => 'ia5String', self::TYPE_IA5_STRING => 'ia5String',
FILE_ASN1_TYPE_UTC_TIME => 'utcTime', self::TYPE_UTC_TIME => 'utcTime',
FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime', self::TYPE_GENERALIZED_TIME => 'generalTime',
FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString', self::TYPE_GRAPHIC_STRING => 'graphicString',
FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString', self::TYPE_VISIBLE_STRING => 'visibleString',
FILE_ASN1_TYPE_GENERAL_STRING => 'generalString', self::TYPE_GENERAL_STRING => 'generalString',
FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString', self::TYPE_UNIVERSAL_STRING => 'universalString',
//FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString', //self::TYPE_CHARACTER_STRING => 'characterString',
FILE_ASN1_TYPE_BMP_STRING => 'bmpString' self::TYPE_BMP_STRING => 'bmpString'
); );
/** /**
@ -190,13 +190,13 @@ class File_ASN1
* @access public * @access public
*/ */
var $stringTypeSize = array( var $stringTypeSize = array(
FILE_ASN1_TYPE_UTF8_STRING => 0, self::TYPE_UTF8_STRING => 0,
FILE_ASN1_TYPE_BMP_STRING => 2, self::TYPE_BMP_STRING => 2,
FILE_ASN1_TYPE_UNIVERSAL_STRING => 4, self::TYPE_UNIVERSAL_STRING => 4,
FILE_ASN1_TYPE_PRINTABLE_STRING => 1, self::TYPE_PRINTABLE_STRING => 1,
FILE_ASN1_TYPE_TELETEX_STRING => 1, self::TYPE_TELETEX_STRING => 1,
FILE_ASN1_TYPE_IA5_STRING => 1, self::TYPE_IA5_STRING => 1,
FILE_ASN1_TYPE_VISIBLE_STRING => 1, self::TYPE_VISIBLE_STRING => 1,
); );
/** /**
@ -223,8 +223,8 @@ class File_ASN1
* Parse BER-encoding (Helper function) * Parse BER-encoding (Helper function)
* *
* Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode.
* $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and * $encoded is passed by reference for the recursive calls done for self::TYPE_BIT_STRING and
* FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used. * self::TYPE_OCTET_STRING. In those cases, the indefinite length is used.
* *
* @param String $encoded * @param String $encoded
* @param Integer $start * @param Integer $start
@ -287,9 +287,9 @@ class File_ASN1
-- http://www.obj-sys.com/asn1tutorial/node12.html */ -- http://www.obj-sys.com/asn1tutorial/node12.html */
$class = ($type >> 6) & 3; $class = ($type >> 6) & 3;
switch ($class) { switch ($class) {
case FILE_ASN1_CLASS_APPLICATION: case self::CLASS_APPLICATION:
case FILE_ASN1_CLASS_PRIVATE: case self::CLASS_PRIVATE:
case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: case self::CLASS_CONTEXT_SPECIFIC:
if ($constructed) { if ($constructed) {
$newcontent = $this->_decode_ber($content, $start); $newcontent = $this->_decode_ber($content, $start);
$length = $newcontent['length']; $length = $newcontent['length'];
@ -319,20 +319,20 @@ class File_ASN1
// decode UNIVERSAL tags // decode UNIVERSAL tags
switch ($tag) { switch ($tag) {
case FILE_ASN1_TYPE_BOOLEAN: case self::TYPE_BOOLEAN:
// "The contents octets shall consist of a single octet." -- paragraph 8.2.1 // "The contents octets shall consist of a single octet." -- paragraph 8.2.1
//if (strlen($content) != 1) { //if (strlen($content) != 1) {
// return false; // return false;
//} //}
$current['content'] = (bool) ord($content[0]); $current['content'] = (bool) ord($content[0]);
break; break;
case FILE_ASN1_TYPE_INTEGER: case self::TYPE_INTEGER:
case FILE_ASN1_TYPE_ENUMERATED: case self::TYPE_ENUMERATED:
$current['content'] = new BigInteger($content, -256); $current['content'] = new BigInteger($content, -256);
break; break;
case FILE_ASN1_TYPE_REAL: // not currently supported case self::TYPE_REAL: // not currently supported
return false; return false;
case FILE_ASN1_TYPE_BIT_STRING: case self::TYPE_BIT_STRING:
// The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit,
// the number of unused bits in the final subsequent octet. The number shall be in the range zero to // the number of unused bits in the final subsequent octet. The number shall be in the range zero to
// seven. // seven.
@ -344,19 +344,19 @@ class File_ASN1
$last = count($temp) - 1; $last = count($temp) - 1;
for ($i = 0; $i < $last; $i++) { for ($i = 0; $i < $last; $i++) {
// all subtags should be bit strings // all subtags should be bit strings
//if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) { //if ($temp[$i]['type'] != self::TYPE_BIT_STRING) {
// return false; // return false;
//} //}
$current['content'].= substr($temp[$i]['content'], 1); $current['content'].= substr($temp[$i]['content'], 1);
} }
// all subtags should be bit strings // all subtags should be bit strings
//if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) { //if ($temp[$last]['type'] != self::TYPE_BIT_STRING) {
// return false; // return false;
//} //}
$current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1);
} }
break; break;
case FILE_ASN1_TYPE_OCTET_STRING: case self::TYPE_OCTET_STRING:
if (!$constructed) { if (!$constructed) {
$current['content'] = $content; $current['content'] = $content;
} else { } else {
@ -366,7 +366,7 @@ class File_ASN1
$temp = $this->_decode_ber($content, $length + $start); $temp = $this->_decode_ber($content, $length + $start);
$this->_string_shift($content, $temp['length']); $this->_string_shift($content, $temp['length']);
// all subtags should be octet strings // all subtags should be octet strings
//if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) { //if ($temp['type'] != self::TYPE_OCTET_STRING) {
// return false; // return false;
//} //}
$current['content'].= $temp['content']; $current['content'].= $temp['content'];
@ -377,14 +377,14 @@ class File_ASN1
} }
} }
break; break;
case FILE_ASN1_TYPE_NULL: case self::TYPE_NULL:
// "The contents octets shall not contain any octets." -- paragraph 8.8.2 // "The contents octets shall not contain any octets." -- paragraph 8.8.2
//if (strlen($content)) { //if (strlen($content)) {
// return false; // return false;
//} //}
break; break;
case FILE_ASN1_TYPE_SEQUENCE: case self::TYPE_SEQUENCE:
case FILE_ASN1_TYPE_SET: case self::TYPE_SET:
$offset = 0; $offset = 0;
$current['content'] = array(); $current['content'] = array();
while (strlen($content)) { while (strlen($content)) {
@ -400,7 +400,7 @@ class File_ASN1
$offset+= $temp['length']; $offset+= $temp['length'];
} }
break; break;
case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: case self::TYPE_OBJECT_IDENTIFIER:
$temp = ord($this->_string_shift($content)); $temp = ord($this->_string_shift($content));
$current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40); $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40);
$valuen = 0; $valuen = 0;
@ -426,31 +426,31 @@ class File_ASN1
Per that, we're not going to do any validation. If there are any illegal characters in the string, Per that, we're not going to do any validation. If there are any illegal characters in the string,
we don't really care */ we don't really care */
case FILE_ASN1_TYPE_NUMERIC_STRING: case self::TYPE_NUMERIC_STRING:
// 0,1,2,3,4,5,6,7,8,9, and space // 0,1,2,3,4,5,6,7,8,9, and space
case FILE_ASN1_TYPE_PRINTABLE_STRING: case self::TYPE_PRINTABLE_STRING:
// Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma,
// hyphen, full stop, solidus, colon, equal sign, question mark // hyphen, full stop, solidus, colon, equal sign, question mark
case FILE_ASN1_TYPE_TELETEX_STRING: case self::TYPE_TELETEX_STRING:
// The Teletex character set in CCITT's T61, space, and delete // The Teletex character set in CCITT's T61, space, and delete
// see http://en.wikipedia.org/wiki/Teletex#Character_sets // see http://en.wikipedia.org/wiki/Teletex#Character_sets
case FILE_ASN1_TYPE_VIDEOTEX_STRING: case self::TYPE_VIDEOTEX_STRING:
// The Videotex character set in CCITT's T.100 and T.101, space, and delete // The Videotex character set in CCITT's T.100 and T.101, space, and delete
case FILE_ASN1_TYPE_VISIBLE_STRING: case self::TYPE_VISIBLE_STRING:
// Printing character sets of international ASCII, and space // Printing character sets of international ASCII, and space
case FILE_ASN1_TYPE_IA5_STRING: case self::TYPE_IA5_STRING:
// International Alphabet 5 (International ASCII) // International Alphabet 5 (International ASCII)
case FILE_ASN1_TYPE_GRAPHIC_STRING: case self::TYPE_GRAPHIC_STRING:
// All registered G sets, and space // All registered G sets, and space
case FILE_ASN1_TYPE_GENERAL_STRING: case self::TYPE_GENERAL_STRING:
// All registered C and G sets, space and delete // All registered C and G sets, space and delete
case FILE_ASN1_TYPE_UTF8_STRING: case self::TYPE_UTF8_STRING:
// ???? // ????
case FILE_ASN1_TYPE_BMP_STRING: case self::TYPE_BMP_STRING:
$current['content'] = $content; $current['content'] = $content;
break; break;
case FILE_ASN1_TYPE_UTC_TIME: case self::TYPE_UTC_TIME:
case FILE_ASN1_TYPE_GENERALIZED_TIME: case self::TYPE_GENERALIZED_TIME:
$current['content'] = $this->_decodeTime($content, $tag); $current['content'] = $this->_decodeTime($content, $tag);
default: default:
} }
@ -481,7 +481,7 @@ class File_ASN1
} }
switch (true) { switch (true) {
case $mapping['type'] == FILE_ASN1_TYPE_ANY: case $mapping['type'] == self::TYPE_ANY:
$intype = $decoded['type']; $intype = $decoded['type'];
if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) { if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) {
return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length'])); return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length']));
@ -491,14 +491,14 @@ class File_ASN1
return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special)); return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special));
} }
break; break;
case $mapping['type'] == FILE_ASN1_TYPE_CHOICE: case $mapping['type'] == self::TYPE_CHOICE:
foreach ($mapping['children'] as $key => $option) { foreach ($mapping['children'] as $key => $option) {
switch (true) { switch (true) {
case isset($option['constant']) && $option['constant'] == $decoded['constant']: case isset($option['constant']) && $option['constant'] == $decoded['constant']:
case !isset($option['constant']) && $option['type'] == $decoded['type']: case !isset($option['constant']) && $option['type'] == $decoded['type']:
$value = $this->asn1map($decoded, $option, $special); $value = $this->asn1map($decoded, $option, $special);
break; break;
case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE: case !isset($option['constant']) && $option['type'] == self::TYPE_CHOICE:
$v = $this->asn1map($decoded, $option, $special); $v = $this->asn1map($decoded, $option, $special);
if (isset($v)) { if (isset($v)) {
$value = $v; $value = $v;
@ -520,8 +520,8 @@ class File_ASN1
// if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings,
// let it through // let it through
switch (true) { switch (true) {
case $decoded['type'] < 18: // FILE_ASN1_TYPE_NUMERIC_STRING == 18 case $decoded['type'] < 18: // self::TYPE_NUMERIC_STRING == 18
case $decoded['type'] > 30: // FILE_ASN1_TYPE_BMP_STRING == 30 case $decoded['type'] > 30: // self::TYPE_BMP_STRING == 30
case $mapping['type'] < 18: case $mapping['type'] < 18:
case $mapping['type'] > 30: case $mapping['type'] > 30:
return null; return null;
@ -533,7 +533,7 @@ class File_ASN1
} }
switch ($decoded['type']) { switch ($decoded['type']) {
case FILE_ASN1_TYPE_SEQUENCE: case self::TYPE_SEQUENCE:
$map = array(); $map = array();
// ignore the min and max // ignore the min and max
@ -556,18 +556,18 @@ class File_ASN1
if ($maymatch) { if ($maymatch) {
$temp = $decoded['content'][$i]; $temp = $decoded['content'][$i];
if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { if ($child['type'] != self::TYPE_CHOICE) {
// Get the mapping and input class & constant. // Get the mapping and input class & constant.
$childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL; $childClass = $tempClass = self::CLASS_UNIVERSAL;
$constant = null; $constant = null;
if (isset($temp['constant'])) { if (isset($temp['constant'])) {
$tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; $tempClass = isset($temp['class']) ? $temp['class'] : self::CLASS_CONTEXT_SPECIFIC;
} }
if (isset($child['class'])) { if (isset($child['class'])) {
$childClass = $child['class']; $childClass = $child['class'];
$constant = $child['cast']; $constant = $child['cast'];
} elseif (isset($child['constant'])) { } elseif (isset($child['constant'])) {
$childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; $childClass = self::CLASS_CONTEXT_SPECIFIC;
$constant = $child['constant']; $constant = $child['constant'];
} }
@ -576,7 +576,7 @@ class File_ASN1
$maymatch = $constant == $temp['constant'] && $childClass == $tempClass; $maymatch = $constant == $temp['constant'] && $childClass == $tempClass;
} else { } else {
// Can only match if no constant expected and type matches or is generic. // Can only match if no constant expected and type matches or is generic.
$maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], self::TYPE_ANY, self::TYPE_CHOICE)) !== false;
} }
} }
} }
@ -605,7 +605,7 @@ class File_ASN1
return $i < $n? null: $map; return $i < $n? null: $map;
// the main diff between sets and sequences is the encapsulation of the foreach in another for loop // the main diff between sets and sequences is the encapsulation of the foreach in another for loop
case FILE_ASN1_TYPE_SET: case self::TYPE_SET:
$map = array(); $map = array();
// ignore the min and max // ignore the min and max
@ -622,9 +622,9 @@ class File_ASN1
for ($i = 0; $i < count($decoded['content']); $i++) { for ($i = 0; $i < count($decoded['content']); $i++) {
$temp = $decoded['content'][$i]; $temp = $decoded['content'][$i];
$tempClass = FILE_ASN1_CLASS_UNIVERSAL; $tempClass = self::CLASS_UNIVERSAL;
if (isset($temp['constant'])) { if (isset($temp['constant'])) {
$tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; $tempClass = isset($temp['class']) ? $temp['class'] : self::CLASS_CONTEXT_SPECIFIC;
} }
foreach ($mapping['children'] as $key => $child) { foreach ($mapping['children'] as $key => $child) {
@ -632,14 +632,14 @@ class File_ASN1
continue; continue;
} }
$maymatch = true; $maymatch = true;
if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { if ($child['type'] != self::TYPE_CHOICE) {
$childClass = FILE_ASN1_CLASS_UNIVERSAL; $childClass = self::CLASS_UNIVERSAL;
$constant = null; $constant = null;
if (isset($child['class'])) { if (isset($child['class'])) {
$childClass = $child['class']; $childClass = $child['class'];
$constant = $child['cast']; $constant = $child['cast'];
} elseif (isset($child['constant'])) { } elseif (isset($child['constant'])) {
$childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; $childClass = self::CLASS_CONTEXT_SPECIFIC;
$constant = $child['constant']; $constant = $child['constant'];
} }
@ -648,7 +648,7 @@ class File_ASN1
$maymatch = $constant == $temp['constant'] && $childClass == $tempClass; $maymatch = $constant == $temp['constant'] && $childClass == $tempClass;
} else { } else {
// Can only match if no constant expected and type matches or is generic. // Can only match if no constant expected and type matches or is generic.
$maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], self::TYPE_ANY, self::TYPE_CHOICE)) !== false;
} }
} }
@ -681,15 +681,15 @@ class File_ASN1
} }
} }
return $map; return $map;
case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: case self::TYPE_OBJECT_IDENTIFIER:
return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content']; return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content'];
case FILE_ASN1_TYPE_UTC_TIME: case self::TYPE_UTC_TIME:
case FILE_ASN1_TYPE_GENERALIZED_TIME: case self::TYPE_GENERALIZED_TIME:
if (isset($mapping['implicit'])) { if (isset($mapping['implicit'])) {
$decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']); $decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']);
} }
return @date($this->format, $decoded['content']); return @date($this->format, $decoded['content']);
case FILE_ASN1_TYPE_BIT_STRING: case self::TYPE_BIT_STRING:
if (isset($mapping['mapping'])) { if (isset($mapping['mapping'])) {
$offset = ord($decoded['content'][0]); $offset = ord($decoded['content'][0]);
$size = (strlen($decoded['content']) - 1) * 8 - $offset; $size = (strlen($decoded['content']) - 1) * 8 - $offset;
@ -718,26 +718,26 @@ class File_ASN1
} }
return $values; return $values;
} }
case FILE_ASN1_TYPE_OCTET_STRING: case self::TYPE_OCTET_STRING:
return base64_encode($decoded['content']); return base64_encode($decoded['content']);
case FILE_ASN1_TYPE_NULL: case self::TYPE_NULL:
return ''; return '';
case FILE_ASN1_TYPE_BOOLEAN: case self::TYPE_BOOLEAN:
return $decoded['content']; return $decoded['content'];
case FILE_ASN1_TYPE_NUMERIC_STRING: case self::TYPE_NUMERIC_STRING:
case FILE_ASN1_TYPE_PRINTABLE_STRING: case self::TYPE_PRINTABLE_STRING:
case FILE_ASN1_TYPE_TELETEX_STRING: case self::TYPE_TELETEX_STRING:
case FILE_ASN1_TYPE_VIDEOTEX_STRING: case self::TYPE_VIDEOTEX_STRING:
case FILE_ASN1_TYPE_IA5_STRING: case self::TYPE_IA5_STRING:
case FILE_ASN1_TYPE_GRAPHIC_STRING: case self::TYPE_GRAPHIC_STRING:
case FILE_ASN1_TYPE_VISIBLE_STRING: case self::TYPE_VISIBLE_STRING:
case FILE_ASN1_TYPE_GENERAL_STRING: case self::TYPE_GENERAL_STRING:
case FILE_ASN1_TYPE_UNIVERSAL_STRING: case self::TYPE_UNIVERSAL_STRING:
case FILE_ASN1_TYPE_UTF8_STRING: case self::TYPE_UTF8_STRING:
case FILE_ASN1_TYPE_BMP_STRING: case self::TYPE_BMP_STRING:
return $decoded['content']; return $decoded['content'];
case FILE_ASN1_TYPE_INTEGER: case self::TYPE_INTEGER:
case FILE_ASN1_TYPE_ENUMERATED: case self::TYPE_ENUMERATED:
$temp = $decoded['content']; $temp = $decoded['content'];
if (isset($mapping['implicit'])) { if (isset($mapping['implicit'])) {
$temp = new BigInteger($decoded['content'], -256); $temp = new BigInteger($decoded['content'], -256);
@ -802,8 +802,8 @@ class File_ASN1
$tag = $mapping['type']; $tag = $mapping['type'];
switch ($tag) { switch ($tag) {
case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence. case self::TYPE_SET: // Children order is not important, thus process in sequence.
case FILE_ASN1_TYPE_SEQUENCE: case self::TYPE_SEQUENCE:
$tag|= 0x20; // set the constructed bit $tag|= 0x20; // set the constructed bit
$value = ''; $value = '';
@ -851,18 +851,18 @@ class File_ASN1
AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or
an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)."
*/ */
if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) {
$subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']);
$temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp;
} else { } else {
$subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']);
$temp = $subtag . substr($temp, 1); $temp = $subtag . substr($temp, 1);
} }
} }
$value.= $temp; $value.= $temp;
} }
break; break;
case FILE_ASN1_TYPE_CHOICE: case self::TYPE_CHOICE:
$temp = false; $temp = false;
foreach ($mapping['children'] as $key => $child) { foreach ($mapping['children'] as $key => $child) {
@ -885,11 +885,11 @@ class File_ASN1
// if isset($child['constant']) is true then isset($child['optional']) should be true as well // if isset($child['constant']) is true then isset($child['optional']) should be true as well
if (isset($child['constant'])) { if (isset($child['constant'])) {
if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) {
$subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']);
$temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp;
} else { } else {
$subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']);
$temp = $subtag . substr($temp, 1); $temp = $subtag . substr($temp, 1);
} }
} }
@ -904,8 +904,8 @@ class File_ASN1
} }
return $temp; return $temp;
case FILE_ASN1_TYPE_INTEGER: case self::TYPE_INTEGER:
case FILE_ASN1_TYPE_ENUMERATED: case self::TYPE_ENUMERATED:
if (!isset($mapping['mapping'])) { if (!isset($mapping['mapping'])) {
if (is_numeric($source)) { if (is_numeric($source)) {
$source = new BigInteger($source); $source = new BigInteger($source);
@ -923,13 +923,13 @@ class File_ASN1
$value = chr(0); $value = chr(0);
} }
break; break;
case FILE_ASN1_TYPE_UTC_TIME: case self::TYPE_UTC_TIME:
case FILE_ASN1_TYPE_GENERALIZED_TIME: case self::TYPE_GENERALIZED_TIME:
$format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y'; $format = $mapping['type'] == self::TYPE_UTC_TIME ? 'y' : 'Y';
$format.= 'mdHis'; $format.= 'mdHis';
$value = @gmdate($format, strtotime($source)) . 'Z'; $value = @gmdate($format, strtotime($source)) . 'Z';
break; break;
case FILE_ASN1_TYPE_BIT_STRING: case self::TYPE_BIT_STRING:
if (isset($mapping['mapping'])) { if (isset($mapping['mapping'])) {
$bits = array_fill(0, count($mapping['mapping']), 0); $bits = array_fill(0, count($mapping['mapping']), 0);
$size = 0; $size = 0;
@ -961,14 +961,14 @@ class File_ASN1
break; break;
} }
case FILE_ASN1_TYPE_OCTET_STRING: case self::TYPE_OCTET_STRING:
/* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit,
the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven.
-- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */
$value = base64_decode($source); $value = base64_decode($source);
break; break;
case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: case self::TYPE_OBJECT_IDENTIFIER:
$oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids); $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids);
if ($oid === false) { if ($oid === false) {
user_error('Invalid OID'); user_error('Invalid OID');
@ -991,7 +991,7 @@ class File_ASN1
$value.= $temp; $value.= $temp;
} }
break; break;
case FILE_ASN1_TYPE_ANY: case self::TYPE_ANY:
$loc = $this->location; $loc = $this->location;
if (isset($idx)) { if (isset($idx)) {
array_pop($this->location); array_pop($this->location);
@ -999,14 +999,14 @@ class File_ASN1
switch (true) { switch (true) {
case !isset($source): case !isset($source):
return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special); return $this->_encode_der(null, array('type' => self::TYPE_NULL) + $mapping, null, $special);
case is_int($source): case is_int($source):
case $source instanceof \phpseclib\Math\BigInteger: case $source instanceof \phpseclib\Math\BigInteger:
return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special); return $this->_encode_der($source, array('type' => self::TYPE_INTEGER) + $mapping, null, $special);
case is_float($source): case is_float($source):
return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special); return $this->_encode_der($source, array('type' => self::TYPE_REAL) + $mapping, null, $special);
case is_bool($source): case is_bool($source):
return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special); return $this->_encode_der($source, array('type' => self::TYPE_BOOLEAN) + $mapping, null, $special);
case is_array($source) && count($source) == 1: case is_array($source) && count($source) == 1:
$typename = implode('', array_keys($source)); $typename = implode('', array_keys($source));
$outtype = array_search($typename, $this->ANYmap, true); $outtype = array_search($typename, $this->ANYmap, true);
@ -1028,23 +1028,23 @@ class File_ASN1
return false; return false;
} }
return $this->_encode_der($source, $filters + $mapping, null, $special); return $this->_encode_der($source, $filters + $mapping, null, $special);
case FILE_ASN1_TYPE_NULL: case self::TYPE_NULL:
$value = ''; $value = '';
break; break;
case FILE_ASN1_TYPE_NUMERIC_STRING: case self::TYPE_NUMERIC_STRING:
case FILE_ASN1_TYPE_TELETEX_STRING: case self::TYPE_TELETEX_STRING:
case FILE_ASN1_TYPE_PRINTABLE_STRING: case self::TYPE_PRINTABLE_STRING:
case FILE_ASN1_TYPE_UNIVERSAL_STRING: case self::TYPE_UNIVERSAL_STRING:
case FILE_ASN1_TYPE_UTF8_STRING: case self::TYPE_UTF8_STRING:
case FILE_ASN1_TYPE_BMP_STRING: case self::TYPE_BMP_STRING:
case FILE_ASN1_TYPE_IA5_STRING: case self::TYPE_IA5_STRING:
case FILE_ASN1_TYPE_VISIBLE_STRING: case self::TYPE_VISIBLE_STRING:
case FILE_ASN1_TYPE_VIDEOTEX_STRING: case self::TYPE_VIDEOTEX_STRING:
case FILE_ASN1_TYPE_GRAPHIC_STRING: case self::TYPE_GRAPHIC_STRING:
case FILE_ASN1_TYPE_GENERAL_STRING: case self::TYPE_GENERAL_STRING:
$value = $source; $value = $source;
break; break;
case FILE_ASN1_TYPE_BOOLEAN: case self::TYPE_BOOLEAN:
$value = $source ? "\xFF" : "\x00"; $value = $source ? "\xFF" : "\x00";
break; break;
default: default:
@ -1057,7 +1057,7 @@ class File_ASN1
} }
if (isset($mapping['cast'])) { if (isset($mapping['cast'])) {
if (isset($mapping['explicit']) || $mapping['type'] == FILE_ASN1_TYPE_CHOICE) { if (isset($mapping['explicit']) || $mapping['type'] == self::TYPE_CHOICE) {
$value = chr($tag) . $this->_encodeLength(strlen($value)) . $value; $value = chr($tag) . $this->_encodeLength(strlen($value)) . $value;
$tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast'];
} else { } else {
@ -1108,7 +1108,7 @@ class File_ASN1
http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2
http://www.obj-sys.com/asn1tutorial/node14.html */ http://www.obj-sys.com/asn1tutorial/node14.html */
$pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ? $pattern = $tag == self::TYPE_UTC_TIME ?
'#(..)(..)(..)(..)(..)(..)(.*)#' : '#(..)(..)(..)(..)(..)(..)(.*)#' :
'#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#'; '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#';
@ -1116,7 +1116,7 @@ class File_ASN1
list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches; list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches;
if ($tag == FILE_ASN1_TYPE_UTC_TIME) { if ($tag == self::TYPE_UTC_TIME) {
$year = $year >= 50 ? "19$year" : "20$year"; $year = $year >= 50 ? "19$year" : "20$year";
} }
@ -1205,7 +1205,7 @@ class File_ASN1
* @return String * @return String
* @access public * @access public
*/ */
function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING) function convert($in, $from = self::TYPE_UTF8_STRING, $to = self::TYPE_UTF8_STRING)
{ {
if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) { if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) {
return false; return false;

File diff suppressed because it is too large Load Diff

View File

@ -16,48 +16,48 @@ class Unit_File_ASN1Test extends PhpseclibTestCase
public function testAnyString() public function testAnyString()
{ {
$KDC_REP = array( $KDC_REP = array(
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array( 'children' => array(
'pvno' => array( 'pvno' => array(
'constant' => 0, 'constant' => 0,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'msg-type' => array( 'msg-type' => array(
'constant' => 1, 'constant' => 1,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'padata' => array( 'padata' => array(
'constant' => 2, 'constant' => 2,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'crealm' => array( 'crealm' => array(
'constant' => 3, 'constant' => 3,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'cname' => array( 'cname' => array(
'constant' => 4, 'constant' => 4,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'ticket' => array( 'ticket' => array(
'constant' => 5, 'constant' => 5,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY), 'type' => File_ASN1::TYPE_ANY),
'enc-part' => array( 'enc-part' => array(
'constant' => 6, 'constant' => 6,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY) 'type' => File_ASN1::TYPE_ANY)
) )
); );
$AS_REP = array( $AS_REP = array(
'class' => FILE_ASN1_CLASS_APPLICATION, 'class' => File_ASN1::CLASS_APPLICATION,
'cast' => 11, 'cast' => 11,
'optional' => true, 'optional' => true,
'explicit' => true 'explicit' => true
@ -89,31 +89,31 @@ class Unit_File_ASN1Test extends PhpseclibTestCase
public function testIncorrectString() public function testIncorrectString()
{ {
$PA_DATA = array( $PA_DATA = array(
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array( 'children' => array(
'padata-type' => array( 'padata-type' => array(
'constant' => 1, 'constant' => 1,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_INTEGER 'type' => File_ASN1::TYPE_INTEGER
), ),
'padata-value' => array( 'padata-value' => array(
'constant' => 2, 'constant' => 2,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_OCTET_STRING 'type' => File_ASN1::TYPE_OCTET_STRING
) )
) )
); );
$PrincipalName = array( $PrincipalName = array(
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array( 'children' => array(
'name-type' => array( 'name-type' => array(
'constant' => 0, 'constant' => 0,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_INTEGER 'type' => File_ASN1::TYPE_INTEGER
), ),
'name-string' => array( 'name-string' => array(
'constant' => 1, 'constant' => 1,
@ -121,95 +121,95 @@ class Unit_File_ASN1Test extends PhpseclibTestCase
'explicit' => true, 'explicit' => true,
'min' => 0, 'min' => 0,
'max' => -1, 'max' => -1,
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array('type' => FILE_ASN1_TYPE_IA5_STRING) // should be FILE_ASN1_TYPE_GENERAL_STRING 'children' => array('type' => File_ASN1::TYPE_IA5_STRING) // should be File_ASN1::TYPE_GENERAL_STRING
) )
) )
); );
$Ticket = array( $Ticket = array(
'class' => FILE_ASN1_CLASS_APPLICATION, 'class' => File_ASN1::CLASS_APPLICATION,
'cast' => 1, 'cast' => 1,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array( 'children' => array(
'tkt-vno' => array( 'tkt-vno' => array(
'constant' => 0, 'constant' => 0,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_INTEGER 'type' => File_ASN1::TYPE_INTEGER
), ),
'realm' => array( 'realm' => array(
'constant' => 1, 'constant' => 1,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY 'type' => File_ASN1::TYPE_ANY
), ),
'sname' => array( 'sname' => array(
'constant' => 2, 'constant' => 2,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY 'type' => File_ASN1::TYPE_ANY
), ),
'enc-part' => array( 'enc-part' => array(
'constant' => 3, 'constant' => 3,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY 'type' => File_ASN1::TYPE_ANY
) )
) )
); );
$KDC_REP = array( $KDC_REP = array(
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => array( 'children' => array(
'pvno' => array( 'pvno' => array(
'constant' => 0, 'constant' => 0,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_INTEGER), 'type' => File_ASN1::TYPE_INTEGER),
'msg-type' => array( 'msg-type' => array(
'constant' => 1, 'constant' => 1,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_INTEGER), 'type' => File_ASN1::TYPE_INTEGER),
'padata' => array( 'padata' => array(
'constant' => 2, 'constant' => 2,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'min' => 0, 'min' => 0,
'max' => -1, 'max' => -1,
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => $PA_DATA), 'children' => $PA_DATA),
'crealm' => array( 'crealm' => array(
'constant' => 3, 'constant' => 3,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_OCTET_STRING), 'type' => File_ASN1::TYPE_OCTET_STRING),
'cname' => array( 'cname' => array(
'constant' => 4, 'constant' => 4,
'optional' => true, 'optional' => true,
'explicit' => true) + $PrincipalName, 'explicit' => true) + $PrincipalName,
//'type' => FILE_ASN1_TYPE_ANY), //'type' => File_ASN1::TYPE_ANY),
'ticket' => array( 'ticket' => array(
'constant' => 5, 'constant' => 5,
'optional' => true, 'optional' => true,
'implicit' => true, 'implicit' => true,
'min' => 0, 'min' => 0,
'max' => 1, 'max' => 1,
'type' => FILE_ASN1_TYPE_SEQUENCE, 'type' => File_ASN1::TYPE_SEQUENCE,
'children' => $Ticket), 'children' => $Ticket),
'enc-part' => array( 'enc-part' => array(
'constant' => 6, 'constant' => 6,
'optional' => true, 'optional' => true,
'explicit' => true, 'explicit' => true,
'type' => FILE_ASN1_TYPE_ANY) 'type' => File_ASN1::TYPE_ANY)
) )
); );
$AS_REP = array( $AS_REP = array(
'class' => FILE_ASN1_CLASS_APPLICATION, 'class' => File_ASN1::CLASS_APPLICATION,
'cast' => 11, 'cast' => 11,
'optional' => true, 'optional' => true,
'explicit' => true 'explicit' => true