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()
메서드의 단계는 다음과 같습니다:
-
this의 [[operationInProgress]]가
true이면, 거부된 프로미스를 반환합니다. 거부 사유는 "InvalidStateError"DOMException입니다. -
this의 [[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
resourceQuery를 플랫폼의 새 [PCSC5]
RESOURCEQUERY클래스의 인스턴스로 두고, this의 [[resourceManager]]를 생성자 입력 매개변수로 사용합니다. -
groups를 해당 플랫폼의 [PCSC5]
STR[]로 둡니다. 이는 해당 플랫폼에서 "시스템의 모든 리더"에 해당하는 그룹 이름 목록을 포함합니다. -
pcscReaders를 빈
STR[]로 둡니다. -
ListReaders메서드를 resourceQuery에서 호출하며, groups를 입력 매개변수로, pcscReaders를 출력 매개변수로 사용합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
resourceQuery를 파기합니다.
-
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress 초기화를 this에 대해 수행합니다.
-
responseCode가
SCARD_S_SUCCESS가 아니면: -
그렇지 않으면 이행합니다. promise의 이행 값은
sequence이며, 요소 타입은DOMString이고, pcscReaders와 동등합니다.
-
-
-
promise를 반환합니다.
4.2.
getStatusChange()
메서드
getStatusChange(readerStates, options)
메서드의 단계는 다음과 같습니다:
-
this의 [[operationInProgress]]가
true이면, 거부된 프로미스를 반환합니다. 거부 사유는 "InvalidStateError"DOMException입니다. -
options["signal"]이 존재하면, 다음 단계를 실행합니다:-
this의 [[signal]]을 signal로 설정합니다.
-
추가합니다. 대기 중인 GetStatusChange를 취소하는 this의 알고리즘을 signal에 추가합니다.
-
options["timeout"]이 존재하면, pcscTimeout을options["timeout"]으로 설정합니다. -
pcscReaderStates를 [PCSC5]
SCARD_READERSTATE[]로 둡니다. 이는 다음에 대응합니다:readerStates. -
this의 [[operationInProgress]]를
true로 설정합니다. -
this의 [[tracker]]를 새 인스턴스로 설정합니다. 이 인스턴스는 플랫폼의 [PCSC5]
SCARDTRACK클래스의 인스턴스이며, this의 [[resourceManager]]를 생성자 입력 매개변수로 사용합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
this의 [[tracker]].
GetStatusChange()를 pcscReaderStates와 pcscTimeout을 입력 매개변수로 사용하여 호출합니다. -
responseCode를 반환된 [PCSC5]
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
this의 [[tracker]]를
null로 설정합니다. -
operationInProgress 초기화를 this에 대해 수행합니다.
-
abortReason을
undefined로 둡니다. -
this의 [[signal]]이
null이 아니면, 다음 단계를 실행합니다:-
this의 [[signal]]이 중단되었으면, abortReason을 this의 [[signal]]의 중단 사유로 설정합니다.
-
제거합니다. 대기 중인 GetStatusChange를 취소하는 this의 알고리즘을 this의 [[signal]]에서 제거합니다.
-
this의 [[signal]]을
null로 설정합니다.
-
-
responseCode가
SCARD_S_SUCCESS가 아니면, 다음 단계를 실행합니다: -
readerStatesOut을
SmartCardReaderStateOut의 시퀀스로 두며, 이는 다음에 대응합니다: pcscReaderStates. -
이행합니다. 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)
메서드의 단계는 다음과 같습니다:
-
this의 [[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 거부된 프로미스를 반환합니다. -
this의 [[activeReaderTransactions]][
readerName]이 존재하면, "InvalidStateError"DOMException으로 거부된 프로미스를 반환합니다. -
this의 [[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
accessFlags를 [PCSC5]
DWORD로 둡니다. 이는accessMode에 대응합니다. -
protocolFlags를
0으로 설정된DWORD로 둡니다. -
options["preferredProtocols"]이 존재하면, protocolFlags를 해당 대응하는 플래그로 설정합니다. -
activeProtocol을
0으로 설정된DWORD로 둡니다. -
comm을 플랫폼의 [PCSC5]
SCARDCOMM클래스의 새 인스턴스로 두고, this의 [[resourceManager]]를 생성자 매개변수로 사용합니다. -
comm.
Connect()를 호출하고readerName, accessFlags 및 protocolFlags를 입력 매개변수로, activeProtocol을 출력 매개변수로 사용합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 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이면 이 단계를 중단한다.
-
SmartCardContext의 대기 중인 GetStatusChange를 취소하려면 SmartCardContext
context의 context.[[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)
메서드의 단계는 다음과 같습니다:
-
만약 this.[[context]].[[operationInProgress]]가
true이면, "InvalidStateError"DOMException으로 거부된 프로미스를 반환합니다. -
만약 this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 그 값이 this와 같지 않으면, 거부된 프로미스를 반환합니다. 거부 사유는 "
InvalidStateError"DOMException입니다. -
만약 this.[[comm]]이
null이면, 거부된 프로미스를 반환합니다. 거부 사유는 "InvalidStateError"DOMException입니다. -
다음 값을 설정합니다: this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
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)
메서드의 단계는 다음과 같다.
-
만약 this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
만약 this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 그 값이 this와 같지 않으면, 다음 예외로 거부된 프로미스를 반환합니다: "
InvalidStateError"DOMException. -
만약 this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
protocol을 [PCSC5]
DWORD로 두고 그 값을 this.[[activeProtocol]]로 설정합니다. -
options["protocol"]이 존재하면, protocol을DWORD로 설정합니다. 이는 다음에 대응합니다:options["protocol"]. -
만약 protocol이 유효한 프로토콜 값이 아니면, 다음 예외로 거부된 프로미스를 반환합니다: "
InvalidStateError"DOMException. -
설정 대상은 this.[[context]].[[operationInProgress]]이며, 설정 값은
true입니다. -
sendPci를 플랫폼의 [PCSC5]
SCARD_IO_HEADER로 둡니다. 이는 this.[[activeProtocol]]에 대응합니다. -
pcscSendBuffer를 [PCSC5]
BYTE[]로 둡니다. 여기에는sendBuffer가 포함됩니다. -
recvPci를 비어 있거나 null인 상태에 해당하는 플랫폼의
SCARD_IO_HEADER로 둡니다. -
recvBuffer를
BYTE[]로 둡니다. 이 배열은 최대 크기의 [ISO7816-3] 확장 응답 APDU(65538바이트)를 담을 수 있을 만큼 충분히 큽니다. -
recvLength를
DWORD로 두고0으로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
this.[[comm]].
Transmit()를 다음 인수로 호출합니다: sendPci, pcscSendBuffer, recvPci, recvBuffer 및 recvLength를 인수로 사용합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 this.[[context]]입니다.
-
만약 responseCode가
SCARD_S_SUCCESS가 아니면, 거부합니다. promise를 예외로 거부하며, 이 예외는 대응하는 값인 responseCode에 따른 것입니다. 그런 다음 이 단계를 중단합니다. -
이행합니다. promise를
ArrayBuffer로 이행하며, recvLength바이트만큼의 recvBuffer 선두 데이터를 포함합니다.
-
-
-
promise를 반환합니다.
5.2.1.
SmartCardTransmitOptions
딕셔너리
dictionary {SmartCardTransmitOptions SmartCardProtocol ; };protocol
protocol-
전송에 사용할 프로토콜이다.
5.3.
startTransaction()
메서드
startTransaction(transaction, options)
메서드의 단계는 다음과 같다.
-
this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하면, 다음 예외로 거부된 프로미스를 반환합니다: "
InvalidStateError"DOMException. -
this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[transactionState]]가
null이 아니면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
signal을
AbortSignal로 두고null로 설정합니다. -
this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
responseCode를 반환된 [PCSC5]
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하여 BeginTransaction의 결과를 처리합니다. 이때 this, responseCode, signal,
transaction및 promise를 사용합니다.
-
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의 결과를 처리하려면 다음 단계를 수행한다.
-
operationInProgress를 초기화합니다. 대상은 connection.[[context]]입니다.
-
abortReason을
undefined로 둡니다. -
signal이
null이 아니면: -
responseCode가
SCARD_S_SUCCESS가 아니면: -
transactionState를 새로운 트랜잭션 상태로 두고, 해당 상태의 프로미스 항목을 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으로 설정합니다.
-
-
그렇지 않으면, connection의 트랜잭션을 종료합니다. 이때 disposition을 사용합니다.
-
-
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]]의 프로미스로 둡니다.
-
connection.[[comm]]이
null이면:-
transactionPromise를 "
InvalidStateError"DOMException으로 거부합니다. -
connection.[[transactionState]]를
null로 설정합니다. -
반환합니다.
-
-
connection.[[context]].[[operationInProgress]]를
true로 설정합니다. -
다음 단계를 병렬로 실행합니다:
-
connection.[[comm]].
EndTransaction()을 호출하고, disposition에 대응하는DWORD를 입력 매개변수로 사용합니다. -
responseCode를 반환된 [PCSC5]
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 connection의 관련 전역 객체이며, 스마트 카드 작업 소스를 사용합니다. 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 connection.[[context]]입니다.
-
제거합니다. connection.[[readerName]]을 connection.[[context]].[[activeReaderTransactions]]에서 제거합니다.
-
exception을 connection.[[transactionState]]의 pendingException으로 둡니다.
-
exception이
null이면, 다음 단계를 수행합니다: -
그렇지 않으면, transactionPromise를 거부합니다. 거부 사유는 exception입니다.
-
connection.[[transactionState]]를
null로 설정합니다.
-
-
처리가 완료된 트랜잭션을 종료하려면 SmartCardConnection
connection에 대해 다음 단계를 수행합니다:
-
connection.[[transactionState]]가
null이면, 이 단계를 중단합니다. -
disposition을 connection.[[transactionState]]의 pendingDisposition으로 둡니다.
-
disposition이
null이면, 이 단계를 중단합니다. -
connection.[[transactionState]]의 pendingDisposition을
null로 설정합니다. -
connection의 트랜잭션을 종료합니다. 이때 disposition을 사용합니다.
대기 중인 [PCSC5]
SCARDCOMM 작업을 취소하려면 SmartCardConnection
connection의 connection.[[comm]].Cancel()을 호출합니다.
5.4.
status()
메서드
status()
메서드의 단계는 다음과 같습니다:
-
this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]이 존재하고 그 값이 this와 같지 않으면, 다음 예외로 거부된 프로미스를 반환합니다: "
InvalidStateError"DOMException. -
this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
pcscReader를 빈
STR[]로 둡니다. -
pcscState를 [PCSC5]
DWORD로 두고0으로 설정합니다. -
activeProtocol을 [PCSC5]
DWORD로 두고0으로 설정합니다. -
pcscAtr을 모든 [ISO7816-3] 리셋 응답(ATR)을 담을 수 있을 만큼 충분히 큰
BYTE[]로 둡니다. -
this.[[comm]].
Status()를 호출하며, pcscReader, pcscState, activeProtocol 및 pcscAtr을 출력 매개변수로 사용합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 this.[[context]]입니다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, 거부합니다. promise를 예외로 거부하며, 이 예외는 대응하는 responseCode의 예외입니다. 그런 다음 이 단계를 중단합니다. -
state를
SmartCardConnectionState로 둡니다. 이는 다음에 대응합니다: pcscState와 activeProtocol. -
state가
undefined이면, promise를 거부합니다. 거부 사유는 "UnknownError"DOMException입니다. 그런 다음 이 단계를 중단합니다. -
status를 새
SmartCardConnectionStatus로 둡니다. -
status["
readerName"]을 pcscReader로 설정합니다. -
status["
state"]를 state로 설정합니다. -
status["
answerToReset"]을ArrayBuffer로 설정합니다. 이 배열에는 pcscAtr에 기록된 바이트가 포함됩니다. -
promise를 status로 이행합니다.
-
-
-
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)
메서드의 단계는 다음과 같다.
-
만약 this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
만약 this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]가 존재하고 그 값이 this와 같지 않으면, 거부된 프로미스를 반환합니다. 거부 사유는 "
InvalidStateError"DOMException입니다. -
만약 this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
pcscControlCode를 [PCSC5]
DWORD로 두고controlCode를 포함하도록 합니다. -
버퍼 소스의 복사본을 가져옵니다.
data의 복사 결과를 다음 [PCSC5]BYTE[]inBuffer에 저장합니다. -
outBuffer를 [PCSC5]
BYTE[]로 둡니다. 모든 제어 명령 응답을 담을 수 있을 만큼 충분히 큽니다. -
outBufferLength를
DWORD로 두고0으로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
this.[[comm]].
Control()을 호출하며, pcscControlCode, inBuffer, outBuffer 및 outBufferLength를 인수로 사용합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 this.[[context]]입니다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, 거부합니다. promise를 예외로 거부하며, 이 예외는 대응하는 responseCode의 예외입니다. 그런 다음 이 단계를 중단합니다. -
resultBytes를 outBufferLength바이트만큼의 outBuffer 선두 데이터로 둡니다.
-
이행합니다. promise를 생성한
ArrayBuffer의 결과로 이행합니다. resultBytes를 사용하여 this의 관련 Realm에서 생성합니다.
-
-
-
promise를 반환합니다.
5.6.
getAttribute()
메서드
getAttribute(tag)
메서드의 단계는 다음과 같다.
-
this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]이 존재하고 그 값이 this와 같지 않으면, 거부된 프로미스를 반환합니다. 거부 사유는 "
InvalidStateError"DOMException입니다. -
this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
buffer를 [PCSC5]
BYTE[]로 둡니다. 이 배열은 해당 리더의 속성을 담을 수 있을 만큼 충분히 크며, 그 크기는 플랫폼의 [PCSC5] 구현에 따라 결정됩니다. -
this.[[comm]].
GetReaderCapabilities()를 pcscTag와 buffer를 인수로 사용하여 호출합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 this.[[context]]입니다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, 거부합니다. promise를 예외로 거부하며, 이 예외는 대응하는 responseCode의 예외입니다. 그런 다음 이 단계를 중단합니다. -
resultBytes를 읽은 속성을 포함하는 buffer의 바이트로 둡니다.
-
이행합니다. promise를 생성한
ArrayBuffer의 결과로 이행합니다. resultBytes를 사용하여 this의 관련 Realm에서 생성합니다.
-
-
promise를 반환합니다.
5.7.
setAttribute()
메서드
setAttribute(tag, value)
메서드의 단계는 다음과 같다.
-
this.[[context]].[[operationInProgress]]가
true이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]이 존재하고 그 값이 this와 같지 않으면, 거부된 프로미스를 반환합니다. 거부 사유는 "
InvalidStateError"DOMException입니다. -
this.[[comm]]이
null이면, 다음 예외로 거부된 프로미스를 반환합니다: "InvalidStateError"DOMException. -
this.[[context]].[[operationInProgress]]를
true로 설정합니다. -
value의 버퍼 소스 복사본을 가져와 그 결과를 [PCSC5]BYTE[]buffer에 저장합니다. -
promise를 새 프로미스로 둡니다.
-
다음 단계를 병렬로 실행합니다:
-
this.[[comm]].
SetReaderCapabilities()를 pcscTag와 buffer를 인수로 사용하여 호출합니다. -
responseCode를 반환된
RESPONSECODE로 둡니다. -
전역 작업을 큐에 추가합니다. 대상은 관련 전역 객체이며, 이는 this의 객체입니다. 스마트 카드 작업 소스를 사용하며, 이 작업은 다음 단계를 수행합니다:
-
operationInProgress를 초기화합니다. 대상은 this.[[context]]입니다.
-
responseCode가
SCARD_S_SUCCESS가 아니면, 거부합니다. promise를 예외로 거부하며, 이 예외는 대응하는 responseCode의 예외입니다. 그런 다음 이 단계를 중단합니다. -
promise를 이행합니다.
-
-
-
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_PARAMETER이면TypeError의 새 인스턴스를 반환한다. -
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'로 재정의할 수 있다
(예: 사용자의 결정에 따라).