blog.stackframe.dev

ACR1252U 투명 세션 문제

ISO 14443-4를 지원하는 카드가 Mifare Classic을 에뮬레이션하여 지원한다면 ACR1252U Mifare Classic 전용 API를 통한 접근이 불가능하다. 이를 우회하기 위하여 PCSC 2.02 Part 3에 정의되고 ACR1252U가 지원하는 Transparent Session을 이용하려 했다.

세션을 만들고 ISO 14443-3 프로토콜로 강제로 내린 후 섹션 인증을 위해 0번 블록에 대한 Authentication with Key A 명령인 60 00를 전송하였다. 그러니 응답이 아래와 같이 왔다:

Sending: FF C2 00 01 04 95 02 60 00
Received (SW1=0x90, SW2=0x00):
C0 03 00 90 00 92 01 00 96 02 01 00 97 02 01 20 ...............

해석하면 CRC 체크가 실패했고 데이터는 01 20이 들어왔다는 의미이다. Mifare Classic 스펙을 보면 Authentication을 시작할 때는 CRC를 붙혀서 전송해야 하지만 응답은 CRC가 없다. 그러므로 수신한 데이터를 멋대로 CRC 체크를 하고 맨 뒤의 2바이트를 잘라버렸으니 원래 4바이트의 데이터가 2바이트만 반환되었다. 이 문제를 해결하기 위해 Transmission and Reception Flag가 존재한다. 여기서 수신된 데이터에 대한 CRC 체크를 꺼버리면 된다.

그런데 이걸 설정하고 명령을 실행시켰더니 수신에서 에러가 나버린다:

Sending: FF C2 00 01 04 90 02 00 02
Received (SW1=0x90, SW2=0x00):
C0 03 00 90 00 .....
Sending: FF C2 00 01 04 95 02 60 00
Received (SW1=0x90, SW2=0x00):
C0 03 01 64 01 ...d.

내가 뭔가 빠트린게 있는건지 PCSC 문서도 보고 가능한 모든 Flag 조합으로 실행시켜보고 다양한 시도를 했지만 성공하지 못했다. 나중에 ACS에 이 문제에 대한 문의를 넣었는데도 답장이 빨리 오지 않아 거의 포기한 상태였다.

며칠이 지나서 ACS로부터 답장을 받았다. 공교롭게도 내가 이 제품을 샀던 회사에서 마케팅 관리 차원으로 문제가 없는지 어떤 용도로 사용중인지 전화가 와서 이거에 대한 문의를 했었는데 그 이후였다. 답장 내용을 요약하자면 펌웨어를 V113 버전으로 업데이트 하고, 플래그는 리틀 엔디안 형식이고 프로토콜 프롤로그도 꺼야하기 때문에 12 00으로 설정해야 한다 였다. 기존 버전은 V110이었고 아무래도 버그를 수정한다고 약간 시간이 걸렸던 것 같다. ACS에서는 펌웨어 업데이트를 공개적으로 제공하지 않기 때문에 이전 버전을 이용중인 사람은 ACS 홈페이지에서 요청을 해야한다.

아무튼 업데이트를 하고 다시 명령을 실행시켜 보니 제대로 작동했다:

Sending: FF C2 00 01 04 90 02 12 00
Received (SW1=0x90, SW2=0x00):
C0 03 00 90 00 .....
Sending: FF C2 00 01 04 95 02 60 00
Received (SW1=0x90, SW2=0x00):
C0 03 00 90 00 92 01 00 96 02 00 00 97 04 D5 FF ................
F2 1C

댓글