使用JCOP SDK转换CAP文件时遇“Invalid AID”错误求助
Java Card Converter 提示“Invalid AID”错误排查
问题情况
已经试过近100种不同的converter命令写法、更换不同AID、只使用小程序AID、移除版本号“1.0”等操作,但始终跳出“Invalid AID”错误。之前用其他Java版本结合XML生成过一次CAP文件,但文件大小接近400kB,明显异常。目前偏好且使用Java7环境。
使用的命令
./converter.sh \ -classdir /Users/X/Desktop/javacard/emvcoapplet/bin \ -d /Users/X/Desktop/javacard/emvcoapplet/cap \ -exportpath /Users/X/Desktop/javacard/jc320v24.0_kit/lib/api_classic-3.0.5.jar \ -applet A000000333010101 emvcoapplet.EMVCoApplet \ emvcoapplet 1.0 A0000003330102
错误信息
Error Message:error: invalid AID A000000333010101. Usage for compact CAP files: converter <options> package_name package_aid major_version.minor_version OR converter -config <filename> ...
小程序代码片段
package emvcoapplet; import javacard.framework.*; import javacard.security.*; import javacardx.crypto.*; import javacard.framework.ISO7816; import javacard.framework.ISOException; import javacard.framework.*; import javacard.security.*; import javacardx.crypto.*; public class EMVCoApplet extends Applet { private static final byte[] AID = { (byte) 0xA0, 0x00, 0x00, 0x03, 0x33, 0x01, 0x01, 0x01 }; public static void install(byte[] bArray, short bOffset, byte bLength) { new EMVCoApplet().register(AID, (short) 0, (byte) AID.length); } private EMVCoApplet() { cipherAESCBC = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false); initializePreStoredTLVStructure(); initializeKeys(); initializeOwnerPin(); } public void process(APDU apdu) throws ISOException { byte[] buffer = apdu.getBuffer(); byte cla = buffer[ISO7816.OFFSET_CLA]; byte ins = buffer[ISO7816.OFFSET_INS]; try { if (selectingApplet()) { return; } if (buffer[ISO7816.OFFSET_CLA] != CLA_EMV_APPLET) { ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); }.... } }
项目结构
emvcoapplet ├── bin │ └── emvcoapplet │ ├── EMVCoApplet$TLV.class │ └── EMVCoApplet.class ├── build.xml ├── cap ├── lib └── src └── emvcoapplet └── EMVCoApplet.java
Java Card工具包结构
jc320v24.0_kit ├── bin │ ├── capdump.bat │ ├── capdump.sh │ ├── capgen.bat │ ├── capgen.sh │ ├── converter.bat │ ├── converter.sh │ ├── exp2text.bat │ ├── exp2text.sh │ ├── verifycap.bat │ ├── verifycap.sh │ ├── verifyexp.bat │ ├── verifyexp.sh │ └── verifyrev.sh ├── legal │ └── THIRDPARTYREADME.txt └── lib ├── api_classic-3.0.4.jar ├── api_classic-3.0.5.jar ├── api_classic-3.1.0.jar ├── api_classic-3.2.0.jar ├── api_classic_annotations-3.0.4.jar ├── api_classic_annotations-3.0.5.jar ├── api_classic_annotations-3.1.0.jar ├── api_classic_annotations-3.2.0.jar ├── asm-9.4.jar ├── commons-cli-1.6.0.jar ├── commons-logging-1.3.0.jar ├── jctasks_tools.jar ├── json.jar ├── logging.properties └── tools.jar
排查方向
- 核对AID的命令行写法:命令里的AID是十六进制字符串,得确保长度在5-16字节(也就是10到32个十六进制字符)。你代码里的AID是8字节,符合要求,但仔细检查下命令里的
A000000333010101有没有打错字符,比如多了或者少了一位? - 工具包和Java7的适配:你用的是jc320v24.0_kit,搭配api_classic-3.0.5.jar,试试换成api_classic-3.0.4.jar看看会不会兼容Java7更好。有些新版本的API包可能对JDK版本要求更高,Java7跑不动也说不定。
- 命令参数别搞混顺序:converter的语法要求很严,
-applet后面必须是<小程序AID> <完整类名>,然后最后三个参数是包名 版本号 包AID,你现在的命令顺序看着是对的,但再仔细核对一遍每个参数的位置,别把包AID和小程序AID搞反了。 - 解决CAP文件过大问题:400kB的CAP肯定不对,正常都是几KB到几十KB。检查下bin目录里有没有多余的class文件,或者exportpath是不是不小心指向了JDK的jar包,而不是Java Card的核心API包——要是把JDK的类都打包进去了,文件肯定超大。
- 换用配置文件试试:命令行参数多了容易错,写个配置文件
converter.cfg,内容如下:
classdir=/Users/X/Desktop/javacard/emvcoapplet/bin destdir=/Users/X/Desktop/javacard/emvcoapplet/cap exportpath=/Users/X/Desktop/javacard/jc320v24.0_kit/lib/api_classic-3.0.5.jar applet A000000333010101 emvcoapplet.EMVCoApplet emvcoapplet 1.0 A0000003330102
然后执行./converter.sh -config converter.cfg,这样能避免命令行输入错误。
内容的提问来源于stack exchange,提问作者keepaerie
相关产品推荐
相关产品推荐

