이번 포스팅에서는 스마트 카드
결제 시스템에서는 사용되는 통신 명령의 일종인 APDU과 응답인 ATR에 대해 개인적으로 정리해보고자 한다.
ATR(Answer to Reset)
IC 카드가 카드 단말기 또는 리더기 연결시 , 리더기 또는 단말기 -> 카드로 리셋 신호를 보낸다. 그 후 리셋신호에 대한 응답으로 보내는 카드 프로토콜과 통신 파라미터를 보내는 초기화 데이터이다
목적
1. 카드 프로토콜 및 전송 매개변수를 (카드) 리더기에게 전송
2. 카드가 ATR 패킷을 보고 카드 특성 파악 및 적절한 통신 방식 설정
3. 카드 ISO/IEC 7816 등의 표준 여부 식별 가능
패킷 구성
1) TS | T0 | [Interface Bytes] | Historical Bytes | TCK
각 패킷 의미
필드 | 의미 |
TS | 전송 시작 바이트 : 통신 모드 (디렉트 / 인버스) |
T0 | 인터페이스 바이트의 개수 및 Historical Bytes의 길이 정보 포함 |
TAi, TBi, TCi, TDi | 인터페이스 바이트 카드 통신 프로토콜과 전기적 특성 정의 |
Historical Bytes(최대 15바이트) | 카드 어플리케이셔 또는 제조사 관련 정보 |
TCK | 체크 바이트 (T=1 프로토콜 사용시 포함됨) |
각 패킷 상세 정보
TS : 전송 방식
HEX | 바이트 수 | 의미 |
0x3B | 1 | Direct Convention |
0x3F | 1 | Inverse Convention |
T0
바이트 | 비트 수 | 의미 |
상위 | 4 | 인터페이스 바이트 존재여부 |
하위 | 4 | Historicl Bytes 길이 |
인터페이스 바이트
각 바이트 그룹은 논리적으로 같은 위치에 해당하는 i 인덱스를 가짐
(TA1, TB1, TC1, TD1 그리고 TD가 존재할 경우 다음 인터페이스 그룹 i+1이 이어짐
항목 | 바이트수 | 의미와 각 패킷 | 예시 |
TA1 | 1 | 통신 속도 FD(상위 4바이트) : 클럭 주기 계수 DI(하위 4바이트) : 비트 전송률 조정 계수 |
|
TB1 | 1 | 프로그램 전압(Vpp), 보호 타임아웃 현재 대부분 사용되지 않으며 보통 0xFF 또는 생략 |
|
TC1 | 1 | 통신 기다림 시간(Extra Guard Time) 기본값 : 0x00(2ETU) 0xFF : 카드가 최대 대기시간까지 미응답 |
|
TD1 | 1 | 다음 인터페이스 바이트 존재 여부 및 프로토콜 유형 상위 4바이트 : 다음 인터페이스 바이트 존재 여부 하위 4바이트 : 통신 프로토콜 (T=0 , T=1 등) |
Historical Bytes
카드의 어플리케이션 , 제조사 ID, 버젼 정보 등을 포함
TCK(선택옵션) - 프로토콜 체크 바이트
T=1 또는 그 이상의 프로토콜 사용시 존재
ATR의 모든 바이트 XOR 합이 0이 되도록 설정됨(TS제외)
응답성공 코드
HEX(2바이트) | 의미 |
90 00 | 스마트 카드 응답 성공 |
예제 ATR |
3B 9F 96 80 1F C3 80 31 A0 73 BE 21 13 67 43 20 00 00 00 81 |
분석
1. 3B -> TS
- Direct Convention
2. 9F -> T0
- 상위 4비트(nibble) -> 1001 : TA1 , TD1 존재
- 하위 4바트(nibble) -> 1111 : 히스토리 바이트 수(15바이트)
3. 96
- TA1 -> FI = 9, DI = 6
4. 80
TD1 -> TD2 있음, T=0 (하위 4비트)
5. 1F
TD2 -> T = 15
6. C3 80 31 A0 73 .. (총 15바이트)
History Byte
7. 마지막 81
TCK -> 체크 바이트(T = 0 프로토콜이 아니므로 체크 바이트 존재)
T= 0 -> 단순 , 기본 프로토콜
T = 1 -> 블록 기반 프로토콜 (TCK 필수)
T=0과 T =1 하나의 프로토콜만을 우선 제공해야 한다. 또한 동시 지원은 허용 x
단말기 리셋 직후의 동작
단말기는 ic 카드의 접점을 활성한 후(카드 삽입 후) , 콜드 리셋(cold reset)을 시작해야한다.
카드 거부시 동작
조건 | 단말기 동작 |
카드 거부 | 카드 세션을 중단하고 비활성화 시퀀스( deactivation sequence ) 시작 |
Cold ATR 거부 | 즉시 중단하지 않고 Ward Reset 수행 |
Warm ATR 거부 | 카드 세션을 중단하고 비활성화 시퀀스 시작 |
유효한 ATR 수신 후의 동작
유효한 cold 또는 warm ATR을 수신하면 단말기는 해당 ATR에 명시된 파라미터를 사용해 카드 세션을 계속 진행 할수 있다.
마지막 바이트가 수신된 이후, 단말기는 해당 프로토콜의 가드 타임(guard time)를 기다린 후 통신을 시작해야 한다.
APDU(Application Protocol Data Unit)
: 스마트 카드나 보안 디바이스(IC 카드, SIM 카드)와 통신 시 사용되는 명령어
ISO/IEC 7816 표준 기반
APDU 구성
1. Command APDU, 줄여서, C-APDU(호스트 -카드 리더기 -> 스마트 카드)
2. Response APDU, 줄여서, R-APDU(스마트카드 -> 호스트 - 카드 리더기)
C-APDU 구조(순서대로)
필수 패킷
CLA(1byte, Class) : 명령 CLASS , "FF"빼고 어떤 값을 가질수 있다.
역할 : 카드가 어떤 집합을 사용하는 지 알려주는 역할 (명령의 종류, 보안 레벨 ,체널 등을 구분)
INS(1byte, Instruction) : 수행할 명령어
P1(1byte) : Parameter 1 명령 옵션
P2(1byte) : Parameter 2 명령 옵션
명령의 세부 동장 , 방식을 정의 (선택 방식 , 오프셋, 파일 ID등 사용)
선택
Lc(0, 1~255, Length Command) : 전송할 데이터 길이
Data(variable, Lc만큼) : 전송할 데이터
Le(0, 1~255) : 수신할 예상 응답 길이 (만약 Le =00일 때는 최대 256 바이트 응답 허용)
C-APDU 구조
case 1 : CLA INS P1 P2
case 2 : CLA INS P1 P2, Le
case 3 : CLA INS P1 P2 Lc Data
case 4 : CLA INS P1 P2 Lc Data Le
R-APDU 구조(순서대로)
Data(var, le만큼)
SW1 : 상태 코드 1
SW 2 : 상태 코드 2
값(Hex) | 설명 |
00 | ISO/IEC 7816-4 기본 명령 (표준 클래스) |
80 | 프로프라이어터리 클래스(비표준, ex : GPO) |
84 | 보안 관련 클래스 |
90 ~ EF | 채널/보안 정보 포함 가능 |
자주 쓰는 C-APDU INS 명령어
INS(HEX) | 명령어 | 설명 |
A4 | SELECT | 파일/어플리케이션 선택 |
B0 | READ BINARY | 바이너리 파일 읽기 |
D6 | UPDATE BINARY | 바이너리 파일 쓰기 |
20 | VERIFY | PIN 검증 |
88 | INTERNAL AUTHENTICATE | 내부 인증 수행 |
84 | GET CHALLENGE | 난수 요청(보안용) |
자주 쓰는 R-APDU SW1 SW2 명령어
SW1 SW2 | 설명 |
90 00 | 성공(SUCCESS) |
6A 82 | 파일 없음 (FILE NOT FOUND) |
6A 86 | 잘못된 파라미터 |
67 00 | 길이 오류 |
PSE(payment System directory)
정의
IC 카드에서 결제 시스템 정보를 저장한 구조화된 파일
카드 내 디렉터리 역할, 카드 내에 어떤 결제 어플리케이션(AID)이 설치되어 있는지를 탐색하는데 사용된다.
특징
1. IC 카드안에 DF(directory File) 형태로 존재
2. APDU 명령을 통해 파일 이름으로 SELECT 가능
정의 | 카드 내 어플리케이션 디렉터리 파일 |
형식 |
|
관련 APDU | SELECT 명령(대부분 0x04)으로 접근 |
역할 | 설치된 결제 애플리케이션 (AID) 목록 제공 |
통신 흐름 | PSE 선택 -> AID 선택 -> 거래 요청(APDU 연속 호출) |
전체 통신 플로우 요약
- PSE 선택 (단말기 -> 카드)
- SELECT 명령 (00 A4 ...)으로 "1PAY.SYS.DDF01" 선택
- APDU 응답 ( 카드 -> 단말기)
- AID 선택 (단말기 ->카드)
- 사용자가 사용할 애플리케이션 선택
- 다시 SELECT 명령으로 AID 선택 (00 A4 ...)
- FCI 분석
- 응답 APDU에서 FCI (File Control Information) 분석
- 안에 포함된 AID 목록을 파악
- Processing Options 요청
- GET PROCESSING OPTIONS (80 A8 ...) 명령
- 레코드 읽기
- READ RECORD (00 B2 ...) 등으로 거래 정보 획득
- 거래 처리 (인증 등)
AID(Application Identifier)
: IC 카드 안에 있는 어플리케이션을 고유하게 식별하기 위한 바이트 문자열(최대 16바이트)
AID 구조
AID는 ISO/IEC 7816-5 표준에 따라 구성되며 일반적으로 다음과 같은 구성입니다:
구성 요소설명
AID 구성 | 의미 | 용도 |
RID (5바이트) |
등록된 애플리케이션 제공자 ID (Registered Application Provider Identifier) | 결제 브랜드 식별 |
PIX (최대 11바이트 |
애플리케이션 제공자의 선택적 확장 (Proprietary Identifier Extension) | 특정 서비스나 애플리케이션 버젼 구분 |
브랜드AID 예시 설명
Visa | A0000000031010 | Visa Debit/Credit |
MasterCard | A0000000041010 | MasterCard Credit |
Amex | A00000002501 | American Express |
UnionPay | A000000333010101 | 중국 유니온페이 |
T-Money | A000000677010106 | 한국 교통카드 |