{"id":319822,"date":"2021-03-18T15:01:02","date_gmt":"2021-03-18T15:01:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=319822"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=319822","title":{"rendered":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 PKCS#11 \u0441 \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u0432 Python. \u0427\u0430\u0441\u0442\u044c II \u2014 \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 Token"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ak\/wh\/4p\/akwh4pindvbkurcpaxanmprjybe.png\" alt=\"image\" align=\"left\">\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/542182\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c pyp11, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0421\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 PKCS#11 \u0441 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043a\u043b\u0430\u0441\u0441 Token, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/github.com\/a513\/PythonPKCS11Gost\" rel=\"nofollow noopener noreferrer\">pyp11<\/a> \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Python-\u0435. \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u043a\u043b\u0430\u0441\u0441 token, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/533852\/\">TclOO<\/a> \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/453164\/\">cryptoarmpkcs<\/a>:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cg\/r3\/wm\/cgr3wmjjqtau47xxjuqkf47o2lq.png\"><a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430 Token<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">oo::class create token {   variable libp11   variable handle   variable infotok   variable pintok   variable nodet #\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   constructor {handlelp11 labtoken slottoken} {     global pass     global yespas     set handle $handlelp11     set slots [pki::pkcs11::listslots $handle]     array set infotok []     foreach slotinfo $slots {       set slotflags [lindex $slotinfo 2]       if {[lsearch -exact $slotflags TOKEN_PRESENT] != -1} {         if {[string first $labtoken [lindex $slotinfo 1]] != -1} {           set infotok(slotlabel) [lindex $slotinfo 1]           set infotok(slotid) [lindex $slotinfo 0]           set infotok(slotflags) [lindex $slotinfo 2]           set infotok(token) [lindex $slotinfo 3]           #\u0411\u0435\u0440\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u0442\u043e\u043a\u0435\u043d           break         }       }     }     #\u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0432 \u0441\u043b\u043e\u0442\u0430\u0445     if {[llength [array names infotok]] == 0 } {       error &quot;Constructor: Token not present for library   : $handle&quot;     }     #\u041e\u0431\u044a\u0435\u043a\u0442 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430     set nodet [dict create pkcs11_handle $handle]     dict set nodet pkcs11_slotid $infotok(slotid)     set tit &quot;\u0412\u0432\u0435\u0434\u0438\u0442\u0435 PIN-\u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u0435 $infotok(slotlabel)&quot;     set xa [my read_password $tit]     if {$xa == &quot;no&quot;} {       error &quot;\u0412\u044b \u043f\u0435\u0440\u0435\u0434\u0443\u043c\u0430\u043b\u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u044c PIN \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u0430 $infotok(slotlabel)&quot;     }     set pintok $pass     set pass &quot;&quot;     set rr [my login ]     if { $rr == 0 } {       unset pintok       error &quot;\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 PIN-\u043a\u043e\u0434 \u0442\u043e\u043a\u0435\u043d\u0430 $infotok(slotlabel).&quot;     } elseif {$rr == -1} {       unset pintok       error &quot;\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043a\u0435\u043d.&quot;     }     my logout   } #\u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430   method infoslot {} {     return [array get infotok]   }   method listcerts {} {     array set lcerts []     set certsder [pki::pkcs11::listcertsder $handle $infotok(slotid)]     #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b     foreach lc $certsder {       array set derc $lc       set lcerts($derc(pkcs11_label)) [list $derc(cert_der) $derc(pkcs11_id)]       #parray derc     }     return [array get lcerts]   }   method read_password {tit} {     global yespas     global pass     set tit_orig &quot;$::labpas&quot;     if {$tit != &quot;&quot;} {       set ::labpas &quot;$tit&quot;     }     tk busy hold &quot;.st.fr1&quot;     tk busy hold &quot;.st.fr3&quot;     #\tplace .topPinPw -in .st.fr1.fr2_certs.labCert  -relx 1.0 -rely 3.0 -relwidth 3.5     place .topPinPw -in .st.labMain  -relx 0.35 -rely 5.0 -relwidth 0.30     set yespas &quot;&quot;     focus .topPinPw.labFrPw.entryPw     vwait yespas     catch {tk busy forget &quot;.st.fr1&quot;}     catch {tk busy forget &quot;.st.fr3&quot;}     if {$tit != &quot;&quot;} {       set ::labpas &quot;$tit_orig&quot;     }     place forget .topPinPw     return $yespas   }   unexport read_password   method rename {type ckaid newlab} {     if {$type != &quot;cert&quot; &amp;&amp; $type != &quot;key&quot; &amp;&amp; $type != &quot;all&quot;} {       error &quot;Bad type for rename &quot;     }     set uu $nodet     lappend uu &quot;pkcs11_id&quot;     lappend uu $ckaid     lappend uu &quot;pkcs11_label&quot;     lappend uu $newlab     if { [my login ] == 0 } {       unset uu       return 0     }     pki::pkcs11::rename $type $uu     my logout     return 1   }   method changeid {type ckaid newid} {     if {$type != &quot;cert&quot; &amp;&amp; $type != &quot;key&quot; &amp;&amp; $type != &quot;all&quot;} {       error &quot;Bad type for changeid &quot;     }     set uu $nodet     lappend uu &quot;pkcs11_id&quot;     lappend uu $ckaid     lappend uu &quot;pkcs11_id_new&quot;     lappend uu $newid     if { [my login ] == 0 } {       unset uu       return 0     }     pki::pkcs11::rename $type $uu     my logout     return 1   }   method delete {type ckaid} {     if {$type != &quot;cert&quot; &amp;&amp; $type != &quot;key&quot; &amp;&amp; $type != &quot;all&quot; &amp;&amp; $type != &quot;obj&quot;} {       error &quot;Bad type for delete&quot;     }     set uu $nodet     lappend uu &quot;pkcs11_id&quot;     lappend uu $ckaid     my login     ::pki::pkcs11::delete $type $uu     my logout     return 1   }   method deleteobj {hobj} {     set uu $nodet     lappend uu &quot;hobj&quot;     lappend uu $hobj #tk_messageBox -title &quot;class deleteobj&quot; -icon info -message &quot;hobj: $hobj\\n&quot; -detail &quot;$uu&quot;     return [::pki::pkcs11::delete obj $uu ]   }   method listmechs {} {     set llmech [pki::pkcs11::listmechs $handle $infotok(slotid)]     return $llmech   }   method pubkeyinfo {cert_der_hex} {     array set linfopk [pki::pkcs11::pubkeyinfo $cert_der_hex $nodet]     return [array get linfopk]   }   method listobjects {type} {     if {$type != &quot;cert&quot; &amp;&amp; $type != &quot;pubkey&quot; &amp;&amp; $type != &quot;privkey&quot; &amp;&amp; $type != &quot;all&quot; &amp;&amp; $type != &quot;data&quot;} {       error &quot;Bad type for listobjects &quot;     }     set allobjs [::pki::pkcs11::listobjects $handle $infotok(slotid) $type]     return $allobjs   }   method importcert {cert_der_hex cka_label} {     set uu $nodet     dict set uu pkcs11_label $cka_label     if {[catch {set pkcs11id [pki::pkcs11::importcert $cert_der_hex $uu]} res] } {       error &quot;Cannot import this certificate:$res&quot;       #          return 0     }     return $pkcs11id   }   method login {} {     set wh 1     set rl -1     while {$wh == 1} {       if {[catch {set rl [pki::pkcs11::login $handle $infotok(slotid) $pintok]} res]} {         if {[string first &quot;SESSION_HANDLE_INVALID&quot; $res] != -1} {           pki::pkcs11::closesession $handle           continue         } elseif {[string first &quot;TOKEN_NOT_PRESENT&quot; $res] != -1} {           set wh 0           continue         }       }       break     }     if {$wh == 0} {       return -1     }     return $rl   }   method logout {} {     return [pki::pkcs11::logout $handle $infotok(slotid)]   }   method keypair {typegost parkey} {     my login     set skey [pki::pkcs11::keypair $typegost $parkey $nodet]     my logout     return $skey   }   method digest {typehash source} {     return [pki::pkcs11::digest $typehash $source $nodet]   }   method signkey {ckm digest hobj_priv} {     set uu $nodet     dict set uu hobj_privkey $hobj_priv     my login     set ss [pki::pkcs11::sign $ckm $digest $uu]     my logout     return $ss   }   method signcert {ckm digest pkcs11_id} {     set uu $nodet     dict set uu pkcs11_id $pkcs11_id     my login     set ss  [pki::pkcs11::sign $ckm $digest $uu]     my logout     return $ss   }   method verify {digest signature asn1pubkey} {     set uu $nodet     dict set uu pubkeyinfo $asn1pubkey     return [pki::pkcs11::verify $digest $signature $uu]   }   method tokenpresent {} {     set slots [pki::pkcs11::listslots $handle]     foreach slotinfo $slots {       set slotid [lindex $slotinfo 0]       set slotlabel [lindex $slotinfo 1]       set slotflags [lindex $slotinfo 2]       if {[lsearch -exact $slotflags TOKEN_PRESENT] != -1} {         if {infotok(slotlabel) == $slotlabel &amp;&amp; $slotid == $infotok(slotid)} {           return 1         }       }     }     return 0   }   method setpin {type tpin newpin} {     if {$type != &quot;user&quot; &amp;&amp; $type != &quot;so&quot;} {       return 0     }     if {$type == &quot;user&quot;} {       if {$tpin != $pintok} {         return 0       }     }     set ret [::pki::pkcs11::setpin  $handle $infotok(slotid) $type $tpin $newpin]     if {$type == &quot;user&quot;} {       if {$ret} {         set pitok $newpin       }     }     return $ret   }   method inituserpin {sopin upin} {     set ret [::pki::pkcs11::inituserpin $handle $infotok(slotid) $sopin $upin]     return $ret   }   method importkey {uukey} {     set uu $nodet     append uu &quot; $uukey&quot;     my login     if {[catch {set impkey [pki::pkcs11::importkey $uu ]} res] } {         set impkey 0     }     my logout     return $impkey   } #\u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   destructor {     variable handle     if {[info exists pintok]} {       my login     }     #\t    ::pki::pkcs11::unloadmodule  $handle   } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>\u041a\u043b\u0430\u0441\u0441 Token, \u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/455796\/\">\u043a\u043b\u0430\u0441\u0441 \u0432 Python<\/a>, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u044d\u0442\u043e \u0442\u0435 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u0438\u043c\u044f __init__, \u0430 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043c\u044f __del__. \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c. \u0418 \u043a\u043b\u0430\u0441\u0441\u0435 Token \u043c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0430 \u0432\u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Token \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438.<\/p>\n<h3>I. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Token <\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Token \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"python\">import sys import pyp11 class Token:   def __init__ (self, handlelp11, slottoken, serialnum):     flags = ''     self.pyver = sys.version[0]     if (self.pyver == '2'):         print ('\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f python3')         quit() #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PKCS#11     self.handle = handlelp11 #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c     self.slotid = slottoken #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430     self.sn = serialnum #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0442\u0435 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c     ret, stat = self.tokinfo() #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430     if (stat != ''): #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435         self.returncode = stat         return #\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d<\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 (\u043c\u0435\u0442\u043e\u0434\u0430 __init__ ) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f (\u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e self) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 (handlelp11), \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 (slottoken), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043a\u0435\u043d, \u0438 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430 (serialnum).<br \/>  \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 pkcs#11, \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043d\u0438\u0445 \u0442\u043e\u043a\u0435\u043d\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:  <\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3 import sys import pyp11 from Token import Token def listslots (handle):     slots = pyp11.listslots(aa)     i = 0     lslots = []     for v in slots:         for f in v[2]:     \t    if (f == 'TOKEN_PRESENT'):                 i = 1                 lslots.append(v)                 break     i += 1     return (lslots) #\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f Linux #\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d lib = '\/usr\/local\/lib64\/libls11sw2016.so' #\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d #lib = '\/usr\/local\/lib64\/libls11cloud.so' #\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d #lib = '\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so' #\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f Windows #lib='C:\\Temp\\ls11sw2016.dll' try: #\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0451 handle (\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438)     aa = pyp11.loadmodule(lib)     print('Handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ' + lib + ': ' + aa) except:     print('Except load lib: ')     e = sys.exc_info()[1]     e1 = e.args[0] #\u041f\u0435\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438     print (e1)     quit() #\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432 slots = listslots(aa) i = 0 for v in slots:     for f in v[2]:         if (f == 'TOKEN_PRESENT'):     \t    if (i == 0):     \t        print ('\\n\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043a\u0435\u043d\u0430\u0445 \u0432 \u0441\u043b\u043e\u0442\u0430\u0445\\n')     \t    it = v[3]     \t    print ('slotid=' + str(v[0]))     \t    print ('\\tFlags=' + str(v[2]))     \t    print ('\\tLabel=&quot;' + it[0].strip() + '&quot;')     \t    print ('\\tManufacturer=&quot;' + it[1].strip() + '&quot;')     \t    print ('\\tModel=&quot;' + it[2].strip() + '&quot;')     \t    print ('\\tSerialNumber=&quot;' + it[3].strip() + '&quot;')     \t    i = 1     \t    break     i += 1 pyp11.unloadmodule(aa) if (i == 0):     print ('\u041d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430. \u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e') quit()<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0438 \u0441\u043b\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u044f\u0441\u043d\u043e, \u0442\u043e \u0441 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u0430 \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0443\u0436\u0435\u043d \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d, \u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043c\u0435\u0442\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a (\u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e) \u043e\u0434\u0438\u043d \u0442\u043e\u043a\u0435\u043d \u0432 \u0441\u043b\u043e\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043a\u0438. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u043e\u043a\u0435\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u043b\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u043c\u0435\u043d\u0438\u0442 \u043c\u0435\u0442\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u0430. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u0436\u0435 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043a\u0435\u043d\u0435 (\u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440, \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c). \u0412 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0432\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u043e\u043a\u0435\u043d:  <\/p>\n<pre><code class=\"python\">... #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PKCS#11     self.handle = handlelp11 #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c     self.slotid = slottoken #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430     self.sn = serialnum ...<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0442\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <i><b>tokinfo()<\/b><\/i>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430. <br \/>  \u041c\u0435\u0442\u043e\u0434 tokinfo \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0441\u043c. \u0432\u044b\u0448\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435):  <\/p>\n<pre><code class=\"python\">#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0442\u0435 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c     ret, stat = self.tokinfo()<\/code><\/pre>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 (ret) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 (stat) \u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430. \u0415\u0441\u043b\u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0443\u0441\u0442\u0430, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 tokinfo \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 self.tokinfo \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0435\u0442 \u0435\u0451 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e returncode:  <\/p>\n<pre><code class=\"python\">#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0442\u0435 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c     ret, stat = self.tokinfo() #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430     if (stat != ''): #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 returncode         self.returncode = stat         return<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 returncode, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b\u043c \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0432 \u0441\u043e\u0437\u0434\u0430\u043d:  <\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3 import sys import pyp11 from Token import Token #\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 #\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d lib = '\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so' try:     aa = pyp11.loadmodule(lib) except:     e = sys.exc_info()[1]     e1 = e.args[0]     print (e1)     quit() #\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430 sn = '9999999999999999' slot = 110 #\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u043e\u043a\u0435\u043d\u0430 t1 = Token(aa, slot, sn) #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 returncode if (t1.returncode != ''): #\u041e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439     print (t1.returncode) #\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430     del t1 #\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430     quit() #\u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d . . .<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c:  <\/p>\n<pre><code class=\"python\">del &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;<\/code><\/pre>\n<p>   <\/p>\n<h3>II. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Tokeh<\/h3>\n<p>  \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 (\u043e\u0448\u0438\u0431\u043a\u0430\u0445), \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435\u0442, \u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0435. \u041c\u044b \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 tokinfo \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u0410 \u0432\u043e\u0442 \u0438 \u0441\u0430\u043c \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 tokinfo:  <\/p>\n<pre><code class=\"python\">  def tokinfo(self):     status = '' #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432     try:         slots = pyp11.listslots(self.handle)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         dd = ''         status = e1         return (dd, status)     status = '' #\u0418\u0449\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c  \u0442\u043e\u043a\u0435\u043d\u043e\u043c #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u043e\u0442\u044b     for v in slots: #\u0418\u0449\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442             if (v[0] != self.slotid):                 status = &quot;\u041e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u0441\u043b\u043e\u0442&quot;                 continue             self.returncode = '' #\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043b\u043e\u0442\u0430             self.flags = v[2] #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0441\u0442\u043e\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u0430             if (self.flags.count('TOKEN_PRESENT') !=0): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430                 tokinf = v[3]                 sn = tokinf[3].strip()                 if (self.sn != sn):                     status = '\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430=\\&quot;' + sn + '\\&quot; \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \\&quot;' + self.sn + '\\&quot;'                     dd = ''                     return (dd, status)                 status = ''                 break             else:                 dd = ''                 status = &quot;\u0412 \u0441\u043b\u043e\u0442\u0435 \u043d\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&quot;                 return (dd, status)     tt = tokinf     dd = dict(Label=tt[0].strip())     dd.update(Manufacturer=tt[1].strip())     dd.update(Model=tt[2].strip())     dd.update(SerialNumber=tt[3].strip())     self.infotok = dd #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     return (dd, status)<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0430\u0430 Token \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c.<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import sys import pyp11 class Token:   def __init__ (self, handlelp11, slottoken, serialnum):     flags = ''     self.pyver = sys.version[0]     if (self.pyver == '2'):         print ('\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f python3')         quit() #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PKCS#11     self.handle = handlelp11 #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c     self.slotid = slottoken #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430     self.sn = serialnum #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0442\u0435 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c     ret, stat = self.tokinfo() #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430     if (stat != ''): #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435         self.returncode = stat         return #\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d   def tokinfo(self):     status = '' #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432     try:         slots = pyp11.listslots(self.handle)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         dd = ''         status = e1         return (dd, status)     status = '' #\u0418\u0449\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c  \u0442\u043e\u043a\u0435\u043d\u043e\u043c #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u043e\u0442\u044b     for v in slots: #\u0418\u0449\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442             if (v[0] != self.slotid):                 status = &quot;\u041e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u0441\u043b\u043e\u0442&quot;                 continue             self.returncode = '' #\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043b\u043e\u0442\u0430             self.flags = v[2] #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0441\u0442\u043e\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u0430             if (self.flags.count('TOKEN_PRESENT') !=0): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430                 tokinf = v[3]                 sn = tokinf[3].strip()                 if (self.sn != sn):                     status = '\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430=\\&quot;' + sn + '\\&quot; \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \\&quot;' + self.sn + '\\&quot;'                     dd = ''                     return (dd, status)                 status = ''                 break             else:                 dd = ''                 status = &quot;\u0412 \u0441\u043b\u043e\u0442\u0435 \u043d\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&quot;                 return (dd, status)     tt = tokinf     dd = dict(Label=tt[0].strip())     dd.update(Manufacturer=tt[1].strip())     dd.update(Model=tt[2].strip())     dd.update(SerialNumber=tt[3].strip())     self.infotok = dd     return (dd, status)   def listcerts(self):     try:         status = ''         lcerts = pyp11.listcerts(self.handle, self.slotid)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         lcerts = ''         status = e1     return (lcerts, status)   def listobjects(self, type1, value = '' ):     try:         status = ''         if (value == ''):     \t    lobjs = pyp11.listobjects(self.handle, self.slotid, type1)         else:     \t    lobjs = pyp11.listobjects(self.handle, self.slotid, type1, value)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         lobjs = ''         status = e1     return (lobjs, status)   def rename(self, type, pkcs11id, label):     try:         status = ''         dd = dict(pkcs11_id=pkcs11id, pkcs11_label=label)         ret = pyp11.rename(self.handle, self.slotid, type, dd)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         ret = ''         status = e1     return (ret, status)   def changeckaid(self, type, pkcs11id, pkcs11idnew):     try:         status = ''         dd = dict(pkcs11_id=pkcs11id, pkcs11_id_new=pkcs11idnew)         ret = pyp11.rename(self.handle, self.slotid, type, dd)     except: #\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0430         e = sys.exc_info()[1]         e1 = e.args[0]         ret = ''         status = e1     return (ret, status)   def login(self, userpin):     try:         status = ''         bb = pyp11.login (self.handle, self.slotid, userpin)     except:         e = sys.exc_info()[1]         e1 = e.args[0]         bb = 0         status = e1     return (bb, status)   def logout(self):     try:         status = ''         bb = pyp11.logout (self.handle, self.slotid)     except:         e = sys.exc_info()[1]         e1 = e.args[0]         bb = 0         status = e1     return (bb, status)   def keypair(self, typek, paramk, labkey): #\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439     gost2012_512 = ['1.2.643.7.1.2.1.2.1', '1.2.643.7.1.2.1.2.2', '1.2.643.7.1.2.1.2.3']     gost2012_256 = ['1.2.643.2.2.35.1', '1.2.643.2.2.35.2',  '1.2.643.2.2.35.3',  '1.2.643.2.2.36.0', '1.2.643.2.2.36.1', '1.2.643.7.1.2.1.1.1', '1.2.643.7.1.2.1.1.2', '1.2.643.7.1.2.1.1.3', '1.2.643.7.1.2.1.1.4']     gost2001 = ['1.2.643.2.2.35.1', '1.2.643.2.2.35.2',  '1.2.643.2.2.35.3',  '1.2.643.2.2.36.0', '1.2.643.2.2.36.1'] #\u0422\u0438\u043f \u043a\u043b\u044e\u0447\u0430     typekey = ['g12_256', 'g12_512', 'gost2001']     genkey = ''     if (typek == typekey[0]):     \tgost = gost2012_256     elif (typek == typekey[1]):     \tgost = gost2012_512     elif (typek == typekey[2]):     \tgost = gost2001     else:     \tstatus = '\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0430'     \treturn (genkey, status)     if (gost.count(paramk) == 0) :     \tstatus = '\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043b\u044e\u0447\u0430'     \treturn (genkey, status)     try: #\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043f\u0430\u0440\u0430     \tstatus = ''     \tgenkey = pyp11.keypair(self.handle, self.slotid, typek, paramk, labkey)     except: #\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443     \te = sys.exc_info()[1]     \te1 = e.args[0]     \tprint (e1) #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435     \tstatus = e1     return (genkey, status)      def digest(self, typehash, source): #\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0445\u044d\u0448     try:         status = ''         digest_hex = pyp11.digest (self.handle, self.slotid, typehash, source)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435     \tstatus = e1     \tdigest_hex = ''     return (digest_hex, status) #\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438   def sign(self, ckmpair, digest_hex, idorhandle): #\u0414\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CKA_ID \u0438\u043b\u0438 handle \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430     try:         status = ''         sign_hex = pyp11.sign(self.handle, self.slotid, ckmpair, digest_hex, idorhandle)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435     \tstatus = e1     \tsign_hex = ''     return (sign_hex, status) #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438   def verify(self, digest_hex, sign_hex, pubkeyinfo): #\u0414\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CKA_ID \u0438\u043b\u0438 handle \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430     try:         status = ''         verify = pyp11.verify(self.handle, self.slotid, digest_hex, sign_hex, pubkeyinfo)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tverify = 0     \tstatus = e1     return (verify, status) #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d   def inittoken(self, sopin, labtoken):     try:         status = ''         dd = pyp11.inittoken (self.handle, self.slotid, sopin, labtoken)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = 0     \tstatus = e1     return (dd, status) #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 PIN-\u043a\u043e\u0434   def inituserpin(self, sopin, userpin):     try:         status = ''         dd = pyp11.inituserpin (self.handle, self.slotid, sopin, userpin)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = 0     \tstatus = e1     return (dd, status) #\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 PIN-\u043a\u043e\u0434   def changeuserpin(self, oldpin, newpin):     try:         status = ''         dd = pyp11.setpin (self.handle, self.slotid, 'user', oldpin, newpin)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = 0     \tstatus = e1     self.closesession ()     return (dd, status)   def closesession(self):     try:         status = ''         dd = pyp11.closesession (self.handle)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = 0     \tstatus = e1     return (dd, status)   def parsecert(self, cert_der_hex):     try:         status = ''         dd = pyp11.parsecert (self.handle, self.slotid, cert_der_hex)     except: #\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = ''     \tstatus = e1     return (dd, status)   def importcert(self, cert_der_hex, labcert):     try:         status = ''         dd = pyp11.importcert (self.handle, self.slotid, cert_der_hex, labcert)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = ''     \tstatus = e1     return (dd, status)   def delobject(self, hobject):     try:         status = ''         hobjc = dict(hobj=hobject)         dd = pyp11.delete(self.handle, self.slotid, 'obj', hobjc)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = ''     \tstatus = e1     return (dd, status)   def delete(self, type, pkcs11id):     if (type == 'obj'):         dd = ''         status = 'delete for type obj use nethod delobject'         return (dd, status)     try:         status = ''         idobj = dict(pkcs11_id=pkcs11id)         dd = pyp11.delete(self.handle, self.slotid, type, idobj)     except:     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = ''     \tstatus = e1     return (dd, status)   def listmechs(self):     try:         status = ''         dd = pyp11.listmechs (self.handle, self.slotid)     except: #\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0442\u043e\u043a\u0435\u043d\u0430     \te = sys.exc_info()[1]     \te1 = e.args[0] #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0438 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 status     \tdd = ''     \tstatus = e1     return (dd, status) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u043c\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0430 Token.<br \/>  \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u043e\u043a\u0435\u043d\u0430:  <\/p>\n<pre><code class=\"python\">&lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt; = Token(&lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u043a\u0435\u0442\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;, &lt;\u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440&gt;) if (&lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;.returncode != ''):    print('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:') #\u041f\u0435\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438    print(&lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;.returncode) #\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430    del &lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;    quit()<\/code><\/pre>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430:  <\/p>\n<pre><code class=\"python\">try:     ret = pyp11.inittoken (&lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u043a\u0435\u0442\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;, &lt;SO-PIN&gt;, &lt;\u043c\u0435\u0442\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430&gt;) except: #\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d     e = sys.exc_info()[1]     e1 = e.args[0]     print (e1)     quit()<\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Token \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 t1):  <\/p>\n<pre><code class=\"python\">ret, stat = t1.inittoken(&lt;SO-PIN&gt;, &lt;\u043c\u0435\u0442\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430&gt;) #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 if (stat != ''):    print('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430:') #\u041f\u0435\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438    print(stat)    quit()  <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0430\u0434\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 Token \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a:  <\/p>\n<pre><code class=\"plaintext\">&lt;handle&gt; := &lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 pkcs11&gt; &lt;slot&gt; := &lt;\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0441\u043b\u043e\u0442\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c&gt; &lt;error&gt; := &lt;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438&gt; &lt;ret&gt; := &lt;\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430&gt; &lt;cert_der_hex&gt; := &lt;\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0432 HEX-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435&gt; ================================================= #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e PIN-\u043a\u043e\u0434\u0430 &lt;ret&gt; = pyp11.inituserpin (&lt;handle&gt;, &lt;slot&gt;, &lt;SO-PIN&gt;, &lt;USER-PIN&gt;) &lt;ret&gt;, &lt;error&gt; = &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;.inituserpin (&lt;SO-PIN&gt;, &lt;USER-PIN&gt;) #\u0421\u043c\u0435\u043d\u0430 USER-PIN \u043a\u043e\u0434\u0430 &lt;ret&gt; = pyp11.setpin (&lt;handle&gt;, &lt;slot&gt;, 'user', &lt;USER-PIN \u0441\u0442\u0430\u0440\u044b\u0439&gt;, &lt;USER-PIN \u043d\u043e\u0432\u044b\u0439&gt;) &lt;ret&gt;, &lt;error&gt; = t1.changeuserpin (&lt;USER-PIN \u0441\u0442\u0430\u0440\u044b\u0439&gt;, &lt;USER-PIN \u043d\u043e\u0432\u044b\u0439&gt;) #\u0421\u043c\u0435\u043d\u0430 SO-PIN \u043a\u043e\u0434\u0430 &lt;ret&gt; = pyp11.setpin (&lt;handle&gt;, &lt;slot&gt;, 'so', &lt;SO-PIN \u0441\u0442\u0430\u0440\u044b\u0439&gt;, &lt;SO-PIN \u043d\u043e\u0432\u044b\u0439&gt;) &lt;ret&gt;, &lt;error&gt; = t1.changesopin (&lt;SO-PIN \u0441\u0442\u0430\u0440\u044b\u0439&gt;, &lt;SO-PIN \u043d\u043e\u0432\u044b\u0439&gt;) #Login &lt;ret&gt; = pyp11.login (&lt;handle&gt;, &lt;slot&gt;, &lt;USER-PIN&gt;) &lt;ret&gt;, &lt;error&gt; = t1.login (&lt;USER-PIN&gt;) #Logout &lt;ret&gt; = pyp11.logout (&lt;handle&gt;, &lt;slot&gt;) &lt;ret&gt;, &lt;error&gt; = t1.logout () #\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 &lt;ret&gt; = pyp11.closesession (&lt;handle&gt;) &lt;ret&gt;, &lt;error&gt; = t1.closesession () #\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435 &lt;ret&gt; = pyp11.listcerts (&lt;handle&gt;, &lt;slot&gt;) &lt;ret&gt;, &lt;error&gt; = t1.listcerts () #\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435 &lt;ret&gt; = pyp11.listobjects (&lt;handle&gt;, &lt;slot&gt;, &lt;'cert' | 'pubkey' | 'privkey' | 'data' | 'all'&gt; [, 'value']) &lt;ret&gt;, &lt;error&gt; = t1.listobjects (&lt;'cert' | 'pubkey' | 'privkey' | 'data' | 'all'&gt; [, 'value']) #\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 &lt;ret&gt; = pyp11.parsecert (&lt;handle&gt;, &lt;slot&gt;, &lt;cert_der_hex&gt;) &lt;ret&gt;, &lt;error&gt; = t1.parsecert(&lt;cert_der_hex&gt;) #\u0418\u043c\u043f\u043e\u0440\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 &lt;ret&gt; = pyp11.importcert (&lt;handle&gt;, &lt;slot&gt;, &lt;cert_der_hex&gt;, &lt;\u041c\u0435\u0442\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&gt;) &lt;ret&gt;, &lt;error&gt; = t1.importcert(&lt;cert_der_hex&gt;, &lt;\u041c\u0435\u0442\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&gt;) #\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u044d\u0448\u0430 &lt;ret&gt; = pyp11.digest (&lt;handle&gt;, &lt;slot&gt;, &lt;\u0442\u0438\u043f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430&gt;, &lt;\u043a\u043e\u043d\u0442\u0435\u043d\u0442&gt;) &lt;ret&gt;, &lt;error&gt; = t1.digest(&lt;\u0442\u0438\u043f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430&gt;, &lt;\u043a\u043e\u043d\u0442\u0435\u043d\u0442&gt;) #\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 &lt;ret&gt; = pyp11.digest (&lt;handle&gt;, &lt;slot&gt;, &lt;\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438&gt;, &lt;\u0445\u044d\u0448 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430&gt;, &lt;CKA_ID | handle \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430&gt;) &lt;ret&gt;, &lt;error&gt; = t1.digest(&lt;\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438&gt;, &lt;\u0445\u044d\u0448 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430&gt;, &lt;CKA_ID | handle \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430&gt;) #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 &lt;ret&gt; = pyp11.verify (&lt;handle&gt;, &lt;slot&gt;, &lt;\u0445\u044d\u0448 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430&gt;, &lt;\u043f\u043e\u0434\u043f\u0438\u0441\u044c&gt;, &lt;asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 subjectpublickeyinfo \u0432 hex&gt;) &lt;ret&gt;, &lt;error&gt; = t1.verify(&lt;\u0445\u044d\u0448 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430&gt;, &lt;\u043f\u043e\u0434\u043f\u0438\u0441\u044c&gt;, &lt;asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 subjectpublickeyinfo \u0432 hex&gt;) #\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b &lt;ret&gt; = pyp11.keypair (&lt;handle&gt;, &lt;slot&gt;, &lt;\u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0430&gt;, &lt;OID \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&gt;, &lt;CKA_LABEL&gt;) &lt;ret&gt;, &lt;error&gt; = t1.keypair(&lt;\u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0430&gt;, &lt;OID \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&gt;, &lt;CKA_LABEL&gt;) <\/code><\/pre>\n<p>  <\/p>\n<h3>III. \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c Token<\/h3>\n<p>  \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/542182\/\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f pyp11<\/a> \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c Token \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<br \/>  \u0418\u0442\u0430\u043a, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/a513\/PythonPKCS11Gost\" rel=\"nofollow noopener noreferrer\">\u0430\u0440\u0445\u0438\u0432<\/a> \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 PythonPKCS11 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:  <\/p>\n<pre><code class=\"python\">python3 setup.py install<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 tests \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f pyp11.<br \/>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 Token \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 test\/classtoken.<br \/>  \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Token \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0448\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b:  <\/p>\n<pre><code class=\"python\">import pyp11 from Token import Token<\/code><\/pre>\n<h3>IV. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0412 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0438 \u0442\u0440\u0435\u0442\u044c\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 <a href=\"https:\/\/github.com\/LudovicRousseau\/PyKCS11\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0435\u043a\u0442 PyKCS11<\/a>.<\/p>\n<p>  P.S. \u0425\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/habr.com\/ru\/users\/svyatikov\/\" class=\"user_link\">svyatikov<\/a> \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Windows.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/547770\/\"> https:\/\/habr.com\/ru\/post\/547770\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ak\/wh\/4p\/akwh4pindvbkurcpaxanmprjybe.png\" alt=\"image\" align=\"left\">\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/542182\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c pyp11, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0421\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 PKCS#11 \u0441 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043a\u043b\u0430\u0441\u0441 Token, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/github.com\/a513\/PythonPKCS11Gost\" rel=\"nofollow noopener noreferrer\">pyp11<\/a> \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Python-\u0435. \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u043a\u043b\u0430\u0441\u0441 token, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/533852\/\">TclOO<\/a> \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/453164\/\">cryptoarmpkcs<\/a>:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cg\/r3\/wm\/cgr3wmjjqtau47xxjuqkf47o2lq.png\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-319822","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=319822"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319822\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=319822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=319822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}