<?php
/* @DESCR -- Do not edit
index.php examples for XStructure.lib
(c) 2015 Philippe Thomassigny
XStructure is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
XStructure is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Xamboo. If not, see <http://www.gnu.org/licenses/>.
Creation: 2015-12-13
Changes:
2015-12-28 Phil: SSL handshake example now complete with full real structure read
2015-12-13 Phil: First release
@End_DESCR */
setlocale(LC_ALL, 'es_MX.UTF8', 'es_MX', '');
date_default_timezone_set('America/Mexico_City');
echo '<h1>XStructure examples</h1>';
if (PHP_VERSION_ID < 70000)
{
// creates \Error class to simulate PHP7 behaviour
class Error extends \Exception {}
}
include_once '../include/xstructure/XStructure.class.php';
echo '<h2>Example of a SSL handshake:</h2>';
echo 'Note: This is not an exact reproduction but an example<br />';
$def = array(
'main' => 'PlainText',
'PlainText' => array(
'type' => array('cast' => 'uint8'),
'major' => array('cast' => 'uint8'),
'minor' => array('cast' => 'uint8'),
'length' => array('cast' => 'uint16'),
'handshake' => array('cast' => 'Handshake',
'conditionparam' => 'type',
'conditionvalue' => 22,
'length' => 'length'
)
),
'Handshake' => array(
'type' => array('cast' => 'uint8'),
'length' => array('cast' => 'uint24'),
'client_hello' => array('cast' => 'ClientHello',
'conditionparam' => 'type',
'conditionvalue' => 1,
'length' => 'length'
)
),
'ClientHello' => array(
'major' => array('cast' => 'uint8'),
'minor' => array('cast' => 'uint8'),
'gmt_unix_time' => array('cast' => 'timestamp'),
'random_bytes' => array('cast' => 'hex', 'length' => 28),
'session_ids_length' => array('cast' => 'uint8'),
'session_ids' => array('cast' => 'session_id', 'vector' => true, 'length' => 'session_ids_length', 'lengthtype' => 'bytes'),
'cipher_suites_length' => array('cast' => 'uint16'),
'cipher_suites' => array('cast' => 'cipher_suite', 'vector' => true, 'length' => 'cipher_suites_length', 'lengthtype' => 'bytes'),
'compression_methods_length' => array('cast' => 'uint8'),
'compression_methods' => array('cast' => 'compression_method', 'vector' => true, 'length' => 'compression_methods_length', 'lengthtype' => 'bytes'),
'extensions_length' => array('cast' => 'uint16'),
'extensions' => array('cast' => 'extension', 'vector' => true, 'length' => 'extensions_length', 'lengthtype' => 'bytes')
),
'session_id' => array(
'id' => array('cast' => 'uint8')
),
'cipher_suite' => array(
'minor' => array('cast' => 'hex', 'length' => 1),
'major' => array('cast' => 'hex', 'length' => 1)
),
'compression_method' => array(
'id' => array('cast' => 'uint8')
),
'extension' => array(
'extension_type' => array('cast' => 'uint16'),
'extension_length' => array('cast' => 'uint16'),
'extension_servername' => array('cast' => 'servernamelist', 'length' => 'extension_length',
'conditionparam' => 'extension_type',
'conditionvalue' => 0),
'extension_data' => array('cast' => 'hex', 'length' => 'extension_length',
'conditionparam' => 'extension_type',
'conditionnotvalue' => 0),
),
'servernamelist' => array(
'length' => array('cast' => 'uint16'),
'servernames' => array('cast' => 'servername', 'vector' => true, 'length' => 'length', 'lengthtype' => 'bytes')
),
'servername' => array(
'nametype' => array('cast' => 'uint8'),
'length' => array('cast' => 'uint16'),
'hostname' => array('cast' => 'string', 'length' => 'length')
)
);
$handshake = new \xstructure\XStructure($def, rawurldecode(file_get_contents('data/sslhandshake.data')));
echo '<pre>'.print_r($handshake, true).'</pre>';
echo '<br />';
echo '<h2>Example of the BitCoin Original Block 0 Header:</h2>';
class BitCoinBlock extends \xstructure\XStructure
{
private $descriptor = array(
'main' => 'Block',
'Block' => array(
'magic' => array('cast' => 'hex', 'length' => 4),
'size' => array('cast' => 'uint32', 'endian' => 'little'),
'header' => array('cast' => 'Header', 'length' => 80),
),
'Header' => array(
'version' => array('cast' => 'uint32', 'endian' => 'little'),
'hashPrevBlock' => array('cast' => 'hex', 'length' => 32),
'hashMerkleRoot' => array('cast' => 'hex', 'length' => 32),
'Time' => array('cast' => 'timestamp', 'endian' => 'little'),
'Bits' => array('cast' => 'hex', 'length' => 4),
'Nonce' => array('cast' => 'uint32', 'endian' => 'little'),
)
);
public function __construct($filename)
{
parent::__construct($this->descriptor, rawurldecode(file_get_contents($filename)));
}
}
$BTCBlock = new BitCoinBlock('data/bitcoin-block0-header.data');
echo '<pre>'.print_r($BTCBlock, true).'</pre>';
echo '<br />';
?>
|