├── .classpath ├── .gitignore ├── .jcop ├── .project ├── README.md ├── cap └── u2ftoken.cap ├── doc ├── Attestation证书生成.md ├── CertToHardString.java ├── ISO7816-4中的文件系统.md ├── U2FToken应用操作命令流程.md ├── attestation_private_key.txt ├── cert.der ├── cert.pem ├── cert_hex.txt ├── javacard2.2执行步骤.md ├── javacard_env.bat ├── jcop命令中的各种坑.md ├── key.der ├── key.pem ├── res │ ├── ECC_01.gif │ ├── ECC_02.gif │ ├── ECC_03.gif │ ├── ECC_04.gif │ ├── ECC_05.gif │ ├── ECC_06.gif │ ├── ECC_07.gif │ ├── ECC_08.gif │ ├── ECC_09.gif │ ├── ECC_10.gif │ ├── ECC_11.gif │ ├── ECC_12.gif │ ├── ECC_13.gif │ ├── ISO7816-4-APDU.png │ ├── ISO7816-4-file_reference.png │ ├── ISO7816-4-hierarchy_DF.png │ ├── ISO7816-4-independent_DF.png │ ├── cert-binary.png │ ├── cert-info.png │ ├── cert-no-ext.png │ ├── curves.png │ ├── gen-cert-input.png │ ├── key-binary.png │ ├── key-pem-to-der.png │ ├── key.png │ └── list-curves.png └── 椭圆曲线加密算法.md ├── extra ├── README.java └── jce-jdk13-153.jar └── src ├── README.md ├── apdu.script ├── com └── esec │ └── u2ftoken │ ├── IndexKeyHandle.java │ ├── KeyHandleGenerator.java │ ├── RawMessageCodec.java │ ├── SecP256r1.java │ ├── SecretKeyDataBase.java │ ├── SecretKeys.java │ ├── SharedMemory.java │ ├── U2FToken.java │ └── javacard │ ├── u2ftoken.cap │ └── u2ftoken.jca ├── command.jcsh ├── compile.bat ├── complie-jcardsim-3.0.4.bat ├── converter.cfg ├── default-new.scr ├── default-success-create.scr ├── default.scr ├── jcardsim-2.2.2-all.jar ├── jcardsim-3.0.4-SNAPSHOT.jar ├── jcardsim.cfg └── output.txt /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | *.class 3 | -------------------------------------------------------------------------------- /.jcop: -------------------------------------------------------------------------------- 1 | 1.01.0A0000006472F0001A0000006472F001.01.0 -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | U2FToken 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | com.ibm.bluez.jcop.eclipse.jcopbuilder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | com.ibm.bluez.jcop.eclipse.jcopnature 22 | 23 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # U2FToken 2 | An U2F Token implementation based on JavaCard 3 | This U2F Token: cannot pass the NFC self-conformance test in the phase: "U2F_REGISTER, Short APDU, Change BlockSize", as it doesn't handle the situation which Le(BlockSize) is not 256 bytes. 4 | **My implementation can handle of this case nicely and pass the test.** 5 | 6 | ### Install(Use JCOP Shell Command) 7 | 1. Complie this Applet and upload to the JavaCard(>3.0) 8 | 2. Set the attestation certificate(with Extended APDU, CLA:F0, INS:01, P1,P2:00, Lc:000119): 9 | > /send f0010000000119308201153081bc020900c5f4ee4c59503e05300a06082a8648ce3d04030230133111300f0603550403130859616e675a686f75301e170d3135313230393037303435385a170d3136313230383037303435385a30133111300f0603550403130859616e675a686f753059301306072a8648ce3d020106082a8648ce3d03010703420004729a71d08162428492f2d961924d37443a4f1bda580f8aea2920d2997cbea43960ce729e35c1f74092f2250e6074823fc57f3360b7cd3969c3c3125ece265c29300a06082a8648ce3d0403020348003045022100e767fa941035d5853d52d87d671470bc763bc5b12e1d4577ea9f8ca674e59d3902203fe11cad59f53576001f15ee05da8746fed3276b16829e9d5efdff705e089c6d 10 | 3. Set the attestation private key(CLA:F0, INS:02, P1,P2:00): 11 | > /send f0020000#(4cc7cf68911896c8e2f9c8cc2f7f0aa21c6acbba381c109afe9118f6cad90f0b) 12 | 13 | ### U2F Self-Comformance Test 14 | * Please access the NFC self-conformance test tool here: 15 | * Download the newly Android Google Authenticator 16 | * Open or with the newly Android chrome. 17 | * Do the Register and Authenticate 18 | 19 | ### Some Tips For Implementation 20 | 1. The authenticate private key is stored in the SE, as there is enough memory to hold thousands of keys. 21 | 2. The key handle consists with index(first 2 bytes) of the authenticate private key and Sha-256 appid(left 32 bytes) 22 | 23 | **//TODO** 24 | 1. The database which stores anthenticate private keys can not increase dynamicly now. 25 | 2. I also want to implement a "wrapped" key handle rather than storing the authenticate private key locally in SE. 26 | -------------------------------------------------------------------------------- /cap/u2ftoken.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/cap/u2ftoken.cap -------------------------------------------------------------------------------- /doc/Attestation证书生成.md: -------------------------------------------------------------------------------- 1 | *本文档使用openssl 1.0.2e* 2 | 首先,打开openssl,使用命令: 3 | >ecparam -list_curves 4 | 5 | 查看openssl所支持的椭圆曲线算法: 6 | ![](./res/list-curves.png) 7 | u2f规范中对签名算法的要求是ECDSA signature(on P-256),其实就是NIST所规定的secp256r1(注意不是secp256k1)。在openssl中是定义的prime256v1。 8 | 然后输入: 9 | >ecparam -name secp256r1 -genkey -out key.pem 10 | 11 | 就会生成公私钥文件key.pem。可以通过以下命令查看: 12 | >ec -in key.pem -noout -text 13 | 14 | ![](./res/key.png) 15 | 私钥32字节,公钥65字节(https://www.ietf.org/rfc/rfc5480.txt,根据这个文献,公钥第一字节0x04表示uncompressed,如果是0x02 or 0x03则表示compressed,u2f要求是uncompressed) 16 | 17 | 然后就可以开始生成自签名证书: 18 | >req -new -x509 -key key.pem -out cert.pem -days 365 -sha256 19 | 20 | ~~**注意,u2f对证书签名时所作hash算法没要求,但是最好是sha256,但是这里命令里的-sha256并没有作用,因为此版本openssl(0.9.8l)还不支持sha256**~~ 21 | **openssl 1.0.2e支持sha256摘要** 22 | 23 | 24 | 然后会要求输入一堆信息,之后就会生成证书cert.pem: 25 | ![](./res/gen-cert-input.png) 26 | 查看证书命令: 27 | >x509 -in cert.pem -text -noout 28 | 29 | ![](./res/cert-info.png) 30 | 可以注意到其中签名算法是ecdsa-with-sha256。**还要注意这里版本号是v1,如果要用v3的话,则在生成证书的命令里还要加上 -extensions v3_ca,但是这样就会有一部分证书扩展** 31 | 32 | **现在问题是,这些证书都是DER编码的。。。怎么转成二进制编码。。。** 33 | ---- 34 | 上面这些命令生成的文件其实都是pem(Privacy Enhanced Mail)格式的。 35 | 36 | **PEM** - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码. 37 | 查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout 38 | Apache和*NIX服务器偏向于使用这种编码格式. 39 | **DER** - Distinguished Encoding Rules,打开看是二进制格式,不可读. 40 | 查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout 41 | 42 | ####证书编码的转换 43 | **PEM转为DER** openssl x509 -in cert.pem -outform der -out cert.der 44 | 45 | **DER转为PEM** openssl x509 -in cert.der -inform der -outform pem -out cert.pem 46 | 47 | 下面将key.pem: 48 | ![](./res/key.png) 49 | 使用命令: 50 | >ec -in key.pem -outform der -out key.der 51 | 52 | 之后用sublime打开key.der查看: 53 | ![](./res/key-binary.png) 54 | 可以看见30 77 02 01 01 04 20之后是私钥,这个前缀不知道是什么意思。 55 | ~~这个二进制文件相当长,因为它是带了证书扩展的。要去掉证书扩展,可以编辑openssl.cfg文件中,找到:~~ 56 | ~~>x509_extensions = v3_ca # The extentions to add to the self signed cert~~ 57 | 58 | ~~将其注释掉,之后再生成证书~~ 59 | ~~可以发现已经不带扩展。(版本为什么变成了V1?)~~ 60 | ~~此时再转成DER文件,会发现二进制码少了很多。~~ 61 | 62 | 将证书使用命令: 63 | >x509 -in cert.pem -outform der -out cert.der 64 | 65 | 得到: 66 | ![](./res/cert-binary.png) 67 | 一共281字节 68 | >**下面来解析下这个证书(依据《PKI技术》 4.4 证书编码,是基于DER编码的)** 69 | >1: "30"表示证书整体上是一个SEQUENCE 70 | >2: "82"表示这个SEQUENCE的长度用"长形式"编码,且表示长度的字节码的长度为2字节 71 | >3-4: "01 15"表示SEQUENCE的长度为0x0115=279字节,其后就是SEQUENCE的Value部分,也就是证书的各个部分 72 | >5-7: "30 81 bc"表示其后的188字节应解码为一个SEQUENCE。 73 | >8-9: "02 09"表示其后是9字节的整数 74 | >10-18: "00 c5 f4 ee 4c 59 50 3e 05"表示serial number(**本来第一个应该是version,但是x509默认是v1,因此这里没有version号。如果是v3则会有。**) 75 | >19-20: "30 0a",这是个SEQUENCE,有10字节 76 | >21-30:"06082a8648ce3d040302",这是个TLV,06表示OBJECT IDENTIFIER,08表示有8字节,根据证书格式,这个表示AlgorithmIdentifier,也就是ecdsa-with-SHA256的OID(见https://tools.ietf.org/html/rfc5758,3.2节):1.2.840.10045.4.3.2。 77 | >31-32: "30 13",这是个SEQUENCE,有19字节 78 | >33-34: "31 11",这是个SET,有17字节 79 | >35-36: "30 0f" 80 | >37-43: "0603 5504 0313 08",不会解析了,反正就是issuer那部分。最后08表示issuer有8字节。 81 | >44-51:"59 616e 675a 686f 75",YangZhou 82 | >"30 1e17 0d31 3531 3230 3930 3730 83 | 3435 385a 170d 3136 3132 3038 3037 3034 84 | 3538 5a": validity字段 85 | >"30 1331 1130 0f06 0355 0403 1308 86 | 5961 6e67 5a68 6f75": subject字段 87 | >"3059 3013 0607 2a86 88 | 48ce 3d02 0106 082a 8648 ce3d 0301 0703 89 | 4200": subjectPublicKeyInfo字段 90 | >公钥:"0472 9a71 d081 6242 8492 f2d9 6192 91 | 4d37 443a 4f1b da58 0f8a ea29 20d2 997c 92 | bea4 3960 ce72 9e35 c1f7 4092 f225 0e60 93 | 7482 3fc5 7f33 60b7 cd39 69c3 c312 5ece 94 | 265c 29" 95 | >最后71字节是签名。(官方给的例子是70字节,我在网上自己签名是72字节,都不一样长,这是因为ecdsa算法的特性决定的) 96 | 97 | 98 | 好复杂,后面就不解析了。。。 -------------------------------------------------------------------------------- /doc/CertToHardString.java: -------------------------------------------------------------------------------- 1 | // package org.esec.mcg.utils; 2 | /** 3 | * java CertToHardString cert.der 4 | * 将DER编码的二进制证书文件转换成字符串:(byte)0x01, (byte)0x02... 5 | * 主要是方便将其写死到代码里。。。 6 | * 需要放在包org.esec.mcg.utils下,将FileUtil.java,ByteUtil.java,StringUtil.java中的package包申明注释掉 7 | * (否则,如果不能单独编译这两个文件,而是需要编译整个包的所有文件) 8 | * javac FileUtile.java ByteUtil.java 9 | * javac CertToHardString.java 10 | * java CertToHardString cert.der 11 | * 输出的字符串保存在out.txt中 12 | */ 13 | import java.io.File; 14 | import java.io.FileWriter; 15 | import java.io.IOException; 16 | import java.util.Set; 17 | import java.util.HashSet; 18 | 19 | @SuppressWarnings("unchecked") 20 | public class CertToHardString { 21 | 22 | public static void main(String[] args) { 23 | File file = new File(args[0]); 24 | byte[] result = FileUtil.FileToByteArray(file); 25 | String s = ByteUtil.ByteArrayToHexString(result); 26 | s = StringUtil.HexStringToHardCodeByteArrayString(s); 27 | // System.out.println(sb.toString()); 28 | FileWriter fw; 29 | try { 30 | File outFile = new File("out.txt"); 31 | fw = new FileWriter(outFile); 32 | fw.write(s); 33 | fw.flush(); 34 | } catch(IOException e) { 35 | e.printStackTrace(); 36 | } 37 | 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /doc/ISO7816-4中的文件系统.md: -------------------------------------------------------------------------------- 1 | ### 1.APDU 2 | C-APDU就是Command APDU? 3 | ![](./res/ISO7816-4-APDU.png) 4 | 是否支持扩展APDU,是在histrotical bytes或EF.ATR中申明的。 5 | 6 | ### 5.2 Data Objects 7 | 本文档定义了两个:SIMPLE-TLV和BER-TLV(但是X509证书一般是DER格式的?) 8 | #### 5.2.1 SIMPLE-TLV 9 | SIMPLE-TLV由2或3部分组成:TAG,LEN,VALUE(可能有)。一个record可能是SIMPLE-TLV编码的。 10 | * TAG:只有一个byte,范围1-254。00和FF是不合法的。如果record是用SIMPLE-TLV编码,那么TAG字段是record identifier。 11 | * LENGTH:由1-3个byte编码。如果第一个byte不是FF,那么LENGTH就只有一个字段,范围0-254;如果第一个byte是FF,那么后两字节是LENGTH,范围0-65535。 12 | 13 | #### 5.2.2 BER-TLV 14 | * TAG:由1-3个字节组成。00不合法。 15 | * LENGTH:由一个或多个字节组成。 16 | 17 | ### 5.3 Structures for applications and data 18 | 有两种文件结构,一种是树形的(有MF),一种是并列的 19 | 树形: 20 | ![](./res/ISO7816-4-hierarchy_DF.png) 21 | 并列: 22 | ![](./res/ISO7816-4-independent_DF.png) 23 | 有四种显示选择的方法: 24 | * Selection by DF name:一个DF name可以表示任意一个DF,最多16字节。application identifier(AID)就是一个DF name。 25 | * Selection by file identifier:一个file identifier可以表示任意file(包括DF,EF)。只有2字节。3F00表示MF。FFFF, 3FFF, 0000不可用。在一个给定的DF下,file identifier必须唯一。 26 | * Selection by path:一个path可以表示任意file。它是file identifier的连接。 27 | * Selection by short EF identifier:short EF identifier可以表示任意EF。由5 bits组成,00000表示当前EF。short EF identifier不能用于path中,或者用于EF identifier(比如在一个SELECT COMMAND中) 28 | 29 | #### 5.3.1.2 File reference data element 30 | ![](./res/ISO7816-4-file_reference.png) 31 | -------------------------------------------------------------------------------- /doc/U2FToken应用操作命令流程.md: -------------------------------------------------------------------------------- 1 | 选择应用: 2 | /select A0000006472F0001 -------------------------------------------------------------------------------- /doc/attestation_private_key.txt: -------------------------------------------------------------------------------- 1 | 4cc7cf68911896c8e2f9c8cc2f7f0aa21c6acbba381c109afe9118f6cad90f0b -------------------------------------------------------------------------------- /doc/cert.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/cert.der -------------------------------------------------------------------------------- /doc/cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIBFTCBvAIJAMX07kxZUD4FMAoGCCqGSM49BAMCMBMxETAPBgNVBAMTCFlhbmda 3 | aG91MB4XDTE1MTIwOTA3MDQ1OFoXDTE2MTIwODA3MDQ1OFowEzERMA8GA1UEAxMI 4 | WWFuZ1pob3UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARymnHQgWJChJLy2WGS 5 | TTdEOk8b2lgPiuopINKZfL6kOWDOcp41wfdAkvIlDmB0gj/FfzNgt805acPDEl7O 6 | JlwpMAoGCCqGSM49BAMCA0gAMEUCIQDnZ/qUEDXVhT1S2H1nFHC8djvFsS4dRXfq 7 | n4ymdOWdOQIgP+EcrVn1NXYAHxXuBdqHRv7TJ2sWgp6dXv3/cF4InG0= 8 | -----END CERTIFICATE----- 9 | -------------------------------------------------------------------------------- /doc/cert_hex.txt: -------------------------------------------------------------------------------- 1 | 308201153081bc020900c5f4ee4c59503e05300a06082a8648ce3d04030230133111300f0603550403130859616e675a686f75301e170d3135313230393037303435385a170d3136313230383037303435385a30133111300f0603550403130859616e675a686f753059301306072a8648ce3d020106082a8648ce3d03010703420004729a71d08162428492f2d961924d37443a4f1bda580f8aea2920d2997cbea43960ce729e35c1f74092f2250e6074823fc57f3360b7cd3969c3c3125ece265c29300a06082a8648ce3d0403020348003045022100e767fa941035d5853d52d87d671470bc763bc5b12e1d4577ea9f8ca674e59d3902203fe11cad59f53576001f15ee05da8746fed3276b16829e9d5efdff705e089c6d -------------------------------------------------------------------------------- /doc/javacard2.2执行步骤.md: -------------------------------------------------------------------------------- 1 | 1. 由于javacard2.2中的converter是识别java sdk1.5所编译的.class文件,因此先打开一个cmd,运行javacard_env.bat设置java和javacard的环境变量 2 | 2. 执行 3 | >javac -g -classpath .\classes;..\lib\api.jar;..\lib\installer.jar 4 | src\com\sun\javacard\samples\HelloWorld\\*.java 5 | 编译出HelloWorld的class文件 6 | 3. 编写converter.cfg文件: 7 | >-out CAP -exportpath ..\\..\api_export_files\ -applet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1:0x1 com.sun.javacard.samples.HelloWorld.HelloWorld com.sun.javacard.samples.HelloWorld 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1 1.0 8 | 9 | 其中api_export_files是javacard SDK带的,-applet 后跟applet的AID和实现Applet接口的文件,之后是Package和Package的AID。**注意Applet AID前面部分必须和Package AID一样** 10 | 11 | 4. 执行将converter.cfg放到项目适当目录,执行converter -config converter.cfg,执行完成后就会在项目Package根目录创建一个javacard文件夹,其中有生成的cap文件 12 | 5. 打开jcop的eclipse,执行以下命令与卡进行建连: 13 | >/term "winscard:4|SCM Microsystems Inc. SDI011G Contactless Reader 0" 14 | >/card -a a000000003000000 -c com.ibm.jc.CardManager 15 | >set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f 16 | >init-update 255 17 | >ext-auth mac 18 | >upload "E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\samples\src\com\sun\javacard\samples\HelloWorld\javacard\HelloWorld.cap" 19 | >install a00000006203010c01 a00000006203010c0101 20 | >/select A00000006203010C0101 21 | 22 | 其中install命令后分别跟Package AID和Applet AID -------------------------------------------------------------------------------- /doc/javacard_env.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set JC_HOME=E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2 3 | set JAVA_HOME=E:\workspace\java\javacard\jdk1.5.0_14 4 | set PATH=.;%JC_HOME%\bin;%JAVA_HOME%\bin;%PATH% 5 | set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; -------------------------------------------------------------------------------- /doc/jcop命令中的各种坑.md: -------------------------------------------------------------------------------- 1 | 1. delete一个module时,返回6448: 2 | >cm> delete A0000006472F0001 3 | => 84 E4 00 00 12 4F 08 A0 00 00 06 47 2F 00 01 88 .....O.....G/... 4 | CC 45 41 D5 0E DB D5 00 .EA..... 5 | (47017 usec) 6 | <= 64 48 dH 7 | Status: 0x6448 8 | jcshell: Error code: 6448 (0x6448) 9 | jcshell: Wrong response APDU: 6448 10 | 11 | 这时用命令 delete -r A0000006472F00(Package AID),这将会删除load file和any associated instance 12 | 13 | 会出现这个删不掉的原因是:The JCRE is unable to remove an applet if there are reference to static variables. The correct solution to this is to make your applet implement the AppletEvent interface and in the public void uninstall() method, set the variable to null. 14 | 15 | /* (non-Javadoc) 16 | * @see javacard.framework.AppletEvent#uninstall() 17 | */ 18 | public void uninstall() { 19 | baData = null; 20 | } -------------------------------------------------------------------------------- /doc/key.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/key.der -------------------------------------------------------------------------------- /doc/key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN EC PARAMETERS----- 2 | BggqhkjOPQMBBw== 3 | -----END EC PARAMETERS----- 4 | -----BEGIN EC PRIVATE KEY----- 5 | MHcCAQEEIEzHz2iRGJbI4vnIzC9/CqIcasu6OBwQmv6RGPbK2Q8LoAoGCCqGSM49 6 | AwEHoUQDQgAEcppx0IFiQoSS8tlhkk03RDpPG9pYD4rqKSDSmXy+pDlgznKeNcH3 7 | QJLyJQ5gdII/xX8zYLfNOWnDwxJeziZcKQ== 8 | -----END EC PRIVATE KEY----- 9 | -------------------------------------------------------------------------------- /doc/res/ECC_01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_01.gif -------------------------------------------------------------------------------- /doc/res/ECC_02.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_02.gif -------------------------------------------------------------------------------- /doc/res/ECC_03.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_03.gif -------------------------------------------------------------------------------- /doc/res/ECC_04.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_04.gif -------------------------------------------------------------------------------- /doc/res/ECC_05.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_05.gif -------------------------------------------------------------------------------- /doc/res/ECC_06.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_06.gif -------------------------------------------------------------------------------- /doc/res/ECC_07.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_07.gif -------------------------------------------------------------------------------- /doc/res/ECC_08.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_08.gif -------------------------------------------------------------------------------- /doc/res/ECC_09.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_09.gif -------------------------------------------------------------------------------- /doc/res/ECC_10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_10.gif -------------------------------------------------------------------------------- /doc/res/ECC_11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_11.gif -------------------------------------------------------------------------------- /doc/res/ECC_12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_12.gif -------------------------------------------------------------------------------- /doc/res/ECC_13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ECC_13.gif -------------------------------------------------------------------------------- /doc/res/ISO7816-4-APDU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ISO7816-4-APDU.png -------------------------------------------------------------------------------- /doc/res/ISO7816-4-file_reference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ISO7816-4-file_reference.png -------------------------------------------------------------------------------- /doc/res/ISO7816-4-hierarchy_DF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ISO7816-4-hierarchy_DF.png -------------------------------------------------------------------------------- /doc/res/ISO7816-4-independent_DF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/ISO7816-4-independent_DF.png -------------------------------------------------------------------------------- /doc/res/cert-binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/cert-binary.png -------------------------------------------------------------------------------- /doc/res/cert-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/cert-info.png -------------------------------------------------------------------------------- /doc/res/cert-no-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/cert-no-ext.png -------------------------------------------------------------------------------- /doc/res/curves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/curves.png -------------------------------------------------------------------------------- /doc/res/gen-cert-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/gen-cert-input.png -------------------------------------------------------------------------------- /doc/res/key-binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/key-binary.png -------------------------------------------------------------------------------- /doc/res/key-pem-to-der.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/key-pem-to-der.png -------------------------------------------------------------------------------- /doc/res/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/key.png -------------------------------------------------------------------------------- /doc/res/list-curves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/doc/res/list-curves.png -------------------------------------------------------------------------------- /doc/椭圆曲线加密算法.md: -------------------------------------------------------------------------------- 1 | ###ECC的优势 2 | 说 ECC 的优势前,先列举几个 RSA 的劣势: 3 | 1. 破解越来越容易。RSA 加密的原理是基于大数运算(2的几千次幂的规模),随着计算机的运算速度越来越快,破解 RSA 的难度逐步降低。目前 1024 位 RSA 密钥已经被认为是不安全的。生产环境使用的 RSA 密钥要求至少是 2048 位。 4 | 2. 加密速度比较慢。大数运算很耗计算资源,速度很慢,不适合在嵌入式设备中使用。 5 | 6 | ECC 完美解决了以上问题: 7 | 1. ECC 基于非常复杂的椭圆曲线算法,数学上被证明是不可破解的——意思就是,即使计算机速度再快,也不可能破解 ECC。 8 | 2. 加密速度快。相同密钥强度下,ECC 的加密速度大约是 RSA 的 10 倍,适合在 Secure Element、TrustZone 等一些计算资源比较紧张的环境中使用。 9 | 10 | ###ECC的公钥和私钥 11 | ECC 的原理非常复杂,所谓的“椭圆”,并不单指我们通常意义上的椭圆,像下面这样的曲线都属于符合 ECC 定义的“椭圆”。 12 | ![](./res/curves.png) 13 | ECC 加解密的原理是在二维平面上找点。要利用 ECC 做加解密,需要: 14 | 1. 确定一个椭圆方程 15 | 并不是所有的椭圆都可以用来加密,诸如 y^2=x^3+a*x+b 这样的椭圆是一类可以用来加密的椭圆。 16 | 2. 在这个椭圆上找一个点 17 | 用 G 表示。 18 | 3. 确定用于找点的平面范围 19 | 用 p 或 m 指定。 20 | 21 | 因此,描述一个 ECC 算法,一般用到 6 个常量:p,a,b,G,n,h 或 m,a,b,G,n,h 。如果加入随机因子,再加 1 个常量:S 。 上面这些常量的取值可能有无数种。为了使用方便,SECP 和 IETF 定义了一些组合,并为每种组合取了个名字,如 secp256r1、brainpoolP256r1 等。根据这些曲线名字,我们可以确定 ECC 算法所需要的常量值。其中,G 代表的是二维坐标上的一点,数值上用 x,y 表示。 22 | 23 | ---- 24 | 在java card中: 25 | 26 | ---- 27 | ### 下面是全面易懂地介绍ECC算法的博客文档 28 | 29 | 前言 30 | 31 | 32 | 同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。目前,国内详细介绍ECC的公开文献并不多(反正我没有找到)。有一些简介,也是泛泛而谈,看完后依然理解不了ECC的实质(可能我理解力太差)。前些天我从国外网站找到些材料,看完后对ECC似乎懵懂了。于是我想把我对ECC的认识整理一下,与大家分享。当然ECC博大精深,我的认识还很肤浅,文章中错误一定不少,欢迎各路高手批评指正,小弟我洗耳恭听,并及时改正。文章将采用连载的方式,我写好一点就贴出来一点。本文主要侧重理论,代码实现暂不涉及。这就要求你要有一点数学功底。最好你能理解RSA算法,对公开密钥算法有一个了解。《近世代数基础》《初等数论》之类的书,最好您先翻一下,这对您理解本文是有帮助的。别怕,我尽量会把语言通俗些,希望本文能成为学习ECC的敲门砖。 33 | 34 | 一、从平行线谈起。 35 | 36 | 平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行公理,是没有证明的)。既然可以假设平行线永不相交,也可以假设平行线在很远很远的地方相交了。即平行线相交于无穷远点P∞(请大家闭上眼睛,想象一下那个无穷远点P∞,P∞是不是很虚幻,其实与其说数学锻炼人的抽象能力,还不如说是锻炼人的想象力)。给个图帮助理解一下: 37 | 38 | ![](./res/ECC_01.gif) 39 | 40 | 直线上出现P∞点,所带来的好处是所有的直线都相交了,且只有一个交点。这就把直线的平行与相交统一了。为与无穷远点相区别把原来平面上的点叫做平常点。 41 | 42 | 以下是无穷远点的几个性质。 43 | 44 | ▲直线L上的无穷远点只能有一个。 45 | (从定义可直接得出) 46 | ▲平面上一组相互平行的直线有公共的无穷远点。 47 | (从定义可直接得出) 48 | ▲ 平面上任何相交的两直线L1,L2有不同的无穷远点。 49 | (否则L1和L2有公共的无穷远点P ,则L1和L2有两个交点A、P,故假设错误。) 50 | ▲平面上全体无穷远点构成一条无穷远直线。(自己想象一下这条直线吧) 51 | ▲平面上全体无穷远点与全体平常点构成射影平面。 52 | 53 | 54 | 55 | 56 | 二、射影平面坐标系 57 | 58 | 射影平面坐标系是对普通平面直角坐标系(就是我们初中学到的那个笛卡儿平面直角坐标系)的扩展。我们知道普通平面直角坐标系没有为无穷远点设计坐标,不能表示无穷远点。为了表示无穷远点,产生了射影平面坐标系,当然射影平面坐标系同样能很好的表示旧有的平常点(数学也是“向下兼容”的)。 59 | 60 | ![](./res/ECC_02.gif) 61 | 62 | 我们对普通平面直角坐标系上的点A的坐标(x,y)做如下改造: 63 | 令x=X/Z ,y=Y/Z(Z≠0);则A点可以表示为(X:Y:Z)。 64 | 变成了有三个参量的坐标点,这就对平面上的点建立了一个新的坐标体系。 65 | 66 | 例2.1:求点(1,2)在新的坐标体系下的坐标。 67 | 解:∵X/Z=1 ,Y/Z=2(Z≠0)∴X=Z,Y=2Z ∴坐标为(Z:2Z:Z),Z≠0。即(1:2:1)(2:4:2)(1.2:2.4:1.2)等形如(Z:2Z:Z),Z≠0的坐标,都是(1,2)在新的坐标体系下的坐标。 68 | 69 | 我们也可以得到直线的方程aX+bY+cZ=0(想想为什么?提示:普通平面直角坐标系下直线一般方程是ax+by+c=0)。新的坐标体系能够表示无穷远点么?那要让我们先想想无穷远点在哪里。根据上一节的知识,我们知道无穷远点是两条平行直线的交点。那么,如何求两条直线的交点坐标?这是初中的知识,就是将两条直线对应的方程联立求解。平行直线的方程是: 70 | aX+bY+c1Z =0; aX+bY+c2Z =0 (c1≠c2); 71 | (为什么?提示:可以从斜率考虑,因为平行线斜率相同); 72 | 73 | 将二方程联立,求解。有c2Z= c1Z= -(aX+bY),∵c1≠c2 ∴Z=0 ∴aX+bY=0; 74 | 所以无穷远点就是这种形式(X:Y:0)表示。注意,平常点Z≠0,无穷远点Z=0,因此无穷远直线对应的方程是Z=0。 75 | 76 | 例2.2:求平行线L1:X+2Y+3Z=0 与L2:X+2Y+Z=0 相交的无穷远点。 77 | 解:因为L1∥L2 所以有Z=0, X+2Y=0;所以坐标为(-2Y:Y:0),Y≠0。即(-2:1:0)(-4:2:0)(-2.4:1.2:0)等形如(-2Y:Y:0),Y≠0的坐标,都表示这个无穷远点。 78 | 79 | 看来这个新的坐标体系能够表示射影平面上所有的点,我们就把这个能够表示射影平面上所有点的坐标体系叫做射影平面坐标系。 80 | 81 | 82 | 练习: 83 | 1、求点A(2,4) 在射影平面坐标系下的坐标。 84 | 2、求射影平面坐标系下点(4.5:3:0.5),在普通平面直角坐标系下的坐标。 85 | 3、求直线X+Y+Z=0上无穷远点的坐标。 86 | 4、判断:直线aX+bY+cZ=0上的无穷远点 和 无穷远直线与直线aX+bY=0的交点,是否是同一个点? 87 | 88 | 89 | 三、椭圆曲线 90 | 91 | 上一节,我们建立了射影平面坐标系,这一节我们将在这个坐标系下建立椭圆曲线方程。因为我们知道,坐标中的曲线是可以用方程来表示的(比如:单位圆方程是x2+y2=1)。椭圆曲线是曲线,自然椭圆曲线也有方程。 92 | 93 | 椭圆曲线的定义: 94 | 一条椭圆曲线是在射影平面上满足方程 95 | Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3 ----------------[3-1] 96 | 的所有点的集合,且曲线上的每个点都是非奇异(或光滑)的。 97 | 98 | 定义详解: 99 | 100 | ▲ Y2Z+a1XYZ+a3YZ2 = X3+a2X2Z+a4XZ2+a6Z3是Weierstrass方程(维尔斯特拉斯,Karl Theodor Wilhelm Weierstrass,1815-1897),是一个齐次方程。 101 | 102 | ▲ 椭圆曲线的形状,并不是椭圆的。只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程(计算椭圆周长的方程,我没有见过,而对椭圆线积分(设密度为1)是求不出来的。谁知道这个方程,请告诉我呀^_^),故得名。 103 | 104 | 我们来看看椭圆曲线是什么样的。 105 | 106 | ![](./res/ECC_03.gif) 107 | ![](./res/ECC_04.gif) 108 | 109 | ▲ 所谓“非奇异”或“光滑”的,在数学中是指曲线上任意一点的偏导数Fx(x,y,z),Fy(x,y,z),Fz(x,y,z)不能同时为0。如果你没有学过高等数学,可以这样理解这个词,即满足方程的任意一点都存在切线。 110 | 111 | 下面两个方程都不是椭圆曲线,尽管他们是方程[3-1]的形式。 112 | 113 | ![](./res/ECC_05.gif) 114 | ![](./res/ECC_06.gif) 115 | 116 | 因为他们在(0:0:1)点处(即原点)没有切线。 117 | 118 | ▲椭圆曲线上有一个无穷远点O∞(0:1:0),因为这个点满足方程[3-1]。 119 | 120 | 知道了椭圆曲线上的无穷远点。我们就可以把椭圆曲线放到普通平面直角坐标系上了。因为普通平面直角坐标系只比射影平面坐标系少无穷远点。我们在普通平面直角坐标系上,求出椭圆曲线上所有平常点组成的曲线方程,再加上无穷远点O∞(0:1:0),不就构成椭圆曲线了么? 121 | 122 | 我们设x=X/Z ,y=Y/Z代入方程[3-1]得到: 123 | y2+a1xy+a3y = x3+a2x2+a4x+a6 -------------------------[3-2] 124 | 125 | 也就是说满足方程[3-2]的光滑曲线加上一个无穷远点O∞,组成了椭圆曲线。为了方便运算,表述,以及理解,今后论述椭圆曲线将主要使用[3-2]的形式。 126 | 127 | 本节的最后,我们谈一下求椭圆曲线一点的切线斜率问题。 128 | 由椭圆曲线的定义可以知道,椭圆曲线是光滑的,所以椭圆曲线上的平常点都有切线。而切线最重要的一个参数就是斜率k。 129 | 130 | 例3.1:求椭圆曲线方程y2+a1xy+a3y=x3+a2x2+a4x+a6上,平常点A(x,y)的切线的斜率k。 131 | 解:令F(x,y)= y2+a1xy+a3y-x3-a2x2-a4x-a6 132 | 求偏导数 133 | Fx(x,y)= a1y-3x2-2a2x-a4 134 | Fy(x,y)= 2y+a1x +a3 135 | 则导数为:f'(x)=- Fx(x,y)/ Fy(x,y)=-( a1y-3x2-2a2x-a4)/(2y+a1x +a3) 136 | = (3x2+2a2x+a4-a1y) /(2y+a1x +a3) 137 | 所以k=(3x2+2a2x+a4-a1y) /(2y+a1x +a3) ------------------------[3-3] 138 | 139 | 看不懂解题过程没有关系,记住结论[3-3]就可以了。 140 | 141 | 142 | 练习: 143 | 1、将给出图例的椭圆曲线方程Y2Z=X3-XZ2 和Y2Z=X3+XZ2+Z3转换成普通平面直角坐标系上的方程。 144 | 145 | 146 | 四、椭圆曲线上的加法 147 | 148 | 上一节,我们已经看到了椭圆曲线的图象,但点与点之间好象没有什么联系。我们能不能建立一个类似于在实数轴上加法的运算法则呢?天才的数学家找到了这一运算法则 149 | 150 | ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 151 | 自从近世纪代数学引入了群、环、域的概念,使得代数运算达到了高度的统一。比如数学家总结了普通加法的主要特征,提出了加群(也叫交换群,或Abel (阿贝尔)群),在加群的眼中。实数的加法和椭圆曲线的上的加法没有什么区别。这也许就是数学抽象把:)。关于群以及加群的具体概念请参考近世代数方面的数学书。 152 | ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 153 | 154 | 运算法则:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。(如图) 155 | 156 | ![](./res/ECC_07.gif) 157 | ![](./res/ECC_08.gif) 158 | 159 | 160 | 法则详解: 161 | ▲这里的+不是实数中普通的加法,而是从普通加法中抽象出来的加法,他具备普通加法的一些性质,但具体的运算法则显然与普通加法不同。 162 | 163 | ▲根据这个法则,可以知道椭圆曲线无穷远点O∞与椭圆曲线上一点P的连线交于P’,过P’作y轴的平行线交于P,所以有 无穷远点 O∞+ P = P 。这样,无穷远点 O∞的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为 零元。同时我们把P’称为P的负元(简称,负P;记作,-P)。(参见下图) 164 | 165 | ![](./res/ECC_09.gif) 166 | 167 | ▲根据这个法则,可以得到如下结论 :如果椭圆曲线上的三个点A、B、C,处于同一条直线上,那么他们的和等于零元,即A+B+C= O∞ 168 | 169 | ▲k个相同的点P相加,我们记作kP。如下图:P+P+P = 2P+P = 3P。 170 | 171 | ![](./res/ECC_10.gif) 172 | 173 | 下面,我们利用P、Q点的坐标(x1,y1),(x2,y2),求出R=P+Q的坐标(x4,y4)。 174 | 175 | 例4.1:求椭圆曲线方程y2+a1xy+a3y=x3+a2x2+a4x+a6上,平常点P(x1,y1),Q(x2,y2)的和R(x4,y4)的坐标。 176 | 解:(1)先求点-R(x3,y3) 177 | 因为P,Q,-R三点共线,故设共线方程为y=kx+b,其中 178 | 若P≠Q(P,Q两点不重合) 则 179 | 直线斜率k=(y1-y2)/(x1-x2) 180 | 若P=Q(P,Q两点重合) 则直线为椭圆曲线的切线,故由例3.1可知: 181 | k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3) 182 | 183 | 因此P,Q,-R三点的坐标值就是方程组: 184 | y2+a1xy+a3y=x3+a2x2+a4x+a6 -----------------[1] 185 | y=(kx+b) -----------------[2] 186 | 的解。 187 | 188 | 将[2],代入[1] 有 189 | (kx+b)2+a1x(kx+b)+a3(kx+b) =x3+a2x2+a4x+a6 --------[3] 190 | 对[3]化为一般方程,根据三次方程根与系数关系(当三次项系数为1时;-x1x2x3 等于常数项系数, x1x2+x2x3+x3x1等于一次项系数,-(x1+x2+x3)等于二次项系数。) 191 | 所以-(x1+x2+x3)=a2-ka1-k2 192 | x3=k2+ka1+a2+x1+x2;---------------------求出点-R的横坐标 193 | 因为k=(y1-y3)/(x1-x3) 故 194 | y3=y1-k(x1-x3);-------------------------------求出点-R的纵坐标 195 | 196 | (2)利用-R求R 197 | 显然有 x4=x3= k2+ka1+a2+x1+x2; ------------求出点R的横坐标 198 | 而y3 y4 为 x=x4时 方程y2+a1xy+a3y=x3+a2x2+a4x+a6的解 199 | 化为一般方程y2+(a1x+a3)y-(x3+a2x2+a4x+a6)=0 , 根据二次方程根与系数关系得: 200 | -(a1x+a3)=y3+y4 201 | 故y4=-y3-(a1x+a3)=k(x1-x4)-y1-(a1x4+a3); ---------------求出点R的纵坐标 202 | 即: 203 | x4=k2+ka1+a2+x1+x2; 204 | y4=k(x1-x4)-y1-a1x4-a3; 205 | 206 | 本节的最后,提醒大家注意一点,以前提供的图像可能会给大家产生一种错觉,即椭圆曲线是关于x轴对称的。事实上,椭圆曲线并不一定关于x轴对称。如下图的y2-xy=x3+1 207 | ![](./res/ECC_11.gif) 208 | 209 | 五、密码学中的椭圆曲线 210 | 211 | 我们现在基本上对椭圆曲线有了初步的认识,这是值得高兴的。但请大家注意,前面学到的椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点。 212 | 让我们想一想,为什么椭圆曲线为什么连续?是因为椭圆曲线上点的坐标,是实数的(也就是说前面讲到的椭圆曲线是定义在实数域上的),实数是连续的,导致了曲线的连续。因此,我们要把椭圆曲线定义在有限域上(顾名思义,有限域是一种只有由有限个元素组成的域)。 213 | 214 | ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 215 | 域的概念是从我们的有理数,实数的运算中抽象出来的,严格的定义请参考近世代数方面的数。简单的说,域中的元素同有理数一样,有自己得加法、乘法、除法、单位元(1),零元(0),并满足交换率、分配率。 216 | ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 217 | 218 | 下面,我们给出一个有限域Fp,这个域只有有限个元素。 219 | 220 | Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1; 221 | Fp 的加法(a+b)法则是 a+b≡c (mod p);即,(a+c)÷p的余数 和c÷p的余数相同。 222 | Fp 的乘法(a×b)法则是 a×b≡c (mod p); 223 | Fp 的除法(a÷b)法则是 a/b≡c (mod p);即 a×b-1≡c (mod p);(b-1也是一个0到p-1之间的整数,但满足b×b-1≡1 (mod p);具体求法可以参考初等数论,或我的另一篇文章)。 224 | Fp 的单位元是1,零元是 0。 225 | 226 | 同时,并不是所有的椭圆曲线都适合加密。y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就把y2=x3+ax+b 这条曲线定义在Fp上: 227 | 228 | 选择两个满足下列条件的小于p(p为素数)的非负整数a、b 229 | 4a3+27b2≠0 (mod p) 230 | 则满足下列方程的所有点(x,y),再加上 无穷远点O∞ ,构成一条椭圆曲线。 231 | y2=x3+ax+b (mod p) 232 | 其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。 233 | 234 | 我们看一下y2=x3+x+1 (mod 23)的图像 235 | 236 | ![](./res/ECC_12.gif) 237 | 238 | 是不是觉得不可思议?椭圆曲线,怎么变成了这般模样,成了一个一个离散的点? 239 | 椭圆曲线在不同的数域中会呈现出不同的样子,但其本质仍是一条椭圆曲线。举一个不太恰当的例子,好比是水,在常温下,是液体;到了零下,水就变成冰,成了固体;而温度上升到一百度,水又变成了水蒸气。但其本质仍是H2O。 240 | 241 | Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。不过,加法法则和实数域上的差不多,请读者自行对比。 242 | 243 | 1 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P 244 | 2 P(x,y)的负元是 (x,-y),有P+(-P)= O∞ 245 | 3 P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系: 246 | x3≡k2-x1-x2(mod p) 247 | y3≡k(x1-x3)-y1(mod p) 248 | 其中若P=Q 则 k=(3x2+a)/2y1 若P≠Q,则k=(y2-y1)/(x2-x1) 249 | 250 | 251 | 例5.1 已知E23(1,1)上两点P(3,10),Q(9,7),求1)-P,2)P+Q,3) 2P。 252 | 解 1) –P的值为(3,-10) 253 | 2) k=(7-10)/(9-3)=-1/2,2的乘法逆元为12 因为2*12≡1 (mod 23) 254 | k≡-1*12 (mod 23) 故 k=11。 255 | x=112-3-9=109≡17 (mod 23); 256 | y=11[3-(-6)]-10=89≡20 (mod 23) 257 | 故P+Q的坐标为(17,20) 258 | 3) k=[3(32)+1]/(2*10)=1/4≡6 (mod 23) 259 | x=62-3-3=30≡20 (mod 23) 260 | y=6(3-7)-10=-34≡12 (mod 23) 261 | 故2P的坐标为(7,12) 262 | 263 | 最后,我们讲一下椭圆曲线上的点的阶。 264 | 如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的 阶,若n不存在,我们说P是无限阶的。 265 | 事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的(证明,请参考近世代数方面的书) 266 | 267 | 268 | 练习: 269 | 1 求出E11(1,6)上所有的点。 270 | 2 已知E11(1,6)上一点G(2,7),求2G到13G所有的值。 271 | 272 | 273 | 六、椭圆曲线上简单的加密/解密 274 | 275 | 公开密钥算法总是要基于一个数学上的难题。比如RSA 依据的是:给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。那椭圆曲线上有什么难题呢? 276 | 277 | 考虑如下等式: 278 | K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数] 279 | 不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。 280 | 这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k(k 281 | 现在我们描述一个利用椭圆曲线进行加密通信的过程: 282 | 283 | 1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。 284 | 2、用户A选择一个私有密钥k,并生成公开密钥K=kG。 285 | 3、用户A将Ep(a,b)和点K,G传给用户B。 286 | 4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r 287 | 5、用户B计算点C1=M+rK;C2=rG。 288 | 6、用户B将C1、C2传给用户A。 289 | 7、用户A接到信息后,计算C1-kC2,结果就是点M。因为 290 | C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M 291 | 再对点M进行解码就可以得到明文。 292 | 293 | 在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、C1、C2 而通过K、G 求k 或通过C2、G求r 都是相对困难的。因此,H无法得到A、B间传送的明文信息。 294 | 295 | ![](./res/ECC_13.gif) 296 | 297 | 密码学中,描述一条Fp上的椭圆曲线,常用到六个参量: 298 | T=(p,a,b,G,n,h)。 299 | (p 、a 、b 用来确定一条椭圆曲线, 300 | G为基点, 301 | n为点G的阶, 302 | h 是椭圆曲线上所有点的个数m与n相除的整数部分) 303 | 304 | 这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件: 305 | 306 | 1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求; 307 | 2、p≠n×h; 308 | 3、pt≠1 (mod n),1≤t<20; 309 | 4、4a3+27b2≠0 (mod p); 310 | 5、n 为素数; 311 | 6、h≤4。 312 | 313 | 314 | 七、椭圆曲线在软件注册保护的应用 315 | 316 | 我们知道将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机。下面,将简介一种利用Fp(a,b)椭圆曲线进行软件注册的方法。 317 | 318 | 319 | 软件作者按如下方法制作注册机(也可称为签名过程) 320 | 321 | 1、选择一条椭圆曲线Ep(a,b),和基点G; 322 | 2、选择私有密钥k(k 323 | 3、产生一个随机整数r(r 324 | 4、将用户名和点R的坐标值x,y作为参数,计算SHA(Secure Hash Algorithm 安全散列算法,类似于MD5)值,即Hash=SHA(username,x,y); 325 | 5、计算sn≡r - Hash * k (mod n) 326 | 6、将sn和Hash作为 用户名username的序列号 327 | 328 | 软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K) 329 | 330 | 1、从用户输入的序列号中,提取sn以及Hash; 331 | 2、计算点R≡sn*G+Hash*K ( mod p ),如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y)的坐标,因为 332 | sn≡r-Hash*k (mod n) 333 | 所以 334 | sn*G + Hash*K 335 | =(r-Hash*k)*G+Hash*K 336 | =rG-Hash*kG+Hash*K 337 | =rG- Hash*K+ Hash*K 338 | =rG=R ; 339 | 3、将用户名和点R的坐标值x,y作为参数,计算H=SHA(username,x,y); 340 | 4、如果H=Hash 则注册成功。如果H≠Hash ,则注册失败(为什么?提示注意点R与Hash的关联性)。 341 | 342 | 简单对比一下两个过程: 343 | 作者签名用到了:椭圆曲线Ep(a,b),基点G,私有密钥k,及随机数r。 344 | 软件验证用到了:椭圆曲线Ep(a,b),基点G,公开密钥K。 345 | Cracker要想制作注册机,只能通过软件中的Ep(a,b),点G,公开密钥K ,并利用K=kG这个关系获得k后,才可以。而求k是很困难的。 346 | 347 | 348 | 练习: 349 | 下面也是一种常于软件保护的注册算法,请认真阅读,并试回答签名过程与验证过程都用到了那些参数,Cracker想制作注册机,应该如何做。 350 | 351 | 软件作者按如下方法制作注册机(也可称为签名过程) 352 | 1、选择一条椭圆曲线Ep(a,b),和基点G; 353 | 2、选择私有密钥k(k 354 | 3、产生一个随机整数r(r 355 | 4、将用户名作为参数,计算Hash=SHA(username); 356 | 5、计算 x’=x (mod n) 357 | 6、计算sn≡(Hash+x’*k)/r (mod n) 358 | 7、将sn和x’作为 用户名username的序列号 359 | 360 | 软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K) 361 | 1、从用户输入的序列号中,提取sn以及x’; 362 | 2、将用户名作为参数,计算Hash=SHA(username); 363 | 3、计算 R=(Hash*G+x’*K)/sn,如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y),因为 364 | sn≡(Hash+x’*k)/r (mod n) 365 | 所以 366 | (Hash*G+x’*K)/sn 367 | =(Hash*G+x’*K)/[(Hash+x’*k)/r] 368 | =(Hash*G+x’*K)/[(Hash*G+x’*k*G)/(rG)] 369 | =rG*[(Hash*G+x’*K)/(Hash*G+x’*K)] 370 | =rG=R (mod p) 371 | 4、v≡x (mod n) 372 | 5、如果v=x’ 则注册成功。如果v≠x’ ,则注册失败。 373 | 374 | 375 | 八、结语 376 | 377 | 历经半个多月断断续续的写作,这篇拙作终于算告一段落了。为写这篇文章,我查了大量的资料,但为了使文章更通俗易懂,我尽量避免涉及专业术语,F2n 域上的椭圆曲线本文也没有涉及。不过,一些名词描述的可能还不太精确,希望众读者对文章的问题,多多批评指正。我也仅仅把这篇文章作为初稿,我会不断修订他的。最后感谢看雪、Sunbird、CCG以及看雪论坛所有成员对我的支持,感谢一切帮助过我的人,没有你们的鼓励,这篇文章我是没有动力写完的,谢谢,谢谢大家! 378 | 379 | 380 | 2003-5- 3 初稿,于看雪论坛 381 | 2004-7-11二稿,修正一张图片 382 | 383 | <全文完> 384 | 385 | 386 | 主要参考文献 387 | 388 | 张禾瑞,《近世代数基础》,高等教育出版社,1978 389 | 闵嗣鹤 严士健,《初等数论》,高等教育出版社,1982 390 | 段云所,《网络信息安全》第三讲,北大计算机系 391 | Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998 392 | 《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000 393 | 《IEEE P1363a / D9》,2001 -------------------------------------------------------------------------------- /extra/README.java: -------------------------------------------------------------------------------- 1 | 一些密码算法类,用于以后在Android端实现 -------------------------------------------------------------------------------- /extra/jce-jdk13-153.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/extra/jce-jdk13-153.jar -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | ### 1. 使用jcsdk自带工具 2 | 在本目录打开命令行,依次运行: 3 | complie.bat(设置环境变量,用javac编译.class); 4 | converter -config converter.cfg(将.class转换成.cap, .jca); 5 | scriptgen com\esec\u2ftoken\javacard\u2ftoken.cap -o default.scr(将.cap转换成APDU指令流) 6 | 照着default-success-create.scr添加首尾的命令流到default.scr 7 | 设置环境变量后,在另一个cmd打开cref -z,模拟器 8 | apdutool default.scr 9 | 10 | ### 2. 使用javacard模拟器jcardsim 11 | 12 | 在本目录打开命令行,依次运行: 13 | complie-jcardsim-3.0.4(其实就是javac编译,注意这里是用的javacard3.0.4,要使用2.2.2请修改里面的classpath) 14 | 执行 java -cp jcardsim-3.0.4-SNAPSHOT.jar;. com.licel.jcardsim.utils.APDUScriptTool jcardsim.cfg apdu.script 15 | 16 | ### 3. ECDSA 17 | 卡上的公钥pubKey.getW():[每次都不一样] (65byte) 18 | 19 | >04, 00, b9, 8f, cf, c3, c0, ae, 95, 6a, 5b, 12, 6d, be, 43, e4, 7f, 09, 0d, de, 02, d2, 6b, 28, 86, ed, 2b, d7, e2, c2, 69, c1, 89, b2, 53, 96, c1, 2d, bf, 4c, 30, ae, d5, d5, 3c, b5, f9, 3b, 20, 37, 83, 88, 9f, 34, 74, f5, 6c, 97, 1e, 0a, a9, e7, fa, a6, 69 20 | >{0x04, 0x00, (byte)0xb9, (byte)0x8f, (byte)0xcf, (byte)0xc3, (byte)0xc0, (byte)0xae, (byte)0x95, 0x6a, 0x5b, 0x12, 0x6d, (byte)0xbe, 0x43, (byte)0xe4, 0x7f, 0x09, 0x0d, (byte)0xde, 0x02, (byte)0xd2, 0x6b, 0x28, (byte)0x86, (byte)0xed, 0x2b, (byte)0xd7, (byte)0xe2, (byte)0xc2, 0x69, (byte)0xc1, (byte)0x89, (byte)0xb2, 0x53, (byte)0x96, (byte)0xc1, 0x2d, (byte)0xbf, 0x4c, 0x30, (byte)0xae, (byte)0xd5, (byte)0xd5, 0x3c, (byte)0xb5, (byte)0xf9, 0x3b, 0x20, 0x37, (byte)0x83, (byte)0x88, (byte)0x9f, 0x34, 0x74, (byte)0xf5, 0x6c, (byte)0x97, 0x1e, 0x0a, (byte)0xa9, (byte)0xe7, (byte)0xfa, (byte)0xa6, 0x69} 21 | 22 | 卡上的私钥privKey.getS():(32byte) 23 | >25, c9, ec, dc, 4c, 59, a3, e0, 4f, 01, 56, 97, f3, cb, 60, 5b, 84, 49, 45, 3a, e2, 0e, d1, bd, c0, a7, e1, fa, 82, ee, 3c, 73 24 | >{(byte)0x25, (byte)0xc9, (byte)0xec, (byte)0xdc, (byte)0x4c, (byte)0x59, (byte)0xa3, (byte)0xe0, (byte)0x4f, (byte)0x01, (byte)0x56, (byte)0x97, (byte)0xf3, (byte)0xcb, (byte)0x60, (byte)0x5b, (byte)0x84, (byte)0x49, (byte)0x45, (byte)0x3a, (byte)0xe2, (byte)0x0e, (byte)0xd1, (byte)0xbd, (byte)0xc0, (byte)0xa7, (byte)0xe1, (byte)0xfa, (byte)0x82, (byte)0xee, (byte)0x3c, (byte)0x73} -------------------------------------------------------------------------------- /src/apdu.script: -------------------------------------------------------------------------------- 1 | // Create U2FToken 2 | 0x80 0xb8 0x00 0x00 0x0a 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x00 0x7F; 3 | 4 | // CREATE APPLET CMD 5 | // 0x80 0xb8 0x00 0x00 0x10 0x9 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x8 0x09 0x05 0x00 0x00 0x02 0xF 0xF 0x7f; 6 | 7 | // Select U2FToken 8 | 0x00 0xa4 0x04 0x00 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x7F; 9 | 10 | // send 0010000000 11 | 0x00 0x10 0x00 0x00 0x00 0x7f; 12 | 13 | // send register 14 | // 0x00 0x01 0x00 0x00 0x00 0x7f; 15 | // 0x00 0x01 0x00 0x00 0x00 0x7f; 16 | 17 | // see pubkey 18 | // 0x00 0x30 0x00 0x00 0x00 0x7f; 19 | 20 | // see sign data 21 | // 0x00 0x40 0x00 0x00 0x00 0x7f; 22 | // 0x00 0x40 0x00 0x00 0x00 0x7f; 23 | // 0x00 0x40 0x00 0x00 0x03 0x11 0x12 0x13 0x7f; -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/IndexKeyHandle.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/IndexKeyHandle.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/KeyHandleGenerator.java: -------------------------------------------------------------------------------- 1 | package com.esec.u2ftoken; 2 | 3 | import javacard.security.ECPrivateKey; 4 | import javacard.security.PrivateKey; 5 | 6 | /** 7 | * Generate a key handle. 8 | * @author Yang Zhou 9 | */ 10 | public interface KeyHandleGenerator { 11 | 12 | public byte[] generateKeyHandle(byte[] applicationSha256, ECPrivateKey privateKey); 13 | public ECPrivateKey verifyKeyHandle(byte[] keyHandle, byte[] applicationSha256); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/RawMessageCodec.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/RawMessageCodec.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/SecP256r1.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/SecP256r1.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/SecretKeyDataBase.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/SecretKeyDataBase.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/SecretKeys.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/SecretKeys.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/SharedMemory.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/SharedMemory.java -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/U2FToken.java: -------------------------------------------------------------------------------- 1 | package com.esec.u2ftoken; 2 | 3 | import javacard.framework.APDU; 4 | import javacard.framework.Applet; 5 | import javacard.framework.AppletEvent; 6 | import javacard.framework.CardException; 7 | import javacard.framework.ISO7816; 8 | import javacard.framework.ISOException; 9 | import javacard.framework.JCSystem; 10 | import javacard.framework.Util; 11 | import javacard.security.AESKey; 12 | import javacard.security.CryptoException; 13 | import javacard.security.ECKey; 14 | import javacard.security.ECPrivateKey; 15 | import javacard.security.ECPublicKey; 16 | import javacard.security.KeyBuilder; 17 | import javacard.security.KeyPair; 18 | import javacard.security.PrivateKey; 19 | import javacard.security.Signature; 20 | import javacardx.crypto.Cipher; 21 | import javacardx.apdu.ExtendedLength; 22 | 23 | public class U2FToken extends Applet implements ExtendedLength { 24 | 25 | private static final byte RFU_ENROLL_SIGNED_VERSION[] = { (byte)0x00 }; 26 | 27 | private static ECPrivateKey attestationPrivateKey; 28 | private static boolean attestationCertificateSet; 29 | private static boolean attestationPrivateKeySet; 30 | 31 | /** 32 | * 0x07. Only check the key handle's validation. 33 | */ 34 | private static final byte P1_CONTROL_CHECK_ONLY = 0x07; 35 | 36 | /** 37 | * 0x03. Check the key handle's validation and sign. Generate the authentication response. 38 | */ 39 | private static final byte P1_CONTROL_SIGN = 0x03; 40 | 41 | /** 42 | * 64 bytes, contains 32 bytes application sha256 and 32 bytes challenge sha256(this is a hash of Client Data) 43 | */ 44 | private static final short LEN_REGISTRATION_REQUEST_MESSAGE = 64; 45 | 46 | /** 47 | * 32 bytes, this is the hash of appid 48 | */ 49 | private static final short LEN_APPLICATIONSHA256 = 32; 50 | 51 | /** 52 | * 32 bytes, this is the hash of Client Data 53 | */ 54 | private static final short LEN_CHALLENGESHA256 = 32; 55 | 56 | /** 57 | * 0x00 58 | */ 59 | private static final byte CLA_U2F = 0x00; 60 | 61 | /** 62 | * 0xf0 63 | */ 64 | private static final byte CLA_PROPRIETARY = (byte)0xF0; 65 | 66 | /** 67 | * 0xc0 68 | */ 69 | private static final byte INS_ISO_GET_DATA = (byte)0xC0; 70 | 71 | /** 72 | * 0x01. Set the attestation certificate. 73 | */ 74 | private static final byte INS_SET_ATTESTATION_CERT = 0x01; 75 | 76 | /** 77 | * 0x02. Set the attestation private key. 78 | */ 79 | private static final byte INS_SET_ATTESTATION_PRIVATE_KEY = 0x02; 80 | 81 | private static final byte INS_U2F_REGISTER = 0x01; // Registration command 82 | private static final byte INS_U2F_AUTHENTICATE = 0x02; // Authenticate/sign command 83 | private static final byte INS_U2F_VERSION = 0x03; //Read version string command 84 | private static final byte INS_U2F_CHECK_REGISTER = 0x04; // Registration command that incorporates checking key handles 85 | private static final byte INS_U2F_AUTHENTICATE_BATCH = 0x05; // Authenticate/sign command for a batch of key handles 86 | 87 | public static final short U2F_SW_TEST_OF_PRESENCE_REQUIRED = ISO7816.SW_CONDITIONS_NOT_SATISFIED; 88 | public static final short U2F_SW_INVALID_KEY_HANDLE = ISO7816.SW_WRONG_DATA; 89 | 90 | private static final byte[] VERSION = {'U', '2', 'F', '_', 'V', '2'}; 91 | 92 | private static byte[] ATTESTATION_CERTIFICATE; 93 | 94 | private static Signature attestationSignature; 95 | private static Signature authenticateSignature; 96 | 97 | private static byte[] registerResponse; 98 | 99 | private KeyHandleGenerator mKeyHandleGenerator; 100 | 101 | private static byte[] counter; 102 | 103 | private static boolean counterOverflowed; 104 | 105 | private static short registerResponseRemaining; 106 | 107 | public U2FToken() { 108 | counter = new byte[4]; 109 | 110 | mKeyHandleGenerator = new IndexKeyHandle(); 111 | 112 | attestationSignature = Signature.getInstance(Signature.ALG_ECDSA_SHA_256, false); 113 | authenticateSignature = Signature.getInstance(Signature.ALG_ECDSA_SHA_256, false); 114 | SecP256r1.keyPair = new KeyPair(KeyPair.ALG_EC_FP, (short) 256); 115 | SecP256r1.setCurveParameters((ECKey)SecP256r1.keyPair.getPrivate()); 116 | SecP256r1.setCurveParameters((ECKey)SecP256r1.keyPair.getPublic()); 117 | // We safely assume that register response is no more than 1024 bytes. 118 | registerResponse = new byte[1024]; 119 | } 120 | public static void install(byte[] bArray, short bOffset, byte bLength) { 121 | // GP-compliant JavaCard applet registration 122 | new U2FToken().register(); 123 | } 124 | 125 | public void process(APDU apdu) { 126 | // Good practice: Return 9000 on SELECT 127 | if (selectingApplet()) { 128 | getSelectResponse(apdu); 129 | return; 130 | } 131 | 132 | // Get APDU header 133 | byte[] buf = apdu.getBuffer(); 134 | byte cla = buf[ISO7816.OFFSET_CLA]; 135 | byte p1 = buf[ISO7816.OFFSET_P1]; 136 | byte p2 = buf[ISO7816.OFFSET_P2]; 137 | short lc = (short)(buf[ISO7816.OFFSET_LC] & 0x00FF); 138 | 139 | if (cla == CLA_PROPRIETARY) { 140 | if (attestationCertificateSet && attestationPrivateKeySet) { 141 | ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); 142 | } 143 | switch (buf[ISO7816.OFFSET_INS]) { 144 | case INS_SET_ATTESTATION_CERT: 145 | setAttestationCert(apdu, cla, p1, p2, lc); 146 | break; 147 | case INS_SET_ATTESTATION_PRIVATE_KEY: 148 | setAttestationPrivateKey(apdu, cla, p1, p2, lc); 149 | break; 150 | default: 151 | ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 152 | } 153 | } else if (cla == CLA_U2F) { 154 | if (!attestationCertificateSet || !attestationPrivateKeySet) { 155 | ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); 156 | } 157 | switch (buf[ISO7816.OFFSET_INS]) { 158 | case (byte) INS_U2F_REGISTER: // U2F register command 159 | u2fRegister(apdu, cla, p1, p2, lc); 160 | break; 161 | 162 | case (byte) INS_U2F_AUTHENTICATE: // U2F authenticate command 163 | u2fAuthenticate(apdu, cla, p1, p2, lc); 164 | break; 165 | 166 | case (byte) INS_ISO_GET_DATA: 167 | getData(apdu, cla, p1, p2, lc); 168 | break; 169 | 170 | default: 171 | // good practice: If you don't know the INStruction, say so: 172 | ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 173 | } 174 | } else { 175 | ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); 176 | } 177 | } 178 | 179 | /** 180 | * When select this Applet, return version: "U2F_V2". 181 | * @param apdu 182 | */ 183 | private void getSelectResponse(APDU apdu) { 184 | byte[] buffer = apdu.getBuffer(); 185 | Util.arrayCopyNonAtomic(VERSION, (short)0, buffer, (short)0, (short)VERSION.length); 186 | apdu.setOutgoingAndSend((short)0, (short)VERSION.length); 187 | } 188 | 189 | private void setAttestationCert(APDU apdu, byte cla, byte p1, byte p2, short lc) { 190 | short len = apdu.setIncomingAndReceive(); 191 | byte[] buffer = apdu.getBuffer(); 192 | ATTESTATION_CERTIFICATE = new byte[len]; 193 | short offset = Util.arrayCopy(buffer, ISO7816.OFFSET_EXT_CDATA, ATTESTATION_CERTIFICATE, (short) 0, len); 194 | attestationCertificateSet = true; 195 | } 196 | 197 | private void setAttestationPrivateKey(APDU apdu, byte cla, byte p1, byte p2, short lc) { 198 | short len = apdu.setIncomingAndReceive(); 199 | byte[] buffer = apdu.getBuffer(); 200 | attestationPrivateKey = (ECPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PRIVATE, KeyBuilder.LENGTH_EC_FP_256, false); 201 | SecP256r1.setCurveParameters(attestationPrivateKey); 202 | attestationPrivateKey.setS(buffer, ISO7816.OFFSET_CDATA, len); 203 | attestationSignature.init(attestationPrivateKey, Signature.MODE_SIGN); 204 | attestationPrivateKeySet = true; 205 | } 206 | 207 | /** 208 | * Pull registration request message. Generate registration response message. 209 | * @param apdu 210 | * @param cla 0x00 211 | * @param p1 212 | * @param p2 213 | * @param lc 214 | */ 215 | private void u2fRegister(APDU apdu, byte cla, byte p1, byte p2, short lc) { 216 | short readCount = apdu.setIncomingAndReceive(); 217 | short dataOffset = apdu.getOffsetCdata(); 218 | boolean extendedLength = (dataOffset != ISO7816.OFFSET_CDATA); 219 | if (readCount != LEN_REGISTRATION_REQUEST_MESSAGE) { 220 | ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 221 | } 222 | 223 | byte[] buffer = apdu.getBuffer(); 224 | SharedMemory sharedMemory = SharedMemory.getInstance(); 225 | 226 | byte[] challengeSha256 = sharedMemory.m32BytesChallengeSha256; 227 | Util.arrayCopyNonAtomic(buffer, dataOffset, challengeSha256, (short) 0, LEN_CHALLENGESHA256); 228 | 229 | byte[] applicationSha256 = sharedMemory.m32BytesApplicationSha256; 230 | Util.arrayCopyNonAtomic(buffer, (short)(dataOffset + LEN_CHALLENGESHA256), 231 | applicationSha256, (short) 0, LEN_APPLICATIONSHA256); 232 | 233 | // Generate user authentication key 234 | SecP256r1.keyPair.genKeyPair(); 235 | ECPrivateKey privKey = (ECPrivateKey)SecP256r1.keyPair.getPrivate(); 236 | ECPublicKey pubKey = (ECPublicKey)SecP256r1.keyPair.getPublic(); 237 | 238 | // Store user's private key locally. Generate Key Handle. 239 | byte[] keyHandle = mKeyHandleGenerator.generateKeyHandle(applicationSha256, privKey); 240 | 241 | byte[] userPublicKey = sharedMemory.m65BytesUserPublicKey; 242 | pubKey.getW(userPublicKey, (short) 0); 243 | 244 | byte[] signatureMessage = sharedMemory.m80BytesSignature; 245 | attestationSignature.update(RFU_ENROLL_SIGNED_VERSION, (short)0, (short)1); 246 | attestationSignature.update(applicationSha256, (short)0, (short)32); 247 | attestationSignature.update(challengeSha256, (short)0, (short)32); 248 | attestationSignature.update(keyHandle, (short)0, (short)keyHandle.length); 249 | attestationSignature.update(userPublicKey, (short)0, (short)65); 250 | short signLen = attestationSignature.sign(buffer, (short)0, (short)0, signatureMessage, (short) 2); 251 | // Because every time do the signature has a different length, so signatureMessage's first 2 bytes indicate the length. 252 | Util.setShort(signatureMessage, (short) 0, signLen); 253 | 254 | // Generate register response 255 | if (extendedLength) { 256 | short sendLen = RawMessageCodec.encodeRegisterResponse(userPublicKey, keyHandle, ATTESTATION_CERTIFICATE, signatureMessage, buffer, (short)0); 257 | apdu.setOutgoingAndSend((short)0, sendLen); 258 | } else { 259 | short blockSize = apdu.setOutgoing(); 260 | short registerResponseLen = RawMessageCodec.encodeRegisterResponse(userPublicKey, keyHandle, ATTESTATION_CERTIFICATE, signatureMessage, registerResponse, (short)2); 261 | registerResponseLen -= 2; 262 | // Set the register response's sent offset is now (blockSize+2), as sent blockSize bytes data and 2 header bytes(store the offset). 263 | Util.setShort(registerResponse, (short)0, (short)(blockSize + 2)); 264 | Util.arrayCopyNonAtomic(registerResponse, (short)2, buffer, (short) 0, blockSize); 265 | apdu.setOutgoingLength(blockSize); 266 | apdu.sendBytes((short)0, blockSize); 267 | 268 | registerResponseRemaining = (short)(registerResponseLen - blockSize); 269 | if (registerResponseRemaining > 256) { 270 | ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); 271 | } else if (registerResponseRemaining > 0) { 272 | ISOException.throwIt((short)(ISO7816.SW_BYTES_REMAINING_00 + registerResponseRemaining)); 273 | } 274 | } 275 | } 276 | 277 | private void getData(APDU apdu, byte cla, byte p1, byte p2, short lc) { 278 | byte[] buffer = apdu.getBuffer(); 279 | short length = lc; 280 | short blockSize = apdu.setOutgoing(); 281 | 282 | if (registerResponseRemaining > blockSize) { // there's still more than Le bytes to be read 283 | short sendOffset = Util.makeShort(registerResponse[0], registerResponse[1]); 284 | Util.arrayCopyNonAtomic(registerResponse, sendOffset, buffer, (short) 0, blockSize); 285 | sendOffset += blockSize; 286 | Util.setShort(registerResponse, (short)0, sendOffset); 287 | registerResponseRemaining -= blockSize; 288 | apdu.setOutgoingLength(blockSize); 289 | apdu.sendBytes((short)0, blockSize); 290 | short remainingLen = registerResponseRemaining > 256 ? ISO7816.SW_BYTES_REMAINING_00 : (short)(ISO7816.SW_BYTES_REMAINING_00 + registerResponseRemaining); 291 | ISOException.throwIt(remainingLen); 292 | 293 | } else if (registerResponseRemaining > 0) { 294 | short sendOffset = Util.makeShort(registerResponse[0], registerResponse[1]); 295 | Util.arrayCopyNonAtomic(registerResponse, sendOffset, buffer, (short) 0, registerResponseRemaining); 296 | apdu.setOutgoingLength(registerResponseRemaining); 297 | apdu.sendBytes((short)0, registerResponseRemaining); 298 | } 299 | } 300 | 301 | private void u2fAuthenticate(APDU apdu, byte cla, byte p1, byte p2, short lc) { 302 | if (counterOverflowed) { 303 | ISOException.throwIt(ISO7816.SW_FILE_FULL); 304 | } 305 | 306 | apdu.setIncomingAndReceive(); 307 | byte[] buffer = apdu.getBuffer(); 308 | short dataOffset = apdu.getOffsetCdata(); 309 | 310 | SharedMemory sharedMemory = SharedMemory.getInstance(); 311 | 312 | boolean sign = false; 313 | switch(p1) { 314 | case (byte) P1_CONTROL_CHECK_ONLY: 315 | break; 316 | case (byte) P1_CONTROL_SIGN: 317 | sign = true; 318 | break; 319 | default: 320 | ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2); 321 | } 322 | 323 | byte[] challengeSha256 = sharedMemory.m32BytesChallengeSha256; 324 | Util.arrayCopyNonAtomic(buffer, dataOffset, challengeSha256, (short) 0, LEN_CHALLENGESHA256); 325 | 326 | byte[] applicationSha256 = sharedMemory.m32BytesApplicationSha256; 327 | Util.arrayCopyNonAtomic(buffer, (short)(dataOffset + LEN_CHALLENGESHA256), 328 | applicationSha256, (short) 0, LEN_APPLICATIONSHA256); 329 | 330 | // Verify Key Handle 331 | short keyHandleLen = (short) (buffer[(short)(dataOffset + 64)] & 0x00ff); 332 | byte[] keyHandle = JCSystem.makeTransientByteArray(keyHandleLen, JCSystem.CLEAR_ON_DESELECT); 333 | Util.arrayCopyNonAtomic(buffer, (short) (dataOffset + 64 + 1), keyHandle, (short) 0, keyHandleLen); 334 | ECPrivateKey privKey = mKeyHandleGenerator.verifyKeyHandle(keyHandle, applicationSha256); 335 | if (privKey == null) { 336 | ISOException.throwIt(U2F_SW_INVALID_KEY_HANDLE); 337 | } 338 | if (!sign) { 339 | ISOException.throwIt(U2F_SW_TEST_OF_PRESENCE_REQUIRED); 340 | } 341 | 342 | // Increase the counter 343 | boolean carry = false; 344 | JCSystem.beginTransaction(); 345 | for (byte i=0; i<4; i++) { 346 | short addValue = (i == 0 ? (short)1 : (short)0); 347 | short val = (short)((short)(counter[(short)(4 - 1 - i)] & 0xff) + addValue); 348 | if (carry) { 349 | val++; 350 | } 351 | carry = (val > 255); 352 | counter[(short)(4 - 1 - i)] = (byte)val; 353 | } 354 | JCSystem.commitTransaction(); 355 | if (carry) { 356 | // Game over 357 | counterOverflowed = true; 358 | ISOException.throwIt(ISO7816.SW_FILE_FULL); 359 | } 360 | 361 | // Authentication response 362 | byte userPresence = 0x01; 363 | byte[] signedData = RawMessageCodec.encodeAuthenticationSignedBytes( 364 | applicationSha256, 365 | userPresence, 366 | counter, 367 | challengeSha256); 368 | short outOffset = 0; 369 | buffer[outOffset++] = userPresence; 370 | outOffset = Util.arrayCopyNonAtomic(counter, (short) 0, buffer, outOffset, (short) 4); 371 | authenticateSignature.init(privKey, Signature.MODE_SIGN); 372 | outOffset += authenticateSignature.sign(signedData, (short) 0, (short) 69, buffer, outOffset); 373 | apdu.setOutgoingAndSend((short) 0, outOffset); 374 | } 375 | } 376 | -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/javacard/u2ftoken.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/com/esec/u2ftoken/javacard/u2ftoken.cap -------------------------------------------------------------------------------- /src/com/esec/u2ftoken/javacard/u2ftoken.jca: -------------------------------------------------------------------------------- 1 | // converted by version 1.3 2 | // on Sun Dec 20 13:12:40 CST 2015 3 | 4 | .package com/esec/u2ftoken { 5 | .aid 0xA0:0x0:0x0:0x6:0x47:0x2F:0x0; 6 | .version 1.0; 7 | 8 | .imports { 9 | 0xA0:0x0:0x0:0x0:0x62:0x0:0x1 1.0; //java/lang 10 | 0xA0:0x0:0x0:0x0:0x62:0x1:0x2 1.3; //javacard/security 11 | 0xA0:0x0:0x0:0x0:0x62:0x1:0x1 1.3; //javacard/framework 12 | 0xA0:0x0:0x0:0x0:0x62:0x2:0x1 1.3; //javacardx/crypto 13 | } 14 | 15 | .applet { 16 | 0xA0:0x0:0x0:0x6:0x47:0x2F:0x0:0x1 U2FToken; 17 | } 18 | 19 | .constantPool { 20 | // 0 21 | instanceFieldRef byte BaseFile/mFID; 22 | // 1 23 | instanceFieldRef byte BaseFile/mSFI; 24 | // 2 25 | instanceFieldRef byte[] BinaryEF/mFileContent; 26 | // 3 27 | instanceFieldRef byte SecretKey/mKeyType; 28 | // 4 29 | instanceFieldRef 1.10 SecretKey/mDESKeyInstance; 30 | // 5 31 | instanceFieldRef 1.20 SecretKey/mAESKeyInstance; 32 | // 6 33 | instanceFieldRef 1.20 SecretKeys/mAESKeyInstance; 34 | // 7 35 | instanceFieldRef BinaryEF U2FToken/attestationCertFile; 36 | // 8 37 | instanceFieldRef SecretKeys U2FToken/mSecretKey; 38 | // 9 39 | instanceFieldRef 1.20 U2FToken/mAESKeyInstance; 40 | // 10 41 | virtualMethodRef 1.16.2()Ljavacard/security/PrivateKey;; // getPrivate()Ljavacard/security/PrivateKey; 42 | .descriptor Ljavacard/security/PrivateKey; 1.2; 43 | 44 | // 11 45 | classRef 1.18; // javacard/security/ECPrivateKey 46 | // 12 47 | virtualMethodRef 1.16.3()Ljavacard/security/PublicKey;; // getPublic()Ljavacard/security/PublicKey; 48 | .descriptor Ljavacard/security/PublicKey; 1.3; 49 | 50 | // 13 51 | classRef 1.19; // javacard/security/ECPublicKey 52 | // 14 53 | staticFieldRef byte[] SecP256r1/p; 54 | // 15 55 | staticFieldRef byte[] SecP256r1/a; 56 | // 16 57 | staticFieldRef byte[] SecP256r1/b; 58 | // 17 59 | staticFieldRef byte[] SecP256r1/G; 60 | // 18 61 | staticFieldRef byte[] SecP256r1/r; 62 | // 19 63 | staticFieldRef SecretKey SecretKey/mAESSecretKey; 64 | // 20 65 | classRef SecretKey; 66 | // 21 67 | staticMethodRef SecretKey/(B)V; 68 | // 22 69 | staticFieldRef SecretKey SecretKey/mDESSecretKey; 70 | // 23 71 | staticMethodRef BaseFile/()V; 72 | // 24 73 | staticMethodRef 0.0.0()V; // java/lang/Object.()V 74 | // 25 75 | classRef 1.12; // javacard/security/CryptoException 76 | // 26 77 | staticMethodRef 1.13.0(BSZ)Ljavacard/security/Key;; // javacard/security/KeyBuilder.buildKey(BSZ)Ljavacard/security/Key; 78 | .descriptor Ljavacard/security/Key; 1.0; 79 | 80 | // 27 81 | classRef 1.10; // javacard/security/DESKey 82 | // 28 83 | staticMethodRef 2.8.13(SB)[B; // javacard/framework/JCSystem.makeTransientByteArray(SB)[B 84 | // 29 85 | staticMethodRef 2.16.3([BSSB)S; // javacard/framework/Util.arrayFillNonAtomic([BSSB)S 86 | // 30 87 | classRef 1.20; // javacard/security/AESKey 88 | // 31 89 | classRef 0.2; // java/lang/Exception 90 | // 32 91 | staticMethodRef 3.1.0(BZ)Ljavacardx/crypto/Cipher;; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 92 | .descriptor Ljavacardx/crypto/Cipher; 3.1; 93 | 94 | // 33 95 | virtualMethodRef 3.1.3(Ljavacard/security/Key;B)V; // init(Ljavacard/security/Key;B)V 96 | .descriptor Ljavacard/security/Key; 1.0; 97 | 98 | // 34 99 | virtualMethodRef 3.1.1([BSS[BS)S; // doFinal([BSS[BS)S 100 | // 35 101 | classRef 1.16; // javacard/security/KeyPair 102 | // 36 103 | staticMethodRef 2.8.9()S; // javacard/framework/JCSystem.getVersion()S 104 | // 37 105 | staticMethodRef 2.3.0()V; // javacard/framework/Applet.()V 106 | // 38 107 | classRef BinaryEF; 108 | // 39 109 | staticMethodRef BinaryEF/(BB)V; 110 | // 40 111 | staticMethodRef 1.16.0(BS)V; // javacard/security/KeyPair.(BS)V 112 | // 41 113 | staticFieldRef byte[] U2FToken/attestationCert; 114 | // 42 115 | virtualMethodRef BinaryEF/setFileContent([B)V; 116 | // 43 117 | classRef U2FToken; 118 | // 44 119 | staticMethodRef U2FToken/()V; 120 | // 45 121 | virtualMethodRef 2.3.1()V; // register()V 122 | // 46 123 | virtualMethodRef 2.3.3()Z; // selectingApplet()Z 124 | // 47 125 | staticMethodRef U2FToken/getSelectResponse(Ljavacard/framework/APDU;)V; 126 | .descriptor Ljavacard/framework/APDU; 2.10; 127 | 128 | // 48 129 | virtualMethodRef 2.10.1()[B; // getBuffer()[B 130 | // 49 131 | virtualMethodRef U2FToken/AESencrypt(Ljavacard/framework/APDU;BBBS)V; 132 | .descriptor Ljavacard/framework/APDU; 2.10; 133 | 134 | // 50 135 | staticMethodRef U2FToken/u2fregister(Ljavacard/framework/APDU;BBBS)V; 136 | .descriptor Ljavacard/framework/APDU; 2.10; 137 | 138 | // 51 139 | staticFieldRef byte[] U2FToken/version; 140 | // 52 141 | staticMethodRef 2.16.2([BS[BSS)S; // javacard/framework/Util.arrayCopyNonAtomic([BS[BSS)S 142 | // 53 143 | virtualMethodRef 2.10.8(SS)V; // setOutgoingAndSend(SS)V 144 | // 54 145 | staticMethodRef SecP256r1/newKeyPair()Ljavacard/security/KeyPair;; 146 | .descriptor Ljavacard/security/KeyPair; 1.16; 147 | 148 | // 55 149 | virtualMethodRef 1.16.1()V; // genKeyPair()V 150 | // 56 151 | classRef SecretKeys; 152 | // 57 153 | staticMethodRef SecretKeys/(B)V; 154 | // 58 155 | virtualMethodRef 1.12.1()S; // getReason()S 156 | // 59 157 | virtualMethodRef SecretKeys/keyWrap([BSS[BSB)V; 158 | // 60 159 | staticMethodRef 2.7.1(S)V; // javacard/framework/ISOException.throwIt(S)V 160 | } 161 | 162 | .class public BaseFile 0 extends 0.0 { // extends java/lang/Object 163 | 164 | .fields { 165 | public byte mFID 0; // B 166 | public byte mSFI 1; // B 167 | public static final byte FILE_TYPE_BINARY = 2; // B 168 | } 169 | 170 | .publicMethodTable 1 { 171 | equals(Ljava/lang/Object;)Z; 172 | } 173 | 174 | .packageMethodTable 0 { 175 | } 176 | 177 | .method public ()V 0 { 178 | .stack 1; 179 | .locals 0; 180 | 181 | L0: aload_0; 182 | invokespecial 24; // java/lang/Object.()V 183 | return; 184 | } 185 | 186 | } 187 | 188 | .class public BinaryEF 1 extends BaseFile { 189 | 190 | .fields { 191 | private byte[] mFileContent 0; // [B 192 | } 193 | 194 | .publicMethodTable 1 { 195 | equals(Ljava/lang/Object;)Z; 196 | createBinaryContent(S)V; 197 | setFileContent([B)V; 198 | getFileContent()[B; 199 | } 200 | 201 | .packageMethodTable 0 { 202 | } 203 | 204 | .method public (BB)V 0 { 205 | .stack 2; 206 | .locals 0; 207 | 208 | L0: aload_0; 209 | invokespecial 23; // com/esec/u2ftoken/BaseFile.()V 210 | aload_0; 211 | sload_1; 212 | putfield_b 0; // byte com/esec/u2ftoken/BaseFile.mFID 213 | aload_0; 214 | sload_2; 215 | putfield_b 1; // byte com/esec/u2ftoken/BaseFile.mSFI 216 | return; 217 | } 218 | 219 | .method public createBinaryContent(S)V 1 { 220 | .stack 2; 221 | .locals 0; 222 | 223 | L0: aload_0; 224 | sload_1; 225 | newarray 11; 226 | putfield_a 2; // reference com/esec/u2ftoken/BinaryEF.mFileContent 227 | return; 228 | } 229 | 230 | .method public setFileContent([B)V 2 { 231 | .stack 2; 232 | .locals 0; 233 | 234 | L0: aload_0; 235 | aload_1; 236 | putfield_a 2; // reference com/esec/u2ftoken/BinaryEF.mFileContent 237 | return; 238 | } 239 | 240 | .method public getFileContent()[B 3 { 241 | .stack 1; 242 | .locals 0; 243 | 244 | L0: getfield_a_this 2; // reference com/esec/u2ftoken/BinaryEF.mFileContent 245 | areturn; 246 | } 247 | 248 | } 249 | 250 | .class public SecP256r1 2 extends 0.0 { // extends java/lang/Object 251 | 252 | .fields { 253 | private static final byte[] p = {-1,-1,-1,-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; // [B 254 | private static final byte[] a = {-1,-1,-1,-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4}; // [B 255 | private static final byte[] b = {90,-58,53,-40,-86,58,-109,-25,-77,-21,-67,85,118,-104,-122,-68,101,29,6,-80,-52,83,-80,-10,59,-50,60,62,39,-46,96,75}; // [B 256 | private static final byte[] G = {4,107,23,-47,-14,-31,44,66,71,-8,-68,-26,-27,99,-92,64,-14,119,3,125,-127,45,-21,51,-96,-12,-95,57,69,-40,-104,-62,-106,79,-29,66,-30,-2,26,127,-101,-114,-25,-21,74,124,15,-98,22,43,-50,51,87,107,49,94,-50,-53,-74,64,104,55,-65,81,-11}; // [B 257 | private static final byte[] r = {-1,-1,-1,-1,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-68,-26,-6,-83,-89,23,-98,-124,-13,-71,-54,-62,-4,99,37,81}; // [B 258 | } 259 | 260 | .publicMethodTable 1 { 261 | equals(Ljava/lang/Object;)Z; 262 | } 263 | 264 | .packageMethodTable 0 { 265 | } 266 | 267 | .method public ()V 0 { 268 | .stack 1; 269 | .locals 0; 270 | 271 | L0: aload_0; 272 | invokespecial 24; // java/lang/Object.()V 273 | return; 274 | } 275 | 276 | .method public static newKeyPair()Ljavacard/security/KeyPair; 1 { 277 | .stack 4; 278 | .locals 3; 279 | 280 | .descriptor Ljavacard/security/KeyPair; 1.16; 281 | 282 | L0: aconst_null; 283 | astore_0; 284 | L1: new 35; // javacard/security/KeyPair 285 | dup; 286 | sconst_5; 287 | sspush 128; 288 | invokespecial 40; // javacard/security/KeyPair.(BS)V 289 | astore_0; 290 | L2: goto L4; 291 | L3: astore_1; 292 | aload_1; 293 | invokevirtual 58; // getReason()S 294 | sstore_2; 295 | sload_2; 296 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 297 | L4: aload_0; 298 | invokevirtual 10; // getPrivate()Ljavacard/security/PrivateKey; 299 | checkcast 0 11; // T_CLASSORINTERFACE javacard/security/ECPrivateKey 300 | astore_1; 301 | aload_0; 302 | invokevirtual 12; // getPublic()Ljavacard/security/PublicKey; 303 | checkcast 0 13; // T_CLASSORINTERFACE javacard/security/ECPublicKey 304 | astore_2; 305 | aload_1; 306 | getstatic_a 14; // reference com/esec/u2ftoken/SecP256r1.p 307 | sconst_0; 308 | sconst_0; 309 | invokeinterface 4 11 4; // javacard/security/ECPrivateKey 310 | aload_1; 311 | getstatic_a 15; // reference com/esec/u2ftoken/SecP256r1.a 312 | sconst_0; 313 | sconst_0; 314 | invokeinterface 4 11 7; // javacard/security/ECPrivateKey 315 | aload_1; 316 | getstatic_a 16; // reference com/esec/u2ftoken/SecP256r1.b 317 | sconst_0; 318 | sconst_0; 319 | invokeinterface 4 11 8; // javacard/security/ECPrivateKey 320 | aload_1; 321 | getstatic_a 17; // reference com/esec/u2ftoken/SecP256r1.G 322 | sconst_0; 323 | sconst_0; 324 | invokeinterface 4 11 9; // javacard/security/ECPrivateKey 325 | aload_1; 326 | getstatic_a 18; // reference com/esec/u2ftoken/SecP256r1.r 327 | sconst_0; 328 | sconst_0; 329 | invokeinterface 4 11 10; // javacard/security/ECPrivateKey 330 | aload_2; 331 | getstatic_a 14; // reference com/esec/u2ftoken/SecP256r1.p 332 | sconst_0; 333 | sconst_0; 334 | invokeinterface 4 13 4; // javacard/security/ECPublicKey 335 | aload_2; 336 | getstatic_a 15; // reference com/esec/u2ftoken/SecP256r1.a 337 | sconst_0; 338 | sconst_0; 339 | invokeinterface 4 13 7; // javacard/security/ECPublicKey 340 | aload_2; 341 | getstatic_a 16; // reference com/esec/u2ftoken/SecP256r1.b 342 | sconst_0; 343 | sconst_0; 344 | invokeinterface 4 13 8; // javacard/security/ECPublicKey 345 | aload_2; 346 | getstatic_a 17; // reference com/esec/u2ftoken/SecP256r1.G 347 | sconst_0; 348 | sconst_0; 349 | invokeinterface 4 13 9; // javacard/security/ECPublicKey 350 | aload_2; 351 | getstatic_a 18; // reference com/esec/u2ftoken/SecP256r1.r 352 | sconst_0; 353 | sconst_0; 354 | invokeinterface 4 13 10; // javacard/security/ECPublicKey 355 | aload_0; 356 | areturn; 357 | .exceptionTable { 358 | // start_block end_block handler_block catch_type_index 359 | L1 L2 L3 25; 360 | } 361 | } 362 | 363 | } 364 | 365 | .class public SecretKey 3 extends 0.0 { // extends java/lang/Object 366 | 367 | .fields { 368 | private 1.10 mDESKeyInstance 0; // Ljavacard/security/DESKey; 369 | private 1.20 mAESKeyInstance 1; // Ljavacard/security/AESKey; 370 | private byte mKeyType 2; // B 371 | public static final byte MODE_ENCRYPT = 1; // B 372 | public static final byte MODE_DECRYPT = 2; // B 373 | public static final byte KEY_TYPE_AES = 1; // B 374 | public static final byte KEY_TYPE_DES = 2; // B 375 | public static SecretKey mDESSecretKey 0; // Lcom/esec/u2ftoken/SecretKey; 376 | public static SecretKey mAESSecretKey 1; // Lcom/esec/u2ftoken/SecretKey; 377 | } 378 | 379 | .publicMethodTable 1 { 380 | equals(Ljava/lang/Object;)Z; 381 | keyWrap([BSS[BSB)V; 382 | } 383 | 384 | .packageMethodTable 0 { 385 | } 386 | 387 | .method public static getInstance(B)Lcom/esec/u2ftoken/SecretKey; 0 { 388 | .stack 3; 389 | .locals 0; 390 | 391 | L0: sload_0; 392 | sconst_1; 393 | if_scmpne L4; 394 | L1: getstatic_a 19; // reference com/esec/u2ftoken/SecretKey.mAESSecretKey 395 | ifnull L3; 396 | L2: getstatic_a 19; // reference com/esec/u2ftoken/SecretKey.mAESSecretKey 397 | areturn; 398 | L3: new 20; // com/esec/u2ftoken/SecretKey 399 | dup; 400 | sconst_1; 401 | invokespecial 21; // com/esec/u2ftoken/SecretKey.(B)V 402 | putstatic_a 19; // reference com/esec/u2ftoken/SecretKey.mAESSecretKey 403 | getstatic_a 19; // reference com/esec/u2ftoken/SecretKey.mAESSecretKey 404 | areturn; 405 | L4: sload_0; 406 | sconst_2; 407 | if_scmpne L8; 408 | L5: getstatic_a 22; // reference com/esec/u2ftoken/SecretKey.mDESSecretKey 409 | ifnull L7; 410 | L6: getstatic_a 22; // reference com/esec/u2ftoken/SecretKey.mDESSecretKey 411 | areturn; 412 | L7: new 20; // com/esec/u2ftoken/SecretKey 413 | dup; 414 | sconst_2; 415 | invokespecial 21; // com/esec/u2ftoken/SecretKey.(B)V 416 | putstatic_a 22; // reference com/esec/u2ftoken/SecretKey.mDESSecretKey 417 | getstatic_a 22; // reference com/esec/u2ftoken/SecretKey.mDESSecretKey 418 | areturn; 419 | L8: new 20; // com/esec/u2ftoken/SecretKey 420 | dup; 421 | sload_0; 422 | invokespecial 21; // com/esec/u2ftoken/SecretKey.(B)V 423 | areturn; 424 | } 425 | 426 | .method private (B)V { 427 | .stack 4; 428 | .locals 1; 429 | 430 | L0: aload_0; 431 | invokespecial 24; // java/lang/Object.()V 432 | aload_0; 433 | sconst_0; 434 | putfield_b 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 435 | aload_0; 436 | aconst_null; 437 | putfield_a 4; // reference com/esec/u2ftoken/SecretKey.mDESKeyInstance 438 | aload_0; 439 | aconst_null; 440 | putfield_a 5; // reference com/esec/u2ftoken/SecretKey.mAESKeyInstance 441 | aload_0; 442 | sload_1; 443 | putfield_b 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 444 | getfield_b_this 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 445 | sconst_2; 446 | if_scmpne L2; 447 | L1: aload_0; 448 | sconst_3; 449 | bspush 64; 450 | sconst_0; 451 | invokestatic 26; // javacard/security/KeyBuilder.buildKey(BSZ)Ljavacard/security/Key; 452 | checkcast 0 27; // T_CLASSORINTERFACE javacard/security/DESKey 453 | putfield_a 4; // reference com/esec/u2ftoken/SecretKey.mDESKeyInstance 454 | bspush 16; 455 | sconst_2; 456 | invokestatic 28; // javacard/framework/JCSystem.makeTransientByteArray(SB)[B 457 | astore_2; 458 | aload_2; 459 | sconst_0; 460 | aload_2; 461 | arraylength; 462 | sconst_0; 463 | invokestatic 29; // javacard/framework/Util.arrayFillNonAtomic([BSSB)S 464 | pop; 465 | getfield_a_this 4; // reference com/esec/u2ftoken/SecretKey.mDESKeyInstance 466 | aload_2; 467 | sconst_0; 468 | invokeinterface 3 27 5; // javacard/security/DESKey 469 | goto L5; 470 | L2: getfield_b_this 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 471 | sconst_1; 472 | if_scmpne L4; 473 | L3: aload_0; 474 | bspush 15; 475 | sspush 128; 476 | sconst_0; 477 | invokestatic 26; // javacard/security/KeyBuilder.buildKey(BSZ)Ljavacard/security/Key; 478 | checkcast 0 30; // T_CLASSORINTERFACE javacard/security/AESKey 479 | putfield_a 5; // reference com/esec/u2ftoken/SecretKey.mAESKeyInstance 480 | bspush 16; 481 | sconst_2; 482 | invokestatic 28; // javacard/framework/JCSystem.makeTransientByteArray(SB)[B 483 | astore_2; 484 | aload_2; 485 | sconst_0; 486 | aload_2; 487 | arraylength; 488 | sconst_0; 489 | invokestatic 29; // javacard/framework/Util.arrayFillNonAtomic([BSSB)S 490 | pop; 491 | getfield_a_this 5; // reference com/esec/u2ftoken/SecretKey.mAESKeyInstance 492 | aload_2; 493 | sconst_0; 494 | invokeinterface 3 30 4; // javacard/security/AESKey 495 | goto L5; 496 | L4: sspush 27264; 497 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 498 | L5: return; 499 | } 500 | 501 | .method public keyWrap([BSS[BSB)V 1 { 502 | .stack 6; 503 | .locals 3; 504 | 505 | L0: aconst_null; 506 | astore 7; 507 | getfield_b_this 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 508 | sconst_2; 509 | if_scmpne L2; 510 | L1: sconst_3; 511 | sconst_0; 512 | invokestatic 32; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 513 | astore 7; 514 | aload 7; 515 | getfield_a_this 4; // reference com/esec/u2ftoken/SecretKey.mDESKeyInstance 516 | sload 6; 517 | invokevirtual 33; // init(Ljavacard/security/Key;B)V 518 | goto L7; 519 | L2: getfield_b_this 3; // byte com/esec/u2ftoken/SecretKey.mKeyType 520 | sconst_1; 521 | if_scmpne L7; 522 | L3: bspush 14; 523 | sconst_0; 524 | invokestatic 32; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 525 | astore 7; 526 | L4: goto L6; 527 | L5: astore 8; 528 | aload 8; 529 | invokevirtual 58; // getReason()S 530 | sstore 9; 531 | sload 9; 532 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 533 | L6: aload 7; 534 | getfield_a_this 5; // reference com/esec/u2ftoken/SecretKey.mAESKeyInstance 535 | sload 6; 536 | invokevirtual 33; // init(Ljavacard/security/Key;B)V 537 | L7: aload 7; 538 | aload_1; 539 | sload_2; 540 | sload_3; 541 | aload 4; 542 | sload 5; 543 | invokevirtual 34; // doFinal([BSS[BS)S 544 | pop; 545 | L8: goto L10; 546 | L9: astore 8; 547 | sspush 27264; 548 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 549 | L10: return; 550 | .exceptionTable { 551 | // start_block end_block handler_block catch_type_index 552 | L3 L4 L5 25; 553 | L7 L8 L9 31; 554 | } 555 | } 556 | 557 | } 558 | 559 | .class public SecretKeys 4 extends 0.0 { // extends java/lang/Object 560 | 561 | .fields { 562 | private 1.20 mAESKeyInstance 0; // Ljavacard/security/AESKey; 563 | public static final byte MODE_ENCRYPT = 1; // B 564 | public static final byte MODE_DECRYPT = 2; // B 565 | public static final byte KEY_TYPE_AES = 1; // B 566 | public static final byte KEY_TYPE_DES = 2; // B 567 | } 568 | 569 | .publicMethodTable 1 { 570 | equals(Ljava/lang/Object;)Z; 571 | keyWrap([BSS[BSB)V; 572 | } 573 | 574 | .packageMethodTable 0 { 575 | } 576 | 577 | .method public (B)V 0 { 578 | .stack 4; 579 | .locals 2; 580 | 581 | L0: aload_0; 582 | invokespecial 24; // java/lang/Object.()V 583 | aload_0; 584 | aconst_null; 585 | putfield_a 6; // reference com/esec/u2ftoken/SecretKeys.mAESKeyInstance 586 | L1: aload_0; 587 | bspush 15; 588 | sspush 128; 589 | sconst_0; 590 | invokestatic 26; // javacard/security/KeyBuilder.buildKey(BSZ)Ljavacard/security/Key; 591 | checkcast 0 30; // T_CLASSORINTERFACE javacard/security/AESKey 592 | putfield_a 6; // reference com/esec/u2ftoken/SecretKeys.mAESKeyInstance 593 | L2: goto L4; 594 | L3: astore_2; 595 | aload_2; 596 | invokevirtual 58; // getReason()S 597 | sstore_3; 598 | sload_3; 599 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 600 | L4: bspush 16; 601 | sconst_2; 602 | invokestatic 28; // javacard/framework/JCSystem.makeTransientByteArray(SB)[B 603 | astore_2; 604 | aload_2; 605 | sconst_0; 606 | aload_2; 607 | arraylength; 608 | sconst_0; 609 | invokestatic 29; // javacard/framework/Util.arrayFillNonAtomic([BSSB)S 610 | pop; 611 | getfield_a_this 6; // reference com/esec/u2ftoken/SecretKeys.mAESKeyInstance 612 | aload_2; 613 | sconst_0; 614 | invokeinterface 3 30 4; // javacard/security/AESKey 615 | return; 616 | .exceptionTable { 617 | // start_block end_block handler_block catch_type_index 618 | L1 L2 L3 25; 619 | } 620 | } 621 | 622 | .method public keyWrap([BSS[BSB)V 1 { 623 | .stack 6; 624 | .locals 3; 625 | 626 | L0: aconst_null; 627 | astore 7; 628 | L1: bspush 14; 629 | sconst_0; 630 | invokestatic 32; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 631 | astore 7; 632 | L2: goto L4; 633 | L3: astore 8; 634 | invokestatic 36; // javacard/framework/JCSystem.getVersion()S 635 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 636 | aload 8; 637 | invokevirtual 58; // getReason()S 638 | sstore 9; 639 | sload 9; 640 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 641 | L4: aload 7; 642 | getfield_a_this 6; // reference com/esec/u2ftoken/SecretKeys.mAESKeyInstance 643 | sload 6; 644 | invokevirtual 33; // init(Ljavacard/security/Key;B)V 645 | L5: aload 7; 646 | aload_1; 647 | sload_2; 648 | sload_3; 649 | aload 4; 650 | sload 5; 651 | invokevirtual 34; // doFinal([BSS[BS)S 652 | pop; 653 | L6: goto L8; 654 | L7: astore 8; 655 | sspush 27264; 656 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 657 | L8: return; 658 | .exceptionTable { 659 | // start_block end_block handler_block catch_type_index 660 | L1 L2 L3 25; 661 | L5 L6 L7 31; 662 | } 663 | } 664 | 665 | } 666 | 667 | .class public U2FToken 5 extends 2.3 { // extends javacard/framework/Applet 668 | 669 | .fields { 670 | public BinaryEF attestationCertFile 0; // Lcom/esec/u2ftoken/BinaryEF; 671 | public SecretKeys mSecretKey 1; // Lcom/esec/u2ftoken/SecretKeys; 672 | private 1.20 mAESKeyInstance 2; // Ljavacard/security/AESKey; 673 | public static final byte CLA_7816 = 0; // B 674 | public static final byte INS_TEST_ENCRYPT = 16; // B 675 | public static final byte INS_TEST_DECRYPT = 32; // B 676 | public static final byte INS_U2F_REGISTER = 1; // B 677 | public static final byte INS_U2F_AUTHENTICATE = 2; // B 678 | public static final byte INS_U2F_VERSION = 3; // B 679 | public static final byte INS_U2F_CHECK_REGISTER = 4; // B 680 | public static final byte INS_U2F_AUTHENTICATE_BATCH = 5; // B 681 | private static final byte[] version = {85,50,70,95,86,50}; // [B 682 | private static final byte[] attestationCert = {48,-126,1,21,48,-127,-68,2,9,0,-59,-12,-18,76,89,80,62,5,48,10,6,8,42,-122,72,-50,61,4,3,2,48,19,49,17,48,15,6,3,85,4,3,19,8,89,97,110,103,90,104,111,117,48,30,23,13,49,53,49,50,48,57,48,55,48,52,53,56,90,23,13,49,54,49,50,48,56,48,55,48,52,53,56,90,48,19,49,17,48,15,6,3,85,4,3,19,8,89,97,110,103,90,104,111,117,48,89,48,19,6,7,42,-122,72,-50,61,2,1,6,8,42,-122,72,-50,61,3,1,7,3,66,0,4,114,-102,113,-48,-127,98,66,-124,-110,-14,-39,97,-110,77,55,68,58,79,27,-38,88,15,-118,-22,41,32,-46,-103,124,-66,-92,57,96,-50,114,-98,53,-63,-9,64,-110,-14,37,14,96,116,-126,63,-59,127,51,96,-73,-51,57,105,-61,-61,18,94,-50,38,92,41,48,10,6,8,42,-122,72,-50,61,4,3,2,3,72,0,48,69,2,33,0,-25,103,-6,-108,16,53,-43,-123,61,82,-40,125,103,20,112,-68,118,59,-59,-79,46,29,69,119,-22,-97,-116,-90,116,-27,-99,57,2,32,63,-31,28,-83,89,-11,53,118,0,31,21,-18,5,-38,-121,70,-2,-45,39,107,22,-126,-98,-99,94,-3,-1,112,94,8,-100,109}; // [B 683 | } 684 | 685 | .publicMethodTable 7 { 686 | equals(Ljava/lang/Object;)Z; 687 | register()V; 688 | register([BSB)V; 689 | selectingApplet()Z; 690 | deselect()V; 691 | getShareableInterfaceObject(Ljavacard/framework/AID;B)Ljavacard/framework/Shareable;; 692 | select()Z; 693 | process(Ljavacard/framework/APDU;)V; 694 | encrypt(Ljavacard/framework/APDU;BBBS)V; 695 | AESencrypt(Ljavacard/framework/APDU;BBBS)V; 696 | } 697 | 698 | .packageMethodTable 0 { 699 | } 700 | 701 | .method public ()V 0 { 702 | .stack 5; 703 | .locals 0; 704 | 705 | L0: aload_0; 706 | invokespecial 37; // javacard/framework/Applet.()V 707 | aload_0; 708 | new 38; // com/esec/u2ftoken/BinaryEF 709 | dup; 710 | bspush -17; 711 | sconst_1; 712 | invokespecial 39; // com/esec/u2ftoken/BinaryEF.(BB)V 713 | putfield_a 7; // reference com/esec/u2ftoken/U2FToken.attestationCertFile 714 | getfield_a_this 7; // reference com/esec/u2ftoken/U2FToken.attestationCertFile 715 | getstatic_a 41; // reference com/esec/u2ftoken/U2FToken.attestationCert 716 | invokevirtual 42; // setFileContent([B)V 717 | return; 718 | } 719 | 720 | .method public static install([BSB)V 1 { 721 | .stack 2; 722 | .locals 0; 723 | 724 | L0: new 43; // com/esec/u2ftoken/U2FToken 725 | dup; 726 | invokespecial 44; // com/esec/u2ftoken/U2FToken.()V 727 | invokevirtual 45; // register()V 728 | return; 729 | } 730 | 731 | .method public process(Ljavacard/framework/APDU;)V 7 { 732 | .stack 6; 733 | .locals 7; 734 | 735 | .descriptor Ljavacard/framework/APDU; 2.10; 736 | 737 | L0: aload_0; 738 | invokevirtual 46; // selectingApplet()Z 739 | ifeq L2; 740 | L1: aload_0; 741 | aload_1; 742 | invokespecial 47; // com/esec/u2ftoken/U2FToken.getSelectResponse(Ljavacard/framework/APDU;)V 743 | return; 744 | L2: aload_1; 745 | invokevirtual 48; // getBuffer()[B 746 | astore_2; 747 | aload_2; 748 | sconst_0; 749 | baload; 750 | sstore_3; 751 | aload_2; 752 | sconst_2; 753 | baload; 754 | sstore 4; 755 | aload_2; 756 | sconst_3; 757 | baload; 758 | sstore 5; 759 | aload_2; 760 | sconst_4; 761 | baload; 762 | sspush 255; 763 | sand; 764 | sstore 6; 765 | aload_2; 766 | sconst_1; 767 | baload; 768 | slookupswitch L9 3 1 L8 16 L3 32 L7; 769 | L3: bspush 13; 770 | sconst_0; 771 | invokestatic 32; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 772 | pop; 773 | L4: goto L6; 774 | L5: astore 7; 775 | invokestatic 36; // javacard/framework/JCSystem.getVersion()S 776 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 777 | aload 7; 778 | invokevirtual 58; // getReason()S 779 | sstore 8; 780 | sload 8; 781 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 782 | L6: aload_0; 783 | aload_1; 784 | sload_3; 785 | sload 4; 786 | sload 5; 787 | sload 6; 788 | invokevirtual 49; // AESencrypt(Ljavacard/framework/APDU;BBBS)V 789 | goto L10; 790 | L7: goto L10; 791 | L8: aload_0; 792 | aload_1; 793 | sload_3; 794 | sload 4; 795 | sload 5; 796 | sload 6; 797 | invokespecial 50; // com/esec/u2ftoken/U2FToken.u2fregister(Ljavacard/framework/APDU;BBBS)V 798 | goto L10; 799 | L9: sspush 27904; 800 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 801 | L10: return; 802 | .exceptionTable { 803 | // start_block end_block handler_block catch_type_index 804 | L3 L4 L5 25; 805 | } 806 | } 807 | 808 | .method private getSelectResponse(Ljavacard/framework/APDU;)V { 809 | .stack 5; 810 | .locals 1; 811 | 812 | .descriptor Ljavacard/framework/APDU; 2.10; 813 | 814 | L0: aload_1; 815 | invokevirtual 48; // getBuffer()[B 816 | astore_2; 817 | getstatic_a 51; // reference com/esec/u2ftoken/U2FToken.version 818 | sconst_0; 819 | aload_2; 820 | sconst_0; 821 | getstatic_a 51; // reference com/esec/u2ftoken/U2FToken.version 822 | arraylength; 823 | invokestatic 52; // javacard/framework/Util.arrayCopyNonAtomic([BS[BSS)S 824 | pop; 825 | aload_1; 826 | sconst_0; 827 | getstatic_a 51; // reference com/esec/u2ftoken/U2FToken.version 828 | arraylength; 829 | invokevirtual 53; // setOutgoingAndSend(SS)V 830 | return; 831 | } 832 | 833 | .method private u2fregister(Ljavacard/framework/APDU;BBBS)V { 834 | .stack 3; 835 | .locals 4; 836 | 837 | .descriptor Ljavacard/framework/APDU; 2.10; 838 | 839 | L0: aload_1; 840 | invokevirtual 48; // getBuffer()[B 841 | astore 6; 842 | sload_2; 843 | ifeq L2; 844 | L1: sspush 28160; 845 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 846 | L2: invokestatic 54; // com/esec/u2ftoken/SecP256r1.newKeyPair()Ljavacard/security/KeyPair; 847 | astore 7; 848 | aload 7; 849 | invokevirtual 55; // genKeyPair()V 850 | aload 7; 851 | invokevirtual 12; // getPublic()Ljavacard/security/PublicKey; 852 | checkcast 0 13; // T_CLASSORINTERFACE javacard/security/ECPublicKey 853 | astore 8; 854 | aload 7; 855 | invokevirtual 10; // getPrivate()Ljavacard/security/PrivateKey; 856 | checkcast 0 11; // T_CLASSORINTERFACE javacard/security/ECPrivateKey 857 | astore 9; 858 | aload 8; 859 | aload 6; 860 | sconst_0; 861 | invokeinterface 3 13 16; // javacard/security/ECPublicKey 862 | pop; 863 | aload_1; 864 | sconst_0; 865 | bspush 32; 866 | invokevirtual 53; // setOutgoingAndSend(SS)V 867 | return; 868 | } 869 | 870 | .method public encrypt(Ljavacard/framework/APDU;BBBS)V 8 { 871 | .stack 7; 872 | .locals 2; 873 | 874 | .descriptor Ljavacard/framework/APDU; 2.10; 875 | 876 | L0: aload_1; 877 | invokevirtual 48; // getBuffer()[B 878 | astore 6; 879 | aload_0; 880 | new 56; // com/esec/u2ftoken/SecretKeys 881 | dup; 882 | sconst_1; 883 | invokespecial 57; // com/esec/u2ftoken/SecretKeys.(B)V 884 | putfield_a 8; // reference com/esec/u2ftoken/U2FToken.mSecretKey 885 | bspush 16; 886 | newarray 11; 887 | dup; 888 | sconst_0; 889 | sconst_0; 890 | bastore; 891 | dup; 892 | sconst_1; 893 | sconst_1; 894 | bastore; 895 | dup; 896 | sconst_2; 897 | sconst_2; 898 | bastore; 899 | dup; 900 | sconst_3; 901 | sconst_3; 902 | bastore; 903 | dup; 904 | sconst_4; 905 | sconst_4; 906 | bastore; 907 | dup; 908 | sconst_5; 909 | sconst_5; 910 | bastore; 911 | dup; 912 | bspush 6; 913 | bspush 6; 914 | bastore; 915 | dup; 916 | bspush 7; 917 | bspush 7; 918 | bastore; 919 | dup; 920 | bspush 8; 921 | bspush 8; 922 | bastore; 923 | dup; 924 | bspush 9; 925 | bspush 9; 926 | bastore; 927 | dup; 928 | bspush 10; 929 | bspush 10; 930 | bastore; 931 | dup; 932 | bspush 11; 933 | bspush 11; 934 | bastore; 935 | dup; 936 | bspush 12; 937 | bspush 12; 938 | bastore; 939 | dup; 940 | bspush 13; 941 | bspush 13; 942 | bastore; 943 | dup; 944 | bspush 14; 945 | bspush 14; 946 | bastore; 947 | dup; 948 | bspush 15; 949 | bspush 15; 950 | bastore; 951 | astore 7; 952 | getfield_a_this 8; // reference com/esec/u2ftoken/U2FToken.mSecretKey 953 | aload 7; 954 | sconst_0; 955 | aload 7; 956 | arraylength; 957 | aload 6; 958 | sconst_0; 959 | sconst_1; 960 | invokevirtual 59; // keyWrap([BSS[BSB)V 961 | aload_1; 962 | sconst_0; 963 | bspush 48; 964 | invokevirtual 53; // setOutgoingAndSend(SS)V 965 | return; 966 | } 967 | 968 | .method public AESencrypt(Ljavacard/framework/APDU;BBBS)V 9 { 969 | .stack 6; 970 | .locals 6; 971 | 972 | .descriptor Ljavacard/framework/APDU; 2.10; 973 | 974 | L0: aload_1; 975 | invokevirtual 48; // getBuffer()[B 976 | astore 6; 977 | L1: aload_0; 978 | bspush 15; 979 | sspush 128; 980 | sconst_0; 981 | invokestatic 26; // javacard/security/KeyBuilder.buildKey(BSZ)Ljavacard/security/Key; 982 | checkcast 0 30; // T_CLASSORINTERFACE javacard/security/AESKey 983 | putfield_a 9; // reference com/esec/u2ftoken/U2FToken.mAESKeyInstance 984 | L2: goto L4; 985 | L3: astore 7; 986 | aload 7; 987 | invokevirtual 58; // getReason()S 988 | sstore 8; 989 | sload 8; 990 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 991 | L4: bspush 16; 992 | sconst_2; 993 | invokestatic 28; // javacard/framework/JCSystem.makeTransientByteArray(SB)[B 994 | astore 7; 995 | aload 7; 996 | sconst_0; 997 | aload 7; 998 | arraylength; 999 | sconst_0; 1000 | invokestatic 29; // javacard/framework/Util.arrayFillNonAtomic([BSSB)S 1001 | pop; 1002 | getfield_a_this 9; // reference com/esec/u2ftoken/U2FToken.mAESKeyInstance 1003 | aload 7; 1004 | sconst_0; 1005 | invokeinterface 3 30 4; // javacard/security/AESKey 1006 | bspush 16; 1007 | newarray 11; 1008 | dup; 1009 | sconst_0; 1010 | sconst_0; 1011 | bastore; 1012 | dup; 1013 | sconst_1; 1014 | sconst_1; 1015 | bastore; 1016 | dup; 1017 | sconst_2; 1018 | sconst_2; 1019 | bastore; 1020 | dup; 1021 | sconst_3; 1022 | sconst_3; 1023 | bastore; 1024 | dup; 1025 | sconst_4; 1026 | sconst_4; 1027 | bastore; 1028 | dup; 1029 | sconst_5; 1030 | sconst_5; 1031 | bastore; 1032 | dup; 1033 | bspush 6; 1034 | bspush 6; 1035 | bastore; 1036 | dup; 1037 | bspush 7; 1038 | bspush 7; 1039 | bastore; 1040 | dup; 1041 | bspush 8; 1042 | bspush 8; 1043 | bastore; 1044 | dup; 1045 | bspush 9; 1046 | bspush 9; 1047 | bastore; 1048 | dup; 1049 | bspush 10; 1050 | bspush 10; 1051 | bastore; 1052 | dup; 1053 | bspush 11; 1054 | bspush 11; 1055 | bastore; 1056 | dup; 1057 | bspush 12; 1058 | bspush 12; 1059 | bastore; 1060 | dup; 1061 | bspush 13; 1062 | bspush 13; 1063 | bastore; 1064 | dup; 1065 | bspush 14; 1066 | bspush 14; 1067 | bastore; 1068 | dup; 1069 | bspush 15; 1070 | bspush 15; 1071 | bastore; 1072 | astore 8; 1073 | aconst_null; 1074 | astore 9; 1075 | L5: bspush 13; 1076 | sconst_0; 1077 | invokestatic 32; // javacardx/crypto/Cipher.getInstance(BZ)Ljavacardx/crypto/Cipher; 1078 | astore 9; 1079 | L6: goto L8; 1080 | L7: astore 10; 1081 | aload 10; 1082 | invokevirtual 58; // getReason()S 1083 | sstore 11; 1084 | sload 11; 1085 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 1086 | L8: aload 9; 1087 | getfield_a_this 9; // reference com/esec/u2ftoken/U2FToken.mAESKeyInstance 1088 | sconst_2; 1089 | invokevirtual 33; // init(Ljavacard/security/Key;B)V 1090 | L9: aload 9; 1091 | aload 8; 1092 | sconst_0; 1093 | aload 8; 1094 | arraylength; 1095 | aload 6; 1096 | sconst_0; 1097 | invokevirtual 34; // doFinal([BSS[BS)S 1098 | pop; 1099 | L10: goto L12; 1100 | L11: astore 10; 1101 | sspush 27264; 1102 | invokestatic 60; // javacard/framework/ISOException.throwIt(S)V 1103 | L12: aload_1; 1104 | sconst_0; 1105 | bspush 48; 1106 | invokevirtual 53; // setOutgoingAndSend(SS)V 1107 | return; 1108 | .exceptionTable { 1109 | // start_block end_block handler_block catch_type_index 1110 | L1 L2 L3 25; 1111 | L5 L6 L7 25; 1112 | L9 L10 L11 31; 1113 | } 1114 | } 1115 | 1116 | } 1117 | 1118 | } 1119 | -------------------------------------------------------------------------------- /src/command.jcsh: -------------------------------------------------------------------------------- 1 | /term "winscard:4|SCM Microsystems Inc. SDI011G Contactless Reader 0" 2 | /card -a a000000003000000 -c com.ibm.jc.CardManager 3 | set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f 4 | init-update 255 5 | ext-auth mac 6 | try 7 | delete a0000006472f0001 8 | catch 1 9 | end 10 | try 11 | delete a0000006472f00 12 | catch 1 13 | end 14 | upload "E:\workspace\java\javacard\jcop_workspace\U2FToken\src\com\esec\u2ftoken\javacard\u2ftoken.cap" 15 | install a0000006472f00 a0000006472f0001 16 | ls 17 | /select a0000006472f0001 -------------------------------------------------------------------------------- /src/compile.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set JC_HOME=E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2 3 | set JAVA_HOME=E:\workspace\java\javacard\jdk1.5.0_14 4 | set PATH=.;%JC_HOME%\bin;%JAVA_HOME%\bin;%PATH% 5 | set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 6 | javac -g -classpath E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\lib\api.jar;E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\lib\installer.jar com\esec\u2ftoken\*.java -------------------------------------------------------------------------------- /src/complie-jcardsim-3.0.4.bat: -------------------------------------------------------------------------------- 1 | javac -g -classpath "%JC_CLASSIC_HOME%"\lib\api_classic.jar com\esec\u2ftoken\*.java 2 | java -cp jcardsim-3.0.4-SNAPSHOT.jar;. com.licel.jcardsim.utils.APDUScriptTool jcardsim.cfg apdu.script output.txt -------------------------------------------------------------------------------- /src/converter.cfg: -------------------------------------------------------------------------------- 1 | -out CAP JCA -exportpath E:\workspace\java\javacard\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\api_export_files\ -applet 0xa0:0x0:0x0:0x6:0x47:0x2f:0x0:0x1 com.esec.u2ftoken.U2FToken com.esec.u2ftoken 0xa0:0x0:0x0:0x6:0x47:0x2f:0x0 1.0 -------------------------------------------------------------------------------- /src/default-new.scr: -------------------------------------------------------------------------------- 1 | powerup; 2 | 3 | // Select the installer applet 4 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 5 | 6 | 0x80 0xB0 0x00 0x00 0x00 0x7F; 7 | 8 | // com/esec/u2ftoken/javacard/Header.cap 9 | 0x80 0xB2 0x01 0x00 0x00 0x7F; 10 | 0x80 0xB4 0x01 0x00 0x14 0x01 0x00 0x11 0xDE 0xCA 0xFF 0xED 0x01 0x02 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x7F; 11 | 0x80 0xBC 0x01 0x00 0x00 0x7F; 12 | 13 | // com/esec/u2ftoken/javacard/Directory.cap 14 | 0x80 0xB2 0x02 0x00 0x00 0x7F; 15 | 0x80 0xB4 0x02 0x00 0x20 0x02 0x00 0x1F 0x00 0x11 0x00 0x1F 0x00 0x0C 0x00 0x29 0x01 0x06 0x00 0x4E 0x05 0x6D 0x01 0xFF 0x00 0xC0 0x00 0x00 0x02 0xBD 0x00 0x16 0x00 0x07 0x01 0xE0 0x04 0x7F; 16 | 0x80 0xB4 0x02 0x00 0x02 0x01 0x00 0x7F; 17 | 0x80 0xBC 0x02 0x00 0x00 0x7F; 18 | 19 | // com/esec/u2ftoken/javacard/Import.cap 20 | 0x80 0xB2 0x04 0x00 0x00 0x7F; 21 | 0x80 0xB4 0x04 0x00 0x20 0x04 0x00 0x29 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x00 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x01 0x02 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x7F; 22 | 0x80 0xB4 0x04 0x00 0x0C 0x01 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x02 0x01 0x7F; 23 | 0x80 0xBC 0x04 0x00 0x00 0x7F; 24 | 25 | // com/esec/u2ftoken/javacard/Applet.cap 26 | 0x80 0xB2 0x03 0x00 0x00 0x7F; 27 | 0x80 0xB4 0x03 0x00 0x0F 0x03 0x00 0x0C 0x01 0x08 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x01 0x03 0x61 0x7F; 28 | 0x80 0xBC 0x03 0x00 0x00 0x7F; 29 | 30 | // com/esec/u2ftoken/javacard/Class.cap 31 | 0x80 0xB2 0x06 0x00 0x00 0x7F; 32 | 0x80 0xB4 0x06 0x00 0x20 0x06 0x00 0x4E 0x00 0x80 0x00 0x02 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x01 0x03 0x00 0x00 0x00 0x4F 0x00 0x58 0x00 0x5F 0x00 0x80 0x00 0x7F; 33 | 0x80 0xB4 0x06 0x00 0x20 0x00 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x80 0x00 0x03 0x00 0x02 0x01 0x01 0x00 0x00 0x01 0xC7 0x00 0x80 0x00 0x03 0x00 0x02 0x01 0x01 0x00 0x00 0x02 0xEB 0x01 0x7F; 34 | 0x80 0xB4 0x06 0x00 0x11 0x82 0x03 0x01 0x00 0x01 0x07 0x02 0x00 0x00 0x03 0x6E 0x05 0x62 0x82 0x12 0x01 0x08 0x7F; 35 | 0x80 0xBC 0x06 0x00 0x00 0x7F; 36 | 37 | // com/esec/u2ftoken/javacard/Method.cap 38 | 0x80 0xB2 0x07 0x00 0x00 0x7F; 39 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x05 0x6D 0x07 0x00 0x6F 0x80 0x0C 0x00 0x7D 0x00 0x19 0x01 0xE8 0x80 0x08 0x01 0xF2 0x00 0x19 0x02 0x09 0x80 0x0D 0x02 0x18 0x00 0x1F 0x02 0xAD 0x80 0x10 0x7F; 40 | 0x80 0xB4 0x07 0x00 0x20 0x02 0xBF 0x00 0x19 0x03 0x0C 0x80 0x08 0x03 0x16 0x00 0x19 0x03 0x2D 0x80 0x0D 0x03 0x3C 0x00 0x1F 0x03 0xAC 0x80 0x0A 0x03 0xB8 0x00 0x19 0x01 0x10 0x18 0x8C 0x7F; 41 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x18 0x7A 0x02 0x30 0x18 0x8C 0x00 0x17 0x18 0x1D 0x88 0x00 0x18 0x1E 0x88 0x01 0x7A 0x02 0x20 0x18 0x1D 0x90 0x0B 0x87 0x02 0x7A 0x02 0x20 0x18 0x19 0x87 0x7F; 42 | 0x80 0xB4 0x07 0x00 0x20 0x02 0x7A 0x01 0x10 0xAD 0x02 0x77 0x01 0x10 0x18 0x8C 0x00 0x18 0x7A 0x04 0x03 0x01 0x2B 0x8F 0x00 0x27 0x3D 0x08 0x11 0x01 0x00 0x8C 0x00 0x28 0x2B 0x70 0x0C 0x7F; 43 | 0x80 0xB4 0x07 0x00 0x20 0x2C 0x19 0x8B 0x00 0x29 0x31 0x1E 0x8D 0x00 0x2D 0x18 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x2C 0x18 0x8B 0x00 0x0C 0x94 0x00 0x00 0x0D 0x2D 0x19 0x7B 0x00 0x0E 0x7F; 44 | 0x80 0xB4 0x07 0x00 0x20 0x03 0x03 0x8E 0x04 0x00 0x0B 0x04 0x19 0x7B 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0B 0x07 0x19 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0B 0x08 0x19 0x7B 0x00 0x7F; 45 | 0x80 0xB4 0x07 0x00 0x20 0x11 0x03 0x03 0x8E 0x04 0x00 0x0B 0x09 0x19 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x0B 0x0A 0x1A 0x7B 0x00 0x0E 0x03 0x03 0x8E 0x04 0x00 0x0D 0x04 0x1A 0x7B 0x7F; 46 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0D 0x07 0x1A 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0D 0x08 0x1A 0x7B 0x00 0x11 0x03 0x03 0x8E 0x04 0x00 0x0D 0x09 0x1A 0x7F; 47 | 0x80 0xB4 0x07 0x00 0x20 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x0D 0x0A 0x18 0x77 0x03 0x10 0x1C 0x04 0x6B 0x1A 0x7B 0x00 0x13 0x66 0x06 0x7B 0x00 0x13 0x77 0x8F 0x00 0x14 0x3D 0x04 0x7F; 48 | 0x80 0xB4 0x07 0x00 0x20 0x8C 0x00 0x15 0x7F 0x00 0x13 0x7B 0x00 0x13 0x77 0x1C 0x05 0x6B 0x1A 0x7B 0x00 0x16 0x66 0x06 0x7B 0x00 0x16 0x77 0x8F 0x00 0x14 0x3D 0x05 0x8C 0x00 0x15 0x7F 0x7F; 49 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x16 0x7B 0x00 0x16 0x77 0x8F 0x00 0x14 0x3D 0x1C 0x8C 0x00 0x15 0x77 0x04 0x21 0x18 0x8C 0x00 0x18 0x18 0x03 0x88 0x03 0x18 0x01 0x87 0x04 0x18 0x01 0x87 0x7F; 50 | 0x80 0xB4 0x07 0x00 0x20 0x05 0x18 0x1D 0x88 0x03 0xAE 0x03 0x05 0x6B 0x2B 0x18 0x06 0x10 0x40 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1B 0x87 0x04 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x7F; 51 | 0x80 0xB4 0x07 0x00 0x20 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x04 0x1A 0x03 0x8E 0x03 0x00 0x1B 0x05 0x70 0x38 0xAE 0x03 0x04 0x6B 0x2D 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x7F; 52 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x05 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x05 0x1A 0x03 0x8E 0x03 0x00 0x1E 0x7F; 53 | 0x80 0xB4 0x07 0x00 0x20 0x04 0x70 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x06 0x73 0x01 0x28 0x07 0xAE 0x03 0x05 0x6B 0x14 0x06 0x03 0x8D 0x00 0x20 0x28 0x07 0x15 0x07 0xAD 0x04 0x16 0x7F; 54 | 0x80 0xB4 0x07 0x00 0x20 0x06 0x8B 0x00 0x21 0x70 0x28 0xAE 0x03 0x04 0x6B 0x23 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x10 0x28 0x08 0x15 0x08 0x8B 0x00 0x29 0x29 0x09 0x16 0x09 0x7F; 55 | 0x80 0xB4 0x07 0x00 0x20 0x8D 0x00 0x2D 0x15 0x07 0xAD 0x05 0x16 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x08 0x11 0x6A 0x80 0x7F; 56 | 0x80 0xB4 0x07 0x00 0x20 0x8D 0x00 0x2D 0x7A 0x03 0x10 0x1C 0x04 0x6B 0x1A 0x7B 0x00 0x23 0x66 0x06 0x7B 0x00 0x23 0x77 0x8F 0x00 0x24 0x3D 0x04 0x8C 0x00 0x25 0x7F 0x00 0x23 0x7B 0x00 0x7F; 57 | 0x80 0xB4 0x07 0x00 0x20 0x23 0x77 0x1C 0x05 0x6B 0x1A 0x7B 0x00 0x26 0x66 0x06 0x7B 0x00 0x26 0x77 0x8F 0x00 0x24 0x3D 0x05 0x8C 0x00 0x25 0x7F 0x00 0x26 0x7B 0x00 0x26 0x77 0x8F 0x00 0x7F; 58 | 0x80 0xB4 0x07 0x00 0x20 0x24 0x3D 0x1C 0x8C 0x00 0x25 0x77 0x04 0x22 0x18 0x8C 0x00 0x18 0x18 0x03 0x88 0x06 0x18 0x01 0x87 0x07 0x18 0x01 0x87 0x08 0x18 0x1D 0x88 0x06 0xAE 0x06 0x05 0x7F; 59 | 0x80 0xB4 0x07 0x00 0x20 0x6B 0x2B 0x18 0x06 0x10 0x40 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1B 0x87 0x07 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0x7F; 60 | 0x80 0xB4 0x07 0x00 0x20 0xAD 0x07 0x1A 0x03 0x8E 0x03 0x00 0x1B 0x05 0x70 0x44 0xAE 0x06 0x04 0x6B 0x39 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x08 0x7F; 61 | 0x80 0xB4 0x07 0x00 0x20 0x70 0x0C 0x2D 0x1A 0x8B 0x00 0x29 0x32 0x1F 0x8D 0x00 0x2D 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x08 0x1A 0x03 0x7F; 62 | 0x80 0xB4 0x07 0x00 0x20 0x8E 0x03 0x00 0x1E 0x04 0x70 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x06 0x73 0x01 0x28 0x07 0xAE 0x06 0x05 0x6B 0x14 0x06 0x03 0x8D 0x00 0x20 0x28 0x07 0x15 0x7F; 63 | 0x80 0xB4 0x07 0x00 0x20 0x07 0xAD 0x07 0x16 0x06 0x8B 0x00 0x21 0x70 0x28 0xAE 0x06 0x04 0x6B 0x23 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x10 0x28 0x08 0x15 0x08 0x8B 0x00 0x29 0x7F; 64 | 0x80 0xB4 0x07 0x00 0x20 0x29 0x09 0x16 0x09 0x8D 0x00 0x2D 0x15 0x07 0xAD 0x08 0x16 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x7F; 65 | 0x80 0xB4 0x07 0x00 0x20 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x05 0x10 0x18 0x8C 0x00 0x2A 0x18 0x8F 0x00 0x2B 0x3D 0x10 0xEF 0x04 0x8C 0x00 0x2C 0x87 0x09 0xAD 0x09 0x7B 0x00 0x2E 0x7F; 66 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x2F 0x7A 0x02 0x30 0x8F 0x00 0x30 0x3D 0x8C 0x00 0x31 0x8B 0x00 0x32 0x7A 0x06 0x27 0x18 0x8B 0x00 0x33 0x60 0x08 0x18 0x19 0x8C 0x00 0x34 0x7A 0x19 0x7F; 67 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x35 0x2D 0x1A 0x03 0x25 0x32 0x1A 0x05 0x25 0x29 0x04 0x1A 0x06 0x25 0x29 0x05 0x1A 0x07 0x25 0x11 0x00 0xFF 0x53 0x29 0x06 0x1A 0x04 0x25 0x75 0x00 0x7F; 68 | 0x80 0xB4 0x07 0x00 0x20 0x55 0x00 0x03 0x00 0x01 0x00 0x47 0x00 0x10 0x00 0x11 0x00 0x20 0x00 0x39 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x3B 0x70 0x10 0x28 0x07 0x15 0x07 0x8B 0x7F; 69 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x29 0x29 0x08 0x16 0x08 0x8D 0x00 0x2D 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x36 0x70 0x24 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x7F; 70 | 0x80 0xB4 0x07 0x00 0x20 0x8C 0x00 0x37 0x70 0x16 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x38 0x70 0x08 0x11 0x6D 0x00 0x8D 0x00 0x2D 0x7A 0x05 0x21 0x19 0x8B 0x00 0x35 0x7F; 71 | 0x80 0xB4 0x07 0x00 0x20 0x2D 0x7B 0x00 0x39 0x03 0x1A 0x03 0x7B 0x00 0x39 0x92 0x8D 0x00 0x3A 0x3B 0x19 0x03 0x7B 0x00 0x39 0x92 0x8B 0x00 0x3B 0x7A 0x03 0x64 0x19 0x8B 0x00 0x35 0x28 0x7F; 72 | 0x80 0xB4 0x07 0x00 0x20 0x06 0x1E 0x60 0x08 0x11 0x6E 0x00 0x8D 0x00 0x2D 0x8D 0x00 0x3C 0x28 0x07 0x15 0x07 0x8B 0x00 0x3D 0x15 0x07 0x8B 0x00 0x0C 0x94 0x00 0x00 0x0D 0x28 0x08 0x15 0x7F; 73 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x28 0x09 0x15 0x08 0x15 0x06 0x03 0x8E 0x03 0x00 0x0D 0x10 0x3B 0x19 0x03 0x10 0x20 0x8B 0x00 0x3B 0x7A 0x07 0x63 0x19 0x7F; 74 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x35 0x28 0x06 0x04 0x8D 0x00 0x3E 0x28 0x07 0x10 0x10 0x90 0x0B 0x3D 0x03 0x03 0x38 0x3D 0x04 0x04 0x38 0x3D 0x05 0x05 0x38 0x3D 0x06 0x06 0x38 0x3D 0x7F; 75 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x07 0x38 0x3D 0x08 0x08 0x38 0x3D 0x10 0x06 0x10 0x06 0x38 0x3D 0x10 0x07 0x10 0x07 0x38 0x3D 0x10 0x08 0x10 0x08 0x38 0x3D 0x10 0x09 0x10 0x09 0x38 0x3D 0x7F; 76 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x0A 0x10 0x0A 0x38 0x3D 0x10 0x0B 0x10 0x0B 0x38 0x3D 0x10 0x0C 0x10 0x0C 0x38 0x3D 0x10 0x0D 0x10 0x0D 0x38 0x3D 0x10 0x0E 0x10 0x0E 0x38 0x3D 0x10 0x0F 0x7F; 77 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x0F 0x38 0x28 0x08 0x15 0x07 0x15 0x08 0x03 0x15 0x08 0x92 0x15 0x06 0x03 0x04 0x8B 0x00 0x3F 0x19 0x03 0x10 0x30 0x8B 0x00 0x3B 0x7A 0x07 0x63 0x04 0x8D 0x7F; 78 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x3E 0x28 0x06 0x19 0x8B 0x00 0x40 0x3B 0x19 0x8B 0x00 0x35 0x28 0x07 0x10 0x10 0x90 0x0B 0x3D 0x03 0x10 0x49 0x38 0x3D 0x04 0x10 0x1E 0x38 0x3D 0x05 0x10 0x7F; 79 | 0x80 0xB4 0x07 0x00 0x20 0x89 0x38 0x3D 0x06 0x10 0x0D 0x38 0x3D 0x07 0x10 0xE9 0x38 0x3D 0x08 0x10 0xAC 0x38 0x3D 0x10 0x06 0x10 0xE9 0x38 0x3D 0x10 0x07 0x10 0x32 0x38 0x3D 0x10 0x08 0x7F; 80 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x83 0x38 0x3D 0x10 0x09 0x10 0x8A 0x38 0x3D 0x10 0x0A 0x10 0x49 0x38 0x3D 0x10 0x0B 0x10 0x79 0x38 0x3D 0x10 0x0C 0x10 0x2F 0x38 0x3D 0x10 0x0D 0x10 0x22 0x7F; 81 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x10 0x0E 0x10 0x13 0x38 0x3D 0x10 0x0F 0x10 0xF3 0x38 0x28 0x08 0x15 0x06 0x15 0x08 0x03 0x10 0x10 0x15 0x07 0x03 0x05 0x8B 0x00 0x3F 0x19 0x03 0x10 0x7F; 82 | 0x80 0xB4 0x07 0x00 0x10 0x10 0x8B 0x00 0x3B 0x7A 0x01 0x10 0x01 0x7F 0x00 0x23 0x01 0x7F 0x00 0x26 0x7A 0x7F; 83 | 0x80 0xBC 0x07 0x00 0x00 0x7F; 84 | 85 | // com/esec/u2ftoken/javacard/StaticField.cap 86 | 0x80 0xB2 0x08 0x00 0x00 0x7F; 87 | 0x80 0xB4 0x08 0x00 0x20 0x08 0x01 0xFF 0x00 0x16 0x00 0x0B 0x00 0x07 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 88 | 0x80 0xB4 0x08 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 89 | 0x80 0xB4 0x08 0x00 0x20 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFC 0x03 0x00 0x20 0x5A 0xC6 0x35 0xD8 0xAA 0x3A 0x93 0xE7 0xB3 0xEB 0xBD 0x55 0x76 0x98 0x7F; 90 | 0x80 0xB4 0x08 0x00 0x20 0x86 0xBC 0x65 0x1D 0x06 0xB0 0xCC 0x53 0xB0 0xF6 0x3B 0xCE 0x3C 0x3E 0x27 0xD2 0x60 0x4B 0x03 0x00 0x41 0x04 0x6B 0x17 0xD1 0xF2 0xE1 0x2C 0x42 0x47 0xF8 0xBC 0x7F; 91 | 0x80 0xB4 0x08 0x00 0x20 0xE6 0xE5 0x63 0xA4 0x40 0xF2 0x77 0x03 0x7D 0x81 0x2D 0xEB 0x33 0xA0 0xF4 0xA1 0x39 0x45 0xD8 0x98 0xC2 0x96 0x4F 0xE3 0x42 0xE2 0xFE 0x1A 0x7F 0x9B 0x8E 0xE7 0x7F; 92 | 0x80 0xB4 0x08 0x00 0x20 0xEB 0x4A 0x7C 0x0F 0x9E 0x16 0x2B 0xCE 0x33 0x57 0x6B 0x31 0x5E 0xCE 0xCB 0xB6 0x40 0x68 0x37 0xBF 0x51 0xF5 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x7F; 93 | 0x80 0xB4 0x08 0x00 0x20 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xBC 0xE6 0xFA 0xAD 0xA7 0x17 0x9E 0x84 0xF3 0xB9 0xCA 0xC2 0xFC 0x63 0x25 0x51 0x03 0x00 0x06 0x55 0x32 0x46 0x5F 0x7F; 94 | 0x80 0xB4 0x08 0x00 0x20 0x56 0x32 0x03 0x01 0x19 0x30 0x82 0x01 0x15 0x30 0x81 0xBC 0x02 0x09 0x00 0xC5 0xF4 0xEE 0x4C 0x59 0x50 0x3E 0x05 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x7F; 95 | 0x80 0xB4 0x08 0x00 0x20 0x04 0x03 0x02 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x1E 0x17 0x0D 0x31 0x35 0x31 0x32 0x7F; 96 | 0x80 0xB4 0x08 0x00 0x20 0x30 0x39 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x17 0x0D 0x31 0x36 0x31 0x32 0x30 0x38 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x7F; 97 | 0x80 0xB4 0x08 0x00 0x20 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x59 0x30 0x13 0x06 0x07 0x2A 0x86 0x48 0xCE 0x3D 0x02 0x01 0x06 0x08 0x2A 0x86 0x48 0xCE 0x7F; 98 | 0x80 0xB4 0x08 0x00 0x20 0x3D 0x03 0x01 0x07 0x03 0x42 0x00 0x04 0x72 0x9A 0x71 0xD0 0x81 0x62 0x42 0x84 0x92 0xF2 0xD9 0x61 0x92 0x4D 0x37 0x44 0x3A 0x4F 0x1B 0xDA 0x58 0x0F 0x8A 0xEA 0x7F; 99 | 0x80 0xB4 0x08 0x00 0x20 0x29 0x20 0xD2 0x99 0x7C 0xBE 0xA4 0x39 0x60 0xCE 0x72 0x9E 0x35 0xC1 0xF7 0x40 0x92 0xF2 0x25 0x0E 0x60 0x74 0x82 0x3F 0xC5 0x7F 0x33 0x60 0xB7 0xCD 0x39 0x69 0x7F; 100 | 0x80 0xB4 0x08 0x00 0x20 0xC3 0xC3 0x12 0x5E 0xCE 0x26 0x5C 0x29 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x04 0x03 0x02 0x03 0x48 0x00 0x30 0x45 0x02 0x21 0x00 0xE7 0x67 0xFA 0x94 0x7F; 101 | 0x80 0xB4 0x08 0x00 0x20 0x10 0x35 0xD5 0x85 0x3D 0x52 0xD8 0x7D 0x67 0x14 0x70 0xBC 0x76 0x3B 0xC5 0xB1 0x2E 0x1D 0x45 0x77 0xEA 0x9F 0x8C 0xA6 0x74 0xE5 0x9D 0x39 0x02 0x20 0x3F 0xE1 0x7F; 102 | 0x80 0xB4 0x08 0x00 0x20 0x1C 0xAD 0x59 0xF5 0x35 0x76 0x00 0x1F 0x15 0xEE 0x05 0xDA 0x87 0x46 0xFE 0xD3 0x27 0x6B 0x16 0x82 0x9E 0x9D 0x5E 0xFD 0xFF 0x70 0x5E 0x08 0x9C 0x6D 0x00 0x00 0x7F; 103 | 0x80 0xB4 0x08 0x00 0x02 0x00 0x00 0x7F; 104 | 0x80 0xBC 0x08 0x00 0x00 0x7F; 105 | 106 | // com/esec/u2ftoken/javacard/ConstantPool.cap 107 | 0x80 0xB2 0x05 0x00 0x00 0x7F; 108 | 0x80 0xB4 0x05 0x00 0x20 0x05 0x01 0x06 0x00 0x41 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x01 0x02 0x00 0x0A 0x00 0x02 0x00 0x24 0x02 0x02 0x00 0x24 0x00 0x02 0x00 0x24 0x01 0x02 0x00 0x30 0x7F; 109 | 0x80 0xB4 0x05 0x00 0x20 0x02 0x02 0x00 0x30 0x00 0x02 0x00 0x30 0x01 0x02 0x00 0x3C 0x00 0x03 0x81 0x10 0x02 0x01 0x81 0x12 0x00 0x03 0x81 0x10 0x03 0x01 0x81 0x13 0x00 0x05 0x00 0x00 0x7F; 110 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x05 0x00 0x00 0x02 0x05 0x00 0x00 0x04 0x05 0x00 0x00 0x06 0x05 0x00 0x00 0x08 0x05 0x00 0x00 0x10 0x01 0x00 0x24 0x00 0x06 0x00 0x01 0x4C 0x05 0x00 0x00 0x7F; 111 | 0x80 0xB4 0x05 0x00 0x20 0x0E 0x06 0x00 0x00 0x39 0x06 0x80 0x00 0x00 0x01 0x81 0x0C 0x00 0x06 0x81 0x0D 0x00 0x01 0x81 0x0A 0x00 0x06 0x82 0x08 0x0D 0x06 0x82 0x10 0x03 0x01 0x81 0x14 0x7F; 112 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x01 0x80 0x02 0x00 0x06 0x83 0x01 0x00 0x03 0x83 0x01 0x03 0x03 0x83 0x01 0x01 0x05 0x00 0x00 0x14 0x01 0x00 0x30 0x00 0x06 0x00 0x02 0x64 0x05 0x00 0x00 0x7F; 113 | 0x80 0xB4 0x05 0x00 0x20 0x12 0x01 0x81 0x10 0x00 0x06 0x81 0x10 0x00 0x03 0x81 0x0C 0x01 0x06 0x82 0x03 0x00 0x01 0x00 0x0A 0x00 0x06 0x00 0x00 0x40 0x06 0x82 0x07 0x01 0x05 0x00 0x00 0x7F; 114 | 0x80 0xB4 0x05 0x00 0x20 0x0C 0x03 0x00 0x0A 0x02 0x01 0x00 0x3C 0x00 0x06 0x00 0x03 0x45 0x03 0x82 0x03 0x01 0x03 0x82 0x03 0x03 0x06 0x00 0x03 0xF7 0x03 0x82 0x0A 0x01 0x06 0x00 0x04 0x7F; 115 | 0x80 0xB4 0x05 0x00 0x20 0x5A 0x06 0x00 0x04 0xD9 0x06 0x00 0x04 0x16 0x05 0x00 0x00 0x0A 0x06 0x82 0x10 0x02 0x03 0x82 0x0A 0x08 0x06 0x00 0x00 0x6B 0x03 0x81 0x10 0x01 0x06 0x00 0x02 0x7F; 116 | 0x80 0xB4 0x05 0x00 0x09 0x21 0x03 0x00 0x30 0x01 0x03 0x82 0x0A 0x06 0x7F; 117 | 0x80 0xBC 0x05 0x00 0x00 0x7F; 118 | 119 | // com/esec/u2ftoken/javacard/RefLocation.cap 120 | 0x80 0xB2 0x09 0x00 0x00 0x7F; 121 | 0x80 0xB4 0x09 0x00 0x20 0x09 0x00 0xC0 0x00 0x23 0x49 0x04 0x09 0x07 0x05 0xF3 0x04 0x04 0x04 0x02 0x11 0x12 0x0B 0x13 0x12 0x17 0x0E 0x09 0x1F 0x6A 0x04 0x04 0x04 0x02 0x11 0x12 0x0B 0x7F; 122 | 0x80 0xB4 0x09 0x00 0x20 0x13 0x1E 0x17 0x0E 0x09 0x1F 0x30 0x02 0x00 0x99 0x07 0x08 0x08 0x08 0x08 0x08 0x08 0x06 0x07 0x24 0x08 0x08 0x08 0x05 0x04 0x04 0x05 0x04 0x05 0x06 0x05 0x06 0x7F; 123 | 0x80 0xB4 0x09 0x00 0x20 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x0C 0x05 0x04 0x05 0x03 0x03 0x08 0x05 0x04 0x05 0x03 0x03 0x04 0x05 0x07 0x1D 0x7F; 124 | 0x80 0xB4 0x09 0x00 0x20 0x04 0x08 0x09 0x09 0x12 0x04 0x08 0x09 0x09 0x09 0x10 0x0B 0x0D 0x0B 0x07 0x09 0x0C 0x0B 0x0A 0x05 0x04 0x05 0x03 0x03 0x08 0x05 0x04 0x05 0x03 0x03 0x04 0x05 0x7F; 125 | 0x80 0xB4 0x09 0x00 0x20 0x07 0x1D 0x04 0x08 0x09 0x09 0x12 0x04 0x09 0x05 0x06 0x09 0x09 0x09 0x10 0x0B 0x0D 0x0B 0x07 0x09 0x0C 0x0B 0x07 0x04 0x07 0x07 0x03 0x06 0x04 0x03 0x07 0x07 0x7F; 126 | 0x80 0xB4 0x09 0x00 0x20 0x05 0x35 0x0A 0x07 0x0C 0x0E 0x0E 0x08 0x07 0x04 0x06 0x04 0x06 0x04 0x07 0x0B 0x03 0x07 0x05 0x04 0x07 0x04 0x0B 0x09 0x07 0x06 0x6B 0x07 0x07 0x06 0x05 0x70 0x7F; 127 | 0x80 0xB4 0x09 0x00 0x03 0x07 0x07 0x04 0x7F; 128 | 0x80 0xBC 0x09 0x00 0x00 0x7F; 129 | 130 | 0x80 0xBA 0x00 0x00 0x00 0x7F; 131 | 132 | // Select the installer applet 133 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 134 | 135 | // Create U2FToken 136 | 0x80 0xB8 0x00 0x00 0x0a 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x00 0x7F; 137 | 138 | // Select U2FToken 139 | 0x00 0xa4 0x04 0x00 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x7F; 140 | 141 | // send 0010000000 142 | 0x00 0x01 0x00 0x00 0x00 0x7f; -------------------------------------------------------------------------------- /src/default-success-create.scr: -------------------------------------------------------------------------------- 1 | powerup; 2 | 3 | // Select the installer applet 4 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 5 | 6 | 0x80 0xB0 0x00 0x00 0x00 0x7F; 7 | 8 | // com/esec/u2ftoken/javacard/Header.cap 9 | 0x80 0xB2 0x01 0x00 0x00 0x7F; 10 | 0x80 0xB4 0x01 0x00 0x14 0x01 0x00 0x11 0xDE 0xCA 0xFF 0xED 0x01 0x02 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x7F; 11 | 0x80 0xBC 0x01 0x00 0x00 0x7F; 12 | 13 | // com/esec/u2ftoken/javacard/Directory.cap 14 | 0x80 0xB2 0x02 0x00 0x00 0x7F; 15 | 0x80 0xB4 0x02 0x00 0x20 0x02 0x00 0x1F 0x00 0x11 0x00 0x1F 0x00 0x0C 0x00 0x29 0x01 0x06 0x00 0x4E 0x05 0x73 0x01 0xFF 0x00 0xC1 0x00 0x00 0x02 0xBD 0x00 0x16 0x00 0x07 0x01 0xE0 0x04 0x7F; 16 | 0x80 0xB4 0x02 0x00 0x02 0x01 0x00 0x7F; 17 | 0x80 0xBC 0x02 0x00 0x00 0x7F; 18 | 19 | // com/esec/u2ftoken/javacard/Import.cap 20 | 0x80 0xB2 0x04 0x00 0x00 0x7F; 21 | 0x80 0xB4 0x04 0x00 0x20 0x04 0x00 0x29 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x00 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x01 0x02 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x7F; 22 | 0x80 0xB4 0x04 0x00 0x0C 0x01 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x02 0x01 0x7F; 23 | 0x80 0xBC 0x04 0x00 0x00 0x7F; 24 | 25 | // com/esec/u2ftoken/javacard/Applet.cap 26 | 0x80 0xB2 0x03 0x00 0x00 0x7F; 27 | 0x80 0xB4 0x03 0x00 0x0F 0x03 0x00 0x0C 0x01 0x08 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x01 0x03 0x61 0x7F; 28 | 0x80 0xBC 0x03 0x00 0x00 0x7F; 29 | 30 | // com/esec/u2ftoken/javacard/Class.cap 31 | 0x80 0xB2 0x06 0x00 0x00 0x7F; 32 | 0x80 0xB4 0x06 0x00 0x20 0x06 0x00 0x4E 0x00 0x80 0x00 0x02 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x01 0x03 0x00 0x00 0x00 0x4F 0x00 0x58 0x00 0x5F 0x00 0x80 0x00 0x7F; 33 | 0x80 0xB4 0x06 0x00 0x20 0x00 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x80 0x00 0x03 0x00 0x02 0x01 0x01 0x00 0x00 0x01 0xC7 0x00 0x80 0x00 0x03 0x00 0x02 0x01 0x01 0x00 0x00 0x02 0xEB 0x01 0x7F; 34 | 0x80 0xB4 0x06 0x00 0x11 0x82 0x03 0x01 0x00 0x01 0x07 0x02 0x00 0x00 0x03 0x6E 0x05 0x68 0x82 0x12 0x01 0x08 0x7F; 35 | 0x80 0xBC 0x06 0x00 0x00 0x7F; 36 | 37 | // com/esec/u2ftoken/javacard/Method.cap 38 | 0x80 0xB2 0x07 0x00 0x00 0x7F; 39 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x05 0x73 0x07 0x00 0x6F 0x80 0x0C 0x00 0x7D 0x00 0x19 0x01 0xE8 0x80 0x08 0x01 0xF2 0x00 0x19 0x02 0x09 0x80 0x0D 0x02 0x18 0x00 0x1F 0x02 0xAD 0x80 0x10 0x7F; 40 | 0x80 0xB4 0x07 0x00 0x20 0x02 0xBF 0x00 0x19 0x03 0x0C 0x80 0x08 0x03 0x16 0x00 0x19 0x03 0x2D 0x80 0x0D 0x03 0x3C 0x00 0x1F 0x03 0xAC 0x80 0x0A 0x03 0xB8 0x00 0x19 0x01 0x10 0x18 0x8C 0x7F; 41 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x18 0x7A 0x02 0x30 0x18 0x8C 0x00 0x17 0x18 0x1D 0x88 0x00 0x18 0x1E 0x88 0x01 0x7A 0x02 0x20 0x18 0x1D 0x90 0x0B 0x87 0x02 0x7A 0x02 0x20 0x18 0x19 0x87 0x7F; 42 | 0x80 0xB4 0x07 0x00 0x20 0x02 0x7A 0x01 0x10 0xAD 0x02 0x77 0x01 0x10 0x18 0x8C 0x00 0x18 0x7A 0x04 0x03 0x01 0x2B 0x8F 0x00 0x27 0x3D 0x08 0x11 0x01 0x00 0x8C 0x00 0x28 0x2B 0x70 0x0C 0x7F; 43 | 0x80 0xB4 0x07 0x00 0x20 0x2C 0x19 0x8B 0x00 0x29 0x31 0x1E 0x8D 0x00 0x2D 0x18 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x2C 0x18 0x8B 0x00 0x0C 0x94 0x00 0x00 0x0D 0x2D 0x19 0x7B 0x00 0x0E 0x7F; 44 | 0x80 0xB4 0x07 0x00 0x20 0x03 0x03 0x8E 0x04 0x00 0x0B 0x04 0x19 0x7B 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0B 0x07 0x19 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0B 0x08 0x19 0x7B 0x00 0x7F; 45 | 0x80 0xB4 0x07 0x00 0x20 0x11 0x03 0x03 0x8E 0x04 0x00 0x0B 0x09 0x19 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x0B 0x0A 0x1A 0x7B 0x00 0x0E 0x03 0x03 0x8E 0x04 0x00 0x0D 0x04 0x1A 0x7B 0x7F; 46 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0D 0x07 0x1A 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0D 0x08 0x1A 0x7B 0x00 0x11 0x03 0x03 0x8E 0x04 0x00 0x0D 0x09 0x1A 0x7F; 47 | 0x80 0xB4 0x07 0x00 0x20 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x0D 0x0A 0x18 0x77 0x03 0x10 0x1C 0x04 0x6B 0x1A 0x7B 0x00 0x13 0x66 0x06 0x7B 0x00 0x13 0x77 0x8F 0x00 0x14 0x3D 0x04 0x7F; 48 | 0x80 0xB4 0x07 0x00 0x20 0x8C 0x00 0x15 0x7F 0x00 0x13 0x7B 0x00 0x13 0x77 0x1C 0x05 0x6B 0x1A 0x7B 0x00 0x16 0x66 0x06 0x7B 0x00 0x16 0x77 0x8F 0x00 0x14 0x3D 0x05 0x8C 0x00 0x15 0x7F 0x7F; 49 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x16 0x7B 0x00 0x16 0x77 0x8F 0x00 0x14 0x3D 0x1C 0x8C 0x00 0x15 0x77 0x04 0x21 0x18 0x8C 0x00 0x18 0x18 0x03 0x88 0x03 0x18 0x01 0x87 0x04 0x18 0x01 0x87 0x7F; 50 | 0x80 0xB4 0x07 0x00 0x20 0x05 0x18 0x1D 0x88 0x03 0xAE 0x03 0x05 0x6B 0x2B 0x18 0x06 0x10 0x40 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1B 0x87 0x04 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x7F; 51 | 0x80 0xB4 0x07 0x00 0x20 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x04 0x1A 0x03 0x8E 0x03 0x00 0x1B 0x05 0x70 0x38 0xAE 0x03 0x04 0x6B 0x2D 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x7F; 52 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x05 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x05 0x1A 0x03 0x8E 0x03 0x00 0x1E 0x7F; 53 | 0x80 0xB4 0x07 0x00 0x20 0x04 0x70 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x06 0x73 0x01 0x28 0x07 0xAE 0x03 0x05 0x6B 0x14 0x06 0x03 0x8D 0x00 0x20 0x28 0x07 0x15 0x07 0xAD 0x04 0x16 0x7F; 54 | 0x80 0xB4 0x07 0x00 0x20 0x06 0x8B 0x00 0x21 0x70 0x28 0xAE 0x03 0x04 0x6B 0x23 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x10 0x28 0x08 0x15 0x08 0x8B 0x00 0x29 0x29 0x09 0x16 0x09 0x7F; 55 | 0x80 0xB4 0x07 0x00 0x20 0x8D 0x00 0x2D 0x15 0x07 0xAD 0x05 0x16 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x08 0x11 0x6A 0x80 0x7F; 56 | 0x80 0xB4 0x07 0x00 0x20 0x8D 0x00 0x2D 0x7A 0x03 0x10 0x1C 0x04 0x6B 0x1A 0x7B 0x00 0x23 0x66 0x06 0x7B 0x00 0x23 0x77 0x8F 0x00 0x24 0x3D 0x04 0x8C 0x00 0x25 0x7F 0x00 0x23 0x7B 0x00 0x7F; 57 | 0x80 0xB4 0x07 0x00 0x20 0x23 0x77 0x1C 0x05 0x6B 0x1A 0x7B 0x00 0x26 0x66 0x06 0x7B 0x00 0x26 0x77 0x8F 0x00 0x24 0x3D 0x05 0x8C 0x00 0x25 0x7F 0x00 0x26 0x7B 0x00 0x26 0x77 0x8F 0x00 0x7F; 58 | 0x80 0xB4 0x07 0x00 0x20 0x24 0x3D 0x1C 0x8C 0x00 0x25 0x77 0x04 0x22 0x18 0x8C 0x00 0x18 0x18 0x03 0x88 0x06 0x18 0x01 0x87 0x07 0x18 0x01 0x87 0x08 0x18 0x1D 0x88 0x06 0xAE 0x06 0x05 0x7F; 59 | 0x80 0xB4 0x07 0x00 0x20 0x6B 0x2B 0x18 0x06 0x10 0x40 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1B 0x87 0x07 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0x7F; 60 | 0x80 0xB4 0x07 0x00 0x20 0xAD 0x07 0x1A 0x03 0x8E 0x03 0x00 0x1B 0x05 0x70 0x44 0xAE 0x06 0x04 0x6B 0x39 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x08 0x7F; 61 | 0x80 0xB4 0x07 0x00 0x20 0x70 0x0C 0x2D 0x1A 0x8B 0x00 0x29 0x32 0x1F 0x8D 0x00 0x2D 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x08 0x1A 0x03 0x7F; 62 | 0x80 0xB4 0x07 0x00 0x20 0x8E 0x03 0x00 0x1E 0x04 0x70 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x06 0x73 0x01 0x28 0x07 0xAE 0x06 0x05 0x6B 0x14 0x06 0x03 0x8D 0x00 0x20 0x28 0x07 0x15 0x7F; 63 | 0x80 0xB4 0x07 0x00 0x20 0x07 0xAD 0x07 0x16 0x06 0x8B 0x00 0x21 0x70 0x28 0xAE 0x06 0x04 0x6B 0x23 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x10 0x28 0x08 0x15 0x08 0x8B 0x00 0x29 0x7F; 64 | 0x80 0xB4 0x07 0x00 0x20 0x29 0x09 0x16 0x09 0x8D 0x00 0x2D 0x15 0x07 0xAD 0x08 0x16 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x7F; 65 | 0x80 0xB4 0x07 0x00 0x20 0x08 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x7A 0x05 0x10 0x18 0x8C 0x00 0x2A 0x18 0x8F 0x00 0x2B 0x3D 0x10 0xEF 0x04 0x8C 0x00 0x2C 0x87 0x09 0xAD 0x09 0x7B 0x00 0x2E 0x7F; 66 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x2F 0x7A 0x02 0x30 0x8F 0x00 0x30 0x3D 0x8C 0x00 0x31 0x8B 0x00 0x32 0x7A 0x06 0x27 0x18 0x8B 0x00 0x33 0x60 0x08 0x18 0x19 0x8C 0x00 0x34 0x7A 0x19 0x7F; 67 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x35 0x2D 0x1A 0x03 0x25 0x32 0x1A 0x05 0x25 0x29 0x04 0x1A 0x06 0x25 0x29 0x05 0x1A 0x07 0x25 0x11 0x00 0xFF 0x53 0x29 0x06 0x1A 0x04 0x25 0x75 0x00 0x7F; 68 | 0x80 0xB4 0x07 0x00 0x20 0x5B 0x00 0x03 0x00 0x01 0x00 0x4D 0x00 0x10 0x00 0x11 0x00 0x20 0x00 0x3F 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x3B 0x70 0x10 0x28 0x07 0x15 0x07 0x8B 0x7F; 69 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x29 0x29 0x08 0x16 0x08 0x8D 0x00 0x2D 0x11 0x6A 0x80 0x8D 0x00 0x2D 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x36 0x70 0x24 0x18 0x19 0x1F 0x7F; 70 | 0x80 0xB4 0x07 0x00 0x20 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x37 0x70 0x16 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x38 0x70 0x08 0x11 0x6D 0x00 0x8D 0x00 0x2D 0x7A 0x7F; 71 | 0x80 0xB4 0x07 0x00 0x20 0x05 0x21 0x19 0x8B 0x00 0x35 0x2D 0x7B 0x00 0x39 0x03 0x1A 0x03 0x7B 0x00 0x39 0x92 0x8D 0x00 0x3A 0x3B 0x19 0x03 0x7B 0x00 0x39 0x92 0x8B 0x00 0x3B 0x7A 0x03 0x7F; 72 | 0x80 0xB4 0x07 0x00 0x20 0x64 0x19 0x8B 0x00 0x35 0x28 0x06 0x1E 0x60 0x08 0x11 0x6E 0x00 0x8D 0x00 0x2D 0x8D 0x00 0x3C 0x28 0x07 0x15 0x07 0x8B 0x00 0x3D 0x15 0x07 0x8B 0x00 0x0C 0x94 0x7F; 73 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x00 0x0D 0x28 0x08 0x15 0x07 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x28 0x09 0x15 0x08 0x15 0x06 0x03 0x8E 0x03 0x00 0x0D 0x10 0x3B 0x19 0x03 0x10 0x20 0x8B 0x7F; 74 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x3B 0x7A 0x07 0x63 0x19 0x8B 0x00 0x35 0x28 0x06 0x04 0x8D 0x00 0x3E 0x28 0x07 0x10 0x10 0x90 0x0B 0x3D 0x03 0x03 0x38 0x3D 0x04 0x04 0x38 0x3D 0x05 0x05 0x7F; 75 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x06 0x06 0x38 0x3D 0x07 0x07 0x38 0x3D 0x08 0x08 0x38 0x3D 0x10 0x06 0x10 0x06 0x38 0x3D 0x10 0x07 0x10 0x07 0x38 0x3D 0x10 0x08 0x10 0x08 0x38 0x3D 0x7F; 76 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x09 0x10 0x09 0x38 0x3D 0x10 0x0A 0x10 0x0A 0x38 0x3D 0x10 0x0B 0x10 0x0B 0x38 0x3D 0x10 0x0C 0x10 0x0C 0x38 0x3D 0x10 0x0D 0x10 0x0D 0x38 0x3D 0x10 0x0E 0x7F; 77 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x0E 0x38 0x3D 0x10 0x0F 0x10 0x0F 0x38 0x28 0x08 0x15 0x07 0x15 0x08 0x03 0x15 0x08 0x92 0x15 0x06 0x03 0x04 0x8B 0x00 0x3F 0x19 0x03 0x10 0x30 0x8B 0x00 0x7F; 78 | 0x80 0xB4 0x07 0x00 0x20 0x3B 0x7A 0x07 0x63 0x04 0x8D 0x00 0x3E 0x28 0x06 0x19 0x8B 0x00 0x40 0x3B 0x19 0x8B 0x00 0x35 0x28 0x07 0x10 0x10 0x90 0x0B 0x3D 0x03 0x10 0x49 0x38 0x3D 0x04 0x7F; 79 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x1E 0x38 0x3D 0x05 0x10 0x89 0x38 0x3D 0x06 0x10 0x0D 0x38 0x3D 0x07 0x10 0xE9 0x38 0x3D 0x08 0x10 0xAC 0x38 0x3D 0x10 0x06 0x10 0xE9 0x38 0x3D 0x10 0x07 0x7F; 80 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x32 0x38 0x3D 0x10 0x08 0x10 0x83 0x38 0x3D 0x10 0x09 0x10 0x8A 0x38 0x3D 0x10 0x0A 0x10 0x49 0x38 0x3D 0x10 0x0B 0x10 0x79 0x38 0x3D 0x10 0x0C 0x10 0x2F 0x7F; 81 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x10 0x0D 0x10 0x22 0x38 0x3D 0x10 0x0E 0x10 0x13 0x38 0x3D 0x10 0x0F 0x10 0xF3 0x38 0x28 0x08 0x15 0x06 0x15 0x08 0x03 0x10 0x10 0x15 0x07 0x03 0x05 0x7F; 82 | 0x80 0xB4 0x07 0x00 0x16 0x8B 0x00 0x3F 0x19 0x03 0x10 0x10 0x8B 0x00 0x3B 0x7A 0x01 0x10 0x01 0x7F 0x00 0x23 0x01 0x7F 0x00 0x26 0x7A 0x7F; 83 | 0x80 0xBC 0x07 0x00 0x00 0x7F; 84 | 85 | // com/esec/u2ftoken/javacard/StaticField.cap 86 | 0x80 0xB2 0x08 0x00 0x00 0x7F; 87 | 0x80 0xB4 0x08 0x00 0x20 0x08 0x01 0xFF 0x00 0x16 0x00 0x0B 0x00 0x07 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 88 | 0x80 0xB4 0x08 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 89 | 0x80 0xB4 0x08 0x00 0x20 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFC 0x03 0x00 0x20 0x5A 0xC6 0x35 0xD8 0xAA 0x3A 0x93 0xE7 0xB3 0xEB 0xBD 0x55 0x76 0x98 0x7F; 90 | 0x80 0xB4 0x08 0x00 0x20 0x86 0xBC 0x65 0x1D 0x06 0xB0 0xCC 0x53 0xB0 0xF6 0x3B 0xCE 0x3C 0x3E 0x27 0xD2 0x60 0x4B 0x03 0x00 0x41 0x04 0x6B 0x17 0xD1 0xF2 0xE1 0x2C 0x42 0x47 0xF8 0xBC 0x7F; 91 | 0x80 0xB4 0x08 0x00 0x20 0xE6 0xE5 0x63 0xA4 0x40 0xF2 0x77 0x03 0x7D 0x81 0x2D 0xEB 0x33 0xA0 0xF4 0xA1 0x39 0x45 0xD8 0x98 0xC2 0x96 0x4F 0xE3 0x42 0xE2 0xFE 0x1A 0x7F 0x9B 0x8E 0xE7 0x7F; 92 | 0x80 0xB4 0x08 0x00 0x20 0xEB 0x4A 0x7C 0x0F 0x9E 0x16 0x2B 0xCE 0x33 0x57 0x6B 0x31 0x5E 0xCE 0xCB 0xB6 0x40 0x68 0x37 0xBF 0x51 0xF5 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x7F; 93 | 0x80 0xB4 0x08 0x00 0x20 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xBC 0xE6 0xFA 0xAD 0xA7 0x17 0x9E 0x84 0xF3 0xB9 0xCA 0xC2 0xFC 0x63 0x25 0x51 0x03 0x00 0x06 0x55 0x32 0x46 0x5F 0x7F; 94 | 0x80 0xB4 0x08 0x00 0x20 0x56 0x32 0x03 0x01 0x19 0x30 0x82 0x01 0x15 0x30 0x81 0xBC 0x02 0x09 0x00 0xC5 0xF4 0xEE 0x4C 0x59 0x50 0x3E 0x05 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x7F; 95 | 0x80 0xB4 0x08 0x00 0x20 0x04 0x03 0x02 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x1E 0x17 0x0D 0x31 0x35 0x31 0x32 0x7F; 96 | 0x80 0xB4 0x08 0x00 0x20 0x30 0x39 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x17 0x0D 0x31 0x36 0x31 0x32 0x30 0x38 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x7F; 97 | 0x80 0xB4 0x08 0x00 0x20 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x59 0x30 0x13 0x06 0x07 0x2A 0x86 0x48 0xCE 0x3D 0x02 0x01 0x06 0x08 0x2A 0x86 0x48 0xCE 0x7F; 98 | 0x80 0xB4 0x08 0x00 0x20 0x3D 0x03 0x01 0x07 0x03 0x42 0x00 0x04 0x72 0x9A 0x71 0xD0 0x81 0x62 0x42 0x84 0x92 0xF2 0xD9 0x61 0x92 0x4D 0x37 0x44 0x3A 0x4F 0x1B 0xDA 0x58 0x0F 0x8A 0xEA 0x7F; 99 | 0x80 0xB4 0x08 0x00 0x20 0x29 0x20 0xD2 0x99 0x7C 0xBE 0xA4 0x39 0x60 0xCE 0x72 0x9E 0x35 0xC1 0xF7 0x40 0x92 0xF2 0x25 0x0E 0x60 0x74 0x82 0x3F 0xC5 0x7F 0x33 0x60 0xB7 0xCD 0x39 0x69 0x7F; 100 | 0x80 0xB4 0x08 0x00 0x20 0xC3 0xC3 0x12 0x5E 0xCE 0x26 0x5C 0x29 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x04 0x03 0x02 0x03 0x48 0x00 0x30 0x45 0x02 0x21 0x00 0xE7 0x67 0xFA 0x94 0x7F; 101 | 0x80 0xB4 0x08 0x00 0x20 0x10 0x35 0xD5 0x85 0x3D 0x52 0xD8 0x7D 0x67 0x14 0x70 0xBC 0x76 0x3B 0xC5 0xB1 0x2E 0x1D 0x45 0x77 0xEA 0x9F 0x8C 0xA6 0x74 0xE5 0x9D 0x39 0x02 0x20 0x3F 0xE1 0x7F; 102 | 0x80 0xB4 0x08 0x00 0x20 0x1C 0xAD 0x59 0xF5 0x35 0x76 0x00 0x1F 0x15 0xEE 0x05 0xDA 0x87 0x46 0xFE 0xD3 0x27 0x6B 0x16 0x82 0x9E 0x9D 0x5E 0xFD 0xFF 0x70 0x5E 0x08 0x9C 0x6D 0x00 0x00 0x7F; 103 | 0x80 0xB4 0x08 0x00 0x02 0x00 0x00 0x7F; 104 | 0x80 0xBC 0x08 0x00 0x00 0x7F; 105 | 106 | // com/esec/u2ftoken/javacard/ConstantPool.cap 107 | 0x80 0xB2 0x05 0x00 0x00 0x7F; 108 | 0x80 0xB4 0x05 0x00 0x20 0x05 0x01 0x06 0x00 0x41 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x01 0x02 0x00 0x0A 0x00 0x02 0x00 0x24 0x02 0x02 0x00 0x24 0x00 0x02 0x00 0x24 0x01 0x02 0x00 0x30 0x7F; 109 | 0x80 0xB4 0x05 0x00 0x20 0x02 0x02 0x00 0x30 0x00 0x02 0x00 0x30 0x01 0x02 0x00 0x3C 0x00 0x03 0x81 0x10 0x02 0x01 0x81 0x12 0x00 0x03 0x81 0x10 0x03 0x01 0x81 0x13 0x00 0x05 0x00 0x00 0x7F; 110 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x05 0x00 0x00 0x02 0x05 0x00 0x00 0x04 0x05 0x00 0x00 0x06 0x05 0x00 0x00 0x08 0x05 0x00 0x00 0x10 0x01 0x00 0x24 0x00 0x06 0x00 0x01 0x4C 0x05 0x00 0x00 0x7F; 111 | 0x80 0xB4 0x05 0x00 0x20 0x0E 0x06 0x00 0x00 0x39 0x06 0x80 0x00 0x00 0x01 0x81 0x0C 0x00 0x06 0x81 0x0D 0x00 0x01 0x81 0x0A 0x00 0x06 0x82 0x08 0x0D 0x06 0x82 0x10 0x03 0x01 0x81 0x14 0x7F; 112 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x01 0x80 0x02 0x00 0x06 0x83 0x01 0x00 0x03 0x83 0x01 0x03 0x03 0x83 0x01 0x01 0x05 0x00 0x00 0x14 0x01 0x00 0x30 0x00 0x06 0x00 0x02 0x64 0x05 0x00 0x00 0x7F; 113 | 0x80 0xB4 0x05 0x00 0x20 0x12 0x01 0x81 0x10 0x00 0x06 0x81 0x10 0x00 0x03 0x81 0x0C 0x01 0x06 0x82 0x03 0x00 0x01 0x00 0x0A 0x00 0x06 0x00 0x00 0x40 0x06 0x82 0x07 0x01 0x05 0x00 0x00 0x7F; 114 | 0x80 0xB4 0x05 0x00 0x20 0x0C 0x03 0x00 0x0A 0x02 0x01 0x00 0x3C 0x00 0x06 0x00 0x03 0x45 0x03 0x82 0x03 0x01 0x03 0x82 0x03 0x03 0x06 0x00 0x03 0xFD 0x03 0x82 0x0A 0x01 0x06 0x00 0x04 0x7F; 115 | 0x80 0xB4 0x05 0x00 0x20 0x60 0x06 0x00 0x04 0xDF 0x06 0x00 0x04 0x1C 0x05 0x00 0x00 0x0A 0x06 0x82 0x10 0x02 0x03 0x82 0x0A 0x08 0x06 0x00 0x00 0x6B 0x03 0x81 0x10 0x01 0x06 0x00 0x02 0x7F; 116 | 0x80 0xB4 0x05 0x00 0x09 0x21 0x03 0x00 0x30 0x01 0x03 0x82 0x0A 0x06 0x7F; 117 | 0x80 0xBC 0x05 0x00 0x00 0x7F; 118 | 119 | // com/esec/u2ftoken/javacard/RefLocation.cap 120 | 0x80 0xB2 0x09 0x00 0x00 0x7F; 121 | 0x80 0xB4 0x09 0x00 0x20 0x09 0x00 0xC1 0x00 0x23 0x49 0x04 0x09 0x07 0x05 0xF3 0x04 0x04 0x04 0x02 0x11 0x12 0x0B 0x13 0x12 0x17 0x0E 0x09 0x1F 0x6A 0x04 0x04 0x04 0x02 0x11 0x12 0x0B 0x7F; 122 | 0x80 0xB4 0x09 0x00 0x20 0x13 0x1E 0x17 0x0E 0x09 0x1F 0x30 0x02 0x00 0x9A 0x07 0x08 0x08 0x08 0x08 0x08 0x08 0x06 0x07 0x24 0x08 0x08 0x08 0x05 0x04 0x04 0x05 0x04 0x05 0x06 0x05 0x06 0x7F; 123 | 0x80 0xB4 0x09 0x00 0x20 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x0C 0x05 0x04 0x05 0x03 0x03 0x08 0x05 0x04 0x05 0x03 0x03 0x04 0x05 0x07 0x1D 0x7F; 124 | 0x80 0xB4 0x09 0x00 0x20 0x04 0x08 0x09 0x09 0x12 0x04 0x08 0x09 0x09 0x09 0x10 0x0B 0x0D 0x0B 0x07 0x09 0x0C 0x0B 0x0A 0x05 0x04 0x05 0x03 0x03 0x08 0x05 0x04 0x05 0x03 0x03 0x04 0x05 0x7F; 125 | 0x80 0xB4 0x09 0x00 0x20 0x07 0x1D 0x04 0x08 0x09 0x09 0x12 0x04 0x09 0x05 0x06 0x09 0x09 0x09 0x10 0x0B 0x0D 0x0B 0x07 0x09 0x0C 0x0B 0x07 0x04 0x07 0x07 0x03 0x06 0x04 0x03 0x07 0x07 0x7F; 126 | 0x80 0xB4 0x09 0x00 0x20 0x05 0x35 0x0A 0x07 0x06 0x0C 0x0E 0x0E 0x08 0x07 0x04 0x06 0x04 0x06 0x04 0x07 0x0B 0x03 0x07 0x05 0x04 0x07 0x04 0x0B 0x09 0x07 0x06 0x6B 0x07 0x07 0x06 0x05 0x7F; 127 | 0x80 0xB4 0x09 0x00 0x04 0x70 0x07 0x07 0x04 0x7F; 128 | 0x80 0xBC 0x09 0x00 0x00 0x7F; 129 | 130 | 0x80 0xBA 0x00 0x00 0x00 0x7F; 131 | 132 | // Select the installer applet 133 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 134 | 135 | // Create U2FToken 136 | 0x80 0xB8 0x00 0x00 0x0a 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x00 0x7F; 137 | 138 | // Select U2FToken 139 | 0x00 0xa4 0x04 0x00 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x7F; 140 | 141 | // send 0010000000 142 | 0x00 0x10 0x00 0x00 0x00 0x7f; 143 | 144 | // send register 145 | 0x00 0x01 0x00 0x00 0x00 0x7f; -------------------------------------------------------------------------------- /src/default.scr: -------------------------------------------------------------------------------- 1 | powerup; 2 | 3 | // Select the installer applet 4 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 5 | 6 | 0x80 0xB0 0x00 0x00 0x00 0x7F; 7 | 8 | // com/esec/u2ftoken/javacard/Header.cap 9 | 0x80 0xB2 0x01 0x00 0x00 0x7F; 10 | 0x80 0xB4 0x01 0x00 0x14 0x01 0x00 0x11 0xDE 0xCA 0xFF 0xED 0x01 0x02 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x7F; 11 | 0x80 0xBC 0x01 0x00 0x00 0x7F; 12 | 13 | // com/esec/u2ftoken/javacard/Directory.cap 14 | 0x80 0xB2 0x02 0x00 0x00 0x7F; 15 | 0x80 0xB4 0x02 0x00 0x20 0x02 0x00 0x1F 0x00 0x11 0x00 0x1F 0x00 0x0C 0x00 0x29 0x00 0xF6 0x00 0x4C 0x05 0x30 0x01 0xFF 0x00 0xB5 0x00 0x00 0x02 0x89 0x00 0x12 0x00 0x07 0x01 0xE0 0x04 0x7F; 16 | 0x80 0xB4 0x02 0x00 0x02 0x01 0x00 0x7F; 17 | 0x80 0xBC 0x02 0x00 0x00 0x7F; 18 | 19 | // com/esec/u2ftoken/javacard/Import.cap 20 | 0x80 0xB2 0x04 0x00 0x00 0x7F; 21 | 0x80 0xB4 0x04 0x00 0x20 0x04 0x00 0x29 0x04 0x00 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x00 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x01 0x02 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x7F; 22 | 0x80 0xB4 0x04 0x00 0x0C 0x01 0x01 0x03 0x01 0x07 0xA0 0x00 0x00 0x00 0x62 0x02 0x01 0x7F; 23 | 0x80 0xBC 0x04 0x00 0x00 0x7F; 24 | 25 | // com/esec/u2ftoken/javacard/Applet.cap 26 | 0x80 0xB2 0x03 0x00 0x00 0x7F; 27 | 0x80 0xB4 0x03 0x00 0x0F 0x03 0x00 0x0C 0x01 0x08 0xA0 0x00 0x00 0x06 0x47 0x2F 0x00 0x01 0x02 0xD9 0x7F; 28 | 0x80 0xBC 0x03 0x00 0x00 0x7F; 29 | 30 | // com/esec/u2ftoken/javacard/Class.cap 31 | 0x80 0xB2 0x06 0x00 0x00 0x7F; 32 | 0x80 0xB4 0x06 0x00 0x20 0x06 0x00 0x4C 0x00 0x80 0x00 0x02 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x01 0x03 0x00 0x00 0x00 0x67 0x00 0x70 0x00 0x77 0x00 0x80 0x00 0x7F; 33 | 0x80 0xB4 0x06 0x00 0x20 0x00 0xFF 0x00 0x01 0x00 0x00 0x00 0x00 0x80 0x00 0x03 0x00 0x02 0x01 0x01 0x00 0x00 0x01 0xDF 0x00 0x80 0x00 0x01 0x00 0x01 0x01 0x01 0x00 0x00 0x02 0x79 0x00 0x7F; 34 | 0x80 0xB4 0x06 0x00 0x0F 0x82 0x03 0x03 0x00 0x03 0x07 0x03 0x00 0x00 0x02 0xE6 0x03 0xC9 0x04 0x4D 0x7F; 35 | 0x80 0xBC 0x06 0x00 0x00 0x7F; 36 | 37 | // com/esec/u2ftoken/javacard/Method.cap 38 | 0x80 0xB2 0x07 0x00 0x00 0x7F; 39 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x05 0x30 0x0A 0x00 0x87 0x80 0x0C 0x00 0x95 0x00 0x19 0x02 0x00 0x80 0x08 0x02 0x0A 0x00 0x19 0x02 0x21 0x80 0x0D 0x02 0x30 0x00 0x1F 0x02 0x43 0x80 0x10 0x7F; 40 | 0x80 0xB4 0x07 0x00 0x20 0x02 0x55 0x00 0x19 0x02 0x7E 0x80 0x08 0x02 0x88 0x00 0x19 0x02 0xA5 0x80 0x0D 0x02 0xB4 0x00 0x1F 0x03 0x24 0x80 0x07 0x03 0x2D 0x00 0x19 0x04 0x55 0x80 0x10 0x7F; 41 | 0x80 0xB4 0x07 0x00 0x20 0x04 0x67 0x00 0x19 0x04 0xEF 0x80 0x08 0x04 0xF9 0x00 0x19 0x05 0x0F 0x80 0x0F 0x05 0x20 0x00 0x1F 0x01 0x10 0x18 0x8C 0x00 0x18 0x7A 0x02 0x30 0x18 0x8C 0x00 0x7F; 42 | 0x80 0xB4 0x07 0x00 0x20 0x17 0x18 0x1D 0x88 0x00 0x18 0x1E 0x88 0x01 0x7A 0x02 0x20 0x18 0x1D 0x90 0x0B 0x87 0x02 0x7A 0x02 0x20 0x18 0x19 0x87 0x02 0x7A 0x01 0x10 0xAD 0x02 0x77 0x01 0x7F; 43 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x18 0x8C 0x00 0x18 0x7A 0x04 0x03 0x01 0x2B 0x8F 0x00 0x23 0x3D 0x08 0x11 0x00 0x80 0x8C 0x00 0x28 0x2B 0x70 0x0C 0x2C 0x19 0x8B 0x00 0x3A 0x31 0x1E 0x8D 0x7F; 44 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x3C 0x18 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x2C 0x18 0x8B 0x00 0x0C 0x94 0x00 0x00 0x0D 0x2D 0x19 0x7B 0x00 0x0E 0x03 0x03 0x8E 0x04 0x00 0x0B 0x04 0x19 0x7F; 45 | 0x80 0xB4 0x07 0x00 0x20 0x7B 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0B 0x07 0x19 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0B 0x08 0x19 0x7B 0x00 0x11 0x03 0x03 0x8E 0x04 0x00 0x0B 0x09 0x7F; 46 | 0x80 0xB4 0x07 0x00 0x20 0x19 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x0B 0x0A 0x1A 0x7B 0x00 0x0E 0x03 0x03 0x8E 0x04 0x00 0x0D 0x04 0x1A 0x7B 0x00 0x0F 0x03 0x03 0x8E 0x04 0x00 0x0D 0x7F; 47 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x1A 0x7B 0x00 0x10 0x03 0x03 0x8E 0x04 0x00 0x0D 0x08 0x1A 0x7B 0x00 0x11 0x03 0x03 0x8E 0x04 0x00 0x0D 0x09 0x1A 0x7B 0x00 0x12 0x03 0x03 0x8E 0x04 0x00 0x7F; 48 | 0x80 0xB4 0x07 0x00 0x20 0x0D 0x0A 0x18 0x77 0x03 0x10 0x1C 0x04 0x6B 0x1A 0x7B 0x00 0x13 0x66 0x06 0x7B 0x00 0x13 0x77 0x8F 0x00 0x14 0x3D 0x04 0x8C 0x00 0x15 0x7F 0x00 0x13 0x7B 0x00 0x7F; 49 | 0x80 0xB4 0x07 0x00 0x20 0x13 0x77 0x1C 0x05 0x6B 0x1A 0x7B 0x00 0x16 0x66 0x06 0x7B 0x00 0x16 0x77 0x8F 0x00 0x14 0x3D 0x05 0x8C 0x00 0x15 0x7F 0x00 0x16 0x7B 0x00 0x16 0x77 0x8F 0x00 0x7F; 50 | 0x80 0xB4 0x07 0x00 0x20 0x14 0x3D 0x1C 0x8C 0x00 0x15 0x77 0x04 0x21 0x18 0x8C 0x00 0x18 0x18 0x03 0x88 0x03 0x18 0x01 0x87 0x04 0x18 0x01 0x87 0x05 0x18 0x1D 0x88 0x03 0xAE 0x03 0x05 0x7F; 51 | 0x80 0xB4 0x07 0x00 0x20 0x6B 0x2B 0x18 0x06 0x10 0x40 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1B 0x87 0x04 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0x7F; 52 | 0x80 0xB4 0x07 0x00 0x20 0xAD 0x04 0x1A 0x03 0x8E 0x03 0x00 0x1B 0x05 0x70 0x38 0xAE 0x03 0x04 0x6B 0x2D 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x05 0x7F; 53 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x05 0x1A 0x03 0x8E 0x03 0x00 0x1E 0x04 0x70 0x08 0x11 0x6A 0x80 0x8D 0x00 0x7F; 54 | 0x80 0xB4 0x07 0x00 0x20 0x3C 0x7A 0x06 0x73 0x01 0x28 0x07 0xAE 0x03 0x05 0x6B 0x14 0x06 0x03 0x8D 0x00 0x20 0x28 0x07 0x15 0x07 0xAD 0x04 0x16 0x06 0x8B 0x00 0x21 0x70 0x28 0xAE 0x03 0x7F; 55 | 0x80 0xB4 0x07 0x00 0x20 0x04 0x6B 0x23 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x10 0x28 0x08 0x15 0x08 0x8B 0x00 0x3A 0x29 0x09 0x16 0x09 0x8D 0x00 0x3C 0x15 0x07 0xAD 0x05 0x16 0x7F; 56 | 0x80 0xB4 0x07 0x00 0x20 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x08 0x11 0x6A 0x80 0x8D 0x00 0x3C 0x7A 0x04 0x22 0x18 0x8C 0x7F; 57 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x18 0x18 0x01 0x87 0x06 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x06 0x70 0x0C 0x2D 0x1A 0x8B 0x00 0x3A 0x32 0x1F 0x8D 0x7F; 58 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x3C 0x10 0x10 0x05 0x8D 0x00 0x1C 0x2D 0x1A 0x03 0x1A 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x06 0x1A 0x03 0x8E 0x03 0x00 0x1E 0x04 0x7A 0x06 0x73 0x01 0x28 0x7F; 59 | 0x80 0xB4 0x07 0x00 0x20 0x07 0x10 0x0E 0x03 0x8D 0x00 0x20 0x28 0x07 0x70 0x16 0x28 0x08 0x8D 0x00 0x24 0x8D 0x00 0x3C 0x15 0x08 0x8B 0x00 0x3A 0x29 0x09 0x16 0x09 0x8D 0x00 0x3C 0x15 0x7F; 60 | 0x80 0xB4 0x07 0x00 0x20 0x07 0xAD 0x06 0x16 0x06 0x8B 0x00 0x21 0x15 0x07 0x19 0x1E 0x1F 0x15 0x04 0x16 0x05 0x8B 0x00 0x22 0x3B 0x70 0x0A 0x28 0x08 0x11 0x6A 0x80 0x8D 0x00 0x3C 0x7A 0x7F; 61 | 0x80 0xB4 0x07 0x00 0x20 0x05 0x10 0x18 0x8C 0x00 0x25 0x18 0x8F 0x00 0x26 0x3D 0x10 0xEF 0x04 0x8C 0x00 0x27 0x87 0x07 0xAD 0x07 0x7B 0x00 0x29 0x8B 0x00 0x2A 0x7A 0x02 0x30 0x8F 0x00 0x7F; 62 | 0x80 0xB4 0x07 0x00 0x20 0x2B 0x3D 0x8C 0x00 0x2C 0x8B 0x00 0x2D 0x7A 0x06 0x27 0x18 0x8B 0x00 0x2E 0x60 0x08 0x18 0x19 0x8C 0x00 0x2F 0x7A 0x19 0x8B 0x00 0x30 0x2D 0x1A 0x03 0x25 0x32 0x7F; 63 | 0x80 0xB4 0x07 0x00 0x20 0x1A 0x05 0x25 0x29 0x04 0x1A 0x06 0x25 0x29 0x05 0x1A 0x07 0x25 0x11 0x00 0xFF 0x53 0x29 0x06 0x1A 0x04 0x25 0x75 0x00 0x4C 0x00 0x03 0x00 0x01 0x00 0x3E 0x00 0x7F; 64 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x00 0x11 0x00 0x20 0x00 0x3C 0x10 0x0D 0x03 0x8D 0x00 0x20 0x3B 0x70 0x16 0x28 0x07 0x8D 0x00 0x24 0x8D 0x00 0x3C 0x15 0x07 0x8B 0x00 0x3A 0x29 0x08 0x16 0x7F; 65 | 0x80 0xB4 0x07 0x00 0x20 0x08 0x8D 0x00 0x3C 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8B 0x00 0x31 0x70 0x18 0x70 0x16 0x18 0x19 0x1F 0x16 0x04 0x16 0x05 0x16 0x06 0x8C 0x00 0x32 0x7F; 66 | 0x80 0xB4 0x07 0x00 0x20 0x70 0x08 0x11 0x6D 0x00 0x8D 0x00 0x3C 0x7A 0x05 0x21 0x19 0x8B 0x00 0x30 0x2D 0x7B 0x00 0x33 0x03 0x1A 0x03 0x7B 0x00 0x33 0x92 0x8D 0x00 0x34 0x3B 0x19 0x03 0x7F; 67 | 0x80 0xB4 0x07 0x00 0x20 0x7B 0x00 0x33 0x92 0x8B 0x00 0x35 0x7A 0x03 0x64 0x19 0x8B 0x00 0x30 0x28 0x06 0x1E 0x60 0x08 0x11 0x6E 0x00 0x8D 0x00 0x3C 0x8D 0x00 0x36 0x28 0x07 0x15 0x07 0x7F; 68 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x37 0x15 0x07 0x8B 0x00 0x0C 0x94 0x00 0x00 0x0D 0x28 0x08 0x15 0x07 0x8B 0x00 0x0A 0x94 0x00 0x00 0x0B 0x28 0x09 0x15 0x08 0x15 0x06 0x03 0x8E 0x03 0x7F; 69 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x0D 0x10 0x3B 0x19 0x03 0x10 0x20 0x8B 0x00 0x35 0x7A 0x07 0x62 0x19 0x8B 0x00 0x30 0x28 0x06 0x18 0x8F 0x00 0x38 0x3D 0x04 0x8C 0x00 0x39 0x87 0x08 0x10 0x7F; 70 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x90 0x0B 0x3D 0x03 0x03 0x38 0x3D 0x04 0x04 0x38 0x3D 0x05 0x05 0x38 0x3D 0x06 0x06 0x38 0x3D 0x07 0x07 0x38 0x3D 0x08 0x08 0x38 0x3D 0x10 0x06 0x10 0x06 0x7F; 71 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x10 0x07 0x10 0x07 0x38 0x3D 0x10 0x08 0x10 0x08 0x38 0x3D 0x10 0x09 0x10 0x09 0x38 0x3D 0x10 0x0A 0x10 0x0A 0x38 0x3D 0x10 0x0B 0x10 0x0B 0x38 0x3D 0x7F; 72 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x0C 0x10 0x0C 0x38 0x3D 0x10 0x0D 0x10 0x0D 0x38 0x3D 0x10 0x0E 0x10 0x0E 0x38 0x3D 0x10 0x0F 0x10 0x0F 0x38 0x28 0x07 0xAD 0x08 0x15 0x07 0x03 0x15 0x07 0x7F; 73 | 0x80 0xB4 0x07 0x00 0x20 0x92 0x15 0x06 0x03 0x04 0x8B 0x00 0x3B 0x19 0x03 0x10 0x30 0x8B 0x00 0x35 0x7A 0x06 0x66 0x19 0x8B 0x00 0x30 0x28 0x06 0x18 0x10 0x0F 0x11 0x00 0x80 0x03 0x8D 0x7F; 74 | 0x80 0xB4 0x07 0x00 0x20 0x00 0x1A 0x94 0x00 0x00 0x1E 0x87 0x09 0x70 0x10 0x28 0x07 0x15 0x07 0x8B 0x00 0x3A 0x29 0x08 0x16 0x08 0x8D 0x00 0x3C 0x10 0x10 0x05 0x8D 0x00 0x1C 0x28 0x07 0x7F; 75 | 0x80 0xB4 0x07 0x00 0x20 0x15 0x07 0x03 0x15 0x07 0x92 0x03 0x8D 0x00 0x1D 0x3B 0xAD 0x09 0x15 0x07 0x03 0x8E 0x03 0x00 0x1E 0x04 0x10 0x10 0x90 0x0B 0x3D 0x03 0x03 0x38 0x3D 0x04 0x04 0x7F; 76 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x05 0x05 0x38 0x3D 0x06 0x06 0x38 0x3D 0x07 0x07 0x38 0x3D 0x08 0x08 0x38 0x3D 0x10 0x06 0x10 0x06 0x38 0x3D 0x10 0x07 0x10 0x07 0x38 0x3D 0x10 0x08 0x7F; 77 | 0x80 0xB4 0x07 0x00 0x20 0x10 0x08 0x38 0x3D 0x10 0x09 0x10 0x09 0x38 0x3D 0x10 0x0A 0x10 0x0A 0x38 0x3D 0x10 0x0B 0x10 0x0B 0x38 0x3D 0x10 0x0C 0x10 0x0C 0x38 0x3D 0x10 0x0D 0x10 0x0D 0x7F; 78 | 0x80 0xB4 0x07 0x00 0x20 0x38 0x3D 0x10 0x0E 0x10 0x0E 0x38 0x3D 0x10 0x0F 0x10 0x0F 0x38 0x28 0x08 0x01 0x28 0x09 0x10 0x0D 0x03 0x8D 0x00 0x20 0x28 0x09 0x70 0x10 0x28 0x0A 0x15 0x0A 0x7F; 79 | 0x80 0xB4 0x07 0x00 0x20 0x8B 0x00 0x3A 0x29 0x0B 0x16 0x0B 0x8D 0x00 0x3C 0x15 0x09 0xAD 0x09 0x05 0x8B 0x00 0x21 0x15 0x09 0x15 0x08 0x03 0x15 0x08 0x92 0x15 0x06 0x03 0x8B 0x00 0x22 0x7F; 80 | 0x80 0xB4 0x07 0x00 0x13 0x3B 0x70 0x0A 0x28 0x0A 0x11 0x6A 0x80 0x8D 0x00 0x3C 0x19 0x03 0x10 0x30 0x8B 0x00 0x35 0x7A 0x7F; 81 | 0x80 0xBC 0x07 0x00 0x00 0x7F; 82 | 83 | // com/esec/u2ftoken/javacard/StaticField.cap 84 | 0x80 0xB2 0x08 0x00 0x00 0x7F; 85 | 0x80 0xB4 0x08 0x00 0x20 0x08 0x01 0xFF 0x00 0x12 0x00 0x09 0x00 0x07 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 86 | 0x80 0xB4 0x08 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F; 87 | 0x80 0xB4 0x08 0x00 0x20 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFC 0x03 0x00 0x20 0x5A 0xC6 0x35 0xD8 0xAA 0x3A 0x93 0xE7 0xB3 0xEB 0xBD 0x55 0x76 0x98 0x7F; 88 | 0x80 0xB4 0x08 0x00 0x20 0x86 0xBC 0x65 0x1D 0x06 0xB0 0xCC 0x53 0xB0 0xF6 0x3B 0xCE 0x3C 0x3E 0x27 0xD2 0x60 0x4B 0x03 0x00 0x41 0x04 0x6B 0x17 0xD1 0xF2 0xE1 0x2C 0x42 0x47 0xF8 0xBC 0x7F; 89 | 0x80 0xB4 0x08 0x00 0x20 0xE6 0xE5 0x63 0xA4 0x40 0xF2 0x77 0x03 0x7D 0x81 0x2D 0xEB 0x33 0xA0 0xF4 0xA1 0x39 0x45 0xD8 0x98 0xC2 0x96 0x4F 0xE3 0x42 0xE2 0xFE 0x1A 0x7F 0x9B 0x8E 0xE7 0x7F; 90 | 0x80 0xB4 0x08 0x00 0x20 0xEB 0x4A 0x7C 0x0F 0x9E 0x16 0x2B 0xCE 0x33 0x57 0x6B 0x31 0x5E 0xCE 0xCB 0xB6 0x40 0x68 0x37 0xBF 0x51 0xF5 0x03 0x00 0x20 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x7F; 91 | 0x80 0xB4 0x08 0x00 0x20 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xBC 0xE6 0xFA 0xAD 0xA7 0x17 0x9E 0x84 0xF3 0xB9 0xCA 0xC2 0xFC 0x63 0x25 0x51 0x03 0x00 0x06 0x55 0x32 0x46 0x5F 0x7F; 92 | 0x80 0xB4 0x08 0x00 0x20 0x56 0x32 0x03 0x01 0x19 0x30 0x82 0x01 0x15 0x30 0x81 0xBC 0x02 0x09 0x00 0xC5 0xF4 0xEE 0x4C 0x59 0x50 0x3E 0x05 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x7F; 93 | 0x80 0xB4 0x08 0x00 0x20 0x04 0x03 0x02 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x1E 0x17 0x0D 0x31 0x35 0x31 0x32 0x7F; 94 | 0x80 0xB4 0x08 0x00 0x20 0x30 0x39 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x17 0x0D 0x31 0x36 0x31 0x32 0x30 0x38 0x30 0x37 0x30 0x34 0x35 0x38 0x5A 0x30 0x13 0x31 0x11 0x30 0x0F 0x06 0x03 0x7F; 95 | 0x80 0xB4 0x08 0x00 0x20 0x55 0x04 0x03 0x13 0x08 0x59 0x61 0x6E 0x67 0x5A 0x68 0x6F 0x75 0x30 0x59 0x30 0x13 0x06 0x07 0x2A 0x86 0x48 0xCE 0x3D 0x02 0x01 0x06 0x08 0x2A 0x86 0x48 0xCE 0x7F; 96 | 0x80 0xB4 0x08 0x00 0x20 0x3D 0x03 0x01 0x07 0x03 0x42 0x00 0x04 0x72 0x9A 0x71 0xD0 0x81 0x62 0x42 0x84 0x92 0xF2 0xD9 0x61 0x92 0x4D 0x37 0x44 0x3A 0x4F 0x1B 0xDA 0x58 0x0F 0x8A 0xEA 0x7F; 97 | 0x80 0xB4 0x08 0x00 0x20 0x29 0x20 0xD2 0x99 0x7C 0xBE 0xA4 0x39 0x60 0xCE 0x72 0x9E 0x35 0xC1 0xF7 0x40 0x92 0xF2 0x25 0x0E 0x60 0x74 0x82 0x3F 0xC5 0x7F 0x33 0x60 0xB7 0xCD 0x39 0x69 0x7F; 98 | 0x80 0xB4 0x08 0x00 0x20 0xC3 0xC3 0x12 0x5E 0xCE 0x26 0x5C 0x29 0x30 0x0A 0x06 0x08 0x2A 0x86 0x48 0xCE 0x3D 0x04 0x03 0x02 0x03 0x48 0x00 0x30 0x45 0x02 0x21 0x00 0xE7 0x67 0xFA 0x94 0x7F; 99 | 0x80 0xB4 0x08 0x00 0x20 0x10 0x35 0xD5 0x85 0x3D 0x52 0xD8 0x7D 0x67 0x14 0x70 0xBC 0x76 0x3B 0xC5 0xB1 0x2E 0x1D 0x45 0x77 0xEA 0x9F 0x8C 0xA6 0x74 0xE5 0x9D 0x39 0x02 0x20 0x3F 0xE1 0x7F; 100 | 0x80 0xB4 0x08 0x00 0x20 0x1C 0xAD 0x59 0xF5 0x35 0x76 0x00 0x1F 0x15 0xEE 0x05 0xDA 0x87 0x46 0xFE 0xD3 0x27 0x6B 0x16 0x82 0x9E 0x9D 0x5E 0xFD 0xFF 0x70 0x5E 0x08 0x9C 0x6D 0x00 0x00 0x7F; 101 | 0x80 0xB4 0x08 0x00 0x02 0x00 0x00 0x7F; 102 | 0x80 0xBC 0x08 0x00 0x00 0x7F; 103 | 104 | // com/esec/u2ftoken/javacard/ConstantPool.cap 105 | 0x80 0xB2 0x05 0x00 0x00 0x7F; 106 | 0x80 0xB4 0x05 0x00 0x20 0x05 0x00 0xF6 0x00 0x3D 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x01 0x02 0x00 0x0A 0x00 0x02 0x00 0x24 0x02 0x02 0x00 0x24 0x00 0x02 0x00 0x24 0x01 0x02 0x00 0x30 0x7F; 107 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x02 0x00 0x3C 0x00 0x02 0x00 0x3C 0x01 0x02 0x00 0x3C 0x02 0x03 0x81 0x10 0x02 0x01 0x81 0x12 0x00 0x03 0x81 0x10 0x03 0x01 0x81 0x13 0x00 0x05 0x00 0x00 0x7F; 108 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x05 0x00 0x00 0x02 0x05 0x00 0x00 0x04 0x05 0x00 0x00 0x06 0x05 0x00 0x00 0x08 0x05 0x00 0x00 0x10 0x01 0x00 0x24 0x00 0x06 0x00 0x01 0x64 0x05 0x00 0x00 0x7F; 109 | 0x80 0xB4 0x05 0x00 0x20 0x0E 0x06 0x00 0x00 0x51 0x06 0x80 0x00 0x00 0x01 0x81 0x0C 0x00 0x06 0x81 0x0D 0x00 0x01 0x81 0x0A 0x00 0x06 0x82 0x08 0x0D 0x06 0x82 0x10 0x03 0x01 0x81 0x14 0x7F; 110 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x01 0x80 0x02 0x00 0x06 0x83 0x01 0x00 0x03 0x83 0x01 0x03 0x03 0x83 0x01 0x01 0x01 0x81 0x10 0x00 0x06 0x82 0x08 0x09 0x06 0x82 0x03 0x00 0x01 0x00 0x0A 0x7F; 111 | 0x80 0xB4 0x05 0x00 0x20 0x00 0x06 0x00 0x00 0x58 0x06 0x81 0x10 0x00 0x05 0x00 0x00 0x0C 0x03 0x00 0x0A 0x02 0x01 0x00 0x3C 0x00 0x06 0x00 0x02 0xBD 0x03 0x82 0x03 0x01 0x03 0x82 0x03 0x7F; 112 | 0x80 0xB4 0x05 0x00 0x20 0x03 0x06 0x00 0x03 0x66 0x03 0x82 0x0A 0x01 0x03 0x00 0x3C 0x09 0x06 0x00 0x03 0x85 0x05 0x00 0x00 0x0A 0x06 0x82 0x10 0x02 0x03 0x82 0x0A 0x08 0x06 0x00 0x00 0x7F; 113 | 0x80 0xB4 0x05 0x00 0x19 0x83 0x03 0x81 0x10 0x01 0x01 0x00 0x30 0x00 0x06 0x00 0x02 0x39 0x03 0x81 0x0C 0x01 0x03 0x00 0x30 0x01 0x06 0x82 0x07 0x01 0x7F; 114 | 0x80 0xBC 0x05 0x00 0x00 0x7F; 115 | 116 | // com/esec/u2ftoken/javacard/RefLocation.cap 117 | 0x80 0xB2 0x09 0x00 0x00 0x7F; 118 | 0x80 0xB4 0x09 0x00 0x20 0x09 0x00 0xB5 0x00 0x1F 0x61 0x04 0x09 0x07 0x05 0xF3 0x04 0x04 0x04 0x02 0x11 0x12 0x0B 0x13 0x12 0x17 0x0E 0x09 0x1F 0x27 0x10 0x1E 0x2F 0x30 0x02 0xFF 0x0B 0x7F; 119 | 0x80 0xB4 0x09 0x00 0x20 0x5C 0x2D 0x25 0x81 0x00 0x92 0x07 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x06 0x07 0x24 0x08 0x08 0x08 0x05 0x04 0x04 0x05 0x04 0x05 0x06 0x05 0x06 0x05 0x7F; 120 | 0x80 0xB4 0x09 0x00 0x20 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x05 0x06 0x0C 0x05 0x04 0x05 0x03 0x03 0x08 0x05 0x04 0x05 0x03 0x03 0x04 0x05 0x07 0x1D 0x04 0x7F; 121 | 0x80 0xB4 0x09 0x00 0x20 0x08 0x09 0x09 0x12 0x04 0x08 0x09 0x09 0x09 0x10 0x0B 0x0D 0x0B 0x07 0x09 0x0C 0x0B 0x07 0x0E 0x04 0x09 0x05 0x06 0x09 0x09 0x0D 0x09 0x03 0x05 0x07 0x09 0x0C 0x7F; 122 | 0x80 0xB4 0x09 0x00 0x20 0x0B 0x07 0x04 0x07 0x07 0x03 0x06 0x04 0x03 0x07 0x07 0x05 0x32 0x08 0x03 0x05 0x07 0x0C 0x10 0x08 0x07 0x04 0x06 0x04 0x06 0x04 0x07 0x0B 0x03 0x07 0x05 0x04 0x7F; 123 | 0x80 0xB4 0x09 0x00 0x18 0x07 0x04 0x0B 0x09 0x07 0x06 0x05 0x6B 0x07 0x07 0x0C 0x04 0x0B 0x07 0x06 0x0C 0x0A 0x64 0x0B 0x07 0x08 0x0E 0x0B 0x07 0x7F; 124 | 0x80 0xBC 0x09 0x00 0x00 0x7F; 125 | 126 | 0x80 0xBA 0x00 0x00 0x00 0x7F; 127 | 128 | // Select the installer applet 129 | 0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F; 130 | 131 | // Create U2FToken 132 | 0x80 0xB8 0x00 0x00 0x0a 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x00 0x7F; 133 | 134 | // Select U2FToken 135 | 0x00 0xa4 0x04 0x00 0x08 0xa0 0x0 0x0 0x6 0x47 0x2f 0x0 0x1 0x7F; 136 | 137 | // send 0010000000 138 | 0x00 0x10 0x00 0x00 0x00 0x7f; 139 | 140 | // send register 141 | 0x00 0x01 0x00 0x00 0x00 0x7f; -------------------------------------------------------------------------------- /src/jcardsim-2.2.2-all.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/jcardsim-2.2.2-all.jar -------------------------------------------------------------------------------- /src/jcardsim-3.0.4-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fightyz/U2FToken/1a264d4c287687883af18a12d4abcb1b32652469/src/jcardsim-3.0.4-SNAPSHOT.jar -------------------------------------------------------------------------------- /src/jcardsim.cfg: -------------------------------------------------------------------------------- 1 | com.licel.jcardsim.card.applet.0.AID=A0000006472F0001 2 | com.licel.jcardsim.card.applet.0.Class=com.esec.u2ftoken.U2FToken -------------------------------------------------------------------------------- /src/output.txt: -------------------------------------------------------------------------------- 1 | CLA: 80, INS: b8, P1: 00, P2: 00, Lc: 0a, 08, a0, 00, 00, 06, 47, 2f, 00, 01, 00, Le: 08, a0, 00, 00, 06, 47, 2f, 00, 01, SW1: 90, SW2: 00 2 | CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 08, a0, 00, 00, 06, 47, 2f, 00, 01, Le: 06, 55, 32, 46, 5f, 56, 32, SW1: 90, SW2: 00 3 | CLA: 00, INS: 10, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 00, SW2: 03 4 | --------------------------------------------------------------------------------