2016-09-01 3 views
2

일부 데이터를 오프셋 ISO7816.OFFSET_CDATA의 APDU 버퍼에 저장하고 이러한 바이트를 응답으로 보내는 Java Card 애플릿을 작성했습니다.스마트 카드에서 응답 상태 단어 0x61xx의 의미는 무엇입니까?

Util.arrayCopy(Input_Data, (short)0, buffer, (short) ISO7816.OFFSET_CDATA, (short)Datalength); 
apdu.setOutgoing(); 
apdu.setOutgoingLength((short)(DataLength)); 

apdu.sendBytesLong(buffer, ISO7816.OFFSET_CDATA, (short)(DataLength)); 

나는 이것을 아무런 문제없이 시뮬레이터에서 테스트했다. 그러나 이것을 실제 스마트 카드 (Gemalto가 제조 한 Java Card v2.2.1)에서 테스트 할 때 응답으로 상태 단어 0x6180이 표시됩니다.

내 명령 APDU가 00 40 00 00 80 Data이고 데이터 길이가 128 바이트이므로 버퍼에 4 + 128 바이트가 있고 (260- (4 + 128)) 바이트가 null입니다.

답변

4

시뮬레이터는 아마도 T=1 전송 프로토콜을 사용하지만 실제 카드는 그렇지 않습니다. 그것은 T=0 프로토콜을 사용합니다. 즉, 데이터를 수신하거나 단일 APDU에서 데이터를 전송할 수 있습니다.

상태 단어 0x6180은 카드에서 수신 할 주소가 0x80임을 나타냅니다. 일반적으로 61XX은 수신 할 XX 바이트를 의미합니다.

수신 방법? 자, GET RESPONSE이라는 특별한 APDU 명령이 있습니다. 61XX 상태 단어를 얻을 때마다 전화해야합니다. DataLength

  • Datalength : 코드에 대한 당신의 GET RESPONSE APDU

    APDU -> 61 XX 
    00 C0 00 00 XX -> your data 90 00 
    

    몇 가지 다른 음의 Le 바이트로 XX를 사용? 당신이 short마다에 DataLength 캐스팅 이유는 무엇

  • 0 대신
  • ISO7816.OFFSET_CDATA의에 출력 데이터를 복사? short입니까? 그럼 던지면 안돼. byte이 맞나요? 부호없는 바이트 값 > 0x80이 음수 short으로 캐스팅되므로 잘못된 방식으로 캐스팅합니다. 부호없는 byte에서 short으로 올바른 캐스트는 (short) (DataLength & 0xFF)
  • 가능한 경우 언제든지 setOutgoingAndSend을 사용하십시오. 훨씬 더 간단합니다.
  • 영구 배열에 복사하지 않을 때마다 arrayCopy 대신 arrayCopyNonAtomic을 사용하십시오. arrayCopyNonAtomic의 성능이 훨씬 좋습니다.
+0

실례합니다. 언두를 드러내지 마십시오. 00 C0 00 00 xx. 나는 apdu를 보낸다. 00 40 00 00 80 INS = 40으로 내 기능을 선택하는 데이터. 내 기능을 선택하는 방법 apdu에서 C0을 사용한다면? –

+0

@FatemeJafari '00 00 00 00 80 Data'를 사용하면'61XX '를 받게되고'00 C0 00 00 XX'을 사용하게됩니다. 이는 카드에서 데이터를 수신하기위한 특수 명령 일뿐입니다. '40' 명령에 대한 응답을 줄 것입니다. 다른 애플릿을 선택할 필요가 없습니다. – vojta

+0

고마워요. 이 상태에서 나는 한 응답으로 나의 응답을 얻을 것인가? 내가 256을 넘는 응답을한다면 나는 무엇을해야 하는가? –