PHP Classes

File: example/index.php

Recommend this page to a friend!
  Classes of philippe thomassigny   XStructure   example/index.php   Download  
File: example/index.php
Role: Example script
Content type: text/plain
Description: Example script
Class: XStructure
Decode binary data and return PHP structured array
Author: By
Last change: patch 1.0.1
Date: 8 years ago
Size: 5,914 bytes
 

Contents

Class file image Download
<?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 />';

?>