{"id":315289,"date":"2020-12-21T21:01:12","date_gmt":"2020-12-21T21:01:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315289"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315289","title":{"rendered":"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Lego \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Tcl. \u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 x509.v3"},"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\/ic\/zn\/83\/iczn83eihmvb6xhxlzxq5niiaqo.png\" align=\"left\" alt=\"image\">\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443 Tcl \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0430\u043c \u044f \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0430\u043b\u043e \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u043b \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432 \u0441\u0440\u0435\u0434\u0435 Tcl. \u041d\u043e \u0437\u0430 Tcl \u0441\u0442\u0430\u043b\u043e \u043e\u0431\u0438\u0434\u043d\u043e. \u042f \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u0418 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u041e\u041e\u041f) \u0432 \u0441\u0440\u0435\u0434\u0435 Tcl. \u0412\u0441\u0435 \u00ab\u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u00bb \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <abbr title=\"\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\">\u041e\u041e\u041f<\/abbr>. \u0410 \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0432\u043a\u0443\u0441. \u042d\u0442\u043e \u0438 Incr Tcl, Snit \u0438 XoTcl.<br \/>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u0435 \u043a \u044f\u0437\u044b\u043a\u0443 C++, \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0434\u043e\u043c\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044f \u0432 \u0441\u0440\u0435\u0434\u0435 Incr Tcl. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f <abbr title=\"\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\">OO\u041f<\/abbr> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Tcl. <br \/>   \u041f\u0430\u043a\u0435\u0442 Snit \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 Tk-\u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u0430 XoTcl \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a nx \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<br \/>   \u041e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u041e\u041e\u041f \u0432 \u044f\u0434\u0440\u043e Tcl \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 8.6. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f TclOO \u2014 Tcl Object Oriented.<br \/>   \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e Tcl \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<a name=\"habracut\"><\/a><br \/>  \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Tcl\/Tk, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/post\/413493\/\">\u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 CAFL63<\/a>, \u044f \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u043b \u043a \u041e\u041e\u041f. \u0418, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0437\u0440\u044f. \u0413\u0434\u0435, \u0433\u0434\u0435, \u0430 \u0432 <abbr title=\"\u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0426\u0435\u043d\u0442\u0440\">\u0423\u0426<\/abbr> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u044d\u0442\u043e \u0438 \u0441\u0430\u043c\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0441\u043f\u0438\u0441\u043a\u0438 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f3\/bj\/95\/f3bj95ne77ymihqhflye0alz3xk.png\"><\/p>\n<p>  \u041d\u0430\u0447\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 x509.v3 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u041e\u041e\u041f. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u043f\u044b\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/421107\/\">\u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 Python<\/a>. \u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c \u043c\u044b \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 TclOO.  <\/p>\n<h3><font color=\"blue\">\u041e DER \u0438 BER \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445<\/font><\/h3>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043b\u0430\u0441\u0441 certificate, \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u043e\u0440 \u0435\u0433\u043e \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0430\u043a\u0435\u0442 asn (package require asn), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441 \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 (\u043a\u0441\u0442\u0430\u0442\u0438, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430) \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430 \u0440\u0430\u0437\u0431\u043e\u0440 asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435. \u041d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0435\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b (\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e) \u0432 BER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435. \u041d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 ::asn::asnLength \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 ASN \u043d\u0430 \u043d\u043e\u0432\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u044b \u0442\u0435\u0433\u0430 \u043a\u0430\u043a \u0432 DER, \u0442\u0430\u043a \u0438 BER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445:  <\/p>\n<pre><code class=\"plaintext\">package require asn #\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0434\u043b\u0438\u043d\u044b  rename ::asn::asnGetLength ::asn::asnGetLength.orig #\u041d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0434\u043b\u0438\u043d\u044b proc ::asn::asnGetLength {data_var length_var} {     upvar 1 $data_var data  $length_var length     asnGetByte data length     if {$length == 0x080} { #\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 BER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \tset lendata [string length $data] \tset tvl 1 \tset length 0 \tset data1 $data \twhile {$tvl != 0} { \t    ::asn::asnGetByte data1 peek_tag  \t    ::asn::asnPeekByte data1 peek_tag1 \t    if {$peek_tag == 0x00 &amp;&amp; $peek_tag1 == 0x00} { \t\tincr tvl -1 \t\t::asn::asnGetByte data1 tag  \t\tincr length 2 \t\tcontinue \t    } \t    if {$peek_tag1 == 0x80} { \t\tincr tvl \t\tif {$tvl &gt; 0} { \t\t    incr length 2 \t\t} \t\t::asn::asnGetByte data1 tag  \t    } else { \t\tset l1 [string length $data1] \t\t::asn::asnGetLength data1 ll \t\tset l2 [string length $data1] \t\tset l3 [expr $l1 - $l2] \t\tincr length $l3 \t\tincr length $ll \t\tincr length \t\t::asn::asnGetBytes data1 $ll strt \t    } \t} \treturn     }     if {$length &gt; 0x080} {         set len_length [expr {$length &amp; 0x7f}]           if {[string length $data] &lt; $len_length} {             return -code error \\ \t\t&quot;length information invalid, not enough octets left&quot;          }         asnGetBytes data $len_length lengthBytes         switch $len_length {             1 { binary scan $lengthBytes     cu length }             2 { binary scan $lengthBytes     Su length }             3 { binary scan \\x00$lengthBytes Iu length }             4 { binary scan $lengthBytes     Iu length }             default {                                 binary scan $lengthBytes H* hexstr \t\tscan $hexstr %llx length             }         }     }     return } <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u043d\u0430\u043c \u0435\u0449\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f? \u041b\u044e\u0431\u0430\u044f ASN-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 X509.v3 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e OID-\u043e\u0432, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0449\u0435\u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c OID-\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 pki. \u041c\u044b \u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (package require pki). \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e\u0431 OID-\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445 \u0438 \u043e\u0431 OID-\u0430\u0445 \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. \u0418\u0445 \u0442\u043e\u0436\u0435 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ::pki::oids:  <\/p>\n<pre><code class=\"plaintext\">set ::pki::oids(1.2.643.100.1)  &quot;OGRN&quot; set ::pki::oids(1.2.643.100.5)  &quot;OGRNIP&quot; set ::pki::oids(1.2.643.3.131.1.1) &quot;INN&quot; set ::pki::oids(1.2.643.100.3) &quot;SNILS&quot; #\u0414\u043b\u044f \u041a\u041f\u041f \u0415\u0413\u0410\u0418\u0421 set ::pki::oids(1.2.840.113549.1.9.2) &quot;UN&quot; #set ::pki::oids(1.2.840.113549.1.9.2) &quot;unstructuredName&quot; #\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0438 set ::pki::oids(1.2.643.2.2.3) &quot;GOST R 34.10-2001 with GOST R 34.11-94&quot; set ::pki::oids(1.2.643.2.2.19) &quot;GOST R 34.10-2001&quot; set ::pki::oids(1.2.643.7.1.1.1.1) &quot;GOST R 34.10-2012-256&quot; set ::pki::oids(1.2.643.7.1.1.1.2) &quot;GOST R 34.10-2012-512&quot; set ::pki::oids(1.2.643.7.1.1.3.2) &quot;GOST R 34.10-2012-256 with GOSTR 34.11-2012-256&quot; set ::pki::oids(1.2.643.7.1.1.3.3) &quot;GOST R 34.10-2012-512 with GOSTR 34.11-2012-512&quot; set ::pki::oids(1.2.643.100.113.1) &quot;KC1 Class Sign Tool&quot; set ::pki::oids(1.2.643.100.113.2) &quot;KC2 Class Sign Tool&quot; set ::pki::oids(2.5.4.42)  &quot;givenName&quot;<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0438:   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">#\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">#\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0438 set ::pki::oids((1.2.643.2.2.35.1)\t&quot;id-GostR3410-2001-CryptoPro-A-ParamSet&quot; set ::pki::oids(1.2.643.2.2.35.2)\t&quot;id-GostR3410-2001-CryptoPro-B-ParamSet&quot; set ::pki::oids(1.2.643.2.2.35.3)\t&quot;id-GostR3410-2001-CryptoPro-C-ParamSet&quot; set ::pki::oids(1.2.643.2.2.36.0)\t&quot;id-GostR3410-2001-CryptoPro-XchA-ParamSet&quot; set ::pki::oids(1.2.643.2.2.36.1)\t&quot;id-GostR3410-2001-CryptoPro-XchB-ParamSet&quot; set ::pki::oids(1.2.643.7.1.2.1.1.1)\t&quot;id-tc26-gost-3410-2012-256-paramSetA&quot; set ::pki::oids(1.2.643.7.1.2.1.1.2)\t&quot;id-tc26-gost-3410-2012-256-paramSetB&quot; set ::pki::oids(1.2.643.7.1.2.1.1.3)\t&quot;id-tc26-gost-3410-2012-256-paramSetC&quot; set ::pki::oids(1.2.643.7.1.2.1.1.4)\t&quot;id-tc26-gost-3410-2012-256-paramSetD&quot; set ::pki::oids(1.2.643.7.1.2.1.2.1)\t&quot;id-tc26-gost-3410-2012-512-paramSetA&quot; set ::pki::oids(1.2.643.7.1.2.1.2.2)\t&quot;id-tc26-gost-3410-2012-512-paramSetB&quot; set ::pki::oids(1.2.643.7.1.2.1.2.3)\t&quot;id-tc26-gost-3410-2012-512-paramSetC&quot;<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h3><font color=\"blue\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430<\/font><\/h3>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 TclOO \u043c\u0430\u043b\u043e \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445. \u041a\u043b\u0430\u0441\u0441 \u0432 TclOO \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430) \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438 \u0435\u0433\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430), \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u043c\u0435\u0442\u043e\u0434\u044b, \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 DER \u0438\u043b\u0438 PEM \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435.<br \/>  \u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (superclass). \u0415\u0451 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0438\u0436\u0435. \u041d\u043e, \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u044d\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430. <br \/>  \u0412 TclOO \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:  <\/p>\n<pre><code class=\"plaintext\">info class instances oo::class<\/code><\/pre>\n<p>  \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441 pubkey. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 certificate \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 pubkey \u0438, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u043d \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 (superclass pubkey).<br \/>  \u0418\u0442\u0430\u043a, \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c parse_cert, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 certificate<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\"> oo::class create certificate { #\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432     foreach cl  &quot;[info class instances oo::class]&quot; { \tif {$cl == &quot;::pubkey&quot; } { #\u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 pubkey \u0435\u0441\u0442\u044c, \u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0435\u0433\u043e. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 3 \t    superclass pubkey \t    break \t}     } #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 #\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430.      variable ret #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430     variable extcert #\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440     constructor {cert} { \tarray set parsed_cert [::pki::_parse_pem $cert &quot;-----BEGIN CERTIFICATE-----&quot; &quot;-----END CERTIFICATE-----&quot;] \tset cert_seq $parsed_cert(data) \tarray set ret [list] #\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 der \u0432 hex \tbinary scan $cert_seq H* ret(cert_full)   # Decode X.509 certificate, which is an ASN.1 sequence \t::asn::asnGetSequence cert_seq wholething \t::asn::asnGetSequence wholething cert #tbs - \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \tset ret(tbsCert) [::asn::asnSequence $cert] \tbinary scan $ret(tbsCert) H* ret(tbsCert) \t::asn::asnPeekByte cert peek_tag \tif {$peek_tag != 0x02} {     # Version number is optional, if missing assumed to be value of 0 \t    ::asn::asnGetContext cert - asn_version \t    ::asn::asnGetInteger asn_version ret(version) \t    incr ret(version) \t} else { \t    set ret(version) 1 \t} \t::asn::asnGetBigInteger cert ret(serial_number) \t::asn::asnGetSequence cert data_signature_algo_seq \t::asn::asnGetObjectIdentifier data_signature_algo_seq ret(data_signature_algo) \t::asn::asnGetSequence cert issuer     set ret(issuer) $issuer \t::asn::asnGetSequence cert validity \t::asn::asnGetUTCTime validity ret(notBefore) \t::asn::asnGetUTCTime validity ret(notAfter) \t::asn::asnGetSequence cert subject     set ret(subject) $subject \t::asn::asnGetSequence cert pubkeyinfo \tbinary scan $pubkeyinfo H* ret(pubkeyinfo_hex) \t::asn::asnGetSequence pubkeyinfo pubkey_algoid \t::asn::asnGetObjectIdentifier pubkey_algoid ret(pubkey_algo) \t::asn::asnGetBitString pubkeyinfo pubkey \tset extensions_list [list] \twhile {$cert != &quot;&quot;} { \t    ::asn::asnPeekByte cert peek_tag \t    switch -- [format {0x%02x} $peek_tag] {     \t\t&quot;0x81&quot; {     \t\t\t::asn::asnGetContext cert - issuerUniqueID     \t\t    }     \t\t&quot;0x82&quot; {     \t\t\t::asn::asnGetContext cert - subjectUniqueID     \t\t    }     \t\t&quot;0xa1&quot; {     \t\t\t::asn::asnGetContext cert - issuerUniqID     \t\t    }     \t\t&quot;0xa2&quot; {     \t\t\t::asn::asnGetContext cert - subjectUniqID     \t\t    }     \t\t&quot;0xa3&quot; {     \t\t\t::asn::asnGetContext cert - extensions_ctx     \t\t\t::asn::asnGetSequence extensions_ctx extensions #\u0423\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 oid \u0432 \u0442\u0435\u043a\u0441\u0442 set ::pki::oids1 [array get ::pki::oids] array unset ::pki::oids      \t\t\twhile {$extensions != &quot;&quot;} {         \t\t    ::asn::asnGetSequence extensions extension \t\t            ::asn::asnGetObjectIdentifier extension ext_oid     \t\t\t    ::asn::asnPeekByte extension peek_tag     \t\t\t    if {$peek_tag == 0x1} {         \t\t\t::asn::asnGetBoolean extension ext_critical         \t\t    } else {         \t\t\tset ext_critical false         \t\t    }     \t\t\t    ::asn::asnGetOctetString extension ext_value_seq     \t\t\t    set ext_oid [::pki::_oid_number_to_name $ext_oid]     \t\t\t    set ext_value [list $ext_critical]     \t\t\t    switch -- $ext_oid {                         id-ce-basicConstraints {             \t\t\t    ::asn::asnGetSequence ext_value_seq ext_value_bin             \t\t\t    if {$ext_value_bin != &quot;&quot;} {             \t\t\t\t::asn::asnGetBoolean ext_value_bin allowCA             \t\t\t    } else {             \t\t\t\tset allowCA &quot;false&quot;             \t\t\t    }         \t\t\t    if {$ext_value_bin != &quot;&quot;} {             \t\t\t\t::asn::asnGetInteger ext_value_bin caDepth             \t\t\t    } else {             \t\t\t\tset caDepth -1             \t\t\t    }\t\t             \t\t\t    lappend ext_value $allowCA $caDepth                         }                         default {             \t\t\t    binary scan $ext_value_seq H* ext_value_seq_hex             \t\t\t    lappend ext_value $ext_value_seq_hex                         }                     }     \t\t\t    lappend extensions_list $ext_oid $ext_value     \t\t\t} #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 oid-\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442 array set ::pki::oids $::pki::oids1     \t\t    } \t    } \t} \tset ret(extensions) $extensions_list \tarray set extcert $extensions_list \t::asn::asnGetSequence wholething signature_algo_seq \t::asn::asnGetObjectIdentifier signature_algo_seq ret(signature_algo) \t::asn::asnGetBitString wholething ret(signature) \tset ret(serial_number) [::math::bignum::tostr $ret(serial_number)] \tset ret(signature) [binary format B* $ret(signature)] \tbinary scan $ret(signature) H* ret(signature) #\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 pubkeyinfo \u043f\u0440\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 - superclass \tif {[llength [self next]]} { #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \t\tnext $ret(pubkeyinfo_hex) \t}     }     method parse_cert {} {         return [array get ret]     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 variable \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430. <br \/>  \u041c\u0435\u0442\u043e\u0434 method \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 proc Tcl. \u041c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <\/p>\n<pre><code class=\"plaintext\">my variable &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439&gt;<\/code><\/pre>\n<p>. \u041c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 (\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438) \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c\u0438.<br \/>  \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0438\u0434\u0438\u043c\u044b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u044b, \u0447\u044c\u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 (\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c\u0438) \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u044f\u0432\u043d\u043e. \u0414\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u0441\u043b\u0443\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:  <\/p>\n<pre><code class=\"plaintext\">export &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&gt;<\/code><\/pre>\n<p>.<br \/>  \u0414\u043b\u044f \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\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=\"plaintext\">unexport &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&gt;<\/code><\/pre>\n<p>.<br \/>  \u0414\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 my:  <\/p>\n<pre><code class=\"plaintext\">my &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&gt;<\/code><\/pre>\n<p>.<br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0436\u0435 \u0446\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 self, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:  <\/p>\n<pre><code class=\"plaintext\">[self] &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&gt;<\/code><\/pre>\n<p>  \u041d\u0438\u0436\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u0441\u0451 \u044d\u0442\u043e.<br \/>  \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0432\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b\u0435 classparsecert.tcl.   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 classparsecert.tcl<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\"> package require asn #\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0434\u043b\u0438\u043d\u044b  rename ::asn::asnGetLength ::asn::asnGetLength.orig #\u041d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0434\u043b\u0438\u043d\u044b proc ::asn::asnGetLength {data_var length_var} {     upvar 1 $data_var data  $length_var length     asnGetByte data length     if {$length == 0x080} { #\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 BER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \tset lendata [string length $data] \tset tvl 1 \tset length 0 \tset data1 $data \twhile {$tvl != 0} { \t    ::asn::asnGetByte data1 peek_tag  \t    ::asn::asnPeekByte data1 peek_tag1 \t    if {$peek_tag == 0x00 &amp;&amp; $peek_tag1 == 0x00} { \t\tincr tvl -1 \t\t::asn::asnGetByte data1 tag  \t\tincr length 2 \t\tcontinue \t    } \t    if {$peek_tag1 == 0x80} { \t\tincr tvl \t\tif {$tvl &gt; 0} { \t\t    incr length 2 \t\t} \t\t::asn::asnGetByte data1 tag  \t    } else { \t\tset l1 [string length $data1] \t\t::asn::asnGetLength data1 ll \t\tset l2 [string length $data1] \t\tset l3 [expr $l1 - $l2] \t\tincr length $l3 \t\tincr length $ll \t\tincr length \t\t::asn::asnGetBytes data1 $ll strt \t    } \t} \treturn     }     if {$length &gt; 0x080} {         set len_length [expr {$length &amp; 0x7f}]         if {[string length $data] &lt; $len_length} {             return -code error \\ \t\t&quot;length information invalid, not enough octets left&quot;          }         asnGetBytes data $len_length lengthBytes         switch $len_length {             1 { binary scan $lengthBytes     cu length }             2 { binary scan $lengthBytes     Su length }             3 { binary scan \\x00$lengthBytes Iu length }             4 { binary scan $lengthBytes     Iu length }             default {                                 binary scan $lengthBytes H* hexstr \t\tscan $hexstr %llx length             }         }     }     return } package require pki set ::pki::oids(1.2.643.100.1)  &quot;OGRN&quot; set ::pki::oids(1.2.643.100.5)  &quot;OGRNIP&quot; set ::pki::oids(1.2.643.3.131.1.1) &quot;INN&quot; set ::pki::oids(1.2.643.100.3) &quot;SNILS&quot; #\u0414\u043b\u044f \u041a\u041f\u041f \u0415\u0413\u0410\u0418\u0421 set ::pki::oids(1.2.840.113549.1.9.2) &quot;UN&quot; #set ::pki::oids(1.2.840.113549.1.9.2) &quot;unstructuredName&quot; #\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0438 set ::pki::oids(1.2.643.2.2.3) &quot;GOST R 34.10-2001 with GOST R 34.11-94&quot; set ::pki::oids(1.2.643.2.2.19) &quot;GOST R 34.10-2001&quot; set ::pki::oids(1.2.643.7.1.1.1.1) &quot;GOST R 34.10-2012-256&quot; set ::pki::oids(1.2.643.7.1.1.1.2) &quot;GOST R 34.10-2012-512&quot; set ::pki::oids(1.2.643.7.1.1.3.2) &quot;GOST R 34.10-2012-256 with GOSTR 34.11-2012-256&quot; set ::pki::oids(1.2.643.7.1.1.3.3) &quot;GOST R 34.10-2012-512 with GOSTR 34.11-2012-512&quot; set ::pki::oids(1.2.643.100.113.1) &quot;KC1 Class Sign Tool&quot; set ::pki::oids(1.2.643.100.113.2) &quot;KC2 Class Sign Tool&quot; set ::pki::oids(2.5.4.42)  &quot;givenName&quot; #\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0438 set ::pki::oids((1.2.643.2.2.35.1)\t&quot;id-GostR3410-2001-CryptoPro-A-ParamSet&quot; set ::pki::oids(1.2.643.2.2.35.2)\t&quot;id-GostR3410-2001-CryptoPro-B-ParamSet&quot; set ::pki::oids(1.2.643.2.2.35.3)\t&quot;id-GostR3410-2001-CryptoPro-C-ParamSet&quot; set ::pki::oids(1.2.643.2.2.36.0)\t&quot;id-GostR3410-2001-CryptoPro-XchA-ParamSet&quot; set ::pki::oids(1.2.643.2.2.36.1)\t&quot;id-GostR3410-2001-CryptoPro-XchB-ParamSet&quot; set ::pki::oids(1.2.643.7.1.2.1.1.1)\t&quot;id-tc26-gost-3410-2012-256-paramSetA&quot; set ::pki::oids(1.2.643.7.1.2.1.1.2)\t&quot;id-tc26-gost-3410-2012-256-paramSetB&quot; set ::pki::oids(1.2.643.7.1.2.1.1.3)\t&quot;id-tc26-gost-3410-2012-256-paramSetC&quot; set ::pki::oids(1.2.643.7.1.2.1.1.4)\t&quot;id-tc26-gost-3410-2012-256-paramSetD&quot; set ::pki::oids(1.2.643.7.1.2.1.2.1)\t&quot;id-tc26-gost-3410-2012-512-paramSetA&quot; set ::pki::oids(1.2.643.7.1.2.1.2.2)\t&quot;id-tc26-gost-3410-2012-512-paramSetB&quot; set ::pki::oids(1.2.643.7.1.2.1.2.3)\t&quot;id-tc26-gost-3410-2012-512-paramSetC&quot; #\u041a\u043b\u0430\u0441\u0441 certificate oo::class create certificate { #\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 pubkey #    superclass pubkey #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 #\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430.      variable ret #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 variable extcert #\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440     constructor {cert} { \tarray set parsed_cert [::pki::_parse_pem $cert &quot;-----BEGIN CERTIFICATE-----&quot; &quot;-----END CERTIFICATE-----&quot;] \tset cert_seq $parsed_cert(data) \tarray set ret [list] #\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 der \u0432 hex \tbinary scan $cert_seq H* ret(cert_full)   # Decode X.509 certificate, which is an ASN.1 sequence \t::asn::asnGetSequence cert_seq wholething \t::asn::asnGetSequence wholething cert #tbs - \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \tset ret(tbsCert) [::asn::asnSequence $cert] \tbinary scan $ret(tbsCert) H* ret(tbsCert) \t::asn::asnPeekByte cert peek_tag \tif {$peek_tag != 0x02} {     # Version number is optional, if missing assumed to be value of 0 \t    ::asn::asnGetContext cert - asn_version \t    ::asn::asnGetInteger asn_version ret(version) \t    incr ret(version) \t} else { \t    set ret(version) 1 \t} \t::asn::asnGetBigInteger cert ret(serial_number) \t::asn::asnGetSequence cert data_signature_algo_seq \t::asn::asnGetObjectIdentifier data_signature_algo_seq ret(data_signature_algo) \t::asn::asnGetSequence cert issuer     set ret(issuer) $issuer \t::asn::asnGetSequence cert validity \t::asn::asnGetUTCTime validity ret(notBefore) \t::asn::asnGetUTCTime validity ret(notAfter) \t::asn::asnGetSequence cert subject     set ret(subject) $subject \t::asn::asnGetSequence cert pubkeyinfo \tbinary scan $pubkeyinfo H* ret(pubkeyinfo_hex) \t::asn::asnGetSequence pubkeyinfo pubkey_algoid \t::asn::asnGetObjectIdentifier pubkey_algoid ret(pubkey_algo) \t::asn::asnGetBitString pubkeyinfo pubkey \tset extensions_list [list] \twhile {$cert != &quot;&quot;} { \t    ::asn::asnPeekByte cert peek_tag \t    switch -- [format {0x%02x} $peek_tag] {     \t\t&quot;0x81&quot; {     \t\t\t::asn::asnGetContext cert - issuerUniqueID     \t\t    }     \t\t&quot;0x82&quot; {     \t\t\t::asn::asnGetContext cert - subjectUniqueID     \t\t    }     \t\t&quot;0xa1&quot; {     \t\t\t::asn::asnGetContext cert - issuerUniqID     \t\t    }     \t\t&quot;0xa2&quot; {     \t\t\t::asn::asnGetContext cert - subjectUniqID     \t\t    }     \t\t&quot;0xa3&quot; {     \t\t\t::asn::asnGetContext cert - extensions_ctx     \t\t\t::asn::asnGetSequence extensions_ctx extensions #\u0423\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 oid \u0432 \u0442\u0435\u043a\u0441\u0442 set ::pki::oids1 [array get ::pki::oids] array unset ::pki::oids      \t\t\twhile {$extensions != &quot;&quot;} {         \t\t    ::asn::asnGetSequence extensions extension \t\t            ::asn::asnGetObjectIdentifier extension ext_oid     \t\t\t    ::asn::asnPeekByte extension peek_tag     \t\t\t    if {$peek_tag == 0x1} {         \t\t\t::asn::asnGetBoolean extension ext_critical         \t\t    } else {         \t\t\tset ext_critical false         \t\t    }     \t\t\t    ::asn::asnGetOctetString extension ext_value_seq     \t\t\t    set ext_oid [::pki::_oid_number_to_name $ext_oid]     \t\t\t    set ext_value [list $ext_critical]     \t\t\t    switch -- $ext_oid {                         id-ce-basicConstraints {             \t\t\t    ::asn::asnGetSequence ext_value_seq ext_value_bin             \t\t\t    if {$ext_value_bin != &quot;&quot;} {             \t\t\t\t::asn::asnGetBoolean ext_value_bin allowCA             \t\t\t    } else {             \t\t\t\tset allowCA &quot;false&quot;             \t\t\t    }         \t\t\t    if {$ext_value_bin != &quot;&quot;} {             \t\t\t\t::asn::asnGetInteger ext_value_bin caDepth             \t\t\t    } else {             \t\t\t\tset caDepth -1             \t\t\t    }           \t\t\t\t\t\t             \t\t\t    lappend ext_value $allowCA $caDepth                         }                         default {             \t\t\t    binary scan $ext_value_seq H* ext_value_seq_hex             \t\t\t    lappend ext_value $ext_value_seq_hex                         }                     }     \t\t\t    lappend extensions_list $ext_oid $ext_value     \t\t\t} #\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 oid-\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442 array set ::pki::oids $::pki::oids1     \t\t    } \t    } \t} \tset ret(extensions) $extensions_list \tarray set extcert $extensions_list \t::asn::asnGetSequence wholething signature_algo_seq \t::asn::asnGetObjectIdentifier signature_algo_seq ret(signature_algo) \t::asn::asnGetBitString wholething ret(signature) \tset ret(serial_number) [::math::bignum::tostr $ret(serial_number)] \tset ret(signature) [binary format B* $ret(signature)] \tbinary scan $ret(signature) H* ret(signature) #\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 pubkeyinfo \u043f\u0440\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 - superclass #\tnext $ret(pubkeyinfo_hex)     }     method parse_cert {} {         return [array get ret]     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434:  <\/p>\n<pre><code class=\"plaintext\">&lt;\u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430&gt; create &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430&gt; [\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u0430]<\/code><\/pre>\n<p>  \u0438\u043b\u0438  <\/p>\n<pre><code class=\"plaintext\">set &lt;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 &gt; &lt;\u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430&gt; new [\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u0430]<\/code><\/pre>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u0430\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u042d\u0442\u043e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c:  <\/p>\n<pre><code class=\"plaintext\">&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;  &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&gt; [&lt;\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&gt;]<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b new \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. <br \/>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 <a href=\"https:\/\/habr.com\/ru\/post\/421107\/\">\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 Python<\/a>. \u0418 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c? \u041d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443.<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 example1.tcl \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:  <\/p>\n<pre><code class=\"plaintext\">#\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 source .\/classparsecert.tcl #\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 set file [lindex $argv 0] if {$argc != 1 || ![file exists $file]} {     puts &quot;Usage: tclsh example1 &lt;\u0444\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c&gt;&quot;     exit } puts &quot;Loading file: $file&quot; set fd [open $file] chan configure $fd -translation binary set data [read $fd] close $fd if {[catch {certificate create cert1 $data} er1]} { \tputs &quot;\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422&quot; \texit } array set cert_parse [cert1 parse_cert] #parray cert_parse puts &quot;\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&quot; foreach ind [array names cert_parse] {     puts &quot;\\tcert_parse($ind)&quot; }<\/code><\/pre>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"bash\">$tclsh .\/example1.tcl Loading file: minenergo.cer \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442         cert_parse(subject)         cert_parse(pubkeyinfo_hex)         cert_parse(extensions)         cert_parse(issuer)         cert_parse(data_signature_algo)         cert_parse(cert_full)         cert_parse(serial_number)         cert_parse(signature)         cert_parse(pubkey_algo)         cert_parse(notAfter)         cert_parse(signature_algo)         cert_parse(notBefore)         cert_parse(version)         cert_parse(tbsCert) $  <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"blue\">\u041e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 Lego<\/font><\/h3>\n<p>\u0423 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0442\u0430\u043a \u0438 \u0445\u043e\u0447\u0435\u0442 \u0441\u043e\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u044f\u0437\u044b\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441:- \u0410 \u043f\u0440\u0438\u0447\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Lego? \u0410 \u0432\u043e\u0442 \u043f\u0440\u0438 \u0447\u0435\u043c. \u0415\u0441\u043b\u0438, \u0441\u043a\u0430\u0436\u0435\u043c \u0432 C++ \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0441\u0440\u0430\u0437\u0443, \u0442\u043e \u0432 <abbr title=\"Tcl Object Oriented\">TclOO<\/abbr> \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u043e\u0434\u043d\u0438 \u0447\u0430\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0433\u0443\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438 \u0442.\u0434. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0434\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. <br \/>   \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435 \u0438 \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 issur \u0438 subject \u0438 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 parse_dn \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 (DN) \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 certificate, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0412 TclOO \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u043e\u0432\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432.<br \/>  \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0441 \u043d\u043e\u0432\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 (\u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430) \u0432\u0438\u0434\u0430:  <\/p>\n<pre><code class=\"plaintext\">oo::define &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;  { #\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \tvariable &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439&gt; \u2026 [&lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439&gt;] \t[ variable &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439&gt; ] }<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u00a0\u043a\u043e\u043c\u0430\u043d\u0434 variable, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b:  <\/p>\n<pre><code class=\"plaintext\">oo::define &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;  { #\u043c\u0435\u0442\u043e\u0434\u044b \tmethod &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 1&gt;  {&lt;\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&gt;} { \t\t&lt;\u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430&gt; \t} \t[ \t\u2026 \tmethod &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 N&gt;  {&lt;\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&gt;} { \t\t&lt;\u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430&gt; \t} \t] }<\/code><\/pre>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b deletemethod \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 \u043e\u0442\u0437\u044b\u0432\u043e\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430.<br \/>  \u041f\u0440\u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 (\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b) \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432\u044b\u0448\u0435.<br \/>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u0443\u0441\u0442\u044b\u043c:  <\/p>\n<pre><code class=\"plaintext\">oo::class create &lt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;<\/code><\/pre>\n<p>  \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:  <\/p>\n<pre><code class=\"plaintext\">oo::define &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;  { \u2026 }<\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u043a\u043b\u0430\u0441\u0441 Certificate:  <\/p>\n<pre><code class=\"plaintext\">oo::define certificate {     method issuer {} { \treturn [ my parse_dn $ret(issuer)]     }     method subject {} { \treturn [ my parse_dn $ret(subject)]     }     method parse_dn {asnblock} { \tset lret {}       while {[string length $asnblock]} {         asn::asnGetSet asnblock AttributeValueAssertion         asn::asnGetSequence AttributeValueAssertion valblock         asn::asnGetObjectIdentifier valblock oid \tset name [::pki::_oid_number_to_name $oid] \t::asn::asnGetString valblock  value \tlappend lret [string toupper $name] \tlappend lret $value       } \treturn $lret     }     unexport parse_dn }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435 \u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:  <\/p>\n<pre><code class=\"plaintext\">... puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:&quot; foreach {oid value} [cert1 subject] {     puts &quot;\\t$oid=$value&quot; } puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:&quot; foreach {oid value} [cert1 issuer] {     puts &quot;\\t$oid=$value&quot; } ...<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 example2.tcl<\/b>                         <\/p>\n<div class=\"spoiler_text\">source .\/classparsecert.tcl<br \/>  #\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442<br \/>  set file [lindex $argv 0]<br \/>  if {$argc != 1 || ![file exists $file]} {<br \/>   puts \u00abUsage: tclsh example1 &lt;\u0444\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c&gt;\u00bb<br \/>   exit<br \/>  }<br \/>  puts \u00abLoading file: $file\u00bb<br \/>  set fd [open $file]<br \/>  chan configure $fd -translation binary<br \/>  set data [read $fd]<br \/>  close $fd<br \/>  if {[catch {certificate create cert1 $data} er1]} {<br \/>   puts \u00ab\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422\u00bb<br \/>   exit<br \/>  }<br \/>  array set cert_parse [cert1 parse_cert]<br \/>  #parray cert_parse<br \/>  puts \u00ab\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u00bb<br \/>  foreach ind [array names cert_parse] {<br \/>   puts &quot;\\tcert_parse($ind)&quot;<br \/>  }<br \/>  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<br \/>  oo::define certificate {<br \/>   method issuer {} {<br \/>   return [ my parse_dn $ret(issuer)]<br \/>   }<br \/>   method subject {} {<br \/>   return [ my parse_dn $ret(subject)]<br \/>   }<br \/>   method parse_dn {asnblock} {<br \/>   set lret {}<br \/>   while {[string length $asnblock]} {<br \/>   asn::asnGetSet asnblock AttributeValueAssertion<br \/>   asn::asnGetSequence AttributeValueAssertion valblock<br \/>   asn::asnGetObjectIdentifier valblock oid<br \/>   set name [::pki::_oid_number_to_name $oid]<br \/>   ::asn::asnGetString valblock value<br \/>   lappend lret [string toupper $name]<br \/>   lappend lret $value<br \/>   }<br \/>   return $lret<br \/>   }<br \/>  #\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<br \/>   unexport parse_dn<br \/>  }<br \/>  #\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b<br \/>  puts \u00ab\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:\u00bb<br \/>  foreach {oid value} [cert1 subject] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00ab\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:\u00bb<br \/>  foreach {oid value} [cert1 issuer] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"bash\">$tclsh example2.tcl minenergo.cer   Loading file: minenergo.cer \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442         cert_parse(subject)         . . .          cert_parse(tbsCert) \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:         EMAIL=xxxxxxxxxxx         INN=xxxxxxxxxxx         OGRN=............ . . .         ST=77 \u0433. \u041c\u043e\u0441\u043a\u0432\u0430         C=RU         CN=\u041c\u0438\u043d \u0420\u043e\u0441\u0441\u0438\u0438 \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:  . . .         C=RU         ST=77 \u041c\u043e\u0441\u043a\u0432\u0430         L=\u041c\u043e\u0441\u043a\u0432\u0430         CN=\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 $<\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"blue\">\u041e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438<\/font><\/h3>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f.\u00a0\u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 (\u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e\u00a0\u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u043c\u00a0) \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0438\u0437 \u0441\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430).<br \/>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0435\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 pubkey, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b pubkeyinfo \u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f RSA, EC, GOST:  <\/p>\n<pre><code class=\"plaintext\">oo::class create pubkey { #\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b pubkeyinfo     variable infopk     constructor {pubkinfo} { \tset infopk $pubkinfo     }     method infopubkey {} { \tarray set retpk [list] \tset pubkeyinfo [binary format H* $infopk] \t::asn::asnGetSequence pubkeyinfo pubkey_algoid \t::asn::asnGetObjectIdentifier pubkey_algoid retpk(pubkey_algo) \t::asn::asnGetBitString pubkeyinfo pubkey \tset pubkey [binary format B* $pubkey] \tbinary scan $pubkey H* retpk(pubkey) \tset retpk(pkcs11id_hex) [::sha1::sha1  $pubkey] \tif {&quot;1 2 643&quot; == [string range $retpk(pubkey_algo) 0 6]} { #\u0413\u041e\u0421\u0422-\u043a\u043b\u044e\u0447     \t    set retpk(type) gost \t    ::asn::asnGetSequence pubkey_algoid pubalgost   #OID - \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \t    ::asn::asnGetObjectIdentifier pubalgost retpk(paramkey) \t    set retpk(paramkey) [::pki::_oid_number_to_name $retpk(paramkey)] \t    if {$pubalgost != &quot;&quot;} {   #OID - \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0445\u044d\u0448\u0430 \t\t::asn::asnGetObjectIdentifier pubalgost retpk(hashkey) \t    } else { \t\tset retpk(hashkey) &quot;&quot; \t    } \t} elseif {&quot;1 2 840 10045 2 1&quot; == $retpk(pubkey_algo) } { #EC-key     \t    set retpk(type) ec \t    ::asn::asnGetObjectIdentifier pubkey_algoid retpk(pubkey_algo_par) \t} elseif {&quot;1 2 840 113549 1 1 1&quot; == $retpk(pubkey_algo) }  { #RSA- key     \t    set retpk(type) rsa     \t\tbinary scan $pubkey H* retpk(pubkey)     \t\t::asn::asnGetSequence pubkey pubkey_parts     \t\t::asn::asnGetBigInteger pubkey_parts retpk(n)     \t\t::asn::asnGetBigInteger pubkey_parts retpk(e)     \t\tset retpk(n) [::math::bignum::tostr $retpk(n)]     \t\tset retpk(e) [::math::bignum::tostr $retpk(e)]     \t\tset retpk(l) [expr {int([::pki::_bits $retpk(n)] \/ 8.0000 + 0.5) * 8}] \t} else {     \t    set retpk(type) unknown \t} \treturn [array get retpk]     } }<\/code><\/pre>\n<p>  \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0444\u0430\u0439\u043b\u0435 classpubkeyinfo.tcl.<br \/>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 infopubkey \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 certificate \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430, \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f:  <\/p>\n<pre><code class=\"plaintext\">superclass pubkey<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 certificate \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 pubkey \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0435\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b pubkeyinfo:  <\/p>\n<pre><code class=\"plaintext\">next $ret(pubkeyinfo_hex)<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 next \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 constructor) \u0438\u0437 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430, \u0442.\u0435. \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 pubkey. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 pubkey \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 infopk asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0432 \u0442\u0435\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey \u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0431\u044b\u043b \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 certificate.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u0445\u0442 example3.tcl \u0437\u0434\u0435\u0441\u044c.<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\"> source .\/classpubkeyinfo.tcl source .\/classparsecert_and_pk.tcl set file [lindex $argv 0] if {$argc != 1 || ![file exists $file]} {     puts &quot;Usage: tclsh example1 &lt;\u0444\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c&gt;&quot;     exit } puts &quot;Loading file: $file&quot; set fd [open $file] chan configure $fd -translation binary set data [read $fd] close $fd if {[catch {certificate create cert1 $data} er1]} { puts &quot;\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&quot; exit } array set cert_parse [cert1 parse_cert] puts &quot;\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&quot; foreach ind [array names cert_parse] {     puts &quot;\\tcert_parse($ind)&quot; } #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b oo::define certificate {     method issuer {} { \treturn [ my parse_dn $ret(issuer)]     }     method subject {} { \treturn [ my parse_dn $ret(subject)]     }     method parse_dn {asnblock} { \tset lret {}       while {[string length $asnblock]} {         asn::asnGetSet asnblock AttributeValueAssertion         asn::asnGetSequence AttributeValueAssertion valblock         asn::asnGetObjectIdentifier valblock oid \tset name [::pki::_oid_number_to_name $oid] \t::asn::asnGetString valblock  value \tlappend lret [string toupper $name] \tlappend lret $value       } \treturn $lret     }     unexport parse_dn } puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:&quot; foreach {oid value} [cert1 subject] {     puts &quot;\\t$oid=$value&quot; } puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:&quot; foreach {oid value} [cert1 issuer] {     puts &quot;\\t$oid=$value&quot; } puts &quot;INFO PUB KEY&quot; foreach {oid value} [cert1 infopubkey] {     puts &quot;\\t$oid=$value&quot; } #\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 pubkey puts &quot;\u041a\u041b\u0410\u0421\u0421 INFO PUB KEY&quot; if {[catch {pubkey create pk1 $cert_parse(pubkeyinfo_hex)} er1]} { puts &quot;\u041d\u0415 PUBKEYINFO&quot; exit } foreach {oid value} [pk1 infopubkey] {     puts &quot;\\t$oid=$value&quot; } puts &quot;\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate&quot; puts &quot;\\t[info class methods certificate]&quot; puts &quot;\u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435&quot; puts &quot;\\t[info class methods certificate -private]&quot; <\/code><\/pre>\n<\/div><\/div>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 example3.tcl:  <\/p>\n<pre><code class=\"bash\"> $ tclsh example3.tcl minenergo.cer  Loading file: minenergo.cer \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442         cert_parse(subject)         . . .         cert_parse(tbsCert) \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:         . . .         ST=77 \u0433. \u041c\u043e\u0441\u043a\u0432\u0430         C=RU         CN=\u041c\u0438\u043d \u0420\u043e\u0441\u0441\u0438\u0438 \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:         C=RU         ST=77 \u041c\u043e\u0441\u043a\u0432\u0430         . . .         CN=\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 INFO PUB KEY         pkcs11id_hex=842205ac57465fd853a158544f1ea1ba1de58569         pubkey=04401dc81447918c7694a74dbe6bb4e4c10a63ca21d6b95a41ae20837deda4700f2404a0c1141d9b535b95707bb751791eb684bd09ce8f0c98d912dea947e4b8bbdb         hashkey=1 2 643 7 1 1 2 2         paramkey=id-GostR3410-2001-CryptoPro-XchA-ParamSet         type=gost         pubkey_algo=1 2 643 7 1 1 1 1 \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         subject parse_cert issuer \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435         parse_dn subject parse_cert issuer  . . . $<\/code><\/pre>\n<p>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e TclOO \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.  <\/p>\n<h3><font color=\"blue\">\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430<\/font><\/h3>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 certificate.<br \/>  \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \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=\"plaintext\"> info class methods &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt; [-private] <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 &quot;-private&quot; \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, \u0442\u043e \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:  <\/p>\n<pre><code class=\"plaintext\">info object clacc &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt;<\/code><\/pre>\n<p>.<br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 cert1 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0432\u0443\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c: certuficate \u0438 pubkey.<br \/>  \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0438\u043c\u0430\u043d\u0434\u0443:  <\/p>\n<pre><code class=\"plaintext\">info class superclasses &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;<\/code><\/pre>\n<p>  \u0410 \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:  <\/p>\n<pre><code class=\"plaintext\">info class subclasses &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430&gt;<\/code><\/pre>\n<p>.<br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c:  <\/p>\n<pre><code class=\"bash\">$  . . . \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         subject parse_cert issuer \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435         parse_dn subject parse_cert issuer \u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 certificate         1 \u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 pubkey         1 \u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         ::pubkey \u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey         ::oo::object \u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate  \u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey         ::certificate $ <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"blue\">\u041f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 (mix in) \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441<\/font><\/h3>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043c\u0438\u043c\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f (mix in). <br \/>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u043e\u0440 asn-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u042d\u0442\u043e \u0438 \u043d\u0430\u0447\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u041e\u0444\u043e\u0440\u043c\u0438\u043c \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 parseexts, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0443\u043a\u0442\u043e\u0440 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440:  <\/p>\n<pre><code class=\"plaintext\">#\u041a\u043b\u0430\u0441\u0441 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 oo::class create parseexts { #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c \u0438 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 #\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u043b\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c     variable ret     variable extcert #\u041f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b     method issuerSignTool {} { \tset member {&quot;\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u041a\u0417\u0418 \u0423\u0426&quot; &quot;\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0423\u0426&quot; &quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0421\u041a\u0417\u0418 \u0423\u0426&quot; &quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0423\u0426&quot;} #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \tif {![info exists extcert(1.2.643.100.112)]} { \t    return [list ] \t} \tset rr [list] \tset iss [binary format H* [lindex $extcert(1.2.643.100.112) 1]] \t::asn::asnGetSequence iss iss_pol \tfor {set i 0} {[string length $iss_pol] &gt; 0}  {incr i} { \t    ::asn::asnGetUTF8String iss_pol retist \t    lappend rr [lindex $member $i] \t    lappend rr $retist \t} \treturn $rr   }     method subjectSignTool {} { #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \tif {![info exists extcert(1.2.643.100.111)]} { \t    return [list ] \t} \tset iss [binary format H* [lindex $extcert(1.2.643.100.111) 1]] \tlappend rr &quot;User CKZI&quot; \t::asn::asnGetUTF8String iss retsst \tlappend rr $retsst \treturn $rr     }     method keyUsage {} {     #keyUsage \tset critcert &quot;No&quot; \tarray set ist [list] #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \tif {![info exists extcert(2.5.29.15)]} { \t    return [array get ist] \t}     \tset ku_hex [lindex $extcert(2.5.29.15) 1] \tif {[lindex $extcert(2.5.29.15) 0] == 1} {     \t\tset critcert &quot;Yes&quot; \t} \tset ku_options {&quot;Digital signature&quot; &quot;Non-Repudiation&quot; &quot;Key encipherment&quot; &quot;Data encipherment&quot; &quot;Key agreement&quot; &quot;Certificate signature&quot; &quot;CRL signature&quot; &quot;Encipher Only&quot; &quot;Decipher Only&quot; &quot;Revocation list signature&quot;} \tset ku [binary format H* $ku_hex] \t::asn::asnGetBitString ku ku_bin \tset retku {} \tfor {set i 0} {$i &lt; [string length $ku_bin]}  {incr i} { \t    if {[string range $ku_bin $i $i] &gt; 0 } {     \t\tlappend retku [lindex $ku_options $i] \t    } \t} \tarray set aku [list] \tset aku(keyUsage) $retku \tset aku(critcert) $critcert \treturn [array get aku]     } }<\/code><\/pre>\n<p>  \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445.<br \/>  \u0414\u043b\u044f \u043f\u043e\u0434\u043c\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 mixin:  <\/p>\n<pre><code class=\"plaintext\">mixin &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430&gt;  <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"plaintext\">oo::define certificate { \tmixin parseexts }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f example4.tcl \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c.<\/b>                         <\/p>\n<div class=\"spoiler_text\">  source .\/classpubkeyinfo.tcl<br \/>  source .\/classparsecert.tcl<br \/>  set file [lindex $argv 0]<br \/>  if {$argc != 1 || ![file exists $file]} {<br \/>   puts \u00abUsage: tclsh example1 &lt;\u0444\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c&gt;\u00bb<br \/>   exit<br \/>  }<br \/>  puts \u00abLoading file: $file\u00bb<br \/>  set fd [open $file]<br \/>  chan configure $fd -translation binary<br \/>  set data [read $fd]<br \/>  close $fd<br \/>  if {[catch {certificate create cert1 $data} er1]} {<br \/>  puts \u00ab\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u00bb<br \/>  exit<br \/>  }<br \/>  array set cert_parse [cert1 parse_cert]<br \/>  if {0} {<br \/>  puts \u00ab\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u00bb<br \/>  foreach ind [array names cert_parse] {<br \/>   puts &quot;\\tcert_parse($ind)&quot;<br \/>  }<br \/>  }<br \/>  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<br \/>  oo::define certificate {<br \/>   method issuer {} {<br \/>   return [ my parse_dn $ret(issuer)]<br \/>   }<br \/>   method subject {} {<br \/>   return [ my parse_dn $ret(subject)]<br \/>   }<br \/>   method parse_dn {asnblock} {<br \/>   set lret {}<br \/>   while {[string length $asnblock]} {<br \/>   asn::asnGetSet asnblock AttributeValueAssertion<br \/>   asn::asnGetSequence AttributeValueAssertion valblock<br \/>   asn::asnGetObjectIdentifier valblock oid<br \/>   set name [::pki::_oid_number_to_name $oid]<br \/>   ::asn::asnGetString valblock value<br \/>   lappend lret [string toupper $name]<br \/>   lappend lret $value<br \/>   }<br \/>   return $lret<br \/>   }<br \/>   unexport parse_dn<br \/>  }<br \/>  puts \u00ab\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:\u00bb<br \/>  foreach {oid value} [cert1 subject] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00ab\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:\u00bb<br \/>  foreach {oid value} [cert1 issuer] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00abINFO PUB KEY\u00bb<br \/>  foreach {oid value} [cert1 infopubkey] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  #\u041a\u043b\u0430\u0441\u0441 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430<br \/>  oo::class create parseexts {<br \/>  #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c<br \/>   variable ret<br \/>   variable extcert<br \/>   method issuerSignTool {} {<br \/>   set member {\u00ab\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u041a\u0417\u0418 \u0423\u0426\u00bb \u00ab\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0423\u0426\u00bb \u00ab\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0421\u041a\u0417\u0418 \u0423\u0426\u00bb \u00ab\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0423\u0426\u00bb}<br \/>  #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<br \/>   if {![info exists extcert(1.2.643.100.112)]} {<br \/>   return [list ]<br \/>   }<br \/>   set rr [list]<br \/>   set iss [binary format H* [lindex $extcert(1.2.643.100.112) 1]]<br \/>   ::asn::asnGetSequence iss iss_pol<br \/>   for {set i 0} {[string length $iss_pol] &gt; 0} {incr i} {<br \/>   ::asn::asnGetUTF8String iss_pol retist<br \/>   lappend rr [lindex $member $i]<br \/>   lappend rr $retist<br \/>   }<br \/>  # unset extcert(1.2.643.100.112)<br \/>   return $rr<br \/>   }<br \/>   method subjectSignTool {} {<br \/>  #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<br \/>   if {![info exists extcert(1.2.643.100.111)]} {<br \/>   return [list ]<br \/>   }<br \/>   set iss [binary format H* [lindex $extcert(1.2.643.100.111) 1]]<br \/>   lappend rr \u00abUser CKZI\u00bb<br \/>   ::asn::asnGetUTF8String iss retsst<br \/>   lappend rr $retsst<br \/>  # unset extcert(1.2.643.100.111)<br \/>   return $rr<br \/>   }<br \/>   method keyUsage {} {<br \/>   #keyUsage<br \/>   set critcert \u00abNo\u00bb<br \/>   array set ist [list]<br \/>  #\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<br \/>   if {![info exists extcert(2.5.29.15)]} {<br \/>   return [array get ist]<br \/>   }<br \/>   set ku_hex [lindex $extcert(2.5.29.15) 1]<br \/>   if {[lindex $extcert(2.5.29.15) 0] == 1} {<br \/>   set critcert \u00abYes\u00bb<br \/>   }<br \/>   set ku_options {\u00abDigital signature\u00bb \u00abNon-Repudiation\u00bb \u00abKey encipherment\u00bb \u00abData encipherment\u00bb \u00abKey agreement\u00bb \u00abCertificate signature\u00bb \u00abCRL signature\u00bb \u00abEncipher Only\u00bb \u00abDecipher Only\u00bb \u00abRevocation list signature\u00bb}<br \/>   set ku [binary format H* $ku_hex]<br \/>   ::asn::asnGetBitString ku ku_bin<br \/>   set retku {}<br \/>   for {set i 0} {$i &lt; [string length $ku_bin]} {incr i} {<br \/>   if {[string range $ku_bin $i $i] &gt; 0 } {<br \/>   lappend retku [lindex $ku_options $i]<br \/>   }<br \/>   }<br \/>   array set aku [list]<br \/>   set aku(keyUsage) $retku<br \/>   set aku(critcert) $critcert<br \/>   return [array get aku]<br \/>   }<br \/>  }<br \/>  oo::define certificate {<br \/>   mixin parseexts<br \/>  }<br \/>  puts \u00abkeyUsage\u00bb<br \/>  foreach {oid value} [cert1 keyUsage] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00abissuerSignTool\u00bb<br \/>  foreach {oid value} [cert1 issuerSignTool] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00absubjectSignTool\u00bb<br \/>  foreach {oid value} [cert1 subjectSignTool] {<br \/>   puts &quot;\\t$oid=$value&quot;<br \/>  }<br \/>  puts \u00ab\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate\u00bb<br \/>  puts &quot;\\t[info class methods certificate]&quot;<br \/>  puts \u00ab\u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435\u00bb<br \/>  puts &quot;\\t[info class methods certificate -private]&quot;<br \/>  puts \u00ab\u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 certificate\u00bb<br \/>  puts &quot;\\t[info object class cert1 certificate]&quot;<br \/>  puts \u00ab\u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 pubkey\u00bb<br \/>  puts &quot;\\t[info object class cert1 pubkey]&quot;<br \/>  puts \u00ab\u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate\u00bb<br \/>  puts &quot;\\t[info class superclasses certificate]&quot;<br \/>  puts \u00ab\u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey\u00bb<br \/>  puts &quot;\\t[info class superclasses pubkey]&quot;<br \/>  puts \u00ab\u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate\u00bb<br \/>  puts &quot;\\t[info class subclasses certificate]&quot;<br \/>  puts \u00ab\u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey\u00bb<br \/>  puts &quot;\\t[info class subclasses pubkey]&quot;<br \/>  puts \u00abMixin-\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate\u00bb<br \/>  puts &quot;\\t[info class mixins certificate]&quot;  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430:  <\/p>\n<pre><code class=\"bash\">$tclsh example4.tcl cert.cer . . . \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435: . . .         C=RU         ST=77 \u041c\u043e\u0441\u043a\u0432\u0430         L=\u041c\u043e\u0441\u043a\u0432\u0430 . . .         CN=\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 INFO PUB KEY         pkcs11id_hex=842205ac57465fd853a158544f1ea1ba1de58569         pubkey=04401dc81447918c7694a74dbe6bb4e4c10a63ca21d6b95a41ae20837deda4700f2404a0c1141d9b535b95707bb751791eb684bd09ce8f0c98d912dea947e4b8bbdb         hashkey=1 2 643 7 1 1 2 2         paramkey=id-GostR3410-2001-CryptoPro-XchA-ParamSet         type=gost         pubkey_algo=1 2 643 7 1 1 1 1 keyUsage         critcert=Yes         keyUsage={Digital signature} Non-Repudiation {Key encipherment} {Data encipherment} issuerSignTool         \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u041a\u0417\u0418 \u0423\u0426=&quot;CSP&quot;          \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0423\u0426=&quot;\u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440&quot; \u0432\u0435\u0440\u0441\u0438\u0438          \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0421\u041a\u0417\u0418 \u0423\u0426=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u2116         \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0423\u0426=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u2116  subjectSignTool         User CKZI=CSP  \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         subject parse_cert issuer \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435         parse_dn subject parse_cert issuer \u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 certificate         1 \u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cert1 \u043a\u043b\u0430\u0441\u0441\u0443 pubkey         1 \u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         ::pubkey \u0421\u0443\u043f\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey         ::oo::object \u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate  \u041f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043b\u0430\u0441\u0441\u0430 pubkey         ::certificate Mixin-\u044b \u043a\u043b\u0430\u0441\u0441\u0430 certificate         ::parseexts<\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"blue\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\/\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/font><\/h3>\n<p>  \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u041e\u041e\u041f \u0432 Tcl. \u041d\u043e \u043c\u044b \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438 \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432 TcllOO \u043c\u043e\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430, \u0442.\u0435. \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f. <br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 certificate \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430:  <\/p>\n<pre><code class=\"plaintext\"> #\u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 oo::define certificate { \tmethod signDoc {doc} { \t\tset sign &quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  $doc&quot; #\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \t\tmy variable signedDoc #\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \t\tincr signedDoc \t\treturn [list $signedDoc $sign] \t} } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u0430\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c:  <\/p>\n<pre><code class=\"plaintext\">. . .  set doc &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c1&quot; puts &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 $doc&quot; foreach {count sign} [cert1 signDoc $doc] {     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=$count&quot;     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot; } . . .<\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">. . . \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u041f\u043e\u0434\u043f\u0438\u0441\u044c1         \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=1         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  \u041f\u043e\u0434\u043f\u0438\u0441\u044c1&quot; . . .<\/code><\/pre>\n<p>  \u0421\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/457288\/\">cryptoarmpkcs<\/a>:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_m\/ap\/0i\/_map0iq_xz0qzsoylh5t5xc31zq.png\" alt=\"image\"><\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0443\u0431\u044b\u0432\u0430\u0435\u0442 \u0432 \u043e\u0442\u043f\u0443\u0441\u043a. \u041e\u043d \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043e\u0442\u043f\u0443\u0441\u043a\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u044b\u0445\u0430\u0442\u044c \u0438 \u043d\u0435 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c. \u041e\u043d \u0445\u043e\u0447\u0435\u0442 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:  <\/p>\n<pre><code class=\"plaintext\">#\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0442\u0437\u044b\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 proc revoke {cert_obj} {     oo::objdefine $cert_obj { #\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430         method signDoc {args} { #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f accessCert \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f             my variable accessCert              set sign &quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043e\u0437\u0432\u0430\u043d. \u041d\u0435 \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c!&quot; #\u0427\u0438\u0441\u043b\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 1             incr accessCert             return [list $accessCert $sign]         }         method unrevoke {} {             my variable accessCert #\u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434  unrevoke \u0443\u0434\u0430\u043b\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, #\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435  \u043c\u0435\u0442\u043e\u0434\u0430 signDoc \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438  #\u0443\u0434\u0430\u043b\u0438\u0442 \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 unrevoke             oo::objdefine [self] { deletemethod signDoc unrevoke }             if {![info exist accessCert]} {                 return 0             }             return $accessCert         }     } }<\/code><\/pre>\n<p>  \u0412\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u0432 signDoc \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438 \u0442\u0430\u043a \u0438 \u043d\u043e\u0432\u044b\u0445, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430. \u0422\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 unrevoke, \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u043c \u043f\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u0438\u0437 \u043e\u0442\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 signDoc \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 certificate, \u043f\u0443\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 signDoc \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u0442 \u0438 \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 unrevoke.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 example5.tcl \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">source .\/classpubkeyinfo.tcl source .\/classparsecert.tcl #\u041f\u0440\u0438\u043c\u0435\u0440 set file [lindex $argv 0] if {$argc != 1 || ![file exists $file]} {     puts &quot;File $file not exist&quot;     puts &quot;Usage: tclsh example1 &lt;\u0444\u0430\u0439\u043b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c&gt;&quot;     exit } puts &quot;Loading file: $file&quot; set fd [open $file] chan configure $fd -translation binary set data [read $fd] close $fd if {$data == &quot;&quot; } {     puts &quot;Bad file with certificate=$file&quot;     usage 1     exit } if {[catch {certificate create cert1 $data} er1]} { puts &quot;\u041d\u0415 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422&quot; exit } array set cert_parse [cert1 parse_cert] #parray cert_parse if {0} { puts &quot;\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&quot; foreach ind [array names cert_parse] {     puts &quot;\\tcert_parse($ind)&quot; } } #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b oo::define certificate {     method issuer {} { \treturn [ my parse_dn $ret(issuer)]     }     method subject {} { \treturn [ my parse_dn $ret(subject)]     }     method parse_dn {asnblock} { \tset lret {}       while {[string length $asnblock]} {         asn::asnGetSet asnblock AttributeValueAssertion         asn::asnGetSequence AttributeValueAssertion valblock         asn::asnGetObjectIdentifier valblock oid \tset name [::pki::_oid_number_to_name $oid] \t::asn::asnGetString valblock  value \tlappend lret [string toupper $name] \tlappend lret $value       } \treturn $lret     }     unexport parse_dn } puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435:&quot; foreach {oid value} [cert1 subject] {     puts &quot;\\t$oid=$value&quot; } puts &quot;\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435:&quot; foreach {oid value} [cert1 issuer] {     puts &quot;\\t$oid=$value&quot; } puts &quot;INFO PUB KEY&quot; foreach {oid value} [cert1 infopubkey] {     puts &quot;\\t$oid=$value&quot; } #\u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 oo::define certificate { \tmethod signDoc {doc} { \t\tset sign &quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  $doc&quot; #\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \t\tmy variable signedDoc #\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \t\tincr signedDoc \t\treturn [list $signedDoc $sign] \t} } set doc &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c1&quot; puts &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 $doc&quot; foreach {count sign} [cert1 signDoc $doc] {     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=$count&quot;     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot; } set doc &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c2&quot; puts &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 $doc&quot; foreach {count sign} [cert1 signDoc $doc] {     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=$count&quot;     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot; } #\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0442\u0437\u044b\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 proc revoke {cert_obj} {     oo::objdefine $cert_obj { #\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430         method signDoc {args} { #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f accessCert \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f             my variable accessCert              set sign &quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043e\u0437\u0432\u0430\u043d. \u041d\u0435 \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c!&quot; #\u0427\u0438\u0441\u043b\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 1             incr accessCert             return [list $accessCert $sign]         }         method unrevoke {} {             my variable accessCert #\u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434  unrevoke \u0443\u0434\u0430\u043b\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, #\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435  \u043c\u0435\u0442\u043e\u0434\u0430 signDoc \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438  #\u0443\u0434\u0430\u043b\u0438\u0442 \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 unrevoke             oo::objdefine [self] { deletemethod signDoc unrevoke }             if {![info exist accessCert]} {                 return 0             }             return $accessCert         }     } } #\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 oo::copy cert1 cert11 #\u041e\u0442\u0437\u044b\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 puts &quot;\u041e\u0442\u0437\u044b\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&quot; revoke cert1 foreach doc &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c3 \u043f\u043e\u0434\u043f\u0438\u0441\u044c4&quot; {     puts &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 $doc&quot;     foreach {count sign} [cert1 signDoc $doc] { \tputs &quot;\\t\u041f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430=$count&quot; \tputs &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot;     } } #\u0414\u043b\u044f \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0442\u0437\u044b\u0432 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 foreach doc &quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c3\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u044c4\u043a&quot; {     puts &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 $doc \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c&quot;     foreach {count sign} [cert11 signDoc $doc] {     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=$count&quot;     puts &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot;     } } #\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 foreach {count info} [cert1 unrevoke] {     puts &quot;\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0432\u043b\u0435\u043d\u043e&quot;     puts &quot;\\t\u0417\u0430 \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u043e\u0442\u0437\u044b\u0432\u0430 \u0431\u044b\u043b\u043e $count \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u044c\u0443\u043f\u0430&quot; } foreach doc &quot;\\&quot;\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\\&quot;&quot; {     puts &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 $doc&quot;     foreach {count sign} [cert1 signDoc $doc] { \tputs &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=$count&quot; \tputs &quot;\\t\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=\\&quot;$sign\\&quot;&quot;     } } <\/code><\/pre>\n<\/div><\/div>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 example5.tcl:  <\/p>\n<pre><code class=\"bash\">. . .  \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u041f\u043e\u0434\u043f\u0438\u0441\u044c1         \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=1         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  \u041f\u043e\u0434\u043f\u0438\u0441\u044c1&quot; \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u041f\u043e\u0434\u043f\u0438\u0441\u044c2         \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=2         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  \u041f\u043e\u0434\u043f\u0438\u0441\u044c2&quot; \u041e\u0442\u0437\u044b\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u041f\u043e\u0434\u043f\u0438\u0441\u044c3         \u041f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430=1         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043e\u0437\u0432\u0430\u043d. \u041d\u0435 \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c!&quot; \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c4         \u041f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430=2         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043e\u0437\u0432\u0430\u043d. \u041d\u0435 \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c!&quot; \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0432\u043b\u0435\u043d\u043e         \u0417\u0430 \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u043e\u0442\u0437\u044b\u0432\u0430 \u0431\u044b\u043b\u043e 2 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u044c\u0443\u043f\u0430 \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f         \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442=3         \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430=&quot;\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430  \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f&quot; . . .<\/code><\/pre>\n<p>  \u0423\u043f\u043e\u043c\u044f\u043d\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. \u042d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430:  <\/p>\n<pre><code class=\"plaintext\">oo::copy &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430&gt; &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043b\u043e\u043d\u0430&gt;<\/code><\/pre>\n<p>\u0413\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u041e\u041e\u041f \u043d\u0430 <a href=\"https:\/\/www.magicsplat.com\/articles\/oo.html\" rel=\"nofollow\">TclOO<\/a> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u043b\u0433\u043e. <br \/>  \u0415\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439 \u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c.<\/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\/533852\/\"> https:\/\/habr.com\/ru\/post\/533852\/<\/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\/ic\/zn\/83\/iczn83eihmvb6xhxlzxq5niiaqo.png\" align=\"left\" alt=\"image\">\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443 Tcl \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0430\u043c \u044f \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0430\u043b\u043e \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u043b \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432 \u0441\u0440\u0435\u0434\u0435 Tcl. \u041d\u043e \u0437\u0430 Tcl \u0441\u0442\u0430\u043b\u043e \u043e\u0431\u0438\u0434\u043d\u043e. \u042f \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u0418 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u041e\u041e\u041f) \u0432 \u0441\u0440\u0435\u0434\u0435 Tcl. \u0412\u0441\u0435 \u00ab\u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u00bb \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <abbr title=\"\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\">\u041e\u041e\u041f<\/abbr>. \u0410 \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0432\u043a\u0443\u0441. \u042d\u0442\u043e \u0438 Incr Tcl, Snit \u0438 XoTcl.<br \/>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u0435 \u043a \u044f\u0437\u044b\u043a\u0443 C++, \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0434\u043e\u043c\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044f \u0432 \u0441\u0440\u0435\u0434\u0435 Incr Tcl. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f <abbr title=\"\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\">OO\u041f<\/abbr> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Tcl. <br \/>   \u041f\u0430\u043a\u0435\u0442 Snit \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 Tk-\u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u0430 XoTcl \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a nx \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<br \/>   \u041e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u041e\u041e\u041f \u0432 \u044f\u0434\u0440\u043e Tcl \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 8.6. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f TclOO \u2014 Tcl Object Oriented.<br \/>   \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e Tcl \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/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-315289","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315289","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=315289"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315289\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}