2016-11-28 4 views
3

카드와 터미널간에 보안 채널을 생성하고 싶습니다. 이건 내 코드입니다 : 내가 명령 80 50 20 00 08 01 15 6A 2A F5 64 87 CF 내가 오류 6a88을 얻고 난 명령 00 50 20 00 08 01 15 6A 2A F5 64 87 CF를 보낼 때 오류 6e00를 얻을를 보내카드와 터미널간에 보안 채널 생성

final static byte INIT_UPDATE  = (byte) 0x50; 
    final static byte EXT_AUTHENTICATE = (byte) 0x82; 
    SecureChannel sc; 

    public void process(APDU apdu) throws ISOException { 
     if (selectingApplet()) { 
     return; 
     } 
     byte[] buffer = apdu.getBuffer(); 
     short inlength = 0; 

     try 
     { 
     switch (buffer[ISO7816.OFFSET_INS]) { 

     case INIT_UPDATE: 
      case EXT_AUTHENTICATE: 
        makeSecureChannel(apdu); 
       break; 
    } 
    catch (CryptoException e) 
    { 
      short r = e.getReason(); 
      ISOException.throwIt(r); 
     } 

}

private void makeSecureChannel(APDU apdu) 
{ 

    byte[] buf = apdu.getBuffer(); 
    byte cla = buf[ISO7816.OFFSET_CLA]; 
    byte ins = buf[ISO7816.OFFSET_INS]; 

    try 
    { 
    apdu.setIncomingAndReceive(); 
    if(ins == INIT_UPDATE) 
    { 
     sc = GPSystem.getSecureChannel();  
    } 

    short len = sc.processSecurity(apdu); 

    apdu.setOutgoing(); 
    apdu.setOutgoingLength(len); 
    apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len); 
    } 
    catch(APDUException ex1) 
    { 
     ISOException.throwIt(ex1.getReason()); 
    }  
} 

. 모든 신체가 나를 도울 수 있습니까?

+0

오류를 특정 코드 줄로 현지화 할 수 있습니까? 디버그 할 수 있습니까? 카드가이 글로벌 플랫폼 API 호출을 지원합니까? –

+0

APDU 명령을 보내기 전에 애플릿을 선택 했습니까? 키 버전 == 0x20 인 카드에 키가 있습니까? 아니요 인 경우 0x20을 0x00으로 바꿉니다. – Abraham

답변

2

상태 단어 6E00은별로 흥미롭지 않습니다. 이는 잘못된 CLA (클래스) 바이트를 보내고 있음을 의미합니다. INITIALIZE UPDATE는 ISO 7816에서 정의되지 않았기 때문에 독점 명령입니다. 독점 명령은 독점 비트를 설정해야합니다. 따라서 클래스 바이트 80 만 올바른 것입니다.

INIT 업데이트의 응답에 초점을 맞춰 보겠습니다. 6A88. 6A88은 "참조 데이터를 찾을 수 없음"을 의미합니다. 이는 P1과 P2에서 참조하는 키가 일치하지 않음을 의미합니다. P1과 P2를 모두 00에 두어 키가 자동으로 선택되었는지 확인하고 (P1에서 키 버전을 명시 적으로 선택하려면 응답 데이터의 "키 정보"를 확인하십시오).