2014-09-22 8 views
4

복잡한 Javacard 애플릿이 있으며 일반 스마트 카드 (예 : NXP J3E145, T = 1) 용으로 개발되고 테스트되었습니다. 이제는 UICC에서 휴대 전화로 사용하고 Android 앱에서 액세스해야합니다. UICC는 T = 0 프로토콜을 사용합니다.Javacard 애플릿 RPDU에는 seek-for-android에서 액세스 할 때 아무런 데이터도 포함되어 있지 않습니다.

일반 카드 판독기 (Omnikey 5321)에서 SIM 카드와 통신 할 때 애플릿이 정상적으로 작동합니다.

그러나 모바일 폰 (Sony Xperia S)으로 이동하고 seek-for-android API를 통해 APDU를 보내면 일부 RPDU에는 데이터 부분이 포함되지 않으며 상태 단어 0x9000과 데이터 부분 만 있습니다. 누락!

80 05 00 00 00 --> 00 90 00 (one byte as I expected) 
80 06 00 00 00 --> <... data of length 20 ...> 90 00 (as I expected) 

그것 (처리 시간은 항상 < 1 초입니다) 시간 제한 문제가 될 수 :

이 APDU의 실패 :

80 04 00 00 00 --> 90 00 (although there should be some data, 200 bytes approx.) 
80 01 00 00 00 --> 90 00 (although I expect 18 bytes) 

이 APDU를 확인입니까? 아니면 T = 0 이상한가?

내 안드로이드 응용 프로그램 코드는 정말 간단하다 :

Channel channel = session.openLogicalChannel(aid); 
byte[] resp = channel.transmit(new byte[] {(byte) 0x80, 0x04, 0x00, 0x00, 0x00}); 

오픈 모바일 API, 4.4.2 (19).

도움이 될 것입니다.이 문제를 해결하는 데 2 ​​일을 보냈습니다. 제발, 나를 구 해주십시오.

보이 타

편집 내 액세스 규칙 : 목록에서

AID: A000000018308005006563686F00 ___ AllApps:Never 
AID: A0000000183080055A6563686F5A ___ Hash:ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always 
AID: A000000018308005596563686F59 ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always 
AID: A000000018308005586563686F58 ___ AllApps:Always 
AID: NO_AID ___ AllApps:Always 
AID: A000000018308005006563686F00 ___ AllApps:Never 
AID: A0000000183080055A6563686F5A ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always 
AID: A000000018308005596563686F59 ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always 
AID: A000000018308005586563686F58 ___ AllApps:Always 
AID: NO_AID ___ AllApps:Always 

내가 APDU는 규칙 필터링 (및 NFC 규칙이 모두 아래로 작성하지 않은) 이상.

내 애플릿에는 AID F06D617073616D2E617070 My Issuer 보안 도메인은 A0000000871002FF33FFFF8901010100입니다.

나는

+0

Le 바이트를 0에서 0xFF로 변경하면 0x6881. 이것은 정말로 혼란 스럽습니다 - 나는 SEEK가 모든 논리적 채널을 관리한다고 생각했습니다. 어떻게 Le 바이트가 0x9000에서 0x6881로 상태 워드를 바꿀 수 있습니까? 어떤 단서가 있습니까? 제발, 도와주세요 ... – vojta

+0

나는 그것이 시크 - 61XX 또는 6CXX 응답을 처리하는 동안 안드로이드 오류가 발생했습니다. 실제로 UICC로 보낸 APDUs (TPDUs) 추적 할 수있는 방법이 있습니까? – vojta

+0

Le, Lc 등 모든 가능한 옵션을 시도한 결과 항상 동일합니다 :-(: 1. 'LC = 1 데이터 = {0x00} Le = null -> 90 00' . 5, 'LC = 데이터 1 = {0 × 00} 르 = 0 -> 90 00' 3. 'LC = 데이터 1 = {0 × 00} 르 = 255 -> 90 00' 4. LC = null 데이터 = null Le = null -> 90 00' 5. 'LC = null 데이터 = null Le = 0 -> 90 00' 6. 'LC = null 데이터 = null Le = 255 -> 68 81' – vojta

답변

3

내 애플릿에 오류가있어서 전체적인 문제가 발생했습니다. 애플릿이 상태 워드 0x911C로 응답했고 데이터가 없습니다. 그러나 SEEK는 상태 단어 0x91XX가 SEEK를 통해 액세스 할 때 사용할 수 없기 때문에 항상 0x911C 대신 0x9000을 반환했습니다. 다음 단락은 SEEK 포럼의 EduardEtc이며 모든 것을 설명합니다.

"ETSI는 SIMToolKit (CAT) 응용 프로그램과 함께 사용하기위한 상태 단어 91XX를 정의합니다 (TS 102 221에서).그렇지 않으면 9000을 SW1SW2로 보내는 모든 카드 응용 프로그램은 91xx를 반환 할 수 있습니다. 대신 전화가 CAT APDU를 처리하도록 해석해야합니다. 따라서 전화 응용 프로그램은 91xx를 결코 보지 못할 것이며, 그것은 9000에 의해 전화의 CAT 취급 층으로 대체됩니다. ISO/IEC 7816-4는 유사한 목적으로 SW1SW2 = 61xx를 정의합니다. 그러나 이것이 ETSI의 요구를 충족시키기위한 표준에 포함 된 시점에서 ETSI는 ISO 프로세스가 완료되고 다른 인코딩을 지정할 때까지 기다리지 않았습니다. "

+0

아, 고마워 다시보고. 나는 그것이 그렇게 깊이 간 것을 짐작하지 않았을 것이다. –

-2

가장 큰 문제는 내가 생각 열기 논리 채널입니다 ... 이러한 규칙은 헤더와 마스크 실제 필터가없는, 내 APDU의 영향을 미칠 수 있다고 생각하지 않습니다. 카드가 논리 채널을 지원하지 않을 수 있습니다. Open Basic 채널을 사용해보십시오.

및 Le 부분이 설정되어 있지 않기 때문에 u에 응답 데이터가 없습니다. CL 필드, INS 필드, P1, P2, (Le), 데이터 .. Le 필드를 00으로 설정하면 총 백 바이트 응답을 사용할 수 있습니다. 다시 바이트 수를 보내면 XX라고 가정하고 넘겨 주면 응답을받을 수 있어야합니다. 256 이상이면 61 바이트, XX는 응답 바이트 수를 나타냅니다.

+0

My Le 필드가 00입니다. "사용 가능한 모든 바이트"를 의미한다고 생각 ... – vojta

+0

르 바이트를> 0으로 변경하면 0x6881 - SW_LOGICAL_CHANNEL_NOT_SUPPORTED가됩니다. – vojta

+2

투표가 종료 됨 : Le 00은 데이터가 예상되지 않음을 의미하지 않습니다. –