2016-04-09 26 views
2

Bir Java Kartına basit bir APDU göndermeye çalışıyorum (aşağıdaki uygulamanın basit kodunu ekledim). Uygulamayı Eclipse simülatöründe zaten test ettim ancak bir APDU’yu APDU’ya göndermek istediğimde applet aşağıdaki hata ile başarısız olur: send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.) .Applet zaten karta yüklü (bunu yapmak için GpShell kullandım) .Bu APDU göndermek için kullandığım komut dosyasının tam çıktısıdır.Java Kartı APDU Hatası

D:\GPShell-1.4.4>GPShell.exe send_APDU.txt 
establish_context 
enable_trace 
enable_timer 
card_connect 
command time: 15 ms 
send_apdu -sc 0 -APDU b0000000010000 
Command --> B0000000010000 
Wrapped command --> B0000000010000 
Response <-- 6E00 
send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.) 
command time: 860 ms 
card_disconnect 
command time: 31 ms 
release_context 
command time: 0 ms 

İşte uygulamanın tam kodu.

public class Contor extends Applet { 

private byte contor = 0; 
private final static byte CLS=(byte)0xB0; 
private final static byte INC=(byte)0x00; 
private final static byte DEC=(byte)0x01; 
private final static byte GET=(byte)0x02; 
private final static byte INIT=(byte)0x03; 

private Contor() { 
} 

public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException { 
    new Contor().register(); 
} 

public void process(APDU apdu) throws ISOException { 
    if(this.selectingApplet())return; 
    byte[] buffer = apdu.getBuffer(); 
    if(buffer[ISO7816.OFFSET_CLA] != CLS) 
     ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); 
    switch(buffer[ISO7816.OFFSET_INS]) 
    { 
     case INC:contor++; break; 
     case DEC:contor--; break; 
     case GET: 
      buffer[0] = contor; 
      apdu.setOutgoingAndSend((short)0,(short)1); 
      break; 
     case INIT: 
      apdu.setIncomingAndReceive(); 
      contor = buffer[ISO7816.OFFSET_CDATA]; 
      break; 
    } 

} 

cevap

2

Uygulamanızla iletişim kurmak için öncelikle uygulamanızı seçmelisiniz.

Bunu yapmak için iki seçeneğiniz vardır. İlk seçenek, uygulama kurulum aşamasında uygulamanızı Varsayılan Seçili yapmak ve her açılıştan sonra örtülü olarak seçilen uygulamayı yapmaktır. İkinci seçenek, diğer komutları göndermeden önce uygulayıcınız AUD ile birleştirilen SELECT APDU komutunu gönderiyor.

SEÇ APDU Komutanlığı bilge 00A40400 <AID Length> <AID>

Diğer = senin komutuna yanıt varlık, sizin uygulaması değildir ve büyük ihtimalle varsayılan Standart-Seçilen uygulama, yani Kart Yöneticisi.

+0

İkinci noktanızla ilgili olarak: Her iki "arabellek [ISO7816.OFFSET_CLA]" ve "CLS" bayt olarak bildirildiklerinden, her ikisi de aynı imzalı değeri (yani -80 (byte) 0xB0' için) içerir ve karşılaştırma mükemmel çalışır. Kısa/int, kesme ve baytıma geri gönderilmesi hiçbir şeyi değiştirmez ve bu durumda tamamen işe yaramaz. –

+0

@MichaelRoland Haklısınız. Teşekkür ederim. Cevap güncellendi. Döküm ve bit-bilge ve tampon elemanlarını "127" den daha büyük bir kısa/int değeriyle karşılaştırdığımız durumlarda gereklidir. sağ? – Abraham