{"id":495057,"date":"2026-09-17T14:40:41","date_gmt":"2026-09-17T14:40:41","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=495057"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=495057","title":{"rendered":"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0432 Java Card"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab\u0410\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0432 Java Card\u00bb \u0431\u044b\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \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 \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 ECDH;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 AES.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u0430\u043f\u043f\u043b\u0435\u0442\u044b, \u043d\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0442 <code>javacard.framework.Applet<\/code>), \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0435 \u0441 \u0430\u043f\u043f\u043b\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u041f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c <code>VSCode<\/code>, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u0430\u0440\u0442\u043e\u0439 <code>FunGP<\/code> \u0438 \u043d\u044e\u0430\u043d\u0441\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 <code>.cap<\/code>-\u0444\u0430\u0439\u043b\u043e\u0432 <code>ant-javacard<\/code>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438: <a href=\"https:\/\/github.com\/void-deref\/libutils\" rel=\"noopener nofollow\">libutils<\/a>, <a href=\"https:\/\/github.com\/void-deref\/SimpleApplet\" rel=\"noopener nofollow\">SimpleApplet<\/a> \u0438 <a href=\"https:\/\/github.com\/void-deref\/FunGP\" rel=\"noopener nofollow\">FunGP<\/a>.<\/p>\n<h3>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libutils.jar<\/h3>\n<p>\u041d\u0435 \u043c\u0443\u0434\u0440\u0441\u0442\u0432\u0443\u044f \u043b\u0443\u043a\u0430\u0432\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e <a href=\"https:\/\/github.com\/void-deref\/libutils\" rel=\"noopener nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <\/a>\u0441 \u0442\u0440\u0435\u043c\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0418\u041b\u0418\u00bb \u043d\u0430\u0434 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"java\">public void xor(byte[] buff, short off, short len){  short bound = (short)(off + len);  for (short i = off; i &lt; bound; ++i) {    buff[i] ^= (short)0xFF;  }}<\/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>}<\/p>\n<\/li>\n<li>\n<p>\u00ab\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\u00bb \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"java\">public voidbubble_sort(byte[] buff, short off, short len){  byte  temp = 0;  short curr = 0;  short next = 0;    if (len == 1) {    return;  }  short outer_len = (short)(off + len - 1);  for (short k = off; k &lt; outer_len; ++k) {    short inner_len = (short)(outer_len - (short)(k - off));  for (short i = off; i &lt; inner_len; ++i) {    \/\/ eliminating an issue that originates from Java-signess, which  \/\/ leands to a situation where '0x80 (-127)' is less than '0x01'.  curr = (short)(buff[i] &amp; 0xFF);  next = (short)(buff[(short)(i + 1)] &amp; 0xFF);  if (curr &lt;= next) {  continue;  }    temp    = (byte)curr;  buff[i] = (byte)next;  buff[(short)(i + 1)] = temp;  }  }}<\/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<\/li>\n<li>\n<p>\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 BCD:<\/p>\n<pre><code class=\"java\">public voidfrom_bcd(byte[] buff, short off, short len){  short bound = (short)(off + len);  byte _byte  = 0;  byte msn = 0;  byte lsn = 0;  for ( ; off &lt; bound; ++off) {  _byte = buff[off];  msn = (byte)((_byte &amp; 0xF0) &gt;&gt;&gt; 4);  lsn = (byte) (_byte          &lt;&lt; 4);  buff[off] = (byte)(lsn | msn);  }    \/\/ fetch the LSN of the last byte  _byte = buff[(short)(off - 1)];  lsn   = (byte)(_byte &amp; 0x0F);    \/\/ discard trailing 'f' (if any)  if (lsn == 0x0F) {  buff[(short)(off - 1)] = (byte)(_byte &amp; 0xF0);  }}<\/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<\/li>\n<\/ul>\n<p>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442<code> ant-javacard.jar<\/code> \u0438 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>build.xml<\/code>. \u0412\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>ant<\/code>.<\/p>\n<p>\u0412 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>build.xml<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;&lt;project name=\"Java Card Utils library\" default=\"build-library\" basedir=\".\"&gt;&lt;!-- &lt;get src=\"https:\/\/github.com\/martinpaljak\/ant-javacard\/releases\/latest\/download\/ant-javacard.jar\" dest=\".\" skipexisting=\"true\"\/&gt; --&gt;&lt;taskdef name=\"javacard\" classname=\"pro.javacard.ant.JavaCard\" classpath=\"ant-javacard.jar\"\/&gt;    &lt;description&gt;GSM library&lt;\/description&gt;    &lt;property name=\"jc.sdk\"          value=\".\/libraries\/jc304_kit\" \/&gt;    &lt;property name=\"package.aid\"     value=\"A0:00:00:00:85:6C:69:62:75:74:69:6C:73\" \/&gt;    &lt;property name=\"package.name\"    value=\"fun.libutils\" \/&gt;    &lt;property name=\"package.version\" value=\"1.0\" \/&gt;    &lt;target name=\"build-library\"&gt;        &lt;mkdir dir=\"dist\" \/&gt;        &lt;javacard&gt;            &lt;!-- \u0410\u0442\u0440\u0438\u0431\u0443\u0442 verify=\"false\" \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u0435\u043d \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0435\u0437 Applet.cap --&gt;            &lt;cap jckit=\"${jc.sdk}\"                  aid=\"${package.aid}\"                 package=\"${package.name}\"                 version=\"${package.version}\"                 output=\"dist\/${package.name}.cap\"                 export=\"dist\/\"                 jar=\"dist\/\"                 sources=\"src\/\"                 verify=\"false\"&gt;                                &lt;!-- \u0422\u0435\u0433 &lt;applet&gt; \u041e\u041f\u0423\u0429\u0415\u041d, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 --&gt;                                &lt;!-- \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0438\u0436\u0435: --&gt;                &lt;!-- &lt;import jar=\"libs\/another_ext_lib.jar\"\/&gt; --&gt;            &lt;\/cap&gt;        &lt;\/javacard&gt;    &lt;\/target&gt;    &lt;target name=\"clean\"&gt;        &lt;delete dir=\"dist\" \/&gt;        &lt;mkdir dir=\"dist\" \/&gt;    &lt;\/target&gt;&lt;\/project&gt;<\/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\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 <code>dist<\/code> \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 <code>fun.libutils.cap<\/code> \u0438 <code>libutils.jar<\/code>. \u041f\u0435\u0440\u0432\u044b\u0439 \u2013 \u044d\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0432 \u0430\u043f\u043f\u043b\u0435\u0442, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u2013 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a \u0430\u043f\u043f\u043b\u0435\u0442\u0443 <code>SimpleApplet.java<\/code> \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<h3>\u0410\u043f\u043f\u043b\u0435\u0442 SimpleApplet.java<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 <a href=\"https:\/\/github.com\/void-deref\/SimpleApplet\" rel=\"noopener nofollow\">\u043f\u0440\u043e\u0435\u043a\u0442<\/a> \u0438 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043e\u0434\u0438\u043d-\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>src\/simple\/applet\/SimpleApplet.java<\/code>. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 <code>VSCode<\/code>, \u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0448\u0435\u0439 <code>libutils<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u0430 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u2013 \u043d\u0435\u0432\u0435\u0434\u043e\u043c\u0430\u044f <s>\u043f\u043e\u0435\u0431<\/s> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430:<\/p>\n<figure class=\"bordered full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d2e\/e14\/006\/d2ee14006293247910cc00c661a693f2.png\" alt=\"VSCode \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 fun.*\" title=\"VSCode \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 fun.*\" width=\"789\" height=\"463\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d2e\/e14\/006\/d2ee14006293247910cc00c661a693f2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d2e\/e14\/006\/d2ee14006293247910cc00c661a693f2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>VSCode \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 fun.*<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:<\/p>\n<ol>\n<li>\n<p>\u0432\u043e\u0439\u0442\u0438 \u0432 \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab<code>JAVA PROJECTS<\/code>\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab<code>SimpleApplet<\/code>\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab<code>Referenced Libraries<\/code>\u00bb &#8212; \u0432\u0441\u043f\u043b\u044b\u0432\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u00ab<code>+<\/code>\u00bb (<code>Add Jar Libraries to Project Classpath<\/code>) \u2013 \u043a\u043b\u0430\u0446\u043d\u0443\u0442\u044c \u043f\u043e \u043d\u0435\u043c\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 <code>libutils\/dist<\/code> \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c <code>libutils.jar<\/code>.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"bordered full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/298\/9f1\/4f5\/2989f14f588b171cc072d255660d39a6.png\" alt=\"1. Explorer; 2. Java Projects; 3. SimpleApplet file heirarchy; 4. Add Jar Libraries.\" title=\"1. Explorer; 2. Java Projects; 3. SimpleApplet file heirarchy; 4. Add Jar Libraries.\" width=\"831\" height=\"847\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/298\/9f1\/4f5\/2989f14f588b171cc072d255660d39a6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/298\/9f1\/4f5\/2989f14f588b171cc072d255660d39a6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>1. Explorer; 2. Java Projects; 3. SimpleApplet file heirarchy; 4. Add Jar Libraries.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043a\u043e\u0434\u0443, \u0431\u043b\u0430\u0433\u043e \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439:<\/p>\n<pre><code class=\"java\">package simple.applet;import javacard.framework.*;import fun.libutils.Utils;public classSimpleApplet extends Applet{    \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0431\u0430\u0439\u0442 INS \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 APDU)private static final byte INS_DO_XOR      = 0x12;private static final byte INS_BUBBLE_SORT = 0x14;private static final byte INS_PARSE_BCD   = 0x16;    \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438Utils utils;publicSimpleApplet()  {        \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Utilsutils = new Utils();}public static voidinstall(byte[] bArray, short bOffset, byte bLength){        \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432 JCRE (Java Card Runtime Environment)new SimpleApplet().register();}public voidprocess(APDU apdu){        \/\/ \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \"SELECT \u043a\u043e\u0433\u043e-\u0442\u043e \u0442\u0430\u043c\", \u0442\u043e \u043d\u0430\u0434\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f        \/\/ \u0442.\u043a. \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d.        \/\/ JCRE \u0436\u0435 \u0441\u0430\u043c\u0430 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0441 \u043d\u0435\u0439 \u0434\u0435\u043b\u0430\u0442\u044c.if (selectingApplet()) {return;}byte[] buff = apdu.getBuffer();byte cla    = buff[ISO7816.OFFSET_CLA];byte ins    = buff[ISO7816.OFFSET_INS];short lc    = (short)(buff[ISO7816.OFFSET_LC] &amp; (short)0xFF);                \/\/ \u041d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0436\u0434\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435: \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 CDATA \u043f\u0430\u043a\u0435\u0442\u0430 APDU \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043eif (lc == 0) {ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);}        \/\/ \u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b - \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0435, \u0430 \u043c\u044b - \u043f\u0440\u0438\u043b\u0435\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b,        \/\/ \u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 ISO 7816, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b,        \/\/ \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043f\u043e\u043b\u044f CLA \u043a\u043e\u043c\u0430\u043d\u0434\u044b APDU.if (cla != (byte)0x80) {ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);}        \/\/ \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442.\u0435. \u043f\u043e\u043b\u044f CDATA)apdu.setIncomingAndReceive();        \/\/ \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f INS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.switch (ins) {case INS_DO_XOR: {                \/\/ \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0435\u0439\u0441\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libutils.jarutils.xor(buff, ISO7816.OFFSET_CDATA, lc);} break;case INS_BUBBLE_SORT: {utils.bubble_sort(buff, ISO7816.OFFSET_CDATA, lc);} break;case INS_PARSE_BCD: {utils.from_bcd(buff, ISO7816.OFFSET_CDATA, lc);} break;default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);}        \/\/ \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u042d\u0442\u043e\u0442 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e        \/\/ \u0431\u0430\u0439\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435.apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, 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>\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043a\u043e\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043e\u0442\u043c\u0435\u0447\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 <code>SimpleApplet.java<\/code>:<\/p>\n<ol>\n<li>\n<p>\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430: <code>Utils utils<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>void install()<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0430\u043f\u043f\u043b\u0435\u0442, \u0447\u0442\u043e\u0431\u044b <code>JCRE<\/code> \u0437\u043d\u0430\u043b\u0430 \u043e \u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438, \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0441 \u043d\u0438\u043c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>void process()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>Utils<\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 APDU-\u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 FunGP<\/h3>\n<p>\u0424\u0430\u043d\u0430\u0442\u044b \u043c\u043e\u0435\u0433\u043e \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u0430 \u043b\u0438\u043a\u0443\u044e\u0442 &#8212; \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0433\u0451\u0442 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>SCP02._retail_mac()<\/code>! \u0422\u0435\u043f\u0435\u0440\u044c <code>EMVco<\/code> \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e. \u041d\u0443 \u0434\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u043b\u0438\u0440\u0438\u043a\u0438, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0434\u0435\u043b\u0443: \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 <a href=\"https:\/\/github.com\/void-deref\/FunGP\" rel=\"noopener nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a> \u0438 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u0437\u0430\u0442\u0435\u043c \u0432\u0432\u0435\u0434\u0438\u0442\u0435:<\/p>\n<pre><code class=\"bash\">python -m 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\u0435source .venv\/bin\/activate # \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e. \u041d\u0430 Windows venv\\Scripts\\activate.batpip install -e .          # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u0431\u0443. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/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\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0443\u0436\u0435\u043d <code>python 3.12.x<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>SimpleApplet.cap<\/code> \u0438 <code>fun.libutils.cap<\/code> \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>.\/resources<\/code> \u00a0\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 <code>FunGP<\/code>, \u0442.\u043a. \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0442\u0443\u0434\u0430.<\/p>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 01_install_applet.py<\/h4>\n<pre><code class=\"python\">from fun_gp import Reader, SmartCard, SCP02, CCM, InstallParams, APPLET_PATH# \u041a\u043b\u044e\u0447\u0438 ISDisd_keyset = ['404142434445464748494A4B4C4D4E4F',              '404142434445464748494A4B4C4D4E4F',              '404142434445464748494A4B4C4D4E4F']# \u041f\u0443\u0442\u044c \u0434\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430applet_cap_path = APPLET_PATH \/ 'SimpleApplet.cap'# \u041f\u0443\u0442\u044c \u0434\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438lib_cap_path    = APPLET_PATH \/ 'fun.libutils.cap'def install_applet():    with Reader() as reader: # \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0440\u0438\u0434\u0435\u0440\u0443. \u0415\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c.        # \u0431\u0435\u0440\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443        isd = SmartCard(reader.plain_apdu, SCP02(isd_keyset), CCM())         isd.transmit('00a4 0400', 0x90, 0x00, 'Select ISD') # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c ISD        isd.mutual_auth() # \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0432\u0437\u0430\u0438\u043c\u043d\u0443\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e        isd.install_lib_scp02(lib_cap_path, 0x90, 0x00) # \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443        isd.install_app_scp02(applet_cap_path, InstallParams(), 0x90, 0x00) # \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0430\u043f\u043f\u043b\u0435\u0442install_applet()<\/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\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u2116 18-19, \u0433\u0434\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0430\u043f\u043f\u043b\u0435\u0442\u0430. \u041f\u043e \u0437\u0434\u0440\u0430\u0432\u043e\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u044e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u0447\u0442\u043e \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2013 \u0431\u0435\u0441\u0442\u043e\u043b\u043a\u043e\u0432\u0430\u044f \u0438\u0434\u0435\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>SmartCard.install_lib_scp02()<\/code>:<\/p>\n<pre><code class=\"python\">def install_lib_scp02(self, lib_path:str, exp_sw1:int|None = None, exp_sw2:int|None = None, is_secured=True):\"\"\"Install a library by means of SCP02 protocol.  :param lib_path: path to a cap file to be installed  :param install_params: by default passes applet's AID only. Additional params mustbe prepended with length value e.g.:  `lv(pin) + lv(secret)`so that the resulting string will have the following form:  `[len][AID] [len][pin] [len][secret]`\"\"\"cap_bytes, pkg_aid, _ = self._ccm.decomposite_cap_file(lib_path)# INSTALL[for load]for_load = self._ccm.make_cmd_install_for_load(pkg_aid, None, LoadParams())self.transmit(for_load, exp_sw1, exp_sw2, 'INSTALL[for load]', is_secured=is_secured)# LOADcap_chunks = self._ccm.make_cmd_load(cap_bytes)for chunk in cap_chunks:self.transmit(chunk, exp_sw1, exp_sw2, 'LOAD', is_secured=is_secured)# Note: 'LOAD.Lc1 + LOAD.Lc2 + LOAD.Lcn' is greater than 'self.cap_file_size'.# The difference is C * N + T, where# C - the length of CMAC,# N - number of LOAD commands,# T = C4 BER-TLV object at the beginning of the very first LOAD CDATA field.print(f'***** CAP-file size *****')print(f'\\n***** CAP-file parameters *****\\n'f'Package AID:  {pkg_aid}\\n'f'Package size: {self._ccm.cap_file_size} bytes.\\n')<\/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 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c <code>SmartCard.install_app_scp02()<\/code>:<\/p>\n<pre><code class=\"python\">def install_app_scp02(self, cap_path:str, install_params:InstallParams, exp_sw1:int|None = None, exp_sw2:int|None = None, is_secured=True):\"\"\"Install an applet through the SCP02 protocol.  :param cap_path: path to a cap file to be installed  :param install_params: by default passes applet's AID only. Additional params mustbe prepended with length value e.g.:  `lv(pin) + lv(secret)`so that the resulting string will have the following form:  `[len][AID] [len][pin] [len][secret]`\"\"\"cap_bytes, pkg_aid, app_aid = self._ccm.decomposite_cap_file(cap_path)# INSTALL[for load]for_load = self._ccm.make_cmd_install_for_load(pkg_aid, None, LoadParams())self.transmit(for_load, exp_sw1, exp_sw2, 'INSTALL[for load]', is_secured=is_secured)# LOADcap_chunks = self._ccm.make_cmd_load(cap_bytes)for chunk in cap_chunks:self.transmit(chunk, exp_sw1, exp_sw2, 'LOAD', is_secured=is_secured)# INSTALL[for install and make selectable]for_install = self._ccm.make_cmd_install_for_install(pkg_aid, app_aid, install_params)self.transmit(for_install, exp_sw1, exp_sw2, 'INSTALL[for install and make selectable]', is_secured=is_secured)# Note: 'LOAD.Lc1 + LOAD.Lc2 + LOAD.Lcn' is greater than 'self.cap_file_size'.# The difference is C * N + T, where# C - the length of CMAC,# N - number of LOAD commands,# T = C4 BER-TLV object at the beginning of the very first LOAD CDATA field.print(f'***** CAP-file size *****')print(f'\\n***** CAP-file parameters *****\\n'f'Package AID:    {pkg_aid}\\n'f'Applet  AID:    {app_aid}\\n'f'Applet  size:   {self._ccm.cap_file_size} bytes.\\n')<\/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>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>install[FOR INSTALL &amp; MAKE SELECTABLE]<\/code>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (\u043f\u043e \u0438\u0434\u0435\u0435 \u043e\u043d\u0430 \u0443 \u0432\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 <code>FunGP<\/code>) \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>tests\/simple_applet<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442:    <\/p>\n<pre><code class=\"bash\">cd .\/tests\/simple_appletpython 01_install_applet.pyConnecting to 'ACS ACR39U ICC Reader 0' readerCommand: Select ISD&gt;&gt; 00A40400 00&lt;&lt; 6F108408A000000151000000A5049F6501FF&lt;&lt; 9000 [ OK ]duration: 0.06Command: Initialize update&gt;&gt; 80500000 08 BE6C166A3C279223&lt;&lt; 000023340138302047290102001DA8418EA3C5F15371165DA5141E67&lt;&lt; 9000 [ OK ]duration: 0.11                Key diversification data: 00002334013830204729                KVN and SCP ID          : 0102                Key Sequence counter    : 001D                Card challenge          : A8418EA3C5F1                card cryptogram         : 5371165DA5141E67                host cryptogram         : D28D420BE55BE38ECommand: External authenticate&gt;&gt; 84820100 10 D28D420BE55BE38E577A97375F18B217&lt;&lt; 9000 [ OK ]duration: 0.07Command: INSTALL[for load]&gt;&gt; 84E60200 28 0DA0000000856C69627574696C7300000EEF0CC602FFFFC702FFFFC802FFFF0056622BC7F2268C65&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.18Command: LOAD&gt;&gt; 84E80000 FF C482017A010017DECAFFED01020200010DA0000000856C69627574696C7302001F0017001F0000000B0006001000F2000A00050007004300000000000001000004000B01000107A000000062000106001000800000FF00010300000008002900980700F2000110188C00007A04421E1F4129041E2905160516046D121916053E251100FF575B3859050170EC7A03470329040329050329061F046B037A1E1F41044329071E2908160816076D50160716081E434329091E290A160A16096D3919160A251100FF53290519160A0441251100FF532906160516066E04701616055B290419160A16065B3819160A0441160438590A0170C55938C1BDFF7E2330BE&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.4Command: LOAD&gt;&gt; 84E88001 8F 080170AE7A04441E1F4129040329050329060329071E16046D26191E25290516051100F05307515B29061605074D5B2907191E16071606553859020170D9191E04432529051605100F5329071607100F6B0E191E044316051100F0535B387A08000A000000000000000000000A00070100000001000105000600010680000009000500000001056292E263BAF15EAF&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.41***** CAP-file size ********** CAP-file parameters *****Package AID:  A0000000856C69627574696C73Package size: 378 bytes.Command: INSTALL[for load]&gt;&gt; 84E60200 20 05A00000008400000EEF0CC602FFFFC702FFFFC802FFFF00E76EBF9967DD7FBD&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.15Command: LOAD&gt;&gt; 84E80000 FF C482018701000FDECAFFED010204000105A00000008402001F000F001F00120025003E000C009B000A00180000007000000000000003010004002503050107A000000062010100010DA0000000856C69627574696C73000107A0000000620001030012010EA00000008453696D706C65417070001206000C00800301000107010000001F07009B000310188C0003188F00013D8C000287007A02308F00043D8C00058B00067A0424188B000760037A198B00082D1A0325321A042529041A07251100FF532905160561081167008D00091F10806A08116E008D0009198B000A3B16047300320012001600110032001C00320027AD001A0873F146875EE631E7&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.4Command: LOAD&gt;&gt; 84E88001 9C 16058B000B701EAD001A0816058B000C7013AD001A0816058B000D7008116D008D0009190816058B000E7A08000A0000000000000000000005003E000F020000000181000006810000068003000100000006000001038003010380030303800A010680070103800A0603810001038100020381000303800A080900180004105D0B0B001005040408040307071D0B041D0B0B0807B39300C9B638B711&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.43Command: INSTALL[for install and make selectable]&gt;&gt; 84E60C00 34 05A0000000840EA00000008453696D706C654170700EA00000008453696D706C65417070010004C900EF000021FF2BFF2D4A0099&lt;&lt; 00&lt;&lt; 9000 [ OK ]duration: 0.29***** CAP-file size ********** CAP-file parameters *****Package AID:    A000000084Applet  AID:    A00000008453696D706C65417070Applet  size:   391 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<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>XOR<\/code>, <code>Bubble sort<\/code> \u0438 <code>decode BCD<\/code>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0431\u0435\u0439\u0442\u0435 \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<pre><code class=\"bash\">python 04_simple_applet_test.pyConnecting to 'ACS ACR39U ICC Reader 0' readerCommand: Select Simple Applet&gt;&gt; 00A40400 0E A00000008453696D706C65417070&lt;&lt; 9000 [ OK ]duration: 0.09Command: XOR input&gt;&gt; 80120000 06 050403020100 # \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 &lt;&lt; FAFBFCFDFEFF             # \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&lt;&lt; 9000 [ OK ]duration: 0.05Command: Bubble sort 128-0               # \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 &gt;&gt; 80140000 80 807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A090807060504030201   # \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&lt;&lt; 0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80&lt;&lt; 9000 [ OK ]duration: 1.88Command: parse BCD&gt;&gt; 80160000 03 2143F5 # \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435&lt;&lt; 123450             # \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&lt;&lt; 9000 [ OK ]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>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u043e\u0442 \u0438 \u0432\u0441\u0435, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0415\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u043d\u0430\u0448\u0435\u043b \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0442\u043e  \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0437\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445 \u0438\u043b\u0438 \u043b\u0438\u0447\u043a\u0435.<\/p>\n<p>\u0412\u0441\u0435\u043c \u043f\u043e\u043a\u0430!<\/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\/1083494\/\">https:\/\/habr.com\/ru\/articles\/1083494\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab\u0410\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0432 Java Card\u00bb \u0431\u044b\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \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 \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430:\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 ECDH;\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 AES.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u0430\u043f\u043f\u043b\u0435\u0442\u044b, \u043d\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0442 javacard.framework.Applet), \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0435 \u0441 \u0430\u043f\u043f\u043b\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u041f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c VSCode, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u0430\u0440\u0442\u043e\u0439 FunGP \u0438 \u043d\u044e\u0430\u043d\u0441\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 .cap-\u0444\u0430\u0439\u043b\u043e\u0432 ant-javacard.\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438: libutils, SimpleApplet \u0438 FunGP.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libutils.jar\u041d\u0435 \u043c\u0443\u0434\u0440\u0441\u0442\u0432\u0443\u044f \u043b\u0443\u043a\u0430\u0432\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u0442\u0440\u0435\u043c\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:\u00ab\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0418\u041b\u0418\u00bb \u043d\u0430\u0434 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:public void xor(byte[] buff, short off, short len){  short bound = (short)(off + len);  for (short i = off; i &lt; bound; ++i) {    buff[i] ^= (short)0xFF;  }}}\u00ab\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\u00bb \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:public voidbubble_sort(byte[] buff, short off, short len){  byte  temp = 0;  short curr = 0;  short next = 0;    if (len == 1) {    return;  }  short outer_len = (short)(off + len &#8212; 1);  for (short k = off; k &lt; outer_len; ++k) {    short inner_len = (short)(outer_len &#8212; (short)(k &#8212; off));  for (short i = off; i &lt; inner_len; ++i) {    \/\/ eliminating an issue that originates from Java-signess, which  \/\/ leands to a situation where &#8216;0x80 (-127)&#8217; is less than &#8216;0x01&#8217;.  curr = (short)(buff[i] &amp; 0xFF);  next = (short)(buff[(short)(i + 1)] &amp; 0xFF);  if (curr &lt;= next) {  continue;  }    temp    = (byte)curr;  buff[i] = (byte)next;  buff[(short)(i + 1)] = temp;  }  }}\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 BCD:public voidfrom_bcd(byte[] buff, short off, short len){  short bound = (short)(off + len);  byte _byte  = 0;  byte msn = 0;  byte lsn = 0;  for ( ; off &lt; bound; ++off) {  _byte = buff[off];  msn = (byte)((_byte &amp; 0xF0) &gt;&gt;&gt; 4);  lsn = (byte) (_byte          &lt;&lt; 4);  buff[off] = (byte)(lsn | msn);  }    \/\/ fetch the LSN of the last byte  _byte = buff[(short)(off &#8212; 1)];  lsn   = (byte)(_byte &amp; 0x0F);    \/\/ discard trailing &#8216;f&#8217; (if any)  if (lsn == 0x0F) {  buff[(short)(off &#8212; 1)] = (byte)(_byte &amp; 0xF0);  }}\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 ant-javacard.jar \u0438 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b build.xml. \u0412\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 ant.\u0412 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 build.xml \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:&lt;?xml version=&#187;1.0&#8243; encoding=&#187;UTF-8&#8243;?&gt;&lt;project name=&#187;Java Card Utils library&#187; default=&#187;build-library&#187; basedir=&#187;.&#187;&gt;&lt;!&#8212; &lt;get src=&#187;https:\/\/github.com\/martinpaljak\/ant-javacard\/releases\/latest\/download\/ant-javacard.jar&#187; dest=&#187;.&#187; skipexisting=&#187;true&#187;\/&gt; &#8212;&gt;&lt;taskdef name=&#187;javacard&#187; classname=&#187;pro.javacard.ant.JavaCard&#187; classpath=&#187;ant-javacard.jar&#187;\/&gt;    &lt;description&gt;GSM library&lt;\/description&gt;    &lt;property name=&#187;jc.sdk&#187;          value=&#187;.\/libraries\/jc304_kit&#187; \/&gt;    &lt;property name=&#187;package.aid&#187;     value=&#187;A0:00:00:00:85:6C:69:62:75:74:69:6C:73&#8243; \/&gt;    &lt;property name=&#187;package.name&#187;    value=&#187;fun.libutils&#187; \/&gt;    &lt;property name=&#187;package.version&#187; value=&#187;1.0&#8243; \/&gt;    &lt;target name=&#187;build-library&#187;&gt;        &lt;mkdir dir=&#187;dist&#187; \/&gt;        &lt;javacard&gt;            &lt;!&#8212; \u0410\u0442\u0440\u0438\u0431\u0443\u0442 verify=&#187;false&#187; \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u0435\u043d \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0435\u0437 Applet.cap &#8212;&gt;            &lt;cap jckit=&#187;${jc.sdk}&#187;                  aid=&#187;${package.aid}&#187;                 package=&#187;${package.name}&#187;                 version=&#187;${package.version}&#187;                 output=&#187;dist\/${package.name}.cap&#187;                 export=&#187;dist\/&#187;                 jar=&#187;dist\/&#187;                 sources=&#187;src\/&#187;                 verify=&#187;false&#187;&gt;                                &lt;!&#8212; \u0422\u0435\u0433 &lt;applet&gt; \u041e\u041f\u0423\u0429\u0415\u041d, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 &#8212;&gt;                                &lt;!&#8212; \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0438\u0436\u0435: &#8212;&gt;                &lt;!&#8212; &lt;import jar=&#187;libs\/another_ext_lib.jar&#187;\/&gt; &#8212;&gt;            &lt;\/cap&gt;        &lt;\/javacard&gt;    &lt;\/target&gt;    &lt;target name=&#187;clean&#187;&gt;        &lt;delete dir=&#187;dist&#187; \/&gt;        &lt;mkdir dir=&#187;dist&#187; \/&gt;    &lt;\/target&gt;&lt;\/project&gt;\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 dist \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 fun.libutils.cap \u0438 libutils.jar. \u041f\u0435\u0440\u0432\u044b\u0439 \u2013 \u044d\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0432 \u0430\u043f\u043f\u043b\u0435\u0442, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u2013 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a \u0430\u043f\u043f\u043b\u0435\u0442\u0443 SimpleApplet.java \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.\u0410\u043f\u043f\u043b\u0435\u0442 SimpleApplet.java\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043e\u0434\u0438\u043d-\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b src\/simple\/applet\/SimpleApplet.java. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 VSCode, \u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0448\u0435\u0439 libutils \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u0430 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u2013 \u043d\u0435\u0432\u0435\u0434\u043e\u043c\u0430\u044f \u043f\u043e\u0435\u0431 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430:VSCode \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 fun.*\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:\u0432\u043e\u0439\u0442\u0438 \u0432 \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430;\u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00abJAVA PROJECTS\u00bb;\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00abSimpleApplet\u00bb;\u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00abReferenced Libraries\u00bb &#8212; \u0432\u0441\u043f\u043b\u044b\u0432\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u00ab+\u00bb (Add Jar Libraries to Project Classpath) \u2013 \u043a\u043b\u0430\u0446\u043d\u0443\u0442\u044c \u043f\u043e \u043d\u0435\u043c\u0443;\u0432 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 libutils\/dist \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c libutils.jar.1. Explorer; 2. Java Projects; 3. SimpleApplet file heirarchy; 4. Add Jar Libraries.\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043a\u043e\u0434\u0443, \u0431\u043b\u0430\u0433\u043e \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439:package simple.applet;import javacard.framework.*;import fun.libutils.Utils;public classSimpleApplet extends Applet{    \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0431\u0430\u0439\u0442 INS \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 APDU)private static final byte INS_DO_XOR      = 0x12;private static final byte INS_BUBBLE_SORT = 0x14;private static final byte INS_PARSE_BCD   = 0x16;    \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438Utils utils;publicSimpleApplet()  {        \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Utilsutils = new Utils();}public static voidinstall(byte[] bArray, short bOffset, byte bLength){        \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432 JCRE (Java Card Runtime Environment)new SimpleApplet().register();}public voidprocess(APDU apdu){        \/\/ \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 &#171;SELECT \u043a\u043e\u0433\u043e-\u0442\u043e \u0442\u0430\u043c&#187;, \u0442\u043e \u043d\u0430\u0434\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f        \/\/ \u0442.\u043a. \u043d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d.        \/\/ JCRE \u0436\u0435 \u0441\u0430\u043c\u0430 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0441 \u043d\u0435\u0439 \u0434\u0435\u043b\u0430\u0442\u044c.if (selectingApplet()) {return;}byte[] buff = apdu.getBuffer();byte cla    = buff[ISO7816.OFFSET_CLA];byte ins    = buff[ISO7816.OFFSET_INS];short lc    = (short)(buff[ISO7816.OFFSET_LC] &amp; (short)0xFF);                \/\/ \u041d\u0430\u0448 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0436\u0434\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435: \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 CDATA \u043f\u0430\u043a\u0435\u0442\u0430 APDU \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043eif (lc == 0) {ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);}        \/\/ \u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212; \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0435, \u0430 \u043c\u044b &#8212; \u043f\u0440\u0438\u043b\u0435\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b,        \/\/ \u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 ISO 7816, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b,        \/\/ \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043f\u043e\u043b\u044f CLA \u043a\u043e\u043c\u0430\u043d\u0434\u044b APDU.if (cla != (byte)0x80) {ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);}        \/\/ \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442.\u0435. \u043f\u043e\u043b\u044f CDATA)apdu.setIncomingAndReceive();        \/\/ \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f INS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.switch (ins) {case INS_DO_XOR: {                \/\/ \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0435\u0439\u0441\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libutils.jarutils.xor(buff, ISO7816.OFFSET_CDATA, lc);} break;case INS_BUBBLE_SORT: {utils.bubble_sort(buff, ISO7816.OFFSET_CDATA, lc);} break;case INS_PARSE_BCD: {utils.from_bcd(buff, ISO7816.OFFSET_CDATA, lc);} break;default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);}        \/\/ \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u042d\u0442\u043e\u0442 \u0430\u043f\u043f\u043b\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e        \/\/ \u0431\u0430\u0439\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435.apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, lc);}}\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043a\u043e\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043e\u0442\u043c\u0435\u0447\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 SimpleApplet.java:\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0430\u043f\u043f\u043b\u0435\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430: Utils utils;\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 void install() \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0430\u043f\u043f\u043b\u0435\u0442, \u0447\u0442\u043e\u0431\u044b JCRE \u0437\u043d\u0430\u043b\u0430 \u043e \u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438, \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0441 \u043d\u0438\u043c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f;\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 void process() \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Utils \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 APDU-\u043a\u043e\u043c\u0430\u043d\u0434.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 FunGP\u0424\u0430\u043d\u0430\u0442\u044b \u043c\u043e\u0435\u0433\u043e \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u0430 \u043b\u0438\u043a\u0443\u044e\u0442 &#8212; \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0433\u0451\u0442 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SCP02._retail_mac()! \u0422\u0435\u043f\u0435\u0440\u044c EMVco \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e. \u041d\u0443 \u0434\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u043b\u0438\u0440\u0438\u043a\u0438, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0434\u0435\u043b\u0443: \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u0437\u0430\u0442\u0435\u043c \u0432\u0432\u0435\u0434\u0438\u0442\u0435:python -m 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\u0435source .venv\/bin\/activate # \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e. \u041d\u0430 Windows venv\\Scripts\\activate.batpip install -e .          # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u0431\u0443. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0443\u0436\u0435\u043d python 3.12.x. \u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c SimpleApplet.cap \u0438 fun.libutils.cap \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e .\/resources \u00a0\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 FunGP, \u0442.\u043a. \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0442\u0443\u0434\u0430.\u0421\u043a\u0440\u0438\u043f\u0442 01_install_applet.pyfrom fun_gp import Reader, SmartCard, SCP02, CCM, InstallParams, APPLET_PATH# \u041a\u043b\u044e\u0447\u0438 ISDisd_keyset = [&#8216;404142434445464748494A4B4C4D4E4F&#8217;,              &#8216;404142434445464748494A4B4C4D4E4F&#8217;,              &#8216;404142434445464748494A4B4C4D4E4F&#8217;]# \u041f\u0443\u0442\u044c \u0434\u043e \u0430\u043f\u043f\u043b\u0435\u0442\u0430applet_cap_path = APPLET_PATH \/ &#8216;SimpleApplet.cap&#8217;# \u041f\u0443\u0442\u044c \u0434\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438lib_cap_path    = APPLET_PATH \/ &#8216;fun.libutils.cap&#8217;def install_applet():    with Reader() as reader: # \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0440\u0438\u0434\u0435\u0440\u0443. \u0415\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c.        # \u0431\u0435\u0440\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443        isd = SmartCard(reader.plain_apdu, SCP02(isd_keyset), CCM())         isd.transmit(&#8217;00a4 0400&#8217;, 0x90, 0x00, &#8216;Select ISD&#8217;) # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c ISD        isd.mutual_auth() # \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0432\u0437\u0430\u0438\u043c\u043d\u0443\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e        isd.install_lib_scp02(lib_cap_path, 0x90, 0x00) # \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443        isd.install_app_scp02(applet_cap_path, InstallParams(), 0x90, 0x00) # \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0430\u043f\u043f\u043b\u0435\u0442install_applet()\u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u2116 18-19, \u0433\u0434\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0430\u043f\u043f\u043b\u0435\u0442\u0430. \u041f\u043e \u0437\u0434\u0440\u0430\u0432\u043e\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u044e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u0447\u0442\u043e \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u043f\u043f\u043b\u0435\u0442 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2013 \u0431\u0435\u0441\u0442\u043e\u043b\u043a\u043e\u0432\u0430\u044f \u0438\u0434\u0435\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 SmartCard.install_lib_scp02():def install_lib_scp02(self, lib_path:str, exp_sw1:int|None = None, exp_sw2:int|None = None, is_secured=True):&#187;&#187;&#187;Install a library by means of SCP02 protocol.  :param lib_path: path &#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-495057","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495057","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=495057"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495057\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=495057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=495057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=495057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}