Файл: _rootinc/kkbkz.inc.php
Строк: 150
<?
/* --------------------------------------------
Модуль для создания/проверки подписи
приватным/публичным ключом.
KKBSign class
-------------
by Kirsanov Anton (webcompass@list.ru)
01.06.2006
^^^^^^^^^^^^^^^
Список методов:
// ---------------------------------------
// Загрузка приватного ключа в PEM формате
load_private_key($file, $password);
// ---------------------------------------
// Инверсия строки
invert();
// ---------------------------------------
// Подпись загруженным ключом строки $str
sign($str);
// ---------------------------------------
// Подпись загруженным ключом строки $str
// и кодирование в Base64
sign64($str);
// ---------------------------------------
// Проверка публичным ключом $file,
// является ли строка $str подписанной
// приватным ключом строкой $data.
check_sign($data, $str, $file);
// ---------------------------------------
// Проверка публичным ключом $file,
// является ли строка $str в Base64
// подписанной приватным ключом строкой $data.
check_sign($data, $str, $file);
------------------------------------------*/
class KKBsign {
// -----------------------------------------------------------------------------------------------
public function load_private_key($filename, $password = NULL){
if(!is_file($filename))
{
echo "Key not found";
return false;
}
$c = file_get_contents($filename);
if($password)
$prvkey = openssl_get_privatekey($c, $password) or die(openssl_error_string());
else
$prvkey = openssl_get_privatekey($c) or die(openssl_error_string());
if(is_resource($prvkey)){
$this->private_key = $prvkey;
return $c;
}
return false;
}
// -----------------------------------------------------------------------------------------------
// Установка флага инверсии
public function invert(){
$this->invert = 1;
}
// -----------------------------------------------------------------------------------------------
// Процесс инверсии строки
function reverse($str){
return strrev($str);
}
// -----------------------------------------------------------------------------------------------
public function sign($str)
{
if($this->private_key)
{
openssl_sign($str, $out, $this->private_key);
if($this->invert == 1) $out = $this->reverse($out);
return $out;
}
}
// -----------------------------------------------------------------------------------------------
public function sign64($str){
return base64_encode($this->sign($str));
}
// -----------------------------------------------------------------------------------------------
public function check_sign($data, $str, $filename){
if($this->invert == 1) $str = $this->reverse($str);
if(!is_file($filename)) return false;
$pubkey = file_get_contents($filename);
return openssl_verify($data, $str, $pubkey);
}
// -----------------------------------------------------------------------------------------------
public function check_sign64($data, $str, $filename){
return $this->check_sign($data, base64_decode($str), $filename);
}
}
class KKBxml {
private $parser;
private $xarray = array();
private $lasttag;
public function KKBxml()
{
$this->parser = xml_parser_create();
xml_set_object($this->parser, $this);
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($this->parser, "tag_open", "tag_close");
xml_set_character_data_handler($this->parser, "cdata");
}
public function parse($data)
{
xml_parse($this->parser, $data);
ksort($this->xarray,SORT_STRING);
return $this->xarray;
}
public function tag_open($parser, $tag, $attributes)
{
$this->lasttag = $tag;
$this->xarray['TAG_'.$tag] = $tag;
if (is_array($attributes)){
foreach ($attributes as $key => $value) {
$this->xarray[$tag.'_'.$key] = $value;
};
};
}
public function cdata($parser, $cdata)
{
$tag = $this->lasttag;
$this->xarray[$tag.'_CHARDATA'] = $cdata;
}
public function tag_close($parser, $tag)
{}
}
function kkb_split_sign($xml,$tag){
// -----===++[Process XML string to array of values]++===-----
// variables:
// $xml - string: xml string
// $tag - string: split tag name
// $array["LETTER"] = an XML section enclosed in <$tag></$tag>
// $array["SIGN"] = an XML sign section enclosed in <$tag+"_sign"></$tag+"_sign">
// $array["RAWSIGN"] = an XML sign section with stripped <$tag+"_sign"></$tag+"_sign"> tags
// example:
// income data:
// $xml = "<order order_id="12345"><department amount="10"/></order><order_sign type="SHA/RSA">ljkhsdfmnuuewrhkj</order_sign>"
// $tag = "ORDER"
// result:
// $array["LETTER"] = "<order order_id="12345"><department amount="10"/></order>"
// $array["SIGN"] = "<order_sign type="SHA/RSA">ljkhsdfmnuuewrhkj</order_sign>"
// $array["RAWSIGN"] = "ljkhsdfmnuuewrhkj"
//
// -----===++[Обработка XML строки в массивзначений]++===-----
// переменные:
// $xml - строка: xml строка
// $tag - строка: имя тэга разделителя
// $array["LETTER"] = XML секция заключенная в <$tag></$tag>
// $array["SIGN"] = XML секция подписи заключенная в <$tag+"_sign"></$tag+"_sign">
// $array["RAWSIGN"] = XML секция подписи с отрезанными <$tag+"_sign"></$tag+"_sign"> тэгами
// Пример:
// Входные данные:
// $xml = "<order order_id="12345"><department amount="10"/></order><order_sign type="SHA/RSA">ljkhsdfmnuuewrhkj</order_sign>"
// $tag = "ORDER"
// Результат:
// $array["LETTER"] = "<order order_id="12345"><department amount="10"/></order>"
// $array["SIGN"] = "<order_sign type="SHA/RSA">ljkhsdfmnuuewrhkj</order_sign>"
// $array["RAWSIGN"] = "ljkhsdfmnuuewrhkj"
$array = array();
$letterst = stristr($xml,"<".$tag);
$signst = stristr($xml,"<".$tag."_SIGN");
$signed = stristr($xml,"</".$tag."_SIGN");
$doced = stristr($signed,">");
$array['LETTER'] = substr($letterst,0,-strlen($signst));
$array['SIGN'] = substr($signst,0,-strlen($doced)+1);
$rawsignst = stristr($array['SIGN'],">");
$rawsigned = stristr($rawsignst,"</");
$array['RAWSIGN'] = substr($rawsignst,1,-strlen($rawsigned));
return $array;
}
?>