1. Navigator
인터페이스 확장
[Exposed =Window ,SecureContext ,IsolatedContext ]partial interface Navigator { [SameObject ]readonly attribute SmartCardResourceManager ; };smartCard
1.1. smartCard
속성
가져올 때 smartCard
속성은 항상 동일한
SmartCardResourceManager
객체 인스턴스를 반환한다.
2. WorkerNavigator
인터페이스 확장
[Exposed =(DedicatedWorker ,SharedWorker ),SecureContext ,IsolatedContext ]partial interface WorkerNavigator { [SameObject ]readonly attribute SmartCardResourceManager ; };smartCard
2.1.
smartCard
속성
가져올 때 smartCard
속성은 항상 동일한
SmartCardResourceManager
객체 인스턴스를 반환한다.
3.
SmartCardResourceManager
인터페이스
[Exposed =(DedicatedWorker ,SharedWorker ,Window ),SecureContext ,IsolatedContext ]interface {SmartCardResourceManager Promise <SmartCardContext >(); };establishContext
이 인터페이스의 메서드는 비동기적으로 완료되며, 작업을 스마트 카드 태스크 소스에 큐에 넣는다.
3.1. establishContext()
메서드
플랫폼의 PC/SC 스택에 PC/SC 컨텍스트를 요청한다.
establishContext()
메서드 단계는 다음과 같다:
-
this의 관련 전역 객체의 연결된 Document가 "smart-card"라는 이름의 정책 제어 기능을 사용하도록 허용되지 않은 경우, "
SecurityError"DOMException을 발생시킨다. -
promise를 새 프로미스라고 하자.
-
다음 단계를 병렬로 실행한다:
-
resourceManager를 플랫폼의 [PCSC5]
RESOURCEMANAGER클래스의 새 인스턴스라고 하자. -
resourceManager의
EstablishContext메서드를 "system"Scope매개변수로 호출한다. -
반환된
RESPONSECODE가SCARD_S_SUCCESS가 아니면 다음 단계를 수행한다:-
resourceManager를 파기한다.
-
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣고, promise를 대응하는 예외로 거부한다.
-
-
그렇지 않으면 다음 단계를 수행한다:
-
context를 새
SmartCardContext라고 하자. 이 객체의 [[resourceManager]] 내부 슬롯은 resourceManager로 설정된다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣고, promise를 context로 이행한다.
-
-
-
promise를 반환한다.
4. SmartCardContext
인터페이스
PC/SC 리소스 관리자와 통신하기 위한 컨텍스트이다.
[Exposed =(DedicatedWorker ,SharedWorker ,Window ),SecureContext ,IsolatedContext ]interface {SmartCardContext Promise <sequence <DOMString >>();listReaders Promise <sequence <SmartCardReaderStateOut >>(getStatusChange sequence <SmartCardReaderStateIn >,readerStates optional SmartCardGetStatusChangeOptions = {});options Promise <SmartCardConnectResult >(connect DOMString ,readerName SmartCardAccessMode ,accessMode optional SmartCardConnectOptions = {}); };options
SmartCardContext
인스턴스는 다음 표에
설명된 내부 슬롯을 사용하여 생성된다:
| 내부 슬롯 | 초기값 | 설명(비규범적) |
|---|---|---|
| [[resourceManager]] | null
| 사용할 플랫폼의 [PCSC5]
RESOURCEMANAGER.
|
| [[operationInProgress]] | false
| 이 컨텍스트에서 진행 중인 PC/SC 작업이 있는지 여부. |
| [[activeReaderTransactions]] | 빈 맵 | 판독기 이름을, 해당 판독기에서 현재 활성 트랜잭션을 보유한 SmartCardConnection에
매핑하는 맵.
이 컨텍스트에서 해당 트랜잭션이 있는 경우에 한한다.
|
| [[connections]] | 빈 정렬된 집합 | 이 컨텍스트가 생성한 기존 SmartCardConnection들.
|
| [[tracker]] | null
| [PCSC5]
SCARDTRACK 인스턴스.
|
| [[signal]] | null
| 처리 중인
getStatusChange()
호출의 AbortSignal.
해당 호출이 있는 경우에 한한다.
|
4.1.
listReaders()
메서드
listReaders()
메서드 단계는 다음과 같다:
-
promise를 새 프로미스라고 하자.
-
this.[[operationInProgress]]가
true이면 promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다:
-
resourceQuery를 플랫폼의 [PCSC5]
RESOURCEQUERY클래스의 새 인스턴스라고 하자. 생성자 입력 매개변수로 this.[[resourceManager]]를 사용한다. -
groups를 플랫폼의 [PCSC5]
STR[]라고 하자. 여기에는 해당 플랫폼에서 "시스템의 모든 판독기"와 동등한 그룹 이름 목록이 들어 있다. -
pcscReaders를 빈
STR[]라고 하자. -
resourceQuery의
ListReaders메서드를 groups를 입력 매개변수로, pcscReaders를 출력 매개변수로 사용하여 호출한다. -
responseCode를 반환된
RESPONSECODE라고 하자. -
resourceQuery를 파기한다.
-
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣는다. 이 태스크는 다음 단계를 수행한다:
-
-
promise를 반환한다.
4.2.
getStatusChange()
메서드
getStatusChange(readerStates, options)
메서드 단계는 다음과 같다:
-
promise를 새 프로미스라고 하자.
-
this.[[operationInProgress]]가
true이면 promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
options["signal"]이 존재하면 다음 단계를 실행한다:-
this.[[signal]]을 signal로 설정한다.
-
처리 중인 GetStatusChange를 취소하는 알고리즘을 signal에 추가한다.
-
options["timeout"]이 존재하면, pcscTimeout을options["timeout"]으로 설정한다. -
pcscReaderStates를
readerStates에 대응하는 [PCSC5]SCARD_READERSTATE[]라고 하자. -
this.[[operationInProgress]]를
true로 설정한다. -
this.[[tracker]]를 플랫폼의 [PCSC5]
SCARDTRACK클래스의 새 인스턴스로 설정한다. 이때 생성자 입력 매개변수로 this.[[resourceManager]]를 사용한다. -
다음 단계를 병렬로 실행한다:
-
this.[[tracker]].
GetStatusChange()를 pcscReaderStates와 pcscTimeout을 입력 매개변수로 사용하여 호출한다. -
responseCode를 반환된 [PCSC5]
RESPONSECODE라고 하자. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣는다. 이 태스크는 다음 단계를 수행한다:
-
this.[[tracker]]를
null로 설정한다. -
abortReason을
undefined라고 하자. -
this.[[signal]]이
null이 아니면 다음 단계를 실행한다:-
this.[[signal]]이 중단된 경우 abortReason을 this.[[signal]]의 중단 이유로 설정한다.
-
처리 중인 GetStatusChange를 취소하는 알고리즘을 this.[[signal]]에서 제거한다.
-
this.[[signal]]을
null로 설정한다.
-
-
responseCode가
SCARD_S_SUCCESS가 아니면 다음 단계를 실행한다: -
readerStatesOut을 pcscReaderStates에 대응하는
SmartCardReaderStateOut시퀀스라고 하자. -
promise를 readerStatesOut으로 이행한다.
-
-
-
promise를 반환한다.
4.2.1.
SmartCardReaderStateIn
딕셔너리
dictionary {SmartCardReaderStateIn required DOMString ;readerName required SmartCardReaderStateFlagsIn ;currentState unsigned long ; };currentCount
readerName-
스마트 카드 판독기의 이름.
currentState-
애플리케이션이 알고 있는 해당 스마트 카드 판독기의 현재 상태.
currentCount-
애플리케이션이 알고 있는 이 판독기의 현재 카드 삽입 및 제거 이벤트 수.
readerStates라는 이름의 SmartCardReaderStateIn
시퀀스가 주어지면, [PCSC5]
SCARD_READERSTATE[]에 대응하는 값을
다음 단계로 생성한다:
-
pcscReaderStates를 빈
SCARD_READERSTATE[]라고 하자. -
readerStates에 있는
SmartCardReaderStateIn유형의 각 stateIn에 대해:-
pcscState를
SCARD_READERSTATE라고 하자. -
pcscState.
Reader를 stateIn["readerName"]으로 설정한다. -
pcscState.
CurrentState를 stateIn["currentState"]에 대응하는DWORD로 설정한다. -
stateIn["
currentCount"]이 존재하면, pcscState.CurrentState의 상위 워드를 stateIn["currentCount"]으로 설정한다. -
pcscState.
EventState를 0으로 설정한다. -
pcscState를 pcscReaderStates에 추가한다.
-
-
pcscReaderStates를 반환한다.
4.2.1.1. SmartCardReaderStateFlagsIn
딕셔너리
dictionary {SmartCardReaderStateFlagsIn boolean =unaware false ;boolean =ignore false ;boolean =unavailable false ;boolean =empty false ;boolean =present false ;boolean =exclusive false ;boolean =inuse false ;boolean =mute false ;boolean =unpowered false ; };
unaware-
애플리케이션은 현재 상태를 알지 못하며 이를 알고자 한다.
ignore-
애플리케이션은 이 판독기에 관심이 없으며, 모니터링 작업 중 이 판독기를 고려해서는 안 된다.
unavailable-
애플리케이션은 이 판독기를 사용할 수 없다고 판단한다.
empty-
애플리케이션은 판독기에 카드가 없다고 판단한다.
present-
애플리케이션은 판독기에 카드가 있다고 판단한다.
exclusive-
애플리케이션은 판독기의 카드가 다른 애플리케이션의 독점 사용을 위해 할당되었다고 판단한다.
inuse-
애플리케이션은 판독기의 카드를 하나 이상의 다른 애플리케이션이 사용 중이지만, 공유 모드로 연결할 수 있다고 판단한다.
mute-
애플리케이션은 판독기에 응답하지 않는 카드가 있다고 판단한다.
unpowered-
애플리케이션은 판독기의 카드에 전원이 공급되지 않았다고 판단한다.
주어진 SmartCardReaderStateFlagsIn에
대응하는 [PCSC5]
DWORD를 다음 단계로 생성한다:
-
flagsIn을 주어진
SmartCardReaderStateFlagsIn이라고 하자. -
pcscFlags를 0으로 설정된
DWORD라고 하자. -
flagsIn["
unaware"]가true이면, [PCSC5]SCARD_STATE_UNAWARE를 pcscFlags에 추가한다. -
flagsIn["
ignore"]가true이면, [PCSC5]SCARD_STATE_IGNORE를 pcscFlags에 추가한다. -
flagsIn["
unavailable"]이true이면, [PCSC5]SCARD_STATE_UNAVAILABLE을 pcscFlags에 추가한다. -
flagsIn["
empty"]가true이면, [PCSC5]SCARD_STATE_EMPTY를 pcscFlags에 추가한다. -
flagsIn["
present"]가true이면, [PCSC5]SCARD_STATE_PRESENT를 pcscFlags에 추가한다. -
flagsIn["
exclusive"]가true이면, [PCSC5]SCARD_STATE_EXCLUSIVE를 pcscFlags에 추가한다. -
flagsIn["
inuse"]가true이면, [PCSC5]SCARD_STATE_INUSE를 pcscFlags에 추가한다. -
flagsIn["
unpowered"]가true이면,SCARD_STATE_UNPOWERED를 pcscFlags에 추가한다. -
pcscFlags를 반환한다.
4.2.2.
SmartCardReaderStateOut
딕셔너리
스마트 카드 판독기의 실제 상태.
dictionary {SmartCardReaderStateOut required DOMString ;readerName required SmartCardReaderStateFlagsOut ;eventState required unsigned long ;eventCount ArrayBuffer ; };answerToReset
readerName-
스마트 카드 판독기의 이름.
eventState-
해당 스마트 카드 판독기의 실제 상태.
eventCount-
이 판독기에서 발생한 실제 카드 삽입 및 제거 이벤트 수.
answerToReset-
해당하는 경우 삽입된 카드의 [ISO7816-3] Answer To Reset(ATR).
pcscReaderStates라는 이름의 [PCSC5]
SCARD_READERSTATE[]가 주어지면, SmartCardReaderStateOut의
대응하는 시퀀스를 다음 단계로 생성한다:
-
readerStatesOut을 빈
SmartCardReaderStateOut시퀀스라고 하자. -
pcscReaderStates에 있는
SCARD_READERSTATE유형의 각 pcscState에 대해:-
stateOut을
SmartCardReaderStateOut이라고 하자. -
stateOut["
readerName"]을 pcscState.Reader로 설정한다. -
stateOut["
eventState"]을 pcscState.EventState에 대응하는SmartCardReaderStateFlagsOut딕셔너리로 설정한다. -
stateOut["
eventCount"]을 pcscState.EventState의 상위 워드로 설정한다. -
플랫폼의
SCARD_READERSTATE구조체에 카드의 [ISO7816-3] Answer To Reset을 포함하는 멤버가 있으면, stateOut["answerToReset"]을 해당 값으로 설정한다. -
stateOut을 readerStatesOut에 추가한다.
-
-
readerStatesOut을 반환한다.
4.2.2.1. SmartCardReaderStateFlagsOut
딕셔너리
dictionary {SmartCardReaderStateFlagsOut boolean =ignore false ;boolean =changed false ;boolean =unavailable false ;boolean =unknown false ;boolean =empty false ;boolean =present false ;boolean =exclusive false ;boolean =inuse false ;boolean =mute false ;boolean =unpowered false ; };
ignore-
애플리케이션이 이 판독기를 무시하도록 요청했다.
changed-
호출 애플리케이션이 입력한 상태와 실제 상태가 서로 다르다.
unavailable-
이 판독기는 사용할 수 없다.
unknown-
애플리케이션이 지정한 판독기 이름을 알 수 없다.
empty-
판독기에 카드가 없다.
present-
판독기에 카드가 있다.
exclusive-
판독기의 카드가 다른 애플리케이션의 독점 사용을 위해 할당되어 있다.
inuse-
판독기의 카드를 하나 이상의 다른 애플리케이션이 사용 중이지만 공유 모드로 연결할 수 있다.
mute-
판독기에 응답하지 않는 카드가 있다.
unpowered-
판독기의 카드에 전원이 공급되지 않았다.
pcscFlags라는 이름의 [PCSC5]
DWORD가 주어지면, SmartCardReaderStateFlagsOut
대응하는 딕셔너리를 다음 단계로 생성한다:
-
flagsOut을 기본 멤버를 갖는
SmartCardReaderStateFlagsOut딕셔너리라고 하자. -
pcscFlags가 [PCSC5]
SCARD_STATE_IGNORE플래그를 가지면, flagsOut["ignore"]를true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_CHANGED플래그를 가지면, flagsOut["changed"]를true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_UNAVAILABLE플래그를 가지면, flagsOut["unavailable"]을true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_UNKNOWN플래그를 가지면, flagsOut["unknown"]을true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_EMPTY플래그를 가지면, flagsOut["empty"]를true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_PRESENT플래그를 가지면, flagsOut["present"]를true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_EXCLUSIVE플래그를 가지면, flagsOut["exclusive"]를true로 설정한다. -
pcscFlags가 [PCSC5]
SCARD_STATE_INUSE플래그를 가지면, flagsOut["inuse"]를true로 설정한다. -
pcscFlags가
SCARD_STATE_MUTE플래그를 가지면, flagsOut["mute"]를true로 설정한다. -
pcscFlags가
SCARD_STATE_UNPOWERED플래그를 가지면, flagsOut["unpowered"]를true로 설정한다. -
flagsOut을 반환한다.
4.2.3. SmartCardGetStatusChangeOptions
딕셔너리
dictionary {SmartCardGetStatusChangeOptions DOMHighResTimeStamp ;timeout AbortSignal ; };signal
timeout-
[PCSC5] GetStatusChange() 메서드의 시간 제한 매개변수. 지정하지 않으면 INFINITE(시스템에 따라 정의됨) 시간 제한 값을 사용한다.
signal-
트리거되면 플랫폼의 [PCSC5] Cancel() 메서드를 호출한다.
4.3. connect()
메서드
connect(readerName, accessMode, options)
메서드 단계는 다음과 같다:
-
promise를 새 프로미스라고 하자.
-
this.[[operationInProgress]]가
true이면 promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[activeReaderTransactions]][
readerName]이 존재하면, promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다:
-
accessFlags를
accessMode에 대응하는 [PCSC5]DWORD라고 하자. -
protocolFlags를
0으로 설정된DWORD라고 하자. -
options["preferredProtocols"]이 존재하면, protocolFlags를 해당 값의 대응 플래그로 설정한다. -
activeProtocol을
0으로 설정된DWORD라고 하자. -
comm을 플랫폼의 [PCSC5]
SCARDCOMM클래스의 새 인스턴스라고 하자. 생성자 매개변수로 this.[[resourceManager]]를 사용한다. -
comm.
Connect()를readerName, accessFlags 및 protocolFlags를 입력 매개변수로, activeProtocol을 출력 매개변수로 사용하여 호출한다. -
responseCode를 반환된
RESPONSECODE라고 하자. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣는다. 이 태스크는 다음 단계를 수행한다:
-
responseCode가
SCARD_S_SUCCESS가 아니면: -
result를 빈
SmartCardConnectResult딕셔너리라고 하자. -
connection을 새
SmartCardConnection이라고 하자. -
connection을 this.[[connections]]에 추가한다.
-
connection.[[comm]]을 comm으로 설정한다.
-
connection.[[readerName]]을
readerName으로 설정한다. -
connection.[[context]]를 this로 설정한다.
-
connection.[[activeProtocol]]을 activeProtocol로 설정한다.
-
result["
connection"]을 connection으로 설정한다. -
activeProtocol이 유효한 프로토콜 값이면, result["
activeProtocol"]을 대응하는SmartCardProtocol로 설정한다. -
promise를 result로 이행한다.
-
-
promise를 반환한다.
4.3.1.
SmartCardProtocol
열거형
enum {SmartCardProtocol ,"raw" ,"t0" };"t1"
"raw"-
"Raw" 모드. 특수 목적 요구사항을 위한 임의의 데이터 교환 프로토콜을 지원하는 데 사용할 수 있다. [PCSC5]
SCARD_PROTOCOL_RAWDWORD에 대응한다. "t0"-
[ISO7816-3] T=0. 비동기 반이중 문자 전송 프로토콜. [PCSC5]
SCARD_PROTOCOL_T0DWORD에 대응한다. "t1"-
[ISO7816-3] T=1. 비동기 반이중 블록 전송 프로토콜. [PCSC5]
SCARD_PROTOCOL_T1DWORD에 대응한다.
[PCSC5]
DWORD가 [PCSC5]
SCARD_PROTOCOL_T0, [PCSC5]
SCARD_PROTOCOL_T1 또는 [PCSC5]
SCARD_PROTOCOL_RAW 중 하나이면 유효한 프로토콜 값이다.
protocols라는 이름의 SmartCardProtocol
시퀀스가 주어지면, 대응하는 플래그를 갖는 [PCSC5]
DWORD를 다음 단계로 생성한다:
-
flags를
0으로 설정된DWORD라고 하자. -
protocols에 있는
SmartCardProtocol유형의 각 protocol에 대해, protocol에 대응하는DWORD를 flags에 추가한다. -
flags를 반환한다.
4.3.2.
SmartCardConnectResult
딕셔너리
dictionary {SmartCardConnectResult required SmartCardConnection ;connection SmartCardProtocol ; };activeProtocol
connection-
생성된 연결에 대한 인터페이스.
activeProtocol-
실제로 사용 중인 프로토콜.
4.3.3.
SmartCardAccessMode
열거형
enum {SmartCardAccessMode ,"shared" ,"exclusive" };"direct"
"shared"-
애플리케이션이 다른 애플리케이션과 카드 접근을 공유할 의사가 있다.
"exclusive"-
애플리케이션이 카드에 대한 독점 접근을 요구한다.
"direct"-
카드의 존재 여부와 관계없이 애플리케이션이 판독기 연결을 요구한다. 독점 접근을 의미한다.
accessMode라는 이름의 SmartCardAccessMode
열거형이 주어지면, 대응하는 [PCSC5]
DWORD를 다음 단계로 생성한다:
-
dword를
0으로 설정된DWORD라고 하자. -
accessMode가 "
shared"이면, dword를 [PCSC5]SCARD_SHARE_SHARED로 설정한다. -
accessMode가 "
exclusive"이면, dword를 [PCSC5]SCARD_SHARE_EXCLUSIVE로 설정한다. -
accessMode가 "
direct"이면, dword를 [PCSC5]SCARD_SHARE_DIRECT로 설정한다. -
dword를 반환한다.
4.3.4.
SmartCardConnectOptions
딕셔너리
dictionary {SmartCardConnectOptions sequence <SmartCardProtocol >; };preferredProtocols
preferredProtocols-
사용할 수 있는 카드 통신 프로토콜.
4.4. 보조 알고리즘 및 정의
SmartCardContext
context의
operationInProgress를 지우려면 다음 단계를 수행한다:
-
단언: context.[[operationInProgress]]는
true이다. -
context.[[operationInProgress]]를
false로 설정한다. -
context.[[connections]]에 있는
SmartCardConnection유형의 각 connection에 대해:-
connection의 완료된 모든 트랜잭션을 종료한다.
-
context.[[operationInProgress]]가
true이면 이 단계를 중단한다.
-
처리 중인 GetStatusChange를 취소하는 알고리즘 단계는 다음과 같다:
-
this.[[tracker]].
Cancel()을 호출한다.
[PCSC5]
DWORD의 상위 워드는
해당 DWORD를 16비트 부호 없는 오른쪽 시프트한 결과이다.
dword라는 이름의 [PCSC5]
DWORD의 상위 워드를
설정하여
주어진 숫자 n으로 만들려면 다음 단계를 수행한다:
-
dword를 dword와
0xFFFF의 비트 AND 결과로 설정한다. -
shiftedN을 n을 16비트 왼쪽 시프트한 결과라고 하자.
-
dword를 dword와 shiftedN의 비트 OR 결과로 설정한다.
[PCSC5]
DWORD flags에 플래그 f를
추가하려면,
flags를 flags와 f의 비트 OR 결과로 설정한다.
[PCSC5]
DWORD flags와 f의 비트 AND 결과가
f이면 flags는 플래그 f를 가진다.
5.
SmartCardConnection
인터페이스
[Exposed =(DedicatedWorker ,SharedWorker ,Window ),SecureContext ,IsolatedContext ]interface {SmartCardConnection Promise <undefined >(disconnect optional SmartCardDisposition = "leave");disposition Promise <ArrayBuffer >(transmit BufferSource ,sendBuffer optional SmartCardTransmitOptions = {});options Promise <undefined >(startTransaction SmartCardTransactionCallback ,transaction optional SmartCardTransactionOptions = {});options Promise <SmartCardConnectionStatus >();status Promise <ArrayBuffer >([control EnforceRange ]unsigned long ,controlCode BufferSource );data Promise <ArrayBuffer >([getAttribute EnforceRange ]unsigned long );tag Promise <undefined >([setAttribute EnforceRange ]unsigned long ,tag BufferSource ); };value callback =SmartCardTransactionCallback Promise <SmartCardDisposition ?> ();
SmartCardConnection
인스턴스는 다음 표에
설명된 내부 슬롯을 사용하여 생성된다:
| 내부 슬롯 | 초기값 | 설명(비규범적) |
|---|---|---|
| [[comm]] | null
| 사용할 플랫폼의 [PCSC5]
SCARDCOMM.
|
| [[readerName]] | null
| 이 연결과 관련된 판독기의 이름. |
| [[context]] | null
| 이 인스턴스를 생성한 SmartCardContext.
|
| [[activeProtocol]] | 0 | 플랫폼의 [PCSC5]
구현이 반환한 활성 프로토콜 DWORD.
|
| [[transactionState]] | null
| 해당하는 경우 startTransaction()으로
시작된 진행 중인 트랜잭션의 상태를 보유한다.
|
5.1.
disconnect()
메서드
disconnect(disposition)
메서드 단계는 다음과 같다:
-
promise를 새 프로미스라고 하자.
-
this.[[context]].[[operationInProgress]]가
true이면 promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]이 존재하고 this와 같지 않으면, promise를 "
InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, promise를 "InvalidStateError"DOMException으로 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다:
-
this.[[comm]].
Disconnect()를disposition에 대응하는DWORD를 입력 매개변수로 사용하여 호출한다. -
responseCode를 반환된
RESPONSECODE라고 하자. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 전역 태스크를 큐에 넣는다. 이 태스크는 다음 단계를 수행한다:
-
-
promise를 반환한다.
5.1.1.
SmartCardDisposition
열거형
enum {SmartCardDisposition ,"leave" ,"reset" ,"unpower" };"eject"
"leave"-
카드 상태를 변경하지 않는다. [PCSC5]
SCARD_LEAVE_CARDDWORD에 해당한다. "reset"-
카드를 재설정한다. [PCSC5]
SCARD_RESET_CARDDWORD에 해당한다. "unpower"-
카드의 전원을 끄고 카드에 대한 접근을 종료한다. [PCSC5]
SCARD_UNPOWER_CARDDWORD에 해당한다. "eject"-
판독기에서 카드를 배출한다. [PCSC5]
SCARD_EJECT_CARDDWORD에 해당한다.
5.2.
transmit()
메서드
transmit(sendBuffer, options)
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 this와 같지 않으면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
protocol을 this.[[activeProtocol]]로 설정된 [PCSC5]
DWORD로 설정한다. -
options["protocol"]이 존재하면, protocol을options["protocol"]에 해당하는DWORD로 설정한다. -
protocol이 유효한 프로토콜 값이 아니면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
sendPci를 this.[[activeProtocol]]에 해당하는 플랫폼의 [PCSC5]
SCARD_IO_HEADER로 설정한다. -
pcscSendBuffer를
sendBuffer를 포함하는 [PCSC5]BYTE[]로 설정한다. -
recvPci를 비어 있거나 null인 것과 동등한 플랫폼의
SCARD_IO_HEADER로 설정한다. -
recvBuffer를 가장 큰 [ISO7816-3] 확장 응답 APDU(65538바이트)를 담기에 충분히 큰
BYTE[]로 설정한다. -
recvLength를
0으로 설정된DWORD로 설정한다. -
다음 단계를 병렬로 실행한다.
-
sendPci, pcscSendBuffer, recvPci, recvBuffer 및 recvLength를 인수로 사용하여 this.[[comm]].
Transmit()을 호출한다. -
responseCode를 반환된
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, responseCode에 해당하는 예외로 promise를 거부하고 이 단계를 중단한다. -
recvBuffer의 처음 recvLength바이트를 포함하는
ArrayBuffer로 promise를 이행한다.
-
-
promise를 반환한다.
5.2.1.
SmartCardTransmitOptions
딕셔너리
dictionary {SmartCardTransmitOptions SmartCardProtocol ; };protocol
protocol-
전송에 사용할 프로토콜이다.
5.3.
startTransaction()
메서드
startTransaction(transaction, options)
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[transactionState]]가
null이 아니면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
signal을
null로 설정된AbortSignal로 설정한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다.
-
responseCode를 반환된 [PCSC5]
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 this, responseCode, signal,
transaction및 promise를 사용해 BeginTransaction의 결과를 처리하는 전역 태스크를 큐에 넣는다.
-
promise를 반환한다.
5.3.1.
SmartCardTransactionOptions
딕셔너리
dictionary {SmartCardTransactionOptions AbortSignal ; };signal
signal-
트리거되면 플랫폼의 [PCSC5] Cancel() 메서드가 호출된다.
5.3.2. 보조 알고리즘 및 정의
- pendingDisposition
-
설정되어 있으면 진행 중인 PC/SC 작업이 끝난 후 이 값을
SmartCardDisposition매개변수로 사용하여 [PCSC5]EndTransaction()을 호출해야 함을 의미한다. - pendingException
-
promise를 거부할 때 사용할 예외이다.
- promise
-
startTransaction()호출이 반환한 대기 중인Promise이다.
SmartCardConnection
connection, [PCSC5]
RESPONSECODE responseCode, AbortSignal
signal, SmartCardTransactionCallback
transaction 및 Promise
promise가 주어졌을 때 BeginTransaction의 결과를 처리하려면 다음 단계를 수행한다.
-
connection.[[context]]의 operationInProgress를 지운다.
-
abortReason을
undefined로 설정한다. -
signal이
null이 아니면 다음을 수행한다. -
responseCode가
SCARD_S_SUCCESS가 아니면 다음을 수행한다. -
transactionState를 트랜잭션 상태의 새 인스턴스로 설정하고, 그 promise 항목을 promise로 설정한다.
-
connection.[[transactionState]]를 transactionState로 설정한다.
-
connection.[[context]].[[activeReaderTransactions]][connection.[[readerName]]]을 connection으로 설정한다.
-
callbackPromise를 transaction을 호출한 결과로 설정한다.
-
callbackPromise에 반응한다.
-
callbackPromise가 값 v로 이행되었으면 다음을 수행한다.
-
disposition을 "
reset"으로 설정한다. -
v가
undefined가 아니면 disposition을 v로 설정한다. -
connection.[[context]].[[operationInProgress]]가
true이면 다음을 수행한다.-
transactionState의 pendingException을 "
InvalidStateError"DOMException으로 설정한다. -
transactionState의 pendingDisposition을 disposition으로 설정한다.
-
-
그렇지 않으면 disposition을 사용하여 connection의 트랜잭션을 종료한다.
-
-
callbackPromise가 사유 r로 거부되었으면 다음을 수행한다.
-
transactionState의 pendingException을 r로 설정한다.
-
connection.[[context]].[[operationInProgress]]가
true이면, transactionState의 pendingDisposition을 "reset"으로 설정한다.
-
-
SmartCardConnection
connection의 트랜잭션을 종료하려면 SmartCardDisposition
disposition을 사용하여 다음 단계를 수행한다.
-
단언: connection.[[context]].[[operationInProgress]]는
false이다. -
단언: connection.[[transactionState]]는
null이 아니다. -
단언: connection.[[transactionState]]의 pendingDisposition은
null이다. -
transactionPromise를 connection.[[transactionState]]의 promise로 설정한다.
-
connection.[[comm]]이
null이면 다음을 수행한다.-
"
InvalidStateError"DOMException으로 transactionPromise를 거부한다. -
connection.[[transactionState]]를
null로 설정한다. -
반환한다.
-
-
connection.[[context]].[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다.
-
disposition에 해당하는
DWORD를 입력 매개변수로 사용하여 connection.[[comm]].EndTransaction()을 호출한다. -
responseCode를 반환된 [PCSC5]
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
connection.[[context]]의 operationInProgress를 지운다.
-
connection.[[readerName]]을 connection.[[context]].[[activeReaderTransactions]]에서 제거한다.
-
exception을 connection.[[transactionState]]의 pendingException으로 설정한다.
-
exception이
null이면 다음 단계를 수행한다. -
그렇지 않으면 exception으로 transactionPromise를 거부한다.
-
connection.[[transactionState]]를
null로 설정한다.
-
-
SmartCardConnection
connection의 완료된 모든 트랜잭션을 종료하려면 다음
단계를 수행한다.
-
connection.[[transactionState]]가
null이면 이 단계를 중단한다. -
disposition을 connection.[[transactionState]]의 pendingDisposition으로 설정한다.
-
disposition이
null이면 이 단계를 중단한다. -
connection.[[transactionState]]의 pendingDisposition을
null로 설정한다. -
disposition을 사용하여 connection의 트랜잭션을 종료한다.
대기 중인 [PCSC5]
SCARDCOMM 작업을 취소하려면 this.[[comm]].Cancel()을 호출한다.
5.4.
status()
메서드
status()
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 this와 같지 않으면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다.
-
pcscReader를 빈
STR[]로 설정한다. -
pcscState를
0으로 설정된 [PCSC5]DWORD로 설정한다. -
activeProtocol을
0으로 설정된 [PCSC5]DWORD로 설정한다. -
pcscAtr을 모든 [ISO7816-3] 리셋 응답(ATR)을 담기에 충분히 큰
BYTE[]로 설정한다. -
pcscReader, pcscState, activeProtocol 및 pcscAtr을 출력 매개변수로 사용하여 this.[[comm]].
Status()를 호출한다. -
responseCode를 반환된
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, responseCode에 해당하는 예외로 promise를 거부하고 이 단계를 중단한다. -
state를 pcscState 및 activeProtocol에 해당하는
SmartCardConnectionState로 설정한다. -
state가
undefined이면, "UnknownError"DOMException으로 promise를 거부하고 이 단계를 중단한다. -
status를 새
SmartCardConnectionStatus로 설정한다. -
status["
readerName"]을 pcscReader로 설정한다. -
status["
state"]를 state로 설정한다. -
status["
answerToReset"]을 pcscAtr에 기록된 바이트를 포함하는ArrayBuffer로 설정한다. -
status로 promise를 이행한다.
-
-
promise를 반환한다.
5.4.1.
SmartCardConnectionStatus
딕셔너리
dictionary {SmartCardConnectionStatus required DOMString ;readerName required SmartCardConnectionState ;state ArrayBuffer ; };answerToReset
readerName-
연결된 판독기의 이름이다.
state-
연결의 현재 상태이다.
answerToReset-
해당하는 경우 카드에서 가져온 리셋 응답(ATR) 문자열이다.
5.4.1.1.
SmartCardConnectionState
열거형
enum {SmartCardConnectionState ,"absent" ,"present" ,"swallowed" ,"powered" ,"negotiable" ,"t0" ,"t1" };"raw"
"absent"-
판독기에 카드가 없다.
"present"-
판독기에 카드가 있지만 사용할 위치로 이동되지 않았다.
"swallowed"-
판독기에 카드가 사용할 위치에 있다. 카드에는 전원이 공급되지 않는다.
"powered"-
카드에 전원이 공급되고 있지만 판독기 드라이버는 카드의 모드를 알지 못한다.
"negotiable"-
카드가 재설정되었으며 PTS(프로토콜 유형 선택) 협상을 기다리고 있다.
"t0"-
카드가 [ISO7816-3] T=0 프로토콜 모드에 있으며 새 프로토콜을 협상할 수 없다.
"t1"-
카드가 [ISO7816-3] T=1 프로토콜 모드에 있으며 새 프로토콜을 협상할 수 없다.
"raw"-
카드가 원시 프로토콜 모드에 있으며 새 프로토콜을 협상할 수 없다.
[PCSC5]
DWORD pcscState와 DWORD activeProtocol이 주어졌을 때,
해당하는 SmartCardConnectionState를
다음 단계로 생성한다.
-
pcscState가 [PCSC5]
SCARD_NEGOTIABLE이면 "negotiable"를 반환한다. -
pcscState가 [PCSC5]
SCARD_SPECIFIC이면 다음 단계를 수행한다. -
undefined를 반환한다.
5.5.
control()
메서드
control(controlCode, data)
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 this와 같지 않으면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
pcscControlCode를
controlCode를 포함하는 [PCSC5]DWORD로 설정한다. -
data의 버퍼 소스 복사본을 가져와 그 결과를 [PCSC5]BYTE[]inBuffer에 저장한다. -
outBuffer를 모든 제어 명령 응답을 담기에 충분히 큰 [PCSC5]
BYTE[]로 설정한다. -
outBufferLength를
0으로 설정된DWORD로 설정한다. -
다음 단계를 병렬로 실행한다.
-
pcscControlCode, inBuffer, outBuffer 및 outBufferLength를 인수로 사용하여 this.[[comm]].
Control()을 호출한다. -
responseCode를 반환된
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
-
promise를 반환한다.
5.6.
getAttribute()
메서드
getAttribute(tag)
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 this와 같지 않으면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
다음 단계를 병렬로 실행한다.
-
buffer를 플랫폼의 [PCSC5] 구현에서 결정한 이 판독기 속성을 담기에 충분히 큰 [PCSC5]
BYTE[]로 설정한다. -
pcscTag와 buffer를 인수로 사용하여 this.[[comm]].
GetReaderCapabilities()를 호출한다. -
responseCode를 반환된
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
promise를 반환한다.
5.7.
setAttribute()
메서드
setAttribute(tag, value)
메서드의 단계는 다음과 같다.
-
promise를 새 프로미스로 설정한다.
-
this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 this와 같지 않으면, "
InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[comm]]이
null이면, "InvalidStateError"DOMException으로 promise를 거부하고 promise를 반환한다. -
this.[[context]].[[operationInProgress]]를
true로 설정한다. -
value의 버퍼 소스 복사본을 가져와 그 결과를 [PCSC5]BYTE[]buffer에 저장한다. -
다음 단계를 병렬로 실행한다.
-
pcscTag와 buffer를 인수로 사용하여 this.[[comm]].
SetReaderCapabilities()를 호출한다. -
responseCode를 반환된
RESPONSECODE로 설정한다. -
this의 관련 전역 객체에서 스마트 카드 태스크 소스를 사용하여 다음 단계를 수행하는 전역 태스크를 큐에 넣는다.
-
-
promise를 반환한다.
6. SmartCardError
인터페이스
[Exposed =(DedicatedWorker ,SharedWorker ,Window ),SecureContext ,IsolatedContext ]interface :SmartCardError DOMException {(constructor optional DOMString = "",message SmartCardErrorOptions );options readonly attribute SmartCardResponseCode ; };responseCode
responseCode
속성은 관련 [PCSC5]
메서드가 반환한 오류 또는 경고 응답 코드이다.
SCARD_S_SUCCESS와 다른 [PCSC5]
RESPONSECODE가 주어졌을 때, 해당하는 예외를 다음 단계로 생성한다.
-
pcscCode를 해당
RESPONSECODE로 설정한다. -
pcscCode가
SCARD_E_NO_SERVICE이면 새"no-service"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_NO_SMARTCARD이면 새"no-smartcard"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_NOT_READY이면 새"not-ready"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_NOT_TRANSACTED이면 새"not-transacted"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_PROTO_MISMATCH이면 새"proto-mismatch"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_READER_UNAVAILABLE이면 새"reader-unavailable"SmartCardError를 반환한다. -
pcscCode가
SCARD_W_REMOVED_CARD이면 새"removed-card"SmartCardError를 반환한다. -
pcscCode가
SCARD_W_RESET_CARD이면 새"reset-card"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_SERVER_TOO_BUSY이면 새"server-too-busy"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_SHARING_VIOLATION이면 새"sharing-violation"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_SYSTEM_CANCELLED이면 새"system-cancelled"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_UNKNOWN_READER이면 새"unknown-reader"SmartCardError를 반환한다. -
pcscCode가
SCARD_W_UNPOWERED_CARD이면 새"unpowered-card"SmartCardError를 반환한다. -
pcscCode가
SCARD_W_UNRESPONSIVE_CARD이면 새"unresponsive-card"SmartCardError를 반환한다. -
pcscCode가
SCARD_W_UNSUPPORTED_CARD이면 새"unsupported-card"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_UNSUPPORTED_FEATURE이면 새"unsupported-feature"SmartCardError를 반환한다. -
pcscCode가
SCARD_E_INVALID_HANDLE이면 새 "InvalidStateError"DOMException을 반환한다. -
pcscCode가
SCARD_E_SERVICE_STOPPED이면 새 "InvalidStateError"DOMException을 반환한다. -
pcscCode가
SCARD_P_SHUTDOWN이면 새 "AbortError"DOMException을 반환한다. -
그렇지 않으면 새 "
UnknownError"DOMException을 반환한다.
6.1.
SmartCardErrorOptions
딕셔너리
dictionary {SmartCardErrorOptions required SmartCardResponseCode ; };responseCode
responseCode
멤버는 SmartCardError의
responseCode
속성에 사용할 값이다.
6.2.
SmartCardResponseCode
열거형
enum {SmartCardResponseCode ,"no-service" ,"no-smartcard" ,"not-ready" ,"not-transacted" ,"proto-mismatch" ,"reader-unavailable" ,"removed-card" ,"reset-card" ,"server-too-busy" ,"sharing-violation" ,"system-cancelled" ,"unknown-reader" ,"unpowered-card" ,"unresponsive-card" ,"unsupported-card" };"unsupported-feature"
"no-service"-
[PCSC5] 명세의 SCARD_E_NO_SERVICE이다.
"no-smartcard"-
[PCSC5] 명세의 SCARD_E_NO_SMARTCARD이다.
"not-ready"-
[PCSC5] 명세의 SCARD_E_NOT_READY이다.
"not-transacted"-
[PCSC5] 명세의 SCARD_E_NOT_TRANSACTED이다.
"proto-mismatch"-
[PCSC5] 명세의 SCARD_E_PROTO_MISMATCH이다.
"reader-unavailable"-
[PCSC5] 명세의 SCARD_E_READER_UNAVAILABLE이다.
"removed-card"-
[PCSC5] 명세의 SCARD_W_REMOVED_CARD이다.
"reset-card"-
[PCSC5] 명세의 SCARD_W_RESET_CARD이다.
"server-too-busy"-
스마트 카드 리소스 관리자가 너무 바빠 이 작업을 완료할 수 없다.
"sharing-violation"-
[PCSC5] 명세의 SCARD_E_SHARING_VIOLATION이다.
"system-cancelled"-
[PCSC5] 명세의 SCARD_E_SYSTEM_CANCELLED이다.
"unknown-reader"-
[PCSC5] 명세의 SCARD_E_UNKNOWN_READER이다.
"unpowered-card"-
[PCSC5] 명세의 SCARD_W_UNPOWERED_CARD이다.
"unresponsive-card"-
[PCSC5] 명세의 SCARD_W_UNRESPONSIVE_CARD이다.
"unsupported-card"-
[PCSC5] 명세의 SCARD_W_UNSUPPORTED_CARD이다.
"unsupported-feature"-
[PCSC5] 명세의 SCARD_E_UNSUPPORTED_FEATURE이다.
7. 보안 및 개인정보 보호 고려 사항
이 API는 웹 애플리케이션에 호스트의 PC/SC 스마트 카드 하위 시스템에 대한 접근을 제공한다. 이는 오용될 경우 사용자의 보안과 개인정보 보호에 중대한 부정적 영향을 미칠 수 있는 강력한 기능이다. 이 절에서는 고려된 위협과 이를 완화하기 위한 사용자 에이전트의 규범적 요구 사항을 설명한다.
7.1. 사용자 동의
스마트 카드 판독기와 그 안에 있는 카드에 대한 접근은
강력한 기능이다. 사용자 에이전트는 명시적
권한 없이 웹 애플리케이션이 SmartCardConnection
객체에 접근하도록 허용해서는 안 된다.
특정 출처에 대해 사용자 동의를 얻어야 한다. 동의 요청은 connect()
메서드 호출로 트리거되어야 한다. 사용자 에이전트는 어느 출처가 접근을 요청하는지 명확히 표시하고 사용자가 충분한
정보를 바탕으로 결정을 내릴 수 있도록 하는 권한 프롬프트를 표시해야 한다(예: 스마트 카드 판독기의 이름 표시).
사용자 에이전트는 일시적 권한(예: "이 세션에서만")과 영구적 권한을 모두 선택할 수 있도록 하는 것이 좋다. 사용자가 영구 접근 권한을 부여했다는 사실을 잊을 위험을 완화하려면 일시적 권한을 기본값이자 더 눈에 띄는 옵션으로 제공하는 것이 좋다.
사용자에게 이 API에 대해 이전에 부여된 모든 권한을 확인하고 취소할 수 있는 메커니즘을 제공해야 한다.
7.2. 핑거프린팅
listReaders()
메서드와 SmartCardReaderStateOut
딕셔너리의 answerToReset
멤버는 수동적 핑거프린팅에 사용할 수 있는 정보를 노출한다. 스마트 카드 판독기의 존재와 모델은 사용자가 기업 환경에
있는지 여부와 같은 정보를 드러낼 수 있다. 리셋 응답(ATR)은 스마트 카드의 유형과 발급자를 추가로 식별할 수 있다.
이 명세는 listReaders()를
호출하기 전에 권한 프롬프트를 요구하지 않지만, 전체 API에 대한 접근은 "smart-card" 정책 제어 기능에 의해 제어된다. 이를 통해 관리자나 사용자는
특정 출처에 대해 API를 비활성화하여 핑거프린팅 위험을 완화할 수 있다.
7.3. 기기 및 데이터 무결성
control()
및 setAttribute()
메서드는 스마트 카드 판독기 하드웨어에 대한 직접적이고 저수준의 접근을 제공한다. 악의적인 사이트는 이러한 메서드를
사용하여 악성 펌웨어를 업로드하거나 기기를 작동 불능으로 만들거나 정상 작동을 방해할 수 있다.
마찬가지로 스마트 카드에 연결된 악의적인 사이트는 PIN 확인을 반복적으로 시도하여 카드를 영구적으로 차단하거나, 보호되지 않은 민감한 데이터에 접근하거나 이를 덮어쓸 수 있다.
이러한 위협을 완화하는 주요 수단은 SmartCardConnection
객체가 생성되기 전에 명시적 권한을 요구하는 것이다. 이 요구 사항은 이후의 모든 강력한
메서드에 대한 접근을 통제한다.
7.4. 인증 및 스푸핑
인증 사용 사례에서는 가능한 경우 개발자가 Web Authentication API를 우선 사용하는 것이 좋다.
7.5. 교차 출처 통신
쓰기 가능한 메모리가 있는 스마트 카드는 서로 다른 출처가 다른 동일 출처 정책을 우회하여 데이터를 교환하는 부채널로 사용될 수 있다. 이를 완화하기 위해 특정 출처에 명시적 권한을 부여한다. 공격을 수행하려면 사용자가 잠재적으로 악의적인 여러 출처에 스마트 카드 접근 권한을 부여해야 한다.
7.6. 격리된 컨텍스트
이 API는 격리된 컨텍스트에서만 노출되어야 한다.
7.7. 문서 수명 주기
문서가 사용자의 직접적인 통제를 벗어난 동안 민감한 하드웨어에 대한 연결을 유지하지 못하도록 하기 위해, 사용자
에이전트는 문서가 더 이상 완전히 활성 상태가 아닐 때 모든 활성 SmartCardContext
객체와 연결된 SmartCardConnection을
폐기해야 한다. 여기에는 disconnect()가
호출된 것처럼 모든 활성 연결을 자동으로 끊는 작업이 포함된다.
8. 통합
8.1. 권한 정책
이 명세는 Navigator
객체의 smartCard
속성이 노출하는 메서드를 사용할 수 있는지 제어하는 기능을 정의한다.
이 기능의 기능 이름은 "smart-card"이다.
이 기능의 기본 허용 목록은
'none'이다. 사용자 에이전트는 특정 출처에 대해 이를 'self'로 재정의할 수 있다
(예: 사용자의 결정에 따라).