Вход Регистрация
Файл: _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($database64_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->parserXML_OPTION_CASE_FOLDINGtrue);
        
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;
}

?>
Онлайн: 2
Реклама