{"id":488266,"date":"2026-07-23T07:24:00","date_gmt":"2026-07-23T07:24:00","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=488266"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=488266","title":{"rendered":"\u0410\u0441\u0441\u0438\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0432 Java Card"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 Java Card. \u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0435 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u201cHello World\u201d. \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442, \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0430\u043f\u043f\u043b\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0425\u043e\u0441\u0442\u043e\u043c \u0438 \u043a\u0430\u0440\u0442\u043e\u0439.<\/p>\n<p><a href=\"https:\/\/github.com\/void-deref\/SecMsgApplet\" rel=\"noopener noreferrer nofollow\">\u0410\u043f\u043f\u043b\u0435\u0442<\/a> \u0438 <a href=\"https:\/\/github.com\/void-deref\/FunGP\" rel=\"noopener noreferrer nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 github.<\/p>\n<p>\u041b\u0435\u0433\u0435\u043d\u0434\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043e\u0442\u0446\u044b-\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0438\u0441\u044c \u0438\u0434\u0435\u0435\u0439 \u044f\u0437\u044b\u043a\u0430, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u043e\u0442 \u0438\u0437\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0443\u0442\u0435\u0447\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0435\u043f\u043e\u0442\u0440\u0435\u0431\u0441\u0442\u0432. \u0421\u043a\u0430\u0437\u0430\u043d\u043e \u2013 \u0441\u0434\u0435\u043b\u0430\u043d\u043e: \u0442\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Java Card platform (<strong>JCp<\/strong>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 (Java Card Virtual Machine, <strong>JCVM<\/strong>) \u0438 \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (Java Card Runtime Environment, <strong>JCRE<\/strong>). \u041e\u0434\u043d\u0430\u043a\u043e, JCp \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043e\u0441\u0442\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432 \u043c\u044f\u0433\u043a\u0438\u0435 \u043d\u043e\u0436\u043d\u044b, \u043e\u043d\u0430 \u0435\u0449\u0435 \u0441\u0442\u0430\u0440\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 (Global Platform, ISO 7816, ETSI), \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a \u0443\u0441\u0435\u0440\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043d\u043e\u043c \u0440\u044b\u043d\u043a\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442 \u0438 SIM-\u043a\u0430\u0440\u0442.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0437\u0430 \u0432\u0441\u0435 \u043d\u0430\u0434\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0443 \u0442\u0435\u0431\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 SRAM, \u043b\u044c\u0432\u0438\u043d\u0430\u044f \u0434\u043e\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0439 JCp, \u0442\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0431\u043e\u043b\u044c \u2013 \u044d\u0442\u043e \u0443\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u044b \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u00ab\u0445\u0440\u0435\u043d, \u0434\u0430 \u043d\u0438 \u0445\u0440\u0435\u043d\u0430\u00bb, \u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e-\u0442\u0430\u043a \u043f\u043e\u0434\u0436\u0438\u0440\u0430\u044e\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448 \u00ab\u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0439\u00bb \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043b\u0438\u0448\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0432\u0435\u0441\u0438\u0442 1,8 \u041a\u0431\u0430\u0439\u0442. \u0427\u0442\u043e-\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430 \u00ab\u0421\u0438\u00bb \u044f \u0431\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043a\u0443\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0442\u0440\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c \u2013 \u044d\u0442\u043e \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e: \u0443 \u0442\u0435\u0431\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438, \u0432\u043e\u0442 \u0438\u043c \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0441\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043c\u043d\u0438, \u0447\u0442\u043e \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 600 \u0431\u0430\u0439\u0442 SRAM, \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u044c\u0441\u044f \u043e \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043f\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0435.<\/p>\n<p>\u041d\u0443 \u0438 \u043a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u00abnew\u00bb: \u0432 Java, C#, \u0421++ \u0438 \u0421\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 malloc()) \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 SRAM. \u00ab\u041d\u0443, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0430 \u0433\u0434\u0435 \u0436\u0435 \u0435\u0449\u0435?\u00bb &#8212; \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c &#8212; \u00ab\u041f\u043e\u0434\u0435\u0440\u0436\u0438 \u043c\u043e\u0451 \u043f\u0438\u0432\u043e\u00bb &#8212; \u043e\u0442\u0432\u0435\u0442\u0438\u0442 JCRE, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u043e FLASH. \u0414\u0435\u0440\u0436\u0430 \u0432 \u0443\u043c\u0435 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0431\u0430\u0433\u0430\u0436 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433.<\/p>\n<p>\u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 <a href=\"https:\/\/github.com\/void-deref\/SecMsgApplet\" rel=\"noopener noreferrer nofollow\">\u0430\u0433\u043d\u0446\u0443<\/a>. \u0423\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0431\u0435\u0433\u0430\u0435\u0442 Java 8, \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 ant, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043b\u043e\u0433:<\/p>\n<pre><code class=\"bash\">$ ant # UbuntuBuildfile: \/home\/telman\/develop\/SecMsgApplet\/build.xmldist:      [cap] INFO: using JavaCard 3.0.4 SDK in \/home\/telman\/develop\/SecMsgApplet\/libraries\/jc304_kit with JDK 8      [cap] INFO: Setting package name to secure.messaging      [cap] Building CAP with 1 applet from package secure.messaging (AID: A000000083)      [cap] secure.messaging.Main A0000000837365636D7367  [compile] Compiling files from \/home\/telman\/develop\/SecMsgApplet\/src  [compile] Compiling 2 source files to \/tmp\/jccpro8021669146027107305  [compile] \/home\/telman\/develop\/SecMsgApplet\/src\/secure\/messaging\/ECCurves.java  [compile] \/home\/telman\/develop\/SecMsgApplet\/src\/secure\/messaging\/Main.java   [verify] Verification passed      [cap] CAP saved to \/home\/telman\/develop\/SecMsgApplet\/SM_applet.capBUILD SUCCESSFULTotal time: 0 seconds<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u00abSM_applet.cap\u00bb. \u0422\u0430\u043a, \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c.<\/p>\n<h3>\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 install()<\/h3>\n<p>\u0412 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438 JCp \u0432\u0445\u043e\u0434\u044f\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 &#8212; \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043c\u0435\u043d\u0443\u0435\u0442\u0441\u044f JCRE. \u0412\u043e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0438 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>install()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"java\">public static voidinstall(byte[] params, short off, byte len){    Main applet = new Main(params, off, len);    applet.register();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<pre><code class=\"java\">publicMain(byte[] params, short off, byte len){ram_buff   = JCSystem.makeTransientByteArray(_64, JCSystem.CLEAR_ON_RESET);state      = JCSystem.makeTransientByteArray(_01, JCSystem.CLEAR_ON_RESET);secret     = new byte[_32];len = params[off++];\/\/ Instance AID lengthoff += len;len = params[off++];\/\/ Control info lengthoff += len;len = params[off++];\/\/ applet data length (i.e. C9xx)if (len != _32) {ISOException.throwIt((short)(ISO7816.SW_WRONG_LENGTH | _01));}Util.arrayCopy(params, off, secret, _00, len);ecc_keys = ECCurves.getKeyPair();ecc_keys.genKeyPair();private_key = (ECPrivateKey)ecc_keys.getPrivate();public_key  = (ECPublicKey)ecc_keys.getPublic();agreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH_PLAIN, false);agreement.init(private_key);aes_key    = (AESKey)KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_RESET, KeyBuilder.LENGTH_AES_128, false);    aes_cipher = Cipher.getInstance(Cipher.ALG_AES_CBC_ISO9797_M2, false);state[_00] = STATE_APDU_PLAIN;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0442\u0443\u0442:<\/p>\n<ul>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 <code>JCSystem.makeTransientByteArray()<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0438\u043f\u0430 <code>byte<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0435\u0433\u043e \u0432\u043e FLASH, \u043d\u043e \u0441\u0430\u043c \u0431\u0443\u0444\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 SRAM, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 64 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 <code>len = params[off++]; off += len;<\/code> \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 GlobalPlatform v2.3 \u0442\u0443\u0442:<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e2\/15a\/f3d\/8e215af3d20c4adcbccff79aef6bf094.png\" width=\"1063\" height=\"802\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8e2\/15a\/f3d\/8e215af3d20c4adcbccff79aef6bf094.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e2\/15a\/f3d\/8e215af3d20c4adcbccff79aef6bf094.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0442\u0443\u0442:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a4\/bce\/83e\/4a4bce83e3a833dec640ebd290088b54.png\" width=\"1063\" height=\"781\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4a4\/bce\/83e\/4a4bce83e3a833dec640ebd290088b54.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a4\/bce\/83e\/4a4bce83e3a833dec640ebd290088b54.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0438 \u0442\u0443\u0442 (JCRE specification, version 3.0.4):<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c67\/64a\/aa6\/c6764aaa654d002f6c676d50bbfdc294.png\" width=\"1063\" height=\"779\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c67\/64a\/aa6\/c6764aaa654d002f6c676d50bbfdc294.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c67\/64a\/aa6\/c6764aaa654d002f6c676d50bbfdc294.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>AID<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 (\u0435\u0441\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438), \u0447\u0435\u0440\u0435\u0437 <code>control info<\/code> &#8212; <s>\u0445\u0440\u0435\u043d \u043f\u043e\u0439\u043c\u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435<\/s> implementation dependent; \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 <code>applet data<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0435\u0433\u043e\u043c <code>C9<\/code>. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0445 \u0434\u043b\u0438\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c 127 \u0431\u0430\u0439\u0442.<\/p>\n<p>\u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 32 \u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u00absecret\u00bb. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0410\u0441\u0441\u0438\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 \u043d\u0430 \u044d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 <code>secP256k1<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>KeyAgreement <\/code>(\u043e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 ECDH);<\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e AES \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u044e\u0447 AES.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0437\u0430\u0434\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043a\u0430\u043a \u00ab<code>APDU PLAIN<\/code>\u00bb, \u0442.\u0435. \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0442\u0440\u0438\u0445 \u2013 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>register()<\/code>, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043d\u0430\u0448\u0438\u043c \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f <code>javacard.framework.Applet<\/code>. \u041e\u043d \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0442.\u043a. \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 JCRE \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043b\u044e\u0431\u0438\u0442\u044c \u0438 \u0431\u0435\u0440\u0435\u0447\u044c.<\/p>\n<h3>\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 process()<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Applet<\/code>, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c \u0438 \u0425\u043e\u0441\u0442\u043e\u043c. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432 \u043d\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>SELECT<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442, JCRE \u0432 \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u0445 \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u00ab\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u00bb, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0435\u043c\u0443. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>00A4 04 00<\/code> <code>(SELECT ISD)<\/code> &#8212; \u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443 \u043d\u0430\u0441 \u0432 <code>switch-case<\/code> \u043d\u0435\u0442 &#8212; \u0442\u043e \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0442.\u043a. \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0442\u0430\u043a\u0430\u044f.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 <code>APDU<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<p><code>|CLA| |INS| |P1 | |P2 | |Lc | [CDATA 0:255];<\/code><\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 APDU &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u043b\u0435 <code>CDATA<\/code>, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"java\">private booleanhas_cdata(byte ins){    boolean result;    switch (ins) {        case INS_GENERATE_SHARED:  case INS_CIPHERING:  case INS_STORE_SECRET:            result = true;        break;        default: result = false;    }    return result;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u0442\u043e \u0430\u043f\u043f\u043b\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b \u0432 <code>CDATA<\/code>. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u043e\u0442 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430 \u0443 \u0432\u0430\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0439\u0442\u0435 \u043a\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u043a\u0430\u043a\u0430\u044f &#8212; \u043d\u0435\u0442. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435\u0441\u044c.<\/p>\n<p>\u00a0\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 <code>process()<\/code>. \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>has_cdata()<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>true<\/code>, \u0442\u043e\u0433\u0434\u0430 <code>apdu.setIncomingAndReceive()<\/code> \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442 \u0443 JCp \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u0440\u0438\u0435\u043c\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 <code>CDATA<\/code>. \u0417\u0430\u0442\u0435\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>len != apdu.getIncomingLength()<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0440\u0430\u0432\u043d\u043e \u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u043e\u043b\u0435 <code>Lc<\/code> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>APDU<\/code>.<\/p>\n<p>\u0411\u043b\u043e\u043a <code>switch-case<\/code> \u043c\u044b \u0435\u0449\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043f\u043e\u043a\u0430 \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043e <code>process()<\/code>, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"java\">if (len &gt; _00) {    apdu.setOutgoingAndSend(_00, len);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 JCp \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043d\u0443\u044e <code>APDU (R-APDU)<\/code> \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c \u2013 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f, JCVM \u2013 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e JVM, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a: <code>ArrayIndexOutOfBoundsException<\/code>, <code>CryptoException<\/code>, <code>APDUException<\/code> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435. \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 ISO 7816 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043b\u0438\u0448\u044c <code>ISOException<\/code>. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0443\u043f\u0430\u043b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 <code>\u201c6F00\u201d<\/code> \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b \u0447\u0442\u043e-\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0434\u043e\u0433\u043b\u044f\u0434\u0435\u043b\u0438. \u0412\u043e\u0442 \u0432\u0430\u043c \u043b\u043e\u043f\u0430\u0442\u0430 &#8212; \u043a\u043e\u043f\u0430\u0439\u0442\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c <code>ISOException<\/code> \u0441 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438 (<code>SW1, SW2<\/code>).<\/p>\n<h3>\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 generate_ecdh_shared_secret()<\/h3>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434 KeyAgreement.generateSecret() \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u0438\u043d\u0430 65 \u0431\u0430\u0439\u0442, \u0432 \u0442.\u0447. \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u00ab0x04\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434: <code>[0x04, 0x01, 0x02, .., 0x3F, 0x40]<\/code>. \u0412\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"java\">\/\/ Validate input length (uncompressed EC point = 65 bytes)if (lc != SIZE_EC_POINT) {    ISOException.throwIt(SW_WRONG_LENGTH);}\/\/ Validate point format (must be uncompressed: 0x04)if (buff[off] != (byte) 0x04) {    ISOException.throwIt(SW_WRONG_DATA);}\/\/ Validate that point is not at infinity (all zeros)for (short i = 1; i &lt; SIZE_EC_POINT; i++) {    if (buff[(short) (off + i)] != (byte) 0x00) {        allZeros = false;        break;    }}if (allZeros) {    ISOException.throwIt(SW_WRONG_DATA);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u041e\u041a, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c<\/p>\n<p><code>le = agreement.generateSecret(buff, off, lc, ram_buff, 00); <\/code><\/p>\n<p>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 <code>buff<\/code> \u0434\u043b\u0438\u043d\u043e\u044e <code>lc<\/code> \u043f\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0443 <code>off<\/code>, \u0430 \u043e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 <code>rambuff<\/code> \u043f\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0443 <code>_00<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c AES \u043a\u043b\u044e\u0447 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 16 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430:<\/p>\n<p><code>aes_key.setKey(ram_buff, 00);<\/code><\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>aeskey<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430:<br \/> <code>aes_key = (AESKey)KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_RESET, KeyBuilder.LENGTH_AES_128, false);<\/code><\/p>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code> KeyBuilder.LENGTH_AES_128\u2019<\/code> \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u043a\u043b\u044e\u0447\u0430 16 \u0431\u0430\u0439\u0442, \u0430 <code>KeyBuilder.TYPE_AES_TRANSIENT_RESET<\/code> \u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 JCRE \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 SRAM.<\/p>\n<p>\u0418\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>TYPE_AES_TRANSIENT_DESELECT<\/code> \u2013 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430 (\u0430 \u043d\u0435 \u043f\u043e \u0441\u0431\u0440\u043e\u0441\u0443 \u043f\u0438\u0442\u0430\u043d\u0438\u044f);<\/p>\n<\/li>\n<li>\n<p><code>TYPE_AES<\/code> \u2013 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u043e FLASH;<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><code>le = public_key.getW(buff, _00)<\/code> \u2013 \u043a\u043b\u0430\u0434\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a\u0430\u0440\u0442\u044b \u0432 \u0431\u0443\u0444\u0435\u0440 APDU;<\/p>\n<\/li>\n<li>\n<p><code>Util.arrayFillNonAtomic(ram_buff, 00, 32, (byte)_00)<\/code> \u2013 \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u043c ram_buff \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f \u043e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p><code>state[_00] = STATE_APDU_SECURED<\/code> \u2013 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0433, \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 ciphering()<\/h3>\n<p>\u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>P1<\/code> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 APDU \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"java\">private shortciphering(byte[] buff, short off, short lc, byte p1){if (p1 != Cipher.MODE_ENCRYPT &amp;&amp; p1 != Cipher.MODE_DECRYPT) {ISOException.throwIt(SW_INCORRECT_P1P2);}aes_cipher.init(aes_key, p1);Util.arrayCopyNonAtomic(buff, off, ram_buff, _00, lc);lc = aes_cipher.doFinal(ram_buff, _00, lc, buff, _00);return lc;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>P1<\/code> \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0432 \u043c\u0435\u0442\u043e\u0434 <code>Cipher.init()<\/code> \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fetch_secret()<\/code> \u0438 <code>store_secret()<\/code> \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0433\u043e 32 \u0431\u0430\u0439\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f AES-\u0448\u0438\u0444\u0440\u0430\u0442\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c, \u0432\u0440\u043e\u0434\u0435, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 FunGP<\/h2>\n<p>\u041c\u043e\u0438 \u043f\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u043d\u0430\u0442\u044b (\u0430 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0437 \u0438\u0445 \u0447\u0438\u0441\u043b\u0430, \u0442\u043e \u0431\u0440\u043e\u0441\u0430\u0439\u0442\u0435 \u0432\u0441\u0435 \u0438 \u0441\u043a\u043e\u0440\u0435\u0439 \u0432\u0441\u0442\u0443\u043f\u0430\u0439\u0442\u0435 \u0432 \u0438\u0445 \u0440\u044f\u0434\u044b) \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u044f \u043f\u0438\u0448\u0443 <a href=\"https:\/\/github.com\/void-deref\/FunGP\" rel=\"noopener noreferrer nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043c\u0430\u0440\u0442-\u043a\u0430\u0440\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0435\u0433\u0430\u0435\u0442 \u043d\u0430 python 3.12. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c:<\/p>\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/void-deref\/FunGP.git # \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c$ cd .\/FunGP # \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430$ python \u2013m venv .venv # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 python$ source .\/venv\/bin\/activate # (\u0434\u043b\u044f Windows: .venv\\Scripts\\activate.bat) \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435$ pip install \u2013e . # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u00ab<code>resources<\/code>\u00bb \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0432 \u043d\u0435\u0435 \u0444\u0430\u0439\u043b <code>SM_applet.cap.<\/code> \u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <code>.\/FunGP\/tests\/sm_applet<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 <code>01_install_applet<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043b\u043e\u0433:<\/p>\n<pre><code>$ python 01_install_applet.pyCommand: Select ISD&gt;&gt; 00A40400 00&lt;&lt; 6112 [ Response bytes still available (ISO 7816) (18 bytes remaining)]Get response: 18 more bytes&gt;&gt; 00C00000 12&lt;&lt; 6F108408A000000151000000A5049F6501FF&lt;&lt; 9000 [ OK ]duration: 0.04Command: Initialize update&gt;&gt; 80500000 08 0C8E3E8AD844753A&lt;&lt; 611c [ Response bytes still available (ISO 7816) (28 bytes remaining)]Get response: 28 more bytes&gt;&gt; 00C00000 1C&lt;&lt; 00000000000000000000FF02004C09CC3FC6981D6ABFA5D3F15E4704&lt;&lt; 9000 [ OK ]duration: 0.04Key diversification data: 00000000000000000000KVN and SCP ID          : FF02Key Sequence counter    : 004CCard challenge          : 09CC3FC6981Dcard cryptogram         : 6ABFA5D3F15E4704host cryptogram         : D82433D0883D9EA8Command: External authenticate&gt;&gt; 84820100 10 D82433D0883D9EA8C95CC3F6C0B8F85B&lt;&lt; 9000 [ OK ]duration: 0.04Command: INSTALL[for load]&gt;&gt; 84E60200 20 05A00000008300000EEF0CC602FFFFC702FFFFC802FFFF00E16DA4D84EE5012F&lt;&lt; 6101 [ Response bytes still available (ISO 7816) (1 bytes remaining)]Get response: 1 more bytes&gt;&gt; 00C00000 01&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.04Command: LOAD&gt;&gt; 84E80000 FF C48206FA01000FDECAFFED010204000105A00000008302001F000F001F000F0029010A003103D300DA009100000269000C000500C104010004002904000107A0000000620001050107A0000000620102050107A0000000620101050107A000000062020103000F010BA0000000837365636D736701B506003100800000FF00010700000019001F0025002B003100AB00AF00800000FF00010000000182030900090701000001C78200000703D303003B80570094002501F90081027C003101F980810286002501107B001B7701107B001C7701107B001D7701107B00207701107B0023770422033119188B002703188B0027928E04002B7AEE1B818678D61E&lt;&lt; 6101 [ Response bytes still available (ISO 7816) (1 bytes remaining)]Get response: 1 more bytes&gt;&gt; 00C00000 01&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.04# \u0442\u0443\u0442 \u0435\u0449\u0435 \u043a\u0443\u0447\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434 LOAD# \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 LOADCommand: LOAD&gt;&gt; 84E88007 45 0604030303070708310905070604080408090A04090E0705070E06051F060608081F0E0B0C0A0B0A090F1309090C160C250B0B090C1A0B080B13080B170C1C5B79AFBA2421&lt;&lt; 6101 [ Response bytes still available (ISO 7816) (1 bytes remaining)]Get response: 1 more bytes&gt;&gt; 00C00000 01&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.08Command: INSTALL[for install and make selectable]&gt;&gt; 84E60C00 4E 05A0000000830BA0000000837365636D73670BA0000000837365636D7367010024C920000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1FEF000089C50B4656137FD8&lt;&lt; 6101 [ Response bytes still available (ISO 7816) (1 bytes remaining)]Get response: 1 more bytes&gt;&gt; 00C00000 01&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.07***** CAP-file size ********** CAP-file parameters *****Package AID:    A000000083Applet  AID:    A0000000837365636D7367Applet  size:   1786 bytes.Reader: context has been released.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0433\u043b\u0430\u0434\u043a\u043e &#8212; \u0442\u043e \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435. <\/p>\n<h3>FunGP: 01_install_applet.py<\/h3>\n<p>\u042d\u0442\u043e \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u0446\u0435\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u043d\u0430\u043a\u0430\u0442\u0438\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442.<\/p>\n<pre><code class=\"python\">from fun_gp import Reader, SmartCard, SCP02, CCM, InstallParams, APPLET_PATHisd_keyset = ['404142434445464748494A4B4C4D4E4F',              '404142434445464748494A4B4C4D4E4F',              '404142434445464748494A4B4C4D4E4F']cap_path = APPLET_PATH \/ 'SM_applet.cap'def install_applet():    with Reader() as reader:        isd = SmartCard(reader.plain_apdu, SCP02(isd_keyset), CCM())        isd.transmit('00a4 0400', 0x90, 0x00, 'Select ISD')        isd.mutual_auth()        install_params = InstallParams(            app_params='000102030405060708090A0B0C0D0E0F 101112131415161718191A1B1C1D1E1F'        )        isd.install_app_scp02(cap_path, install_params, 0x90, 0x00)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p><code>with Reader() as reader<\/code> \u2013 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u0440\u0438\u0434\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043a\u043b\u0430\u0441\u0441\u0430 <code>SmartCard()<\/code> \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u00ab\u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e\u00bb, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435, \u0432\u0435\u0434\u044c \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>SCP02<\/code> (Secure Channel Protocol 02, GlobalPlatform) \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u043e\u043c\u0435\u043d\u043e\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 <code>CCM<\/code> (Card Content Management, GlobalPlatform), \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 cap-\u0444\u0430\u0439\u043b \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043c\u0435\u0442\u043e\u0434\u0430 <code>SmartCard.transmit()<\/code> \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u0446\u0435\u043b\u0435\u0432\u0430\u044f <code>APDU<\/code> \u043a\u043e\u043c\u0430\u043d\u0434\u0430, <code>SW1, SW2<\/code> \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u043e\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0438 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 <code>SW1<\/code> \u0438\u043b\u0438 <code>SW2<\/code> \u0437\u0430\u0434\u0430\u043d\u044b, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0436\u0434\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u043d\u0430\u0447\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u0443\u043f\u0430\u0434\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p><code>SmartCard.mutual_auth()<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 <code>SCP02<\/code>, \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0425\u043e\u0441\u0442\u043e\u043c \u0438 \u043a\u0430\u0440\u0442\u043e\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c\u0438 ISO 7816 \u0438 GlobalPlatform.<\/p>\n<\/li>\n<li>\n<p><code>InstallParams()<\/code> \u2013 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0434 \u0442\u0435\u0433\u043e\u043c <code>0xC9<\/code> \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><code>SmartCard.install_app_scp02()<\/code> \u2013 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<\/li>\n<\/ol>\n<h3>FunGP: 03_generate_shared.py<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u043c\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0443, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442 <s>\u0431\u043e\u0431\u0440\u0430<\/s> \u0438 \u043e\u0431\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c. \u041d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>main()<\/code> \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><code>resp, , = isd.transmit('8002 0000' + lv_hex(dh.pub_key), 0x90, 0x00).<\/code><\/p>\n<p>\u041c\u044b \u0448\u043b\u0435\u043c \u0430\u043f\u043f\u043b\u0435\u0442\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0425\u043e\u0441\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u0432\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0447\u0442\u043e \u043d\u0430\u0441 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0435\u0442 <code>0x9000<\/code>. \u041a\u0441\u0442\u0430\u0442\u0438, \u044f \u0432\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e <code>SmartCard.transmit()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u2013 <code>R-APDU, SW1 \u0438 SW2<\/code>, \u043d\u0435\u0442? \u041d\u0443 \u0442\u0430\u043a \u0432\u043e\u0442, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043b\u0438\u0448\u044c <code>resp<\/code> \u0441 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u044e\u0434\u0430:<\/p>\n<p><code>shared_secret = dh.generate_shared_secret(resp)<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0432\u044b\u0435 16 \u0431\u0430\u0439\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u201c<code>shared_secret<\/code>\u201d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0430\u043a \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 AES128 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0430 ISO 9797 M2 (<code>0x80, 0x00 .. 0x00<\/code>):<\/p>\n<p><code>dh.init_aes_cipher(shared_secret[0:16])<\/code><\/p>\n<p>\u0418 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0438 \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0435:<\/p>\n<pre><code class=\"python\">def send_cipher_text(isd:SmartCard, dh:DiffieHellman):    input_data = '0102030405060708090a0b0c0d0e0f'    # encrypting plain text    cipher_text = dh.aes_encrypt(input_data)    # passing over cipher text    resp, _,_ = isd.transmit('8004 0100' + lv_hex(cipher_text), 0x90, 0x00, cmd_name='Decrypt data')    # plain_text = dh.aes_decrypt(resp)        # conparison    print(f'input data: {input_data}\\nplain text: {bytes_to_hex(resp)}')    assert input_data.lower() == bytes_to_hex(resp).lower(), f\"Assertion failed: expected {input_data}, got: {bytes_to_hex(resp)}\"def send_plain_text(isd:SmartCard, dh:DiffieHellman):    # passing over plain text    input_data = '0102030405060708090a0b0c0d0e0f'    resp, _,_ = isd.transmit('8004 0200' + lv_hex(input_data), 0x90, 0x00, cmd_name='Encrypt data')    # decrypting result    plain_text = dh.aes_decrypt(resp)        # conparison    print(f'input data: {input_data}\\nplain text: {bytes_to_hex(plain_text)}')    assert input_data.lower() == bytes_to_hex(plain_text).lower(), f\"Assertion failed: expected {input_data}, got: {bytes_to_hex(plain_text)}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>send_cipher_text()<\/code>:<\/p>\n<ol>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>dh.aes_encrypt(input_data)<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u201c<code>0102030405060708090a0b0c0d0e0f<\/code>\u201d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u0448\u043b\u0435\u043c \u043a\u0430\u0440\u0442\u0435;<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0440\u0442\u0430 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0435\u0440\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f.1;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0443\u043f\u0430\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>send_plain_text()<\/code>.<\/p>\n<h3>FunGP: 04_secret_exchange.py<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043c\u0435\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 <code>main()<\/code> \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c, \u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u2018<code>secret<\/code>\u2019 \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u043c\u0438 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">def fetch_secret(isd:SmartCard, dh:DiffieHellman):    resp,_,_ = isd.transmit('8006 0000 20', 0x90, 0x00)    plain_text = dh.aes_decrypt(resp)    print(f'Card\\'s secret: {bytes_to_hex(plain_text)}')def store_secret(isd:SmartCard, dh:DiffieHellman):    cdata = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'    cipher_text = dh.aes_encrypt(cdata)    _,_,_ = isd.transmit('8008 0000' + lv_hex(cipher_text), 0x90, 0x00)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 <code>store_secret()<\/code> \u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u0442.\u043a. <code>sw1<\/code> \u0438 <code>sw2<\/code> \u0438 \u0442\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>SmartCard.transmit()<\/code>, \u0430 <code>resp<\/code> \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0442.\u043a. \u043a\u043e\u043c\u0430\u043d\u0434\u0430 &#8216;<code>8008 0000<\/code>&#8216; (STORE SECRET) \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<h3>FunGP: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SW1 SW2<\/h3>\n<p>\u041a\u0430\u043a \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>sw1<\/code>, <code>sw2<\/code> \u043c\u0435\u0442\u043e\u0434\u0430 <code>SmarCard.transmit()<\/code> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \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. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 <code>01_install_applet.py<\/code> \u0438 \u043e\u043d \u0443\u043f\u0430\u0434\u0435\u0442 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043b\u043e\u0433\u043e\u043c:<\/p>\n<pre><code class=\"bash\">Command: INSTALL[for load]&gt;&gt; 84E60200 20 05A00000008300000EEF0CC602FFFFC702FFFFC802FFFF0045A8710AEBD1B86F&lt;&lt; 6985 [ Conditions of use not satisfied ]duration: 0.04Reader: context has been released.Traceback (most recent call last):  File \"\/home\/telman\/develop\/FunGP\/tests\/sm_applet\/01_install_applet.py\", line 20, in &lt;module&gt;    install_applet()  File \"\/home\/telman\/develop\/FunGP\/tests\/sm_applet\/01_install_applet.py\", line 18, in install_applet    isd.install_app_scp02(cap_path, install_params, 0x90, 0x00)  File \"\/home\/telman\/develop\/FunGP\/fun_gp\/smart_card.py\", line 52, in install_app_scp02    self.transmit(for_load, exp_sw1, exp_sw2, 'INSTALL[for load]', is_secured=is_secured)  File \"\/home\/telman\/develop\/FunGP\/fun_gp\/smart_card.py\", line 14, in transmit    return self._plain_apdu(cmd, exp_sw1, exp_sw2, cmd_name)           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File \"\/home\/telman\/develop\/FunGP\/fun_gp\/reader.py\", line 115, in plain_apdu    raise SWMismatchException(f\"\\n\\nCard response error: {description} {attempts_left}\"fun_gp.reader.SWMismatchException: Card response error: Conditions of use not satisfied expected: 9000 got:      6985<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e GlobalPlatform \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442 \u0441 <code>package AID<\/code> \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u043c \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c <code>05_test_has_cdata.py<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435:<\/p>\n<p><code>card_pub_key,_,_ = isd.transmit('8002 0000', 0x67, 0x00, cmd_name='Public key exchange between Host and Card')<\/code><\/p>\n<p>\u0410 \u0438\u043c\u0435\u043d\u043d\u043e, <code>C-APDU<\/code> \u043b\u0438\u0448\u0435\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0425\u043e\u0441\u0442\u0430). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u043e, \u0431\u0435\u0437 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0439 \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0438 \u0441 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043c\u0435\u0441\u0442\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">Command: Select Secure Message applet&gt;&gt; 00A40400 0B A0000000837365636D7367&lt;&lt; 9000 [ OK ]duration: 0.09Command: Public key exchange between Host and Card&gt;&gt; 80020000 00&lt;&lt; 6700 [ Wrong length ]duration: 0.05Reader: context has been released.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c <code>SW1=0x67<\/code> \u0438 <code>SW2=0x00<\/code>, \u0447\u0442\u043e \u043c\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c.<\/p>\n<p>\u0412\u0441\u0435\u0445 \u0431\u043b\u0430\u0433.<\/p>\n<\/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\/articles\/1061992\/\">https:\/\/habr.com\/ru\/articles\/1061992\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 Java Card. \u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0435 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u201cHello World\u201d. \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442, \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0430\u043f\u043f\u043b\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0425\u043e\u0441\u0442\u043e\u043c \u0438 \u043a\u0430\u0440\u0442\u043e\u0439.\u0410\u043f\u043f\u043b\u0435\u0442 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 github.\u041b\u0435\u0433\u0435\u043d\u0434\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043e\u0442\u0446\u044b-\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0438\u0441\u044c \u0438\u0434\u0435\u0435\u0439 \u044f\u0437\u044b\u043a\u0430, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u043e\u0442 \u0438\u0437\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0443\u0442\u0435\u0447\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0435\u043f\u043e\u0442\u0440\u0435\u0431\u0441\u0442\u0432. \u0421\u043a\u0430\u0437\u0430\u043d\u043e \u2013 \u0441\u0434\u0435\u043b\u0430\u043d\u043e: \u0442\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Java Card platform (JCp), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 (Java Card Virtual Machine, JCVM) \u0438 \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (Java Card Runtime Environment, JCRE). \u041e\u0434\u043d\u0430\u043a\u043e, JCp \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043e\u0441\u0442\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432 \u043c\u044f\u0433\u043a\u0438\u0435 \u043d\u043e\u0436\u043d\u044b, \u043e\u043d\u0430 \u0435\u0449\u0435 \u0441\u0442\u0430\u0440\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 (Global Platform, ISO 7816, ETSI), \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a \u0443\u0441\u0435\u0440\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043d\u043e\u043c \u0440\u044b\u043d\u043a\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442 \u0438 SIM-\u043a\u0430\u0440\u0442.\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0437\u0430 \u0432\u0441\u0435 \u043d\u0430\u0434\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0443 \u0442\u0435\u0431\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 SRAM, \u043b\u044c\u0432\u0438\u043d\u0430\u044f \u0434\u043e\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0439 JCp, \u0442\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e.\u041f\u0435\u0440\u0432\u0430\u044f \u0431\u043e\u043b\u044c \u2013 \u044d\u0442\u043e \u0443\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u044b \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u00ab\u0445\u0440\u0435\u043d, \u0434\u0430 \u043d\u0438 \u0445\u0440\u0435\u043d\u0430\u00bb, \u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e-\u0442\u0430\u043a \u043f\u043e\u0434\u0436\u0438\u0440\u0430\u044e\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448 \u00ab\u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0439\u00bb \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043b\u0438\u0448\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0432\u0435\u0441\u0438\u0442 1,8 \u041a\u0431\u0430\u0439\u0442. \u0427\u0442\u043e-\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430 \u00ab\u0421\u0438\u00bb \u044f \u0431\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043a\u0443\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0442\u0440\u0430\u0442\u0430\u043c\u0438.\u0412\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c \u2013 \u044d\u0442\u043e \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e: \u0443 \u0442\u0435\u0431\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438, \u0432\u043e\u0442 \u0438\u043c \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0441\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043c\u043d\u0438, \u0447\u0442\u043e \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 600 \u0431\u0430\u0439\u0442 SRAM, \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u044c\u0441\u044f \u043e \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043f\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0435.\u041d\u0443 \u0438 \u043a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u00abnew\u00bb: \u0432 Java, C#, \u0421++ \u0438 \u0421\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 malloc()) \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 SRAM. \u00ab\u041d\u0443, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0430 \u0433\u0434\u0435 \u0436\u0435 \u0435\u0449\u0435?\u00bb &#8212; \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c &#8212; \u00ab\u041f\u043e\u0434\u0435\u0440\u0436\u0438 \u043c\u043e\u0451 \u043f\u0438\u0432\u043e\u00bb &#8212; \u043e\u0442\u0432\u0435\u0442\u0438\u0442 JCRE, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u043e FLASH. \u0414\u0435\u0440\u0436\u0430 \u0432 \u0443\u043c\u0435 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0431\u0430\u0433\u0430\u0436 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433.\u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0433\u043d\u0446\u0443. \u0423\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0431\u0435\u0433\u0430\u0435\u0442 Java 8, \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 ant, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043b\u043e\u0433:$ ant # UbuntuBuildfile: \/home\/telman\/develop\/SecMsgApplet\/build.xmldist:      [cap] INFO: using JavaCard 3.0.4 SDK in \/home\/telman\/develop\/SecMsgApplet\/libraries\/jc304_kit with JDK 8      [cap] INFO: Setting package name to secure.messaging      [cap] Building CAP with 1 applet from package secure.messaging (AID: A000000083)      [cap] secure.messaging.Main A0000000837365636D7367  [compile] Compiling files from \/home\/telman\/develop\/SecMsgApplet\/src  [compile] Compiling 2 source files to \/tmp\/jccpro8021669146027107305  [compile] \/home\/telman\/develop\/SecMsgApplet\/src\/secure\/messaging\/ECCurves.java  [compile] \/home\/telman\/develop\/SecMsgApplet\/src\/secure\/messaging\/Main.java   [verify] Verification passed      [cap] CAP saved to \/home\/telman\/develop\/SecMsgApplet\/SM_applet.capBUILD SUCCESSFULTotal time: 0 seconds\u041a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u00abSM_applet.cap\u00bb. \u0422\u0430\u043a, \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c.\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 install()\u0412 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438 JCp \u0432\u0445\u043e\u0434\u044f\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 &#8212; \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043c\u0435\u043d\u0443\u0435\u0442\u0441\u044f JCRE. \u0412\u043e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0438 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 install(), \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430.public static voidinstall(byte[] params, short off, byte len){    Main applet = new Main(params, off, len);    applet.register();}\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430, \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.publicMain(byte[] params, short off, byte len){ram_buff   = JCSystem.makeTransientByteArray(_64, JCSystem.CLEAR_ON_RESET);state      = JCSystem.makeTransientByteArray(_01, JCSystem.CLEAR_ON_RESET);secret     = new byte[_32];len = params[off++];\/\/ Instance AID lengthoff += len;len = params[off++];\/\/ Control info lengthoff += len;len = params[off++];\/\/ applet data length (i.e. C9xx)if (len != _32) {ISOException.throwIt((short)(ISO7816.SW_WRONG_LENGTH | _01));}Util.arrayCopy(params, off, secret, _00, len);ecc_keys = ECCurves.getKeyPair();ecc_keys.genKeyPair();private_key = (ECPrivateKey)ecc_keys.getPrivate();public_key  = (ECPublicKey)ecc_keys.getPublic();agreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH_PLAIN, false);agreement.init(private_key);aes_key    = (AESKey)KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_RESET, KeyBuilder.LENGTH_AES_128, false);    aes_cipher = Cipher.getInstance(Cipher.ALG_AES_CBC_ISO9797_M2, false);state[_00] = STATE_APDU_PLAIN;}\u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0442\u0443\u0442:\u043c\u0435\u0442\u043e\u0434 JCSystem.makeTransientByteArray() \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0438\u043f\u0430 byte \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0435\u0433\u043e \u0432\u043e FLASH, \u043d\u043e \u0441\u0430\u043c \u0431\u0443\u0444\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 SRAM, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 64 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.\u0421\u0442\u0440\u043e\u043a\u0438 len = params[off++]; off += len; \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 GlobalPlatform v2.3 \u0442\u0443\u0442:\u0442\u0443\u0442:\u0438 \u0442\u0443\u0442 (JCRE specification, version 3.0.4):\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 AID \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 (\u0435\u0441\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438), \u0447\u0435\u0440\u0435\u0437 control info &#8212; \u0445\u0440\u0435\u043d \u043f\u043e\u0439\u043c\u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 implementation dependent; \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 applet data, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0435\u0433\u043e\u043c C9. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0445 \u0434\u043b\u0438\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c 127 \u0431\u0430\u0439\u0442.\u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 32 \u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u00absecret\u00bb. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c:\u0410\u0441\u0441\u0438\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 \u043d\u0430 \u044d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 secP256k1;\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 KeyAgreement (\u043e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 ECDH);\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e AES \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435;\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u044e\u0447 AES.\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0437\u0430\u0434\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u043a\u0430\u043a \u00abAPDU PLAIN\u00bb, \u0442.\u0435. \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0442\u0440\u0438\u0445 \u2013 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 register(), \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043d\u0430\u0448\u0438\u043c \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f javacard.framework.Applet. \u041e\u043d \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0442.\u043a. \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 JCRE \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043b\u044e\u0431\u0438\u0442\u044c \u0438 \u0431\u0435\u0440\u0435\u0447\u044c.\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 process()\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Applet, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u043c \u0438 \u0425\u043e\u0441\u0442\u043e\u043c. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432 \u043d\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 SELECT. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442, JCRE \u0432 \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u0445 \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u00ab\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u00bb, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0435\u043c\u0443. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 00A4 04 00 (SELECT ISD) &#8212; \u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443 \u043d\u0430\u0441 \u0432 switch-case \u043d\u0435\u0442 &#8212; \u0442\u043e \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0442.\u043a. \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0442\u0430\u043a\u0430\u044f.\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 APDU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:|CLA| |INS| |P1 | |P2 | |Lc | [CDATA 0:255];\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 APDU &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u043b\u0435 CDATA, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434private booleanhas_cdata(byte ins){    boolean result;    switch (ins) {        case INS_GENERATE_SHARED:  case INS_CIPHERING:  case INS_STORE_SECRET:            result = true;        break;        default: result = false;    }    return result;}\u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u0442\u043e \u0430\u043f\u043f\u043b\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b \u0432 CDATA. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u043e\u0442 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430 \u0443 \u0432\u0430\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0439\u0442\u0435 \u043a\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u043a\u0430\u043a\u0430\u044f &#8212; \u043d\u0435\u0442. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435\u0441\u044c.\u00a0\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 process(). \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 has_cdata() \u0432\u0435\u0440\u043d\u0443\u043b true, \u0442\u043e\u0433\u0434\u0430 apdu.setIncomingAndReceive() \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442 \u0443 JCp \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u0440\u0438\u0435\u043c\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 CDATA. \u0417\u0430\u0442\u0435\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 len != apdu.getIncomingLength() \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0440\u0430\u0432\u043d\u043e \u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u043e\u043b\u0435 Lc \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 APDU.\u0411\u043b\u043e\u043a switch-case \u043c\u044b \u0435\u0449\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043f\u043e\u043a\u0430 \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043e process(), \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:if (len &gt; _00) {    apdu.setOutgoingAndSend(_00, len);}\u0415\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 JCp \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043d\u0443\u044e APDU (R-APDU) \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c \u2013 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f, JCVM \u2013 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e JVM, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a: ArrayIndexOutOfBoundsException, CryptoException, APDUException \u0438 \u043f\u0440\u043e\u0447\u0438\u0435. \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 ISO 7816 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043b\u0438\u0448\u044c ISOException. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0443\u043f\u0430\u043b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u201c6F00\u201d \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b \u0447\u0442\u043e-\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0434\u043e\u0433\u043b\u044f\u0434\u0435\u043b\u0438. \u0412\u043e\u0442 \u0432\u0430\u043c \u043b\u043e\u043f\u0430\u0442\u0430 &#8212; \u043a\u043e\u043f\u0430\u0439\u0442\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c ISOException \u0441 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438 (SW1, SW2).\u0410\u043f\u043f\u043b\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 generate_ecdh_shared_secret()\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434 KeyAgreement.generateSecret() \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430\u043c\u0438:\u043d\u0435\u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442;\u0434\u043b\u0438\u043d\u0430 65 \u0431\u0430\u0439\u0442, \u0432 \u0442.\u0447. \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u00ab0x04\u00bb;\u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439.\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434: [0x04, 0x01, 0x02, .., 0x3F, 0x40]. \u0412\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430:\/\/ Validate input length (uncompressed EC point = 65 bytes)if (lc != SIZE_EC_POINT) {    ISOException.throwIt(SW_WRONG_LENGTH);}\/\/ Validate point format (must be uncompressed: 0x04)if (buff[off] != (byte) 0x04) {    ISOException.throwIt(SW_WRONG_DATA);}\/\/ Validate that point is not at infinity (all zeros)for (short i = 1; i &lt; SIZE_EC_POINT; i++) {    if (buff[(short) (off + i)] != (byte) 0x00) {        allZeros = false;        break;    }}if (allZeros) {    ISOException.throwIt(SW_WRONG_DATA);}\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u041e\u041a, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043cle = agreement.generateSecret(buff, off, lc, ram_buff, 00); \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 buff \u0434\u043b\u0438\u043d\u043e\u044e lc \u043f\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0443 off, \u0430 \u043e\u0431\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 rambuff \u043f\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0443 _00.\u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c AES \u043a\u043b\u044e\u0447 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 16 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430:aes_key.setKey(ram_buff, 00);\u041a\u0441\u0442\u0430\u0442\u0438,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-488266","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/488266","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=488266"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/488266\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=488266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=488266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=488266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}