PHP Classes

File: example/index.php

Recommend this page to a friend!
  Packages 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: 10 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 />';

?>