{"id":318368,"date":"2021-02-20T21:00:48","date_gmt":"2021-02-20T21:00:48","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=318368"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=318368","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 I"},"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\/0y\/eh\/it\/0yehitz78ydsxb1ipr3ymdtyro4.png\" alt=\"image\" align=\"left\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 <a href=\"https:\/\/habr.com\/ru\/post\/316328\/\">\u0442\u043e\u043a\u0435\u043d\u043e\u0432 PKCS#11<\/a> \u0441 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (<a href=\"https:\/\/habr.com\/ru\/post\/335712\/\">Python<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/449462\/\">Tcl<\/a>) \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0451\u043c \u043f\u043e\u043b\u0435 \u0437\u0440\u0435\u043d\u0438\u044f. \u042d\u0442\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, <a href=\"https:\/\/habr.com\/ru\/post\/449462\/\">\u043f\u0430\u043a\u0435\u0442 TclPKCS11<\/a> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0435\u0433\u043e \u0431\u0430\u0437\u0435 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/453164\/\">cryptoarmpkcs<\/a>. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 cryptoarmpkcs \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 tcl\/tk \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Android. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/github.com\/a513\/TclPKCS11\" rel=\"nofollow noopener noreferrer\">TclPKCS11 \u0432\u0435\u0440\u0441\u0438\u0438 1.0.0<\/a> \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u0413\u041e\u0421\u0422 \u0420 34.11-2012 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u044b \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 256 \u0438 512 \u0431\u0438\u0442, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c. \u0412\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 cryptoarmpkcs, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0434\u0432\u0438\u0436\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442:<br \/>  <a name=\"habracut\"><\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/079\/c68\/551\/079c685516d480f98f0443297c522980.png\" alt=\"image\"><\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u0441\u0440\u0435\u0434\u0443 Python. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 PKCS#11 \u0432 Python.<br \/>  \u0412\u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/github.com\/LudovicRousseau\/PyKCS11\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0435\u043a\u0442 PyKCS11<\/a>. \u0418\u0437\u0443\u0447\u0438\u0432 \u0435\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438: \u0413\u041e\u0421\u0422 \u0420 34.10-2012 (\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c), \u0413\u041e\u0421\u0422 \u0420 34.11-2012 (\u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435), \u0413\u041e\u0421\u0422 \u0420 34.12-2015 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.13-2015 (\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a \u0438 \u041c\u0430\u0433\u043c\u0430). \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0438\u0441\u044c\u043c\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0441\u0432\u043e\u044e \u043f\u043e\u043c\u043e\u0449\u044c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0442\u0432\u0435\u0442 \u043c\u0435\u043d\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0435\u0441\u043a\u0443\u0440\u0430\u0436\u0438\u043b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cf\/xh\/xt\/cfxhxtovx4fh6s8zrh4uvoihjk8.png\"><\/p>\n<p>  \u0418 \u0442\u043e\u0433\u0434\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b \u043d\u0430 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 <a href=\"https:\/\/github.com\/a513\/TclPKCS11\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0435\u043a\u0442 TckPKCS11-1.0.1<\/a> \u0432 Python. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 TclPKCS11? \u0414\u0430 \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430 Python, \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f. \u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 TclPKCS11 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0412 \u043d\u0451\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0430\u0440 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 (512 \u0438 1024 \u0431\u0438\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430), \u0438 \u0434\u0430\u0436\u0435 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2001;<\/li>\n<li>\u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0445\u044d\u0448\u0430 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 (256 \u0438 512 \u0431\u0438\u0442), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.11-94 \u0438 SHA1;<\/li>\n<li>\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438.<\/li>\n<\/ul>\n<p>  \u0418\u0437 \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b:<\/p>\n<ul>\n<li>\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0441\u043c\u0435\u043d\u0430 PIN-\u043a\u043e\u0434\u043e\u0432);<\/li>\n<li>\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u0438\u0445;<\/li>\n<li>\u0438\u043c\u043f\u043e\u0440\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0435\u0439 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438):<\/li>\n<li>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u0435\u0442\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043a\u043b\u044e\u0447\u0438);<\/li>\n<li> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/li>\n<\/ul>\n<p>  \u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 PKCS#11, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u0440\u043e\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 PyKCS11. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<h3>I. \u041f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043c\u043e\u0434\u0443\u043b\u044f tclpkcs11 \u0432 \u043c\u043e\u0434\u0443\u043b\u044c pyp11 \u0434\u043b\u044f Python<\/h3>\n<p>  \u041f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043c\u043e\u0434\u0443\u043b\u044f tclpkcs11 \u043a \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Python. \u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u044f tclpkcs11.c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c tclpkcs11.c \u0432 \u0444\u0430\u0439\u043b pythonpkcs11.c \u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u043c. \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f Python \u043d\u0430\u0437\u043e\u0432\u0435\u043c <abbr title=\"pyTHONpKCS11\">pyp11<\/abbr>. <\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/469043\/\">C API Python<\/a>. \u041f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043d\u043e\u0433\u0438\u0435 (\u043d\u043e \u043d\u0435 \u044f) \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u0441\u0430\u043c\u044b\u043c \u0442\u0440\u0443\u0434\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u043e \u043e\u043d \u0441\u0430\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439. \u0410\u043d\u0430\u043b\u0438\u0437 C API \u0434\u043b\u044f Tcl \u0438 C API \u0434\u043b\u044f Python \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0438\u0445 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e, \u0447\u0442\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438) \u0438\u0437 Tcl \u0432 Python \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0432 \u0444\u0430\u0439\u043b\u0435 pythonpkcs11.c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f Tcl_Obj \u043d\u0430 PyObject, \u0447\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e: Tcl \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0430 Python \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0439 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 Tcl, \u0432 \u0421-\u043a\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443):<\/p>\n<pre><code class=\"cpp\">name_proc_tcl (CliendData cd, Tcl_Interp *interp, int objc, Tcl_Obj[] *objv[] ){           . . . };<\/code><\/pre>\n<p>  \u0412 Python \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">name_proc_py (PyObject *self, PyObject *args){           . . . };<\/code><\/pre>\n<p>  \u0412 C-\u043a\u043e\u0434\u0435 \u0434\u043b\u044f tcl \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 objc. <\/p>\n<pre><code class=\"cpp\">name_proc_tcl (CliendData cd, Tcl_Interp *interp, int objc, Tcl_Obj[] *objv[] ){   if (objc != 4) {           . . .     Tcl_SetObjResult(interp, Tcl_NewStringObj(&quot;wrong # args: should be \\&quot;pki::pkcs11::login handle slot password\\&quot;&quot;, -1));     return(TCL_ERROR);   }           . . . };<\/code><\/pre>\n<p>  \u0412 Python \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 PyTuple_Size(args):<\/p>\n<pre><code class=\"cpp\">name_proc_py (PyObject *self, PyObject *args){ \/\/\u0412\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432   int objc;   objc = PyTuple_Size(args);           . . .   if (objc != 3) {         PyErr_SetString(PyExc_TypeError, &quot;pyp11_login args error (count args != 3)&quot;); \treturn NULL;   }           . . . };<\/code><\/pre>\n<p>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f Tcl \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442.\u043a. \u0432 objv[0] \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main \u0432 C).<\/p>\n<p>  \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 Tcl \u0438 Python.<\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f Tcl \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <br \/>  return (TCL_ERROR);<\/p>\n<p>  \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c TclSetObjResult.<\/p>\n<p>  \u0414\u043b\u044f Python \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b return NULL \u0438 PyErr_SetString. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  \u0412 Tcl \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 Tcl-\u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u0432 Python \u2014 \u043a\u0430\u043a \u043a\u043e\u0440\u0442\u0435\u0436 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 Python-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434, \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pyp11_login):<\/p>\n<pre><code class=\"cpp\">\u2026 char *tcl_handle; long slotid_long; char *password; \/\/\u041c\u0430\u0441\u0441\u0438\u0432 PyObject-\u043e\u0432 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 PyObject *argspy[3]; \/\/\u0420\u0430\u0441\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\/\u043e\u0431\u044a\u0435\u043a\u0442\u044b   (&quot;OOO&quot; - \u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430) \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0430\u043c  PyArg_ParseTuple(args, &quot;OOO&quot;, &amp;argspy[0], &amp;argspy[1], &amp;argspy[2]) \u2026 <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">\u2026 \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 (s) \u0441 handle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PKCS11 PyArg_Parse(argspy[0], &quot;s&quot;, &amp;tcl_handle); \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 (l), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043a\u0435\u043d PyArg_Parse(argspy[1], &quot;l&quot;, &amp;slotid_long); \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 (s) \u0441 PIN-\u043a\u043e\u0434\u043e\u043c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430  PyArg_Parse(argspy[2], &quot;s&quot;, &amp;password); ... <\/code><\/pre>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 C API Python \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">PyArg_ParseTuple(args, \u00absls\u00bb, &amp;tcl_handle, &amp;slotid_long, &amp;password);<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043d\u0438 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438. <\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043b\u0438\u0431\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430, \u043b\u0438\u0431\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f. <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u0422\u0430\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f Tcl \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f Tcl_NewObj(), \u0430 \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f PyListNew(0).<\/p>\n<p>  \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f Tcl \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f TclListObjAppendElement, \u0430 \u0434\u043b\u044f Python \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f PyList_Append. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0432 <a href=\"https:\/\/github.com\/a513\/TclPKCS11\" rel=\"nofollow noopener noreferrer\">\u043a\u043e\u0434 TclPKCS11<\/a> \u0438 \u043a\u043e\u0434 pyp11 (\u0421\u0421\u042b\u041b\u041a\u0410). <\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 ckalloc \u0438 ckfree \u0432 tclpkcs11.c \u0434\u043b\u044f Tcl, \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 pythonpkcs11.c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u2014 malloc \u0438 free.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043d\u044f\u043b\u0430 \u043f\u0430\u0440\u0443 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0434\u043d\u0435\u0439.<\/p>\n<h3>II. \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f pyp11<\/h3>\n<p>  \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=\"bash\">#python3 setup.py install<\/code><\/pre>\n<p>  \u041b\u0438\u0447\u043d\u043e \u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 Windows, Linux, OS X. \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 TclPKCS11 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/488528\/\">Android<\/a>. <\/p>\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 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>  P\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0442\u043e\u043a\u0435\u043d\u0430. \u0412 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f pyp11.dgst, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u0442\u043e\u043a\u0435\u043d\u0430\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u044d\u0448 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012:<\/p>\n<pre><code class=\"python\">bash-4.4$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import pyp11 #\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0445\u044d\u0448 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.11-2012-256 (stribog256) &gt;&gt;&gt; hash256 = pyp11.dgst(&quot;stribog256&quot;, &quot;\u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&quot;) #\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0445\u044d\u0448 \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.11-2012-512 (stribog512) &gt;&gt;&gt; hash512 = pyp11.dgst(&quot;stribog512&quot;, &quot;\u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&quot;) &gt;&gt;&gt; print(&quot;STRIBOG256=&quot; + hash256) STRIBOG256=26b8865c37831aa254706e6c3514fb23f386358e9dd858703a24d4825d2c4794 &gt;&gt;&gt; print(&quot;STRIBOG512=&quot; + hash512) STRIBOG512=e92ff2063c586ec6e9c9569dad7dd503de1c88faafc8b1bf43909bfa36db92ccbf3823f0b8f5d877f10933ed7e670081018dac0929d17729422f05ce1f4c4f25 &gt;&gt;&gt; quit() bash-4.4$<\/code><\/pre>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0445\u044d\u0448-\u0430 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; hash256_bin = bytes(bytearray.fromhex(hash256))<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0439:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; hash256 = bytes(hash256_bin).hex() &gt;&gt;&gt; print(&quot;STRIBOG256_NEW=&quot; + hash256) STRIBOG256_NEW=26b8865c37831aa254706e6c3514fb23f386358e9dd858703a24d4825d2c4794 &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u0442\u043e\u043a\u0435\u043d\u0430. \u042d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f parsecert. \u041d\u0430 \u0432\u0445\u043e\u0434 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER-\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443:<\/p>\n<pre><code class=\"python\">bash-4.4$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import pyp11 &gt;&gt;&gt; #\u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 &gt;&gt;&gt; with open(&quot;cert_256.der&quot;, &quot;rb&quot;) as f: ...    cert_der = f.read() ...  &gt;&gt;&gt; #\u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 der \u0432 hex &gt;&gt;&gt; cert_der_hex = bytes(cert_der).hex() &gt;&gt;&gt; #\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 &gt;&gt;&gt; pubk = pyp11.parsecert(cert_der_hex) &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b pyp11.parsecert \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c (\u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a):<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt;print (pubk.keys()) dict_keys(['pkcs11_id', 'pubkeyinfo', 'pubkey', 'subject', 'issuer', 'serial_number', 'tbsCertificate', 'signature_algo', 'signature']) &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f as1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u0412\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u0421\u0440\u0435\u0434\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 pubkeyinfo \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b subjectpublickeyinfo, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 pubkey \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, tbs-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435 \u0438 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; subject = pubk['subject'] &gt;&gt;&gt; print ('SUBJECT=' + subject) SUBJECT=30820205310b3009060355040613025255312a3028060355042a0c21d09fd0b0d0b2d0b5d0bb20d090d0bdd0b0d182d0bed0bbd18cd0b5d0b2d0b8d1873135303306035504030c2cd09ed09ed09e20d09ad09ed09cd09fd090d09dd098d0af20d0add09ad09e2dd0a1d0a2d0a0d09ed099203937311d301b06092a864886f70d010901160e696e666f4072746564632e6f72673118301606052a85036401120d313137373734363733343433393116301406052a85036403120b3133383632313537373734311a301806082a85030381030101120c3030393732393131303536393130302e060355040c0c27d093d0b5d0bdd0b5d180d0b0d0bbd18cd0bdd18bd0b920d0b4d0b8d180d0b5d0bad182d0bed180310a3008060355040b0c013031353033060355040a0c2cd09ed09ed09e20d09ad09ed09cd09fd090d09dd098d0af20d0add09ad09e2dd0a1d0a2d0a0d09ed099203937315f305d06035504090c5631313931333620d0b32e20d09cd0bed181d0bad0b2d0b020d0bfd1802dd0b420312dd0b920d0a1d0b5d182d183d0bdd18cd181d0bad0b8d0b920d0b42e203130d09020d181d182d1802e203120d0bfd0bed0bc2e20323115301306035504070c0cd09cd0bed181d0bad0b2d0b0311c301a06035504080c13373720d0b32e20d09cd0bed181d0bad0b2d0b0311b301906035504040c12d0a5d0b0d180d0b8d182d0bed0bdd0bed0b2 &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u042d\u043b\u0435\u043c\u0435\u043d\u0442 pkcs11_id \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u043d\u0435 \u0438\u0437 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448 \u043f\u043e SHA-1 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pyp11.parsecert \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 (\u0431\u0435\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430) pkcs11_id \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d -1:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; pkcs11_id = pubk['pkcs11_id'] &gt;&gt;&gt; print ('PKCS11_ID=' + pkcs11_id) PKCS11_ID=-1 &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u041a\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0430 \u0447\u0442\u043e, \u0440\u0430\u0437\u0432\u0435 \u0432 Python \u043d\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432? \u0410 \u043a\u0430\u043a \u0436\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, asn1crypto? \u041e\u0442\u0432\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u0445 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0418 \u0432\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u0430 pyp11, \u0432 \u043d\u0435\u0433\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 pubkeyinfo \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0431\u044b\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f parsecert \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 x509.v3 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b subjectpublickeyinfo (pubkeyinfo).<\/p>\n<p>  \u0412 \u043f\u0430\u043f\u043a\u0435 tests \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 test0_* \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>  ############\u0423\u0411\u0420\u0410\u0422\u042c \u043f\u0440\u043e FSB795 ################################<\/p>\n<p>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0441 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/post\/421107\/\">fsb795<\/a>:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; import fsb795 &gt;&gt;&gt; #\u041f\u0430\u0440\u0441\u0438\u043c \u043d\u0430\u0448 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e fsb795 &gt;&gt;&gt; mycert = fsb795.Certificate(cert_der) &gt;&gt;&gt; #\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0442\u0438\u043f\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435 &gt;&gt;&gt; dn, type = mycert.subjectCert() &gt;&gt;&gt; #DN - \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044c\/\u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a &gt;&gt;&gt; for key in dn.keys(): ...     print (key + '=' + dn[key]) ...  Country=RU GN=\u0418\u043c\u044f \u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e CN=\u041e\u041e\u041e \u041a\u041e\u041c\u041f\u0410\u041d\u0418\u042f  E=info@ooo.org OGRN=xxxxxxxxxxxx SNILS=xxxxxxxxxxx INN=xxxxxxxxxxxx title=\u0413\u0435\u043d\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 OU=0 O=\u041e\u041e\u041e \u041a\u041e\u041c\u041f\u0410\u041d\u0418\u042f  street=119136 \u0433. \u041c\u043e\u0441\u043a\u0432\u0430  L=\u041c\u043e\u0441\u043a\u0432\u0430 ST=77 \u0433. \u041c\u043e\u0441\u043a\u0432\u0430 SN=\u0425\u0430\u0440\u0438\u0442\u043e\u043d\u043e\u0432 &gt;&gt;&gt;  <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.<\/p>\n<h3>III. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 PKCS#11<\/h3>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u043a\u0435\u043d PKCS#11, \u0434\u0430\u0436\u0435 \u0442\u043e\u043a\u0435\u043d \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 RuTokenLite. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0440\u0435\u0447\u044c \u043e \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0442\u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432 \u0432\u0438\u0434\u0443 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.11-2012. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 RuTokenECP-2.0, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0438\u043b\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b.<br \/>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443 \u043c\u043e\u0436\u043d\u043e, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 cryptoarmpkcs.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 cryptoarmpkcs \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c.<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li><a href=\"https:\/\/github.com\/a513\/CryptoArmPKCS\/raw\/master\/distr\/cryptoarmpkcs_linux32.tar.bz2\" rel=\"nofollow noopener noreferrer\">Linux32<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/a513\/CryptoArmPKCS\/raw\/master\/distr\/cryptoarmpkcs_linux64.tar.bz2\" rel=\"nofollow noopener noreferrer\">Linux64<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/a513\/CryptoArmPKCS\/raw\/master\/distr\/cryptoarmpkcs_mac.tar.bz2\" rel=\"nofollow noopener noreferrer\">OS X<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/a513\/CryptoArmPKCS\/raw\/master\/distr\/cryptoarmpkcs_setup_win32.exe\" rel=\"nofollow noopener noreferrer\">WIN32<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/a513\/CryptoArmPKCS\/raw\/master\/distr\/cryptoarmpkcs_setup_win64.exe\" rel=\"nofollow noopener noreferrer\">WIN64<\/a><\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b\u00bb:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/g8\/4w\/sh\/g84wshnhb_q9dainmc6nfnf7m5k.png\"><\/p>\n<p>  \u041d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0442\u043e\u043a\u0435\u043d \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u044f pyp11 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 librtpkcs11ecp-2.0 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libls11sw2016 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libls11cloud.so \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/habr.com\/ru\/post\/403563\/\">\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c<\/a>. \u0427\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u0434\u0430\u0436\u0435 \u0442\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043d\u0430 \u043d\u0438\u0445 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 loadmodule:<\/p>\n<pre><code class=\"python\">bash-4.4$ python3   Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import sys &gt;&gt;&gt; import pyp11 &gt;&gt;&gt; #\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 pkcs11 &gt;&gt;&gt; lib = &quot;\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so&quot; &gt;&gt;&gt; #\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PKCS#11 &gt;&gt;&gt; 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\u043b\u043e\u0445\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 ...     handlelib = pyp11.loadmodule(lib, 2) ... except: ...     print ('\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: ') ...     e = sys.exc_info()[1] ...     e1 = e.args[0] ...     print (e1) ...  \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:   pyp11_load_module args error (count args != 1) &gt;&gt;&gt; #\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c &gt;&gt;&gt; idlib = pyp11.loadmodule(lib) &gt;&gt;&gt; #\u041f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &gt;&gt;&gt; print (idlib) pkcs0 &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0435\u0451 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; pyp11.unloadmodule(idlib) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0435\u0451 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0442\u0430\u0445 \u0442\u043e\u043a\u0435\u043d\u044b. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0442\u043e\u0432 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043d\u0438\u0445 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 \u043d\u0438\u0445 \u0442\u043e\u043a\u0435\u043d\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; slots = pyp11.listslots(idlib) &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 pyp11.listslots \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043b\u043e\u0442\u0435: <\/p>\n<pre><code class=\"python\">[&lt;info slot1&gt;, &lt;info slot2&gt;, ... , &lt;info slotN&gt;]<\/code><\/pre>\n<p>.<br \/>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">[&lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;, &lt;\u043c\u0435\u0442\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u0441\u043b\u043e\u0442\u0435&gt;, &lt;\u0444\u043b\u0430\u0433\u0438 \u0441\u043b\u043e\u0442\u0430 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &lt;\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043a\u0435\u043d\u0435&gt;] <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043a\u0435\u043d, \u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b &lt;\u043c\u0435\u0442\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430 &#8230;&gt; \u0438 &lt;\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043b\u043e\u0442\u0435&gt; \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u0441\u043b\u043e\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u0444\u043b\u0430\u0433\u0430 TOKEN_PRESENT \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 &lt;\u0444\u043b\u0430\u0433\u0438 \u0441\u043b\u043e\u0442\u0430 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430&gt;:<\/p>\n<pre><code class=\"python\">bash-4.4$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import sys &gt;&gt;&gt; import pyp11 &gt;&gt;&gt; #\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &gt;&gt;&gt; #lib = '\/usr\/local\/lib64\/libls11sw2016.so' &gt;&gt;&gt; lib = '\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so' &gt;&gt;&gt; #\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &gt;&gt;&gt; libid = pyp11.loadmodule(lib) &gt;&gt;&gt; #\u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &gt;&gt;&gt; print (libid) pkcs0 &gt;&gt;&gt; #\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432 &gt;&gt;&gt; slots = pyp11.listslots(libid) &gt;&gt;&gt; tokpr = 0 &gt;&gt;&gt; #\u0418\u0449\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; while (tokpr == 0): ... #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u043e\u0442\u044b ...     for v in slots: ...         #\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 ...         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 (flags.count('TOKEN_PRESENT') !=0): ...             tokpr = 1 ... #\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0443 \u043c\u0435\u0442\u043a\u0438 \u0441\u043b\u043e\u0442\u0430 ...             lab = v[1].strip() ...             infotok = v[3] ...             slotid = v[0] ...             break ...     if (tokpr == 0): ...         input ('\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.\\n\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0412\u0412\u041e\u0414') ...     slots = pyp11.listslots(libid) ... #\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0442\u043e\u043a\u0435\u043d\u0435 ...  \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 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0412\u0412\u041e\u0414 '' &gt;&gt;&gt; #\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0442\u043e\u043a\u0435\u043d\u0435 &gt;&gt;&gt; print ('LAB=&quot;' + lab + '&quot;, SLOTID=' + str(slotid)) LAB=&quot;Rutoken lite &lt;no label&gt;&quot;, SLOTID=0 &gt;&gt;&gt; print ('FLAGS:', flags) FLAGS: ['TOKEN_PRESENT', 'RNG', 'LOGIN_REQUIRED', 'SO_PIN_TO_BE_CHANGED', 'REMOVABLE_DEVICE', 'HW_SLOT'] &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0444\u043b\u0430\u0433\u0438 (FLAGS:) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430, \u0442\u043e \u0432 \u043d\u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u043b\u0430\u0433 &#8216;TOKEN_INITIALIZED&#8217;. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043d\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"python\">#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d &gt;&gt;&gt; if (flags.count('TOKEN_INITIALIZED') == 0''): ...         #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043a\u0435\u043d ...         dd = pyp11.inittoken (libid, 0, '87654321',&quot;TESTPY2&quot;) ...          &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code class=\"python\">pyp11.inittoken (&lt;\u0434\u0438\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;)<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u043e\u043a\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0444\u043b\u0430\u0433\u0430 &#8216;TOKEN_INITIALIZED&#8217;, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u043d\u0435\u043c \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043a\u043b\u044e\u0447\u0438, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0442.\u0434).<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d USER-PIN. \u042d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0432\u0435\u0446 \u0442\u043e\u043a\u0435\u043d\u0430:<\/p>\n<pre><code class=\"python\">pyp11.inituserpin (&lt;\u0434\u0438\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;USER-PIN&gt;)<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 &#8216;USER_PIN_TO_BE_CHANGED&#8217;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0442\u043e\u043a\u0435\u043d\u0430, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0431\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439 USER-PIN (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#8216;user&#8217;):<\/p>\n<pre><code class=\"python\">pyp11.setpin (&lt;\u0434\u0438\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;, &lt;'user'|'so'&gt;,&lt;\u0442\u0435\u043a\u0443\u0449\u0438\u0439 PIN-\u043a\u043e\u0434&gt;, &lt;\u043d\u043e\u0432\u044b\u0439 PIN-\u043a\u043e\u0434&gt;)<\/code><\/pre>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u00ab\u043c\u043e\u0434\u043d\u043e\u00bb \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0423\u0426 \u0442\u043e\u043a\u0435\u043d\u044b \u0441 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0438 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 PIN-\u043a\u043e\u0434\u0430\u043c\u0438 \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u043e\u0439. \u0418, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0442, \u0447\u0442\u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e PIN-\u043a\u043e\u0434\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c, \u0438 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u042f \u0431\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0443 cryptoarmpkcs:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/44c\/6a9\/030\/44c6a9030e579ce9f8225b23d8b1f12e.png\" alt=\"image\"><\/p>\n<p>  \u0412 \u043f\u0430\u043f\u043a\u0435 tests \u043f\u0440\u043e\u0435\u043a\u0442\u0430 pyp11 \u043b\u0435\u0436\u0430\u0442 \u0442\u0440\u0438 \u0442\u0435\u0441\u0442\u0430 test1_0_inittoken.py, test1_1_inituserpin.py \u0438 test1_2_change_userpin, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u043e\u043a\u0435\u043d\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0445 \u043d\u0430\u0434\u043e \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u0430 PyKCS11:<\/p>\n<pre><code class=\"python\">$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import PyKCS11 &gt;&gt;&gt; #\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 PKCS#11 &gt;&gt;&gt; lib = '\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so' &gt;&gt;&gt; pkcs11.load(lib) &gt;&gt;&gt; #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 &gt;&gt;&gt; slots = pkcs11.getSlotList(tokenPresent=True) &gt;&gt;&gt; #\u0418\u0449\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; while (len(slots) == 0): ...     input ('\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.\\n\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0412\u0412\u041e\u0414') ...     #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 ...     slots = pkcs11.getSlotList(tokenPresent=True) ...  \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 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0412\u0412\u041e\u0414 '' &gt;&gt;&gt; &gt;&gt;&gt; #\u0411\u0435\u0440\u0451\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; slot = slots[0] &gt;&gt;&gt; #\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435  &gt;&gt;&gt; #SO-PIN &gt;&gt;&gt; so_pin = '87654321' &gt;&gt;&gt; lab_tok = &quot;myLabel&quot; &gt;&gt;&gt; #\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 &gt;&gt;&gt; pkcs11.initToken(slot, so_pin, lab_tok) &gt;&gt;&gt; session = pkcs11.openSession(slot, PyKCS11.CKF_SERIAL_SESSION | PyKCS11.CKF_RW_SESSION) &gt;&gt;&gt; #\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e USER-PIN  &gt;&gt;&gt; init_pin = '1234' &gt;&gt;&gt; session.login(so_pin, user_type=PyKCS11.CKU_SO) &gt;&gt;&gt; session.initPin(init_pin) &gt;&gt;&gt; session.logout() &gt;&gt;&gt; #\u041d\u043e\u0432\u044b\u0439 USER-PIN &gt;&gt;&gt; user_pin = '01234567' &gt;&gt;&gt; session.login(init_pin) &gt;&gt;&gt; # change PIN &gt;&gt;&gt; session.setPin(init_pin, user_pin) &gt;&gt;&gt; session.logout() &gt;&gt;&gt; quit() $ <\/code><\/pre>\n<p>  <\/p>\n<h3>IV. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043f\u0430\u0440\u0430, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 \u0435\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u0448 \u0442\u043e\u043a\u0435\u043d \u0433\u043e\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435: \u043c\u044b \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u043c\u0435\u0442\u043a\u0443, \u043d\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043c\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 PIN-\u043a\u043e\u0434\u044b (USER, SO). <\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.11-2012, \u0442\u043e \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b CKM_GOST* \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c\u0438 \u0422\u041a-26.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 pyp11.lictmechs:<\/p>\n<pre><code class=\"python\">&lt;\u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432&gt; = pyp11.listmech(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;)<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u043e \u0442\u043e\u043a\u0435\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, RuToken Lite. \u041e\u043d\u0438 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u043a\u0435\u043d\u044b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.11-2012:<\/p>\n<pre><code class=\"python\">$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import pyp11 &gt;&gt;&gt; #\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &gt;&gt;&gt; #\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; lib = '\/usr\/local\/lib64\/libls11sw2016.so' &gt;&gt;&gt; #\u0414\u043b\u044f Windows &gt;&gt;&gt; #lib='C:\\Temp\\ls11sw2016.dll' &gt;&gt;&gt; #\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; #lib = '\/usr\/local\/lib64\/libls11cloud.so' &gt;&gt;&gt; #\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d &gt;&gt;&gt; #lib = '\/usr\/local\/lib64\/librtpkcs11ecp_2.0.so' &gt;&gt;&gt; #\u0417\u0430\u043a\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &gt;&gt;&gt; aa = pyp11.loadmodule(lib) &gt;&gt;&gt; listmech = pyp11.listmechs(aa, 0) &gt;&gt;&gt; print ('\\t\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0442\u043e\u043a\u0435\u043d\u0430')         \u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0442\u043e\u043a\u0435\u043d\u0430 &gt;&gt;&gt; for mech in listmech: ...     print(mech) ... <\/code><\/pre>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"> CKM_GOSTR3410_KEY_PAIR_GEN (0x1200) CKM_GOSTR3410_512_KEY_PAIR_GEN (0xD4321005) CKM_GOSTR3410 (0x1201) CKM_GOSTR3410_512 (0xD4321006) CKM_GOSTR3410_WITH_GOSTR3411 (0x1202) CKM_GOSTR3410_WITH_GOSTR3411_12_256 (0xD4321008) CKM_GOSTR3410_WITH_GOSTR3411_12_512 (0xD4321009) CKM_GOSTR3410_DERIVE (0x1204) CKM_GOSTR3410_12_DERIVE (0xD4321007) CKM_GOSR3410_2012_VKO_256 (0xD4321045) CKM_GOSR3410_2012_VKO_512 (0xD4321046) CKM_KDF_4357 (0xD4321025) CKM_KDF_GOSTR3411_2012_256 (0xD4321026) CKM_KDF_TREE_GOSTR3411_2012_256 (0xD4321044) CKM_GOSTR3410_KEY_WRAP (0x1203) CKM_GOSTR3410_PUBLIC_KEY_DERIVE (0xD432100A) CKM_LISSI_GOSTR3410_PUBLIC_KEY_DERIVE (0xD4321037) CKM_GOST_GENERIC_SECRET_KEY_GEN (0xD4321049) CKM_GOST_CIPHER_KEY_GEN (0xD4321048) CKM_GOST_CIPHER_ECB (0xD4321050) CKM_GOST_CIPHER_CBC (0xD4321051) CKM_GOST_CIPHER_CTR (0xD4321052) CKM_GOST_CIPHER_OFB (0xD4321053) CKM_GOST_CIPHER_CFB (0xD4321054) CKM_GOST_CIPHER_OMAC (0xD4321055) CKM_GOST_CIPHER_KEY_WRAP (0xD4321059) CKM_GOST_CIPHER_ACPKM_CTR (0xD4321057) CKM_GOST_CIPHER_ACPKM_OMAC (0xD4321058) CKM_GOST28147_KEY_GEN (0x1220) CKM_GOST28147 (0x1222) CKM_GOST28147_KEY_WRAP (0x1224) CKM_GOST28147_PKCS8_KEY_WRAP (0xD4321036) CKM_GOST_CIPHER_PKCS8_KEY_WRAP (0xD432105A) CKM_GOST28147_ECB (0x1221) CKM_GOST28147_CNT (0xD4321825) CKM_GOST28147_MAC (0x1223) CKM_KUZNYECHIK_KEY_GEN (0xD4321019) CKM_KUZNYECHIK_ECB (0xD432101A) CKM_KUZNYECHIK_CBC (0xD432101E) CKM_KUZNYECHIK_CTR (0xD432101B) CKM_KUZNYECHIK_OFB (0xD432101D) CKM_KUZNYECHIK_CFB (0xD432101C) CKM_KUZNYECHIK_OMAC (0xD432101F) CKM_KUZNYECHIK_KEY_WRAP (0xD4321028) CKM_KUZNYECHIK_ACPKM_CTR (0xD4321042) CKM_KUZNYECHIK_ACPKM_OMAC (0xD4321043) CKM_MAGMA_KEY_GEN (0xD432102A) CKM_MAGMA_ECB (0xD4321018) CKM_MAGMA_CBC (0xD4321023) CKM_MAGMA_CTR (0xD4321020) CKM_MAGMA_OFB (0xD4321022) CKM_MAGMA_CFB (0xD4321021) CKM_MAGMA_OMAC (0xD4321024) CKM_MAGMA_KEY_WRAP (0xD4321029) CKM_MAGMA_ACPKM_CTR (0xD4321040) CKM_MAGMA_ACPKM_OMAC (0xD4321041) CKM_GOSTR3411 (0x1210) CKM_GOSTR3411_12_256 (0xD4321012) CKM_GOSTR3411_12_512 (0xD4321013) CKM_GOSTR3411_HMAC (0x1211) CKM_GOSTR3411_12_256_HMAC (0xD4321014) CKM_GOSTR3411_12_512_HMAC (0xD4321015) CKM_PKCS5_PBKD2 (0x3B0) CKM_PBA_GOSTR3411_WITH_GOSTR3411_HMAC (0xD4321035) CKM_TLS_GOST_KEY_AND_MAC_DERIVE (0xD4321033) CKM_TLS_GOST_PRE_MASTER_KEY_GEN (0xD4321031) CKM_TLS_GOST_MASTER_KEY_DERIVE (0xD4321032) CKM_TLS_GOST_PRF (0xD4321030) CKM_TLS_GOST_PRF_2012_256 (0xD4321016) CKM_TLS_GOST_PRF_2012_512 (0xD4321017) CKM_TLS12_MASTER_KEY_DERIVE (0x3E0) CKM_TLS12_KEY_AND_MAC_DERIVE (0x3E1) CKM_TLS_MAC (0x3E4) CKM_TLS_KDF (0x3E5) CKM_TLS_TREE_GOSTR3411_2012_256 (0xD4321047) CKM_EXTRACT_KEY_FROM_KEY (0x365) CKM_SHA_1 (0x220) CKM_MD5 (0x210) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<pre><code class=\"python\">&gt;&gt;&gt; quit() $ <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/400943\/\">\u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435<\/a> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0413\u041e\u0421\u0422 \u0420 34.10-2012-256 \u044d\u0442\u043e 512 \u0431\u0438\u0442, \u0430 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0413\u041e\u0421\u0422 \u0420 34.10-2012-512 \u044d\u0442\u043e 1024 \u0431\u0438\u0442\u0430), \u043d\u043e \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0445\u0435\u043c\u044b \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 (\u043f. 5.2 <a href=\"http:\/\/www.altell.ru\/legislation\/standards\/gost-34.10-2012.pdf\" rel=\"nofollow noopener noreferrer\">\u0413\u041e\u0421\u0422 \u0420 34.10-2012<\/a>). \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0445\u0435\u043c\u044b \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 (\u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438) \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b.<\/p>\n<p>  \u041a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f OID-\u0430\u043c\u0438. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <a href=\"https:\/\/tc26.ru\/about\/protsedury-i-reglamenty\/identifikatory-obektov-oid-tekhnicheskogo-komiteta-po-standartizatsii-kriptograficheskaya-zashchita-1.html\" rel=\"nofollow noopener noreferrer\">TK-26 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 oid-\u044b<\/a> \u0434\u043b\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c 256:<\/p>\n<ul>\n<li>1.2.643.7.1.2.1.1.1 (id-tc26-gost-3410-12-256-paramSetA);<\/li>\n<li>1.2.643.7.1.2.1.1.2 (id-tc26-gost-3410-12-256-paramSetB;<\/li>\n<li>1.2.643.7.1.2.1.1.3 (id-tc26-gost-3410-12-256-paramSetC);<\/li>\n<li>1.2.643.7.1.2.1.1.4 (id-tc26-gost-3410-12-256-paramSetD).<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 OID-\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442 \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e:<\/p>\n<ul>\n<li> 1.2.643.2.2.35.1 (id-GostR3410-2001-CryptoPro-A-ParamSet);<\/li>\n<li> 1.2.643.2.2.35.2 (d-GostR3410-2001-CryptoPro-B-ParamSet);<\/li>\n<li> 1.2.643.2.2.35.3 (id-GostR3410-2001-CryptoPro-C-ParamSet);<\/li>\n<li> 1.2.643.2.2.36.0 (id-GostR3410-2001-CryptoPro-XchA-Param)Set;<\/li>\n<li> 1.2.643.2.2.36.1 (id-GostR3410-2001-CryptoPro-XchB-Param)Set.<\/li>\n<\/ul>\n<p>  \u041a\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0430 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043a\u0430\u0448\u0430 \u0442\u0430\u043a\u0430\u044f? \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e \u0441\u0443\u0442\u0438, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e \u0441 OID-\u0430\u043c\u0438 1.2.643.2.2.35.1, 1.2.643.2.2.35.2, 1.2.643.2.2.35.3 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0422\u041a-26 \u0441 OID-\u0430\u043c\u0438 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 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e id-GostR3410-2001-CryptoPro-XchA-Param \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 id-GostR3410-2001-CryptoPro-A-ParamSet, \u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 id-GostR3410-2001-CryptoPro-XchB-Param \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 id-GostR3410-2001-CryptoPro-C-ParamSet \u0442\u043e\u0433\u043e \u0436\u0435 \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u043b\u0438\u0441\u044c, \u0442\u043e \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u0421 \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c 512 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<ul>\n<li> 1.2.643.7.1.2.1.2.1 (id-tc26-gost-3410-2012-512-paramSetA);<\/li>\n<li> 1.2.643.7.1.2.1.2.2 (id-tc26-gost-3410-2012-512-paramSetB);<\/li>\n<li> 1.2.643.7.1.2.1.2.3 (id-tc26-gost-3410-2012-512-paramSetC);<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code class=\"python\">&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u0432\u0430\u0440\u044f&gt; = pyp11.keypair(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c&gt;, &lt;\u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b&gt;, &lt;OID \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&gt;, &lt;\u043c\u0435\u0442\u043a\u0430\/CKA_LABEL&gt;)<\/code><\/pre>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0441 \u0447\u0435\u043c \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c, \u044d\u0442\u043e &lt;\u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b&gt;:<br \/>  &lt;\u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b&gt; := &#8216;g12_256&#8217; | &#8216;g12_512&#8217;<br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c 512, \u0442\u043e \u0437\u0430\u0434\u0430\u0435\u043c \u0442\u0438\u043f &#8216;g12_512&#8217;, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">genkey = pyp11.keypair(libid, slotid, 'g12_512', '1.2.643.7.1.2.1.2.2', 'KeyGost512')<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c 256 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">genkey256 = pyp11.keypair(libid, slotid, 'g12_256', '1.2.643.7.1.2.1.1.3', 'KeyGost256')<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435:<\/p>\n<pre><code class=\"python\">pyp11.login(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;, 'USER-PIN')<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c logout:<\/p>\n<pre><code class=\"python\">pyp11.logout(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430&gt;)<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (\u0441\u043b\u043e\u0432\u0430\u0440\u044c), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; pyp11.login(libid, slotid, '01234567') 1 &gt;&gt;&gt; genkey256 = pyp11.keypair(libid, slotid, 'g12_256', '1.2.643.7.1.2.1.1.3', 'KeyGost256') &gt;&gt;&gt; print (genkey256.keys()) dict_keys(['pkcs11_handle', 'pkcs11_slotid', 'hobj_pubkey', 'hobj_privkey', 'pkcs11_id', 'pkcs11_label', 'pubkey', 'pubkey_algo', 'pubkeyinfo', 'type']) &gt;&gt;&gt; pyp11.logout(libid, slotid) 1 &gt;&gt;&gt;<\/code><\/pre>\n<p>  \u0421\u0440\u0435\u0434\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 (&#8216;hobj_pubkey&#8217;) \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447\u0438 (&#8216;hobj_privkey&#8217;). \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0438. \u0421\u0440\u0435\u0434\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438 CKA_ID \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0439 (&#8216;pkcs11_id&#8217;). \u042d\u043b\u0435\u043c\u0435\u043d\u0442 pkcs11_id \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, CKA_ID \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448\u0430 SHA-1 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 &#8216;pubkey&#8217;. \u041f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b <a href=\"https:\/\/habr.com\/ru\/post\/316328\/\">CKA_ID<\/a> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0439. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u043d\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0449\u0443\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u044e\u0447\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; for key in genkey256.keys(): ...     print (key + '= ' + str(genkey256.get(key))) ...  pkcs11_handle= pkcs0 pkcs11_slotid= 0 hobj_pubkey= hobj0100000000000000 hobj_privkey= hobj0200000000000000 pkcs11_id= dd22fe35aeb7eb2ebcad7199b117eb3a7b5f5813 pkcs11_label= KeyGost256 pubkey= 4c2ed60bc5771b2a6616af58c8dd202b9463dde9bd1de028335e718634761e360a25b2f337c2e67c28402cd49fff4f708130a80dc479301b21ceb9324c47464b pubkey_algo= 1 2 643 7 1 1 1 1 pubkeyinfo= 302106082a85030701010101301506092a850307010201010306082a8503070101020203430004404c2ed60bc5771b2a6616af58c8dd202b9463dde9bd1de028335e718634761e360a25b2f337c2e67c28402cd49fff4f708130a80dc479301b21ceb9324c47464b type= pkcs11 &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u0435\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; hprivkey = genkey256.get(&quot;hobj_privkey&quot;) &gt;&gt;&gt; pkcs11_id = genkey256.get(&quot;pkcs11_id&quot;) &gt;&gt;&gt; pubkeyinfo = genkey256.get(&quot;pubkeyinfo&quot;) &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c (\u042d\u041f) \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0445\u044d\u0448 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0445\u044d\u0448:<br \/>  &lt;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0445\u044d\u0448 &gt; = pyp11.digest(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &#8216;stribog256&#8217; | &#8216;stribog512&#8217;, &lt;\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442&gt;)<br \/>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c 256 \u0431\u0438\u0442, \u0442\u043e \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u044d\u0448 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u041e\u0421\u0422 \u0420 34.11-2012 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 256 \u0431\u0438\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0445\u044d\u0448 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 &#8216;CKM_GOSTR3410&#8217;:<\/p>\n<pre><code class=\"python\">&lt;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f  \u042d\u041f&gt; = pyp11.sign(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, 'CKM_GOSTR3410' | 'CKM_GOSTR3410_512', &lt;\u0445\u044d\u0448 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430&gt;, &lt;hobj_privkey|pkcs11_id&gt;)<\/code><\/pre>\n<p>  \u0425\u044d\u0448 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <abbr title=\"\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u041f\u043e\u0434\u043f\u0438\u0441\u044c\">\u042d\u041f<\/abbr>:<\/p>\n<pre><code class=\"python\">bash-4.4$ python3 Python 3.7.9 (default, Feb  1 2021, 16:55:33)  [GCC 8.4.0] on linux Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. &gt;&gt;&gt; import pyp11 &gt;&gt;&gt; lib = '\/usr\/local\/lib64\/libls11sw2016.so'&gt;&gt;&gt; libid = pyp11.loadmodule(lib)&gt;&gt;&gt; slotid = 0 &gt;&gt;&gt; #\u041d\u0435\u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043b\u0438\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435!!! &gt;&gt;&gt; pyp11.login(libid, slotid, '01234567') 1 &gt;&gt;&gt; genkey256 = pyp11.keypair(libid, slotid, 'g12_256', '1.2.643.7.1.2.1.1.3', 'KeyGost256') &gt;&gt;&gt; hprivkey = genkey256.get(&quot;hobj_privkey&quot;) &gt;&gt;&gt; pkcs11_id = genkey256.get(&quot;pkcs11_id&quot;) &gt;&gt;&gt; pubkeyinfo = genkey256.get(&quot;pubkeyinfo&quot;) &gt;&gt;&gt; hashdoc_hex = pyp11.digest(libid, slotid, 'stribog256', '\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442') &gt;&gt;&gt; #\u0414\u043b\u044f \u042d\u041f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f hobj_privkey &gt;&gt;&gt; sign1 = pyp11.sign(libid, slotid, 'CKM_GOSTR3410', hashdoc_hex, hprivkey) &gt;&gt;&gt; #\u0414\u043b\u044f \u042d\u041f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f pkcs11_id (CKA_ID) &gt;&gt;&gt; sign2 = pyp11.sign(libid, slotid, 'CKM_GOSTR3410', hashdoc_hex, pkcs11_id) &gt;&gt;&gt; print ('SIGN1=' + sign1 ) SIGN1=5b3f881153f50d9a8da6bb37bb83f54fe997d074672c29c2c0aeb22739a14f1e776b8427e262b098c75abe3a4faffe383d3e2cc406afa09efb3e783919b4ca11 &gt;&gt;&gt; print ('SIGN2=' + sign2)  SIGN2=441a29206a3622a9c76282b71b4fcdbf4c15034d0f0be7b1f711c6d5eef8162a2a2876a5d375cb56e23fc76173cacf88b620fd793cf756589a76cbee6b1fd27a &gt;&gt;&gt; pyp11.logout(libid, slotid) 1 &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f asn1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 subjectPublicKeyInfo, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 pubkeyinfo:<\/p>\n<pre><code class=\"python\"> pubkeyinfo = genkey256.get(&quot;pubkeyinfo&quot;)<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<pre><code class=\"python\">pyp11.sign(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &lt;\u0445\u044d\u0448 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 hex&gt;, &lt;\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 hex&gt;, &lt;asn1-subjectPublicKeyInfo&gt;)<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1 (\u0435\u0434\u0438\u043d\u0438\u0446\u0443), \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0438 0 (\u043d\u043e\u043b\u044c), \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430.<\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; verify1 = pyp11.verify(libid, slotid, hashdoc_hex, sign1, pubkeyinfo) &gt;&gt;&gt; print (verify1) 1 &gt;&gt;&gt; verify2 = pyp11.verify(libid, slotid, hashdoc_hex, sign2, pubkeyinfo) &gt;&gt;&gt; print (verify2) 1 &gt;&gt;&gt; <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043e\u0431\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.<\/p>\n<h3>V. \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 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430<\/h3>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3 #-*- coding: utf-8 -*- import pyp11 print('\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430') #\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u0430 lib = '\/usr\/local\/lib64\/libls11sw2016.so' aa = pyp11.loadmodule(lib) print (aa) #\u0424\u0430\u0439\u043b \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 fileCA = &quot;CA_12_512.der&quot; #\u0424\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 fileUser = &quot;habrCA_12_512.der&quot; #\u0427\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 with open(fileCA, &quot;rb&quot;) as f:     certCA = f.read() #\u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c der \u0432 hex certCA_hex = bytes(certCA).hex() #\u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 with open(fileUser, &quot;rb&quot;) as f:     certHabr = f.read() #\u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c der \u0432 hex certHabr_hex = bytes(certHabr).hex() print ('\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442') parseCA = pyp11.parsecert (aa, 0, certCA_hex) print ('\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f') parseHabre = pyp11.parsecert (certHabr_hex) print (parseHabre.keys()) #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 if (parseCA.get('subject') != parseHabre.get('issuer')):     print ('\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u044b\u0434\u0430\u043d \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0423\u0426')     quit() print ('\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u044b\u0434\u0430\u043d \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0423\u0426') #\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c tbsCertificate \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432 binary tbs_hex = parseHabre.get('tbsCertificate') tbsHabrDer = bytes(bytearray.fromhex(tbs_hex)) #tbsHabrDer = '1111' #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0445\u044d\u0448 \u0434\u043b\u044f tbs-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 hashTbs_hex = pyp11.digest(aa, 0, &quot;stribog512&quot;, tbsHabrDer) #hashTbs_hex = pyp11.digest(aa, 0, &quot;stribog256&quot;, tbsHabrDer) verify = pyp11.verify(aa, 0,  hashTbs_hex, parseHabre.get('signature'), parseCA.get('pubkeyinfo')) #verify = pyp11.verify(aa, 0,  hashTbs_hex, parseHabre.get('signature'), parseHabre.get('pubkeyinfo')) print (verify) if (verify != 1):     print ('\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443')     quit() print ('\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443') quit() <\/code><\/pre>\n<p>  <\/p>\n<h3>VI. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0442\u043e\u043a\u0435\u043d\u0430<\/h3>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 PKCS#11, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043a\u043b\u044e\u0447\u0438. \u0418 \u0442\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043c\u0435\u044e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b. \u041d\u0430\u0441 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b CKA_LABEL \u0438\u043b\u0438 \u043c\u0435\u0442\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0421\u041a\u0410_ID \u0438\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 CKA_ID \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c \u0438 \u043a\u043b\u044e\u0447\u0430\u043c.<\/p>\n<p>  \u0423\u0436\u0435 \u0438\u043c\u0435\u044f \u0432 \u0441\u0432\u043e\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0434\u0443\u043b\u044f pyp11, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 \u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/453164\/\">\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442<\/a>. \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/415423\/\">\u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440<\/a> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442. \u041d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u0430\u043a \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0442\u043e\u043a\u0435\u043d \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u0435? \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 pyp11.importcert:<\/p>\n<pre><code class=\"python\">&lt;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f CKA_ID&gt; = pyp11.importcert(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &lt;\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0438 hex-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435&gt;, &lt;\u043c\u0435\u0442\u043a\u0430 CKA_LABEL&gt;)<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430? \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043e\u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043f\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 CKA_ID. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d \u0432 hex-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d \u0432 DER-\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b CKA_ID \u0438 CKA_LABEL. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u0440\u043e\u0439\u043a\u0443 &lt;\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&gt; x &lt;\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447&gt; x &lt;\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447&gt; \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e CKA_ID, \u043d\u043e \u0438 \u043f\u043e \u043c\u0435\u0442\u043a\u0435 CKA_LABEL, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0443 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043c\u0435\u0442\u043a\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 rename:<\/p>\n<pre><code class=\"python\">pyp11.rename(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &lt;\u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;, &lt;\u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a&gt;)<\/code><\/pre>\n<p>  \u0412 &lt;\u0442\u0438\u043f\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a \u043a\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430: &#8216;cert&#8217; | &#8216;key&#8217; | &#8216;all&#8217; (\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043f\u0430\u0440\u0430, \u043a \u0442\u043e\u043c\u0443 \u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443).<\/p>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 rename \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CKA_LABEL, \u043d\u043e \u0438 CKA_ID. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 CKA_ID (pkcs11_id), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">#\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0433\u043e CKA_ID labcert = 'LabelNEW' ckaid = pyp11.importcert(aa, 0, cert_der_hex, labcert) #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439 #\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c ldict = dict(pkcs11_id=ckaid, pkcs11_label=labcert) #\u041c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043a\u0438 \u0443 \u043a\u043b\u044e\u0447\u0435\u0439 pyp11.rename(aa, 0, 'key', ldict)<\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442 CKA_ID. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 CKA_ID:<\/p>\n<pre><code class=\"python\">ldict = dict(pkcs11_id=ckaid, pkcs11_id_new=11111)<\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/p>\n<pre><code class=\"python\">pyp11.delete(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;, &lt;\u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;, &lt;\u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a&gt;)<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u042d\u0442\u043e \u043b\u0438\u0431\u043e CKA_ID (\u043a\u043b\u044e\u0447 pkcs11_id) \u043b\u0438\u0431\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e handle-\u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 pyp11.listobjects, \u043a\u043b\u044e\u0447 pkcs11_handle):<\/p>\n<pre><code class=\"python\">ldict = dict(pkcs11_id=ckaid) #\u0418\u043b\u0438 \u0441 handle-\u043e\u0431\u044a\u0435\u043a\u0442\u0430: #ldict = dict(hobj=pkcs11_handle) #\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 pyp11.login(aa. 0, '01234567') pyp11.delete(aa, 0, 'all', ldict) pyp11.logout(aa, 0)<\/code><\/pre>\n<p>  \u0423\u043f\u043e\u043c\u044f\u043d\u0435\u043c \u0435\u0449\u0435 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u042d\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0439 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435:<\/p>\n<pre><code class=\"python\">pyp11.closesession(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;)<\/code><\/pre>\n<p>  \u042d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u00abPKCS11_ERROR SESSION_HANDLE_INVALID\u00bb, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u042d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  \u0418 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 pyp11.listcertsder:<\/p>\n<pre><code class=\"python\">&lt;\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&gt; = pyp11.listcerts(&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&gt;, &lt;\u0441\u043b\u043e\u0442 \u0442\u043e\u043a\u0435\u043d\u0430&gt;)<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3 #-*- coding: utf-8 -*- import sys import time import pyp11 print('\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0442\u043e\u043a\u0435\u043d\u0430') aa = pyp11.loadmodule('\/usr\/local\/lib64\/libls11sw2016.so') lcerts = pyp11.listcerts(aa, 0) if (len(lcerts) == 0):     print ('\u041d\u0430 \u0442\u043e\u043a\u0435\u043d\u0435 \u043d\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432')     quit() #\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b for cert in lcerts:     #\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435     for key in cert:         print (key + ': ' + cert[key]) #\u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441 pyp11.listobjects lm = pyp11.listobjects(aa, 0, 'cert', 'value') print('\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 listobjects:') for obj in lm:     for key in obj:         print (key + ': ' + obj[key]) quit()<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u044b pyp11.listobjects \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 pyp11.listcerts \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043d\u043e \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041e\u043f\u044b\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f tclpkcs11 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0432 \u043c\u043e\u0434\u0443\u043b\u044c pyp11 \u0434\u043b\u044f Python, \u0441 \u043b\u0438\u0445\u0432\u043e\u0439 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <abbr title=\"\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u041a\u043b\u044e\u0447\u0435\u0439\">\u0418\u041e\u041a<\/abbr> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u043d\u0430 \u0431\u0430\u0437\u0435 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043a\u043b\u0430\u0441\u0441 token, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0418 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438. \u041a\u0441\u0442\u0430\u0442\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f tclpkcs11 \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f.<br \/>  \u041d\u043e \u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 PyKCS11.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u043f\u0438\u0441\u044c\u043c\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 PyKCS11, \u0442\u043e \u044f \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u043d\u0435\u0433\u043e \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 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u043b \u0438\u043c \u043e\u0431 \u044d\u0442\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y0\/9h\/1t\/y09h1tczy7r9kdufk3iz9s3adbw.png\"><\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PyKCS11 \u0434\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u041a\u0441\u0442\u0430\u0442\u0438, \u043c\u043e\u0434\u0443\u043b\u044c pyp11 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 PyPCS11. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \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 \u043f\u0440\u043e\u0435\u043a\u0442 PyKCS11.<\/p><\/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\/542182\/\"> https:\/\/habr.com\/ru\/post\/542182\/<\/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\/0y\/eh\/it\/0yehitz78ydsxb1ipr3ymdtyro4.png\" alt=\"image\" align=\"left\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 <a href=\"https:\/\/habr.com\/ru\/post\/316328\/\">\u0442\u043e\u043a\u0435\u043d\u043e\u0432 PKCS#11<\/a> \u0441 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (<a href=\"https:\/\/habr.com\/ru\/post\/335712\/\">Python<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/449462\/\">Tcl<\/a>) \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0451\u043c \u043f\u043e\u043b\u0435 \u0437\u0440\u0435\u043d\u0438\u044f. \u042d\u0442\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, <a href=\"https:\/\/habr.com\/ru\/post\/449462\/\">\u043f\u0430\u043a\u0435\u0442 TclPKCS11<\/a> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0435\u0433\u043e \u0431\u0430\u0437\u0435 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/453164\/\">cryptoarmpkcs<\/a>. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 cryptoarmpkcs \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 tcl\/tk \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Android. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/github.com\/a513\/TclPKCS11\" rel=\"nofollow noopener noreferrer\">TclPKCS11 \u0432\u0435\u0440\u0441\u0438\u0438 1.0.0<\/a> \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u0413\u041e\u0421\u0422 \u0420 34.11-2012 \u0438 \u0413\u041e\u0421\u0422 \u0420 34.10-2012. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u044b \u043f\u043e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 256 \u0438 512 \u0431\u0438\u0442, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c. \u0412\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 cryptoarmpkcs, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0434\u0432\u0438\u0436\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442:  <\/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-318368","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318368","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=318368"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318368\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=318368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=318368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=318368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}