2013-03-26 3 views
2

다른 크기 5 Kb, 7 Kb 및 11 Kb의 파일 3 개를 저장하는 애플릿을 작성했습니다. 애플릿 안에 파일을 저장하는 데 아무런 문제가 없습니다. 그러나 내가 그들을 다시 읽으려고 할 때, 처음 두 개 (작은 파일) 만 읽을 수 있습니다. 세 번째 파일은 예외가 발생합니다 : 내가 문제를 알아 내기 위해 노력했다javacard 애플릿에서 큰 파일 읽기

javax.smartcardio.CardException: Could not obtain response 
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source) 
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source) 

을하고 나는 그것이 파일의 크기와 상관이 발견했다. 그래서 크기가 7KB 인 테스트 파일을 만들고이 파일을 비트 단위로 증가 시켰습니다. 7905 바이트에 도달 할 때까지 작동했습니다. 즉, 7905 바이트는 애플릿에서 읽을 수있는 최대 바이트 수입니다. 나는 샘플 코드를 사용하여 응답 체인 오전 : 나는 JC 2.2.1 (36 KB)와 JC 2.2.2 (80KB) 호환 카드 즉 카드의 두 가지 유형을 시도

public void readFile(APDU apdu, short[] offset, short selectedFile, short MAX_APDU_SEN,  byte OFFSET_SENT) { 
    byte[] file = getFile(selectedFile); 
    if (file == null) { 
    + ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);+ 
    } 
    // work out how many bytes to send this time and how many will be left 
    short remain = (short) (file.length - offset[OFFSET_SENT]); 
    boolean chain = remain > MAX_APDU_SEN; 
    short sendLen = chain ? MAX_APDU_SEN : remain; 
    apdu.setOutgoing(); 
    apdu.setOutgoingLength(sendLen); 
    apdu.sendBytesLong(file, offset[OFFSET_SENT], sendLen); 
    // Check to see if there are more APDU's to send 
    if (chain) { 
    +offset[OFFSET_SENT] = sendLen; // count the bytes sent 
    ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); // indicate there are more bytes  to come 
    } else {+ 
    offset[OFFSET_SENT] = 0; // no more bytes to send 
    } 
} 

을하지만 그들은 모두 동일하게 동작합니다.

도움이 필요하십니까?

답변

2

파일 읽기는 일반적으로 ISO 7816-4에 지정된 READ BINARY 명령에서 호스트 응용 프로그램이 P1/P2의 시작 오프셋을 편리하게 지정할 수 있으므로 체인을 사용하여 수행하지 않습니다. 나는 카드가 묶인 응답이라 할지라도, 제한된 크기의 버퍼로 데이터를 준비하려고한다고 가정합니다. 문제의 원인이라고 생각합니다.

+0

고맙습니다. 연결을 제거하고 내 호스트 응용 프로그램에서 256 바이트의 작은 청크를 읽었을 때마다 매번 오프셋을 256 씩 늘립니다. 제대로 작동합니다. 20 Kb 파일을 읽으려고했는데 그 결과는 긍정적이었습니다. 그래서 나는 체인이 매우 큰 파일을 견딜 수 없다고 가정합니다. 어쨌든 나는 틀릴지도 모른다. – ally

+0

더 큰 청크를 얻기 위해 확장 길이 APDU를 시도 할 수도 있지만 지원되는 제한은 카드에 따라 다릅니다. 보내지는 명령어가 적어 짐에 따라 오버 헤드가 적어 지므로 시간을 절약 할 수 있습니다. 20kByte 파일에 대해서는 주목할만한 것입니다. – guidot

+0

@ ally, 나와 코드를 공유 할 수 있습니까? Java 카드를 처음 사용하고 더 큰 크기의 파일을 저장하는 것과 동일한 문제가 있습니다. – Suraj