Saguenay (Jonquière), Québec, Canada. Tél: (581) 683-9887 Téléc: (581) 221-0874
RetourASN.1/DER/BER PHP
2008-02-13 15:15:03 (ID: 74, Parent: 0, Type: post)Je vous ai parlé dernièrement de ASN.1. Voici un petit parseur de base en PHP//Title: Simple PHP BER/DER/ASN.1 basic decoder //Author: Jean-Luc Cyr //Date: 2008-02-13 //Desc: Simple BER Printable string dumper // read BER data from a file // Set input filename $filename = 'o'; // Set max number of tag to parse (0 = no limit) $limit = 0; //Open data file $f = fopen($filename,'rb'); //Set read tag number to 0 $c=0; //While not end of file while(!feof($f)) { //Read first block data type $type = ord(fread($f,1)); if ($type==0) break; //Read first len block $len = ord(fread($f,1)); if ($len==0) break; $le = 0; //If first bit of len is set (1) //we have a multiple bit len to read if (($len&128)==128) { echo "Big Len ".($len&127)." Bytes\r\n"; for ($i = 0; $i < ($len&127); $i++) $le = $le * 256 + ord(fread($f,1)); $len = $le; } //Findout data type (first 2 bits) $cl = ($type & (128+64) ) >> 6; switch($cl) { case 0: $cla = 'Universal'; break; case 1: $cla = 'application'; break; case 2: $cla = 'context-specific'; break; case 3: $cla = 'private'; break; } //Dump some info printf("[$cla] Type: %x (%d), len: %d\r\n",$type,$type,$len); //Read data chunk $data = fread($f,$len); //Display data chunk based on type switch($type) { case 2: // integer break; case 3: // bit string break; case 4: // octet string break; case 5: // null break; case 6: // object identifier break; case 16: // sequence and sequence of break; case 17: // set and set of break; case 19: //string printf("Data: $data\r\n"); break; case 20: // t61string break; case 22: // ia5string break; case 23: // utctime break; default: #printf("Data: $data\r\n"); break; } //increment count $c++; //check if we reach the number of tag specified if (($c>$limit)&&($limit>0)) break; } //close our input file fclose($f);
Document Informatif
ADN Informatique
2015
Rev. 1
Jean-Luc Cyr