我想使用 IntelliJ IDEA 进行 JavaCard 2.2.1 开发。javacard 转换器要求类文件主版本为 46。
所以我的问题是如何将类文件兼容设置为 1.2(这将生成主要版本为 46 的类文件)?
以下是供您参考的类文件版本:
主要次要 Java 平台版本 45 3 1.0 45 3 1.1 46 0 1.2 47 0 1.3 48 0 1.4 49 0 1.5 50 0 1.6
下面,您会看到一个java卡程序,它在收到APDU Command = 8000000000(其来源)时返回"Hello Word"
package helloWorldPackage;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Util;
public class HelloWorldApplet extends Applet
{
private static final byte[] helloWorld = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};
private static final byte HW_CLA = (byte)0x80;
private static final byte HW_INS = (byte)0x00;
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buffer = apdu.getBuffer(); …Run Code Online (Sandbox Code Playgroud) 我在同一张智能卡上有2张小卡片,我想要进行通信.
我可以选择一个小程序,然后发送相应的APDU,然后取消选择它并选择另一个等..我想知道是否有可能做到这一点 更正确 与逻辑信道?我的意思是使用一种方法可以让我不为每个APDU命令选择/取消选择每个applet?
先感谢您 :)
我在javacard applet中声明BigNumber数据类型时遇到了问题.如果我只是评论声明,applet正确加载到模拟器中.问题的确切原因是加载import.cap文件时(jcshell:错误代码:6a80(数据错误))
java卡套件2.2.2使用
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
import javacardx.framework.math.BigNumber;
public class LargeBal extends Applet {
// CLA byte
public static final byte BANK_CLA = (byte) 0x80;
// INS byte
public static final byte INS_GET_BALANCE = 0X02;
public static final byte INS_CREDIT = 0X04;
public static final byte INS_DEBIT = 0X06;
/**
* SW bytes for Arithmetic exception
*/
final static short INVALID_NUMBER_FORMAT = 0x6308;
/**
* Initial account balance
*/
final static byte[] INITIAL_ACCOUNT_BALANCE …Run Code Online (Sandbox Code Playgroud) 我知道GP Shell是一个测试Java卡I/O的工具.
但是,使用起来非常麻烦.
有没有GP Shell的替代品,不需要编写脚本?
我试图从传入的智能卡APDU读取数据并返回相同的传入消息,同时还将ASCII字"响应"附加到消息的前面.我正在获得一个6F00地位.我该如何修复代码?
我的代码:
private void repeat(APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setIncomingAndReceive();
byte[] incomingMsg = getData(buffer);
if ((short) incomingMsg.length != (short) 0) {
apdu.setOutgoing();
// Send back the "respond " + "<incoming message" back
byte[] respMsg = {0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x20};
byte[] outgoingMsg = new byte[(short) (incomingMsg.length + respMsg.length)];
ArrayLogic.arrayCopyRepack(respMsg, (short) 0, (short) respMsg.length, outgoingMsg, (short) 0);
ArrayLogic.arrayCopyRepack(incomingMsg, (short) 0, (short) incomingMsg.length, outgoingMsg, (short) respMsg.length);
buffer = outgoingMsg;
apdu.setOutgoingAndSend((short) 0, (short) outgoingMsg.length);
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个javacard,它安装了2个小程序.现在我想从两者中选择一个.目前我的工作方式是,我提供applet的cap文件,我从中得到它的AID.但我发现这种方法并不令人满意.所以
我正在编写Java Applet.我需要RSAPrivateCrtKey使用APDU Command 上传预生成到applet.
在我的电脑里,我正在生成密钥.接下来我将此密钥序列化为privateKeyBuffer:
keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_512);
keyPair.genKeyPair();
rsaPrivateKey = (RSAPrivateCrtKey) keyPair.getPrivate();
byte[] privateKeyBuffer = new byte[165];
short lengthDP1 = rsaPrivateKey.getDP1(privateKeyBuffer, 0);
offset += lengthDP1;
short lengthDQ1 = rsaPrivateKey.getDQ1(privateKeyBuffer, offset);
offset += lengthDQ1;
short lengthP = rsaPrivateKey.getP(privateKeyBuffer, offset);
offset += lengthP;
short lengthQ = rsaPrivateKey.getQ(privateKeyBuffer, offset);
offset += lengthQ;
short lengthPQ = rsaPrivateKey.getPQ(privateKeyBuffer, offset);
Run Code Online (Sandbox Code Playgroud)
生成缓冲区后,我应该将每个数组元素转换为十六进制,然后使用APDU发送,最后在applet中恢复我的私钥,但是privateKeyBuffer我们有负数:
37,65,-96,-110,38,6,-2,73,-37,28,120,-90... (etc)
Run Code Online (Sandbox Code Playgroud)
我应该如何将它们转换为十六进制并保持APDU正确(因为我知道只允许正数)或者可能有另一种方法将密钥推送到JavaCard?
有任何想法吗?
一些智能卡支持SCP 01和SCP02是什么意思?以及如何在这两者之间做出选择?它是在安全域中预定义还是有一些命令可以选择一个或其他选择?
我在我的Java卡和我的SAM中的另一个applet中编写了一个applet.我想通过发送每一侧创建的随机数来创建相互身份验证.读者的模型是:
c:\>gp.exe -all -d
# Detected readers from SunPCSC
[*] ACS ACR1281 1S Dual Reader PICC 0
[*] ACS ACR1281 1S Dual Reader SAM 0
Run Code Online (Sandbox Code Playgroud)
我在SAM上选择applet,创建随机数并发送出去.然后我选择Java卡上的applet创建随机SAM的字符串和新的随机创建卡并发送混合随机.
所以我应该再次选择SAM上的applet来检查随机,但由于我的randoms处于瞬态Clear_ON_RESET内存中,它们就消失了.
我需要瞬态CLEAR_ON_RESETMemory中的随机数.我用它gp.exe来发送APDU.
有什么方法可以选择SAM和卡吗?我想应该有办法让他们两个.