私はすでにjavax.smartcardio
スマートカードからシリアル番号をあまり苦労せずに読み取ることに慣れていました。ただし、現在、空のカードで MF を作成するように割り当てられています (これがないとシリアル番号を読み取ることができません)。ISO 7816 ガイドラインに従ってそのための APDU コマンドを作成していますが、16 進値が間違ったバイトに変換されます。
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
class SmartCardAPIs {
public int Create_MF() throws CardException{
//--Variable declaration
int result=0;
Card card=null;
byte[] responseData=null;
ResponseAPDU answer=null;
String SW1=null;
String SW2=null;
int cla, ins, p1, p2;
byte[] data=null;
//---------------------------------------------
//--1--Establish connection with the smart card
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
// Use the first terminal
CardTerminal terminal = terminals.get(0);
// Connect with the card
card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
//---------------------------------------------
//--2--Create MF
cla=0x00;
ins=0xE0;
p1=0x00;
p2=0x00;
data = new byte[] {
(byte) 0x21,
(byte) 0x62,
(byte) 0x1F,
(byte) 0x82, // **** Getting converted to -126 ****
--
--
--
};
answer = channel.transmit(new CommandAPDU(cla, ins, p1, p2, data));
responseData= answer.getBytes();
if(responseData!=null)
{
if(responseData.length==2)
{
SW1=String.format("%02X ", (responseData[0])).trim();
SW2=String.format("%02X ", (responseData[1])).trim();
}
}
}
}
2つの問題があります
1: コマンド APDU のデータが間違ったバイトを取得しています ( *としてマークされています)。
2: SW1 と SW2 が 6A 80 として返されます。これは、データ フィールドのパラメーターが正しくないことを意味します (16 進形式の int をバイトにキャストするときに負の値が原因だと思いますが、強制されているためあまり役に立ちません)。
ここに配置した部分的な APDU コマンドは、提供された完全なコマンドの一部であり、コマンドでスマート カード ツールを使用してブランク カードで MF を作成することに成功したため、コマンドは 100% OK でテストされています。 .私は今、Javaで同じことをしたい.
問題はこの APDU の作成方法にあると思いますが、負の値の問題である可能性があります (カードからシリアル番号を読み取るためのアプレットを作成しましたが、Java APDU の専門家ではありません)。