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を新しい 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を新しい 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を新しい Promiseとします。
-
this.[[operationInProgress]]が
trueの場合、promiseを"InvalidStateError"DOMExceptionで 却下し、promiseを返します。 -
options["signal"]が 存在する場合、次の手順を実行します。-
this.[[signal]]をsignalに設定します。
-
signalに、未完了の GetStatusChangeをキャンセルするアルゴリズムを追加します。
-
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-
アプリケーションは、リーダー内のカードが1つ以上の別のアプリケーションによって使用中であるものの、 共有モードで接続できる可能性があると判断しています。
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-
リーダー内のカードは1つ以上の別のアプリケーションによって使用中ですが、共有 モードで接続できる可能性があります。
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を新しい 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に設定します。
fというフラグを追加するには、
[PCSC5]
DWORD flagsを、flagsとfのビット単位ORに設定します。
[PCSC5]
DWORD flagsとfのビット単位ANDが
fである場合、flagsはフラグを持ちます。
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を新しい 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を新しい 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を返します。 -
protocolを、this.[[activeProtocol]]に設定された [PCSC5]
DWORDとします。 -
options["protocol"]が 存在する場合、protocolをoptions["protocol"]に 対応するDWORDに設定します。 -
protocolが有効なプロトコル値でない場合、 promiseを"
InvalidStateError"DOMExceptionで 却下し、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とします。 -
次の手順を並行して実行します。
-
this.[[comm]].
Transmit()を、 sendPci、pcscSendBuffer、recvPci、recvBufferおよび recvLengthを引数として呼び出します。 -
responseCodeを、返された
RESPONSECODEとします。 -
グローバルタスクをキューに追加し、関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。
-
responseCodeが
SCARD_S_SUCCESSでない場合、 promiseをresponseCodeに対応する例外で却下し、これらの手順を中止します。 -
promiseを、recvBufferの先頭 recvLengthバイトを含む
ArrayBufferで 解決します。
-
-
promiseを返します。
5.2.1.
SmartCardTransmitOptions
辞書
dictionary {SmartCardTransmitOptions SmartCardProtocol ; };protocol
protocol-
伝送に使用するプロトコル。
5.3.
startTransaction()
メソッド
startTransaction(transaction, options)
メソッドの手順は次のとおりです。
-
promiseを新しい Promiseとします。
-
this.[[context]].[[operationInProgress]]が
trueの場合、promiseを"InvalidStateError"DOMExceptionで 却下し、promiseを返します。 -
this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在する場合、promiseを"
InvalidStateError"DOMExceptionで 却下し、 promiseを返します。 -
this.[[comm]]が
nullの場合、 promiseを"InvalidStateError"DOMExceptionで 却下し、 promiseを返します。 -
this.[[transactionState]]が
nullでない場合、promiseを"InvalidStateError"DOMExceptionで 却下し、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操作が完了した後、 [PCSC5]
EndTransaction()を、この値をSmartCardDispositionパラメーターとして指定して呼び出すべきであることを意味します。 - 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に設定します。
-
-
それ以外の場合、connectionのトランザクションを終了し、 dispositionを使用します。
-
-
callbackPromiseが理由rで却下された場合:
-
transactionStateのpendingExceptionを rに設定します。
-
connection.[[context]].[[operationInProgress]]が
trueの場合、transactionStateのpendingDispositionを "reset"に設定します。 -
それ以外の場合、connectionのトランザクションを終了し、 "
reset"を使用します。
-
-
SmartCardConnection
connectionのトランザクションを終了し、SmartCardDisposition
dispositionを使用するには、次の手順を実行します。
-
表明: connection.[[context]].[[operationInProgress]]は
falseです。 -
表明: connection.[[transactionState]]は
nullではありません。 -
表明: connection.[[transactionState]]のpendingDispositionは
nullです。 -
transactionPromiseを、connection.[[transactionState]]のpromiseとします。
-
connection.[[comm]]が
nullの場合:-
transactionPromiseを"
InvalidStateError"DOMExceptionで 却下します。 -
connection.[[transactionState]]を
nullに設定します。 -
返ります。
-
-
connection.[[context]].[[operationInProgress]]を
trueに設定します。 -
次の手順を並行して実行します。
-
connection.[[comm]].
EndTransaction()を、 dispositionに対応するDWORDを入力パラメーターとして呼び出します。 -
responseCodeを、返された[PCSC5]
RESPONSECODEとします。 -
グローバルタスクをキューに追加し、関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。
-
connection.[[context]]の operationInProgressをクリアします。
-
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操作をキャンセルするには、this.[[comm]].Cancel()を呼び出します。
5.4.
status()
メソッド
status()
メソッドの手順は次のとおりです。
-
promiseを新しい 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に設定します。 -
次の手順を並行して実行します。
-
pcscReaderを空の
STR[]とします。 -
pcscStateを
0に設定された[PCSC5]DWORDとします。 -
activeProtocolを
0に設定された[PCSC5]DWORDとします。 -
pcscAtrを、任意の[ISO7816-3] Answer To Reset(ATR)を保持するのに十分な大きさの
BYTE[]とします。 -
this.[[comm]].
Status()を、 pcscReader、pcscState、activeProtocolおよび pcscAtrを出力パラメーターとして呼び出します。 -
responseCodeを、返された
RESPONSECODEとします。 -
グローバルタスクをキューに追加し、関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。
-
responseCodeが
SCARD_S_SUCCESSでない場合、 promiseをresponseCodeに対応する例外で却下し、これらの手順を中止します。 -
stateを、pcscStateおよびactiveProtocolに 対応する
SmartCardConnectionStateとします。 -
stateが
undefinedの場合、 promiseを"UnknownError"DOMExceptionで 却下し、これらの手順を中止します。 -
statusを新しい
SmartCardConnectionStatusとします。 -
status["
readerName"]を pcscReaderに設定します。 -
status["
state"]を stateに設定します。 -
status["
answerToReset"]を、 pcscAtrに書き込まれたバイトを含むArrayBufferに設定します。 -
promiseをstatusで解決します。
-
-
promiseを返します。
5.4.1.
SmartCardConnectionStatus
辞書
dictionary {SmartCardConnectionStatus required DOMString ;readerName required SmartCardConnectionState ;state ArrayBuffer ; };answerToReset
readerName-
接続されているリーダーの名前。
state-
接続の現在の状態。
answerToReset-
該当する場合、カードからのAnswer To Reset(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"-
カードはrawプロトコルモードにあり、新しいプロトコルをネゴシエートできません。
[PCSC5]
DWORD pcscStateおよびDWORD activeProtocolが与えられた場合、
対応するSmartCardConnectionState
は、次の手順で作成されます。
-
pcscStateが[PCSC5]
SCARD_NEGOTIABLEの場合、"negotiable"を返します。 -
pcscStateが[PCSC5]
SCARD_SPECIFICの場合、次の手順を実行します。 -
undefinedを返します。
5.5.
control()
メソッド
control(controlCode, data)
メソッドの手順は次のとおりです。
-
promiseを新しい 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に設定します。 -
pcscControlCodeを、
controlCodeを含む [PCSC5]DWORDとします。 -
dataの バッファーソースのコピーを取得し、結果を [PCSC5]BYTE[]inBufferに保存します。 -
outBufferを、任意の制御コマンド応答を保持するのに十分な大きさの [PCSC5]
BYTE[]とします。 -
outBufferLengthを
0に設定されたDWORDとします。 -
次の手順を並行して実行します。
-
this.[[comm]].
Control()を、 pcscControlCode、inBuffer、outBufferおよび outBufferLengthを引数として呼び出します。 -
responseCodeを、返された
RESPONSECODEとします。 -
グローバルタスクをキューに追加し、関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。
-
-
promiseを返します。
5.6.
getAttribute()
メソッド
getAttribute(tag)
メソッドの手順は次のとおりです。
-
promiseを新しい 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に設定します。 -
次の手順を並行して実行します。
-
bufferを、プラットフォームの[PCSC5] 実装によって決定される、このリーダー属性を保持するのに十分な大きさの [PCSC5]
BYTE[]とします。 -
this.[[comm]].
GetReaderCapabilities()を、 pcscTagおよびbufferを引数として呼び出します。 -
responseCodeを、返された
RESPONSECODEとします。 -
グローバルタスクをキューに追加し、関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。
-
promiseを返します。
5.7.
setAttribute()
メソッド
setAttribute(tag, value)
メソッドの手順は次のとおりです。
-
promiseを新しい 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に設定します。 -
valueの バッファーソースのコピーを取得し、結果を [PCSC5]BYTE[]bufferに保存します。 -
次の手順を並行して実行します。
-
this.[[comm]].
SetReaderCapabilities()を、 pcscTagおよびbufferを引数として呼び出します。 -
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は、WebアプリケーションにホストのPC/SCスマート カードサブシステムへのアクセスを提供します。これは、悪用された場合、 ユーザーのセキュリティおよびプライバシーに重大な悪影響を与える可能性がある 強力な機能です。この節では、考慮される脅威と、それらを軽減するための ユーザーエージェントに対する規範的要件について概説します。
7.1. ユーザーの同意
スマートカードリーダーおよびその中に存在するカードへのアクセスは、
強力な機能です。ユーザーエージェントは、
明示的な許可なしに、WebアプリケーションがSmartCardConnection
オブジェクトへのアクセスを得ることを許可してはなりません。
ユーザーの同意は、特定の
オリジンについて取得しなければなりません。同意の要求は、
connect()
メソッドの呼び出しによって開始されなければなりません。
ユーザーエージェントは、どのオリジンがアクセスを要求しているかを明確に示し、
ユーザーが十分な情報に基づいて判断するために必要な情報
(たとえば、スマートカードリーダーの名前)を提供する許可プロンプトを
表示しなければなりません。
ユーザーエージェントは、一時的な許可 (例:「このセッションのみ」)と永続的な許可の両方の選択肢を 提供するべきです。ユーザーが永続的なアクセスを許可したことを 忘れるリスクを軽減するため、一時的な許可を 既定かつより目立つ選択肢とするべきです。
ユーザーには、このAPIについて以前に付与した許可を 表示および取り消すための仕組みを提供しなければなりません。
7.2. フィンガープリンティング
listReaders()
メソッドおよび
SmartCardReaderStateOut
辞書の
answerToReset
メンバーは、受動的フィンガープリンティングに使用できる情報を公開します。
スマートカードリーダーの存在およびモデルは、ユーザーが企業環境にいるかどうかなど、
ユーザーに関する情報を明らかにする可能性があります。Answer to Reset(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'に上書きしてもよいものとします(たとえば、ユーザーの判断に基づく場合)。