WebスマートカードAPI

非公式提案草案,

このバージョン:
https://wicg.github.io/web-smart-card/
課題追跡:
GitHub
編集者:
(Google)
(Google)

概要

このAPIの目的は、スマートカード(PC/SC)アプリケーションを Webプラットフォームへ移行できるようにすることです。このAPIにより、ホストOSで利用可能なPC/SC 実装(およびカードリーダードライバー)へアクセスできます。

付属する解説 文書もあります。

この文書の位置付け

この仕様は、Web Platform Incubator Community Groupによって公開されました。 これはW3C標準ではなく、W3C標準化過程にもありません。 以下の W3C Community Contributor License Agreement (CLA) には限定的なオプトアウトがあり、その他の条件も適用されることに注意してください。 W3Cコミュニティグループおよびビジネスグループについて詳しく学ぶことができます。

[Exposed=Window, SecureContext, IsolatedContext]
partial interface Navigator {
  [SameObject] readonly attribute SmartCardResourceManager 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() メソッドの手順は次のとおりです。

  1. this関連するグローバルオブジェクト関連付けられたDocumentが、 「smart-card」という名前のポリシー制御機能使用することを許可されていない場合、"SecurityError" DOMException投げます

  2. promise新しい Promiseとします。

  3. 次の手順を並行して実行します。

    1. resourceManagerを、プラットフォームの [PCSC5] RESOURCEMANAGERクラスの新しいインスタンスとします。

    2. resourceManagerEstablishContextメソッドを、 "system"というScopeパラメーターを指定して呼び出します。

    3. 返されたRESPONSECODESCARD_S_SUCCESSでない場合、 次の手順を実行します。

      1. resourceManagerを破棄します。

      2. グローバルタスクをキューに追加し関連するグローバルオブジェクトである this上に、スマートカード タスクソースを使用して、promise対応する 例外却下します。

    4. それ以外の場合、次の手順を実行します。

      1. context新しい SmartCardContext とし、その [[resourceManager]]内部 スロットを resourceManagerに設定します。

      2. グローバルタスクをキューに追加し関連するグローバルオブジェクト であるthis上に、スマートカード タスクソースを使用して、 promisecontext解決します。

  4. 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() メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[operationInProgress]]trueに設定します。

  4. 次の手順を並行して実行します。

    1. resourceQueryを、プラットフォームの [PCSC5] RESOURCEQUERYクラスの新しいインスタンスとし、 this.[[resourceManager]]を コンストラクターの入力パラメーターとします。

    2. groupsを、プラットフォーム上で「システム内のすべての リーダー」と同等のグループ名一覧を含む、プラットフォームの[PCSC5] STR[] とします。

    3. pcscReadersを空のSTR[]とします。

    4. resourceQueryListReadersメソッドを、 groupsを入力パラメーター、pcscReadersを出力パラメーターとして呼び出します。

    5. responseCodeを、返された RESPONSECODEとします。

    6. resourceQueryを破棄します。

    7. グローバルタスクをキューに追加し関連するグローバルオブジェクトである this上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. thisoperationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合:

        1. responseCodeSCARD_E_NO_READERS_AVAILABLEの場合、 promiseを空の DOMStringsequence解決します。

        2. それ以外の場合、promiseresponseCode対応する 例外却下します。

      3. それ以外の場合、promisepcscReadersと同等の DOMStringsequence解決します。

  5. promiseを返します。

4.2. getStatusChange() メソッド

getStatusChange(readerStates, options) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. options["signal"]が 存在する場合、次の手順を実行します。

    1. signaloptions["signal"]とします。

    2. signal中止されている場合、promisesignal中止理由却下し、 promiseを返します。

    3. this.[[signal]]signalに設定します。

    4. signalに、未完了の GetStatusChangeをキャンセルするアルゴリズムを追加します。

  4. pcscTimeoutを、[PCSC5] INFINITEに設定された[PCSC5] DWORDとします。

  5. options["timeout"]が 存在する場合、pcscTimeoutoptions["timeout"]に設定します。

  6. pcscReaderStatesを、 readerStates対応する[PCSC5] SCARD_READERSTATE[]とします。

  7. this.[[operationInProgress]]trueに設定します。

  8. this.[[tracker]]を、プラットフォームの [PCSC5] SCARDTRACKクラスの新しいインスタンスに設定し、 this.[[resourceManager]]を コンストラクターの入力パラメーターとします。

  9. 次の手順を並行して実行します。

    1. this.[[tracker]].GetStatusChange()を、 pcscReaderStatesおよびpcscTimeoutを入力パラメーターとして呼び出します。

    2. responseCodeを、返された [PCSC5] RESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトである this上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[tracker]]nullに設定します。

      2. thisoperationInProgressをクリアします。

      3. abortReasonundefinedとします。

      4. this.[[signal]]nullでない場合、 次の手順を実行します。

        1. this.[[signal]]中止されている場合、 abortReasonthis.[[signal]]中止理由に設定します。

        2. 未完了の GetStatusChangeをキャンセルするアルゴリズムを、 this.[[signal]]から 削除します。

        3. this.[[signal]]nullに設定します。

      5. responseCodeSCARD_S_SUCCESSでない場合、次の 手順を実行します。

        1. responseCodeSCARD_E_CANCELLEDであり、 abortReasonundefinedでない場合、 promiseabortReason却下します。

        2. それ以外の場合、promiseresponseCode対応する 例外却下します。

        3. 返ります。

      6. readerStatesOutを、pcscReaderStates対応するSmartCardReaderStateOutの シーケンスとします。

      7. promisereaderStatesOut解決します。

  10. promiseを返します。

4.2.1. SmartCardReaderStateIn 辞書

dictionary SmartCardReaderStateIn {
  required DOMString readerName;
  required SmartCardReaderStateFlagsIn currentState;
  unsigned long currentCount;
};
readerName

スマートカードリーダーの名前。

currentState

アプリケーションが認識している、そのスマートカードリーダーの現在の状態。

currentCount

アプリケーションが認識している、このリーダーにおけるカード挿入および取り外しイベントの現在の回数。

readerStatesという名前のSmartCardReaderStateInのシーケンスが与えられた場合、 [PCSC5]対応する SCARD_READERSTATE[]は、次の手順で作成されます。

  1. pcscReaderStatesを空のSCARD_READERSTATE[]とします。

  2. readerStates内の、型がSmartCardReaderStateInである stateInそれぞれ処理します。

    1. pcscStateSCARD_READERSTATEとします。

    2. pcscState.ReaderstateIn["readerName"]に設定します。

    3. pcscState.CurrentStateを、 stateIn["currentState"]に 対応するDWORDに設定します。

    4. stateIn["currentCount"]が 存在する場合、 pcscState.CurrentState上位ワードをstateIn["currentCount"]に 設定します。

    5. pcscState.EventStateを0に設定します。

    6. pcscStatepcscReaderStates付加します。

  3. 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は、次の手順で作成されます。

  1. flagsInを、指定されたSmartCardReaderStateFlagsInとします。

  2. pcscFlagsを0に設定されたDWORDとします。

  3. flagsIn["unaware"]が trueの場合、[PCSC5] SCARD_STATE_UNAWAREpcscFlags追加します。

  4. flagsIn["ignore"]が trueの場合、[PCSC5] SCARD_STATE_IGNOREpcscFlags追加します。

  5. flagsIn["unavailable"]が trueの場合、[PCSC5] SCARD_STATE_UNAVAILABLEpcscFlags追加します。

  6. flagsIn["empty"]が trueの場合、[PCSC5] SCARD_STATE_EMPTYpcscFlags追加します。

  7. flagsIn["present"]が trueの場合、[PCSC5] SCARD_STATE_PRESENTpcscFlags追加します。

  8. flagsIn["exclusive"]が trueの場合、[PCSC5] SCARD_STATE_EXCLUSIVEpcscFlags追加します。

  9. flagsIn["inuse"]が trueの場合、[PCSC5] SCARD_STATE_INUSEpcscFlags追加します。

  10. flagsIn["mute"]が trueの場合、SCARD_STATE_MUTEpcscFlags追加します。

  11. flagsIn["unpowered"]が trueの場合、SCARD_STATE_UNPOWEREDpcscFlags追加します。

  12. 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対応するシーケンスは、次の手順で作成されます。

  1. readerStatesOutを空のSmartCardReaderStateOutの シーケンスとします。

  2. pcscReaderStates内の、型が SCARD_READERSTATEであるpcscStateそれぞれ処理します。

    1. stateOutSmartCardReaderStateOutとします。

    2. stateOut["readerName"]を pcscState.Readerに設定します。

    3. stateOut["eventState"]を、 pcscState.EventState対応するSmartCardReaderStateFlagsOut 辞書に設定します。

    4. stateOut["eventCount"]を、 pcscState.EventState上位ワードに設定します。

    5. プラットフォームのSCARD_READERSTATE構造体にカードの [ISO7816-3] Answer To Resetを含むメンバーがある場合、stateOut["answerToReset"]を その値に設定します。

    6. stateOutreaderStatesOut付加します。

  3. 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 辞書は、次の手順で作成されます。

  1. flagsOutを、既定のメンバーを持つSmartCardReaderStateFlagsOut 辞書とします。

  2. pcscFlags[PCSC5] SCARD_STATE_IGNORE持つ場合、 flagsOut["ignore"]を trueに設定します。

  3. pcscFlags[PCSC5] SCARD_STATE_CHANGED持つ場合、 flagsOut["changed"]を trueに設定します。

  4. pcscFlags[PCSC5] SCARD_STATE_UNAVAILABLE持つ場合、 flagsOut["unavailable"]を trueに設定します。

  5. pcscFlags[PCSC5] SCARD_STATE_UNKNOWN持つ場合、 flagsOut["unknown"]を trueに設定します。

  6. pcscFlags[PCSC5] SCARD_STATE_EMPTY持つ場合、 flagsOut["empty"]を trueに設定します。

  7. pcscFlags[PCSC5] SCARD_STATE_PRESENT持つ場合、 flagsOut["present"]を trueに設定します。

  8. pcscFlags[PCSC5] SCARD_STATE_EXCLUSIVE持つ場合、 flagsOut["exclusive"]を trueに設定します。

  9. pcscFlags[PCSC5] SCARD_STATE_INUSE持つ場合、 flagsOut["inuse"]を trueに設定します。

  10. pcscFlagsSCARD_STATE_MUTE持つ場合、 flagsOut["mute"]を trueに設定します。

  11. pcscFlagsSCARD_STATE_UNPOWERED持つ場合、 flagsOut["unpowered"]を trueに設定します。

  12. 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) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[activeReaderTransactions]][readerName]が 存在する場合、promiseを"InvalidStateError" DOMException却下し、 promiseを返します。

  4. this.[[operationInProgress]]trueに設定します。

  5. 次の手順を並行して実行します。

    1. accessFlagsを、accessMode対応する[PCSC5] DWORDとします。

    2. protocolFlags0に設定されたDWORDとします。

    3. options["preferredProtocols"]が 存在する場合、protocolFlagsを、その 対応するフラグに設定します。

    4. activeProtocol0に設定されたDWORDとします。

    5. commを、プラットフォームの[PCSC5] SCARDCOMMクラスの新しいインスタンスとし、this.[[resourceManager]]を コンストラクターのパラメーターとします。

    6. comm.Connect()を、readerNameaccessFlagsおよびprotocolFlagsを入力パラメーター、 activeProtocolを出力パラメーターとして呼び出します。

    7. responseCodeを、返されたRESPONSECODEとします。

    8. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. thisoperationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合:

        1. commを破棄します。

        2. promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. resultを空のSmartCardConnectResult 辞書とします。

      4. connectionを新しいSmartCardConnectionとします。

      5. connectionthis.[[connections]]付加します。

      6. connection.[[comm]]commに設定します。

      7. connection.[[readerName]]readerNameに設定します。

      8. connection.[[context]]thisに設定します。

      9. connection.[[activeProtocol]]activeProtocolに設定します。

      10. result["connection"]を connectionに設定します。

      11. activeProtocol有効なプロトコル値である場合、 result["activeProtocol"]を 対応するSmartCardProtocolに設定します。

      12. promiseresult解決します。

  6. promiseを返します。

4.3.1. SmartCardProtocol 列挙型

enum SmartCardProtocol {
  "raw",
  "t0",
  "t1"
};
"raw"

「Raw」モード。特殊用途の要件に対する任意のデータ交換プロトコルをサポートするために 使用できます。[PCSC5] SCARD_PROTOCOL_RAW DWORDに対応します。

"t0"

[ISO7816-3] T=0。非同期半二重文字伝送プロトコル。[PCSC5] SCARD_PROTOCOL_T0 DWORDに対応します。

"t1"

[ISO7816-3] T=1。非同期半二重ブロック伝送プロトコル。[PCSC5] SCARD_PROTOCOL_T1 DWORDに対応します。

[PCSC5] DWORDが、[PCSC5] SCARD_PROTOCOL_T0[PCSC5] SCARD_PROTOCOL_T1、または[PCSC5] SCARD_PROTOCOL_RAWのいずれかである場合、その値は 有効なプロトコル値です。

protocolsという名前のSmartCardProtocolのシーケンスが与えられた場合、 対応するフラグを持つ[PCSC5] DWORDは、次の 手順で作成されます。

  1. flags0に設定されたDWORDとします。

  2. protocols内の、型がSmartCardProtocolである protocolそれぞれ処理し、 protocolに対応するDWORDflags追加します。

  3. 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は、次の手順で作成されます。

  1. dword0に設定されたDWORDとします。

  2. accessModeが"shared"の場合、 dword[PCSC5] SCARD_SHARE_SHAREDに設定します。

  3. accessModeが"exclusive"の場合、 dword[PCSC5] SCARD_SHARE_EXCLUSIVEに設定します。

  4. accessModeが"direct"の場合、 dword[PCSC5] SCARD_SHARE_DIRECTに設定します。

  5. dwordを返します。

4.3.4. SmartCardConnectOptions 辞書

dictionary SmartCardConnectOptions {
  sequence<SmartCardProtocol> preferredProtocols;
};
preferredProtocols

使用できるカード通信プロトコル。

4.4. 補助アルゴリズムおよび定義

SmartCardContext context operationInProgressをクリアするには、次の手順を実行します。

  1. 表明context.[[operationInProgress]]trueです。

  2. context.[[operationInProgress]]falseに設定します。

  3. context.[[connections]]に含まれる、型がSmartCardConnectionである connectionそれぞれ処理します。

    1. connection確定済みトランザクションを終了します。

    2. context.[[operationInProgress]]trueの場合、これらの手順を中止します。

未完了のGetStatusChangeをキャンセルするアルゴリズムの手順は 次のとおりです。

  1. this.[[tracker]].Cancel()を呼び出します。

[PCSC5] DWORD上位ワードは、 そのDWORDを16ビット符号なし右シフトした結果です。

dwordという名前の[PCSC5] DWORD上位ワードを 指定された数値nに設定するには、次の手順を実行します。

  1. dwordを、dword0xFFFFのビット単位ANDに設定します。

  2. shiftedNを、nを16ビット左シフトした結果とします。

  3. dwordを、dwordshiftedNのビット単位ORに設定します。

fというフラグを追加するには、 [PCSC5] DWORD flagsを、flagsfのビット単位ORに設定します。

[PCSC5] DWORD flagsfのビット単位ANDが fである場合、flagsフラグを持ちます

5. SmartCardConnection インターフェイス

[Exposed=(DedicatedWorker, SharedWorker, Window), SecureContext, IsolatedContext]
interface SmartCardConnection {
  Promise<undefined> disconnect(optional SmartCardDisposition disposition = "leave");

  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) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. this.[[context]].[[operationInProgress]]trueに設定します。

  6. 次の手順を並行して実行します。

    1. this.[[comm]].Disconnect()を、 dispositionに 対応するDWORDを入力パラメーターとして呼び出します。

    2. responseCodeを、返されたRESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. this.[[comm]]を破棄します。

      4. this.[[comm]]nullに設定します。

      5. promise解決します。

  7. promiseを返します。

5.1.1. SmartCardDisposition 列挙型

enum SmartCardDisposition {
  "leave",
  "reset",
  "unpower",
  "eject"
};
"leave"

カードの状態を変更しません。[PCSC5] SCARD_LEAVE_CARD DWORDに対応します。

"reset"

カードをリセットします。[PCSC5] SCARD_RESET_CARD DWORDに対応します。

"unpower"

カードの電源を切り、カードへのアクセスを終了します。[PCSC5] SCARD_UNPOWER_CARD DWORDに対応します。

"eject"

カードをリーダーから排出します。[PCSC5] SCARD_EJECT_CARD DWORDに対応します。

5.2. transmit() メソッド

transmit(sendBuffer, options) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. protocolを、this.[[activeProtocol]]に設定された [PCSC5] DWORDとします。

  6. options["protocol"]が 存在する場合、protocoloptions["protocol"]に 対応するDWORDに設定します。

  7. protocol有効なプロトコル値でない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  8. this.[[context]].[[operationInProgress]]trueに設定します。

  9. sendPciを、this.[[activeProtocol]]に対応する、 プラットフォームの[PCSC5] SCARD_IO_HEADERとします。

  10. pcscSendBufferを、sendBufferを含む [PCSC5] BYTE[]とします。

  11. recvPciを、空またはnullに相当するプラットフォームのSCARD_IO_HEADERとします。

  12. recvBufferを、最大の[ISO7816-3] 拡張応答APDU(65538バイト)を保持するのに十分な大きさのBYTE[]とします。

  13. recvLength0に設定されたDWORDとします。

  14. 次の手順を並行して実行します。

    1. this.[[comm]].Transmit()を、 sendPcipcscSendBufferrecvPcirecvBufferおよび recvLengthを引数として呼び出します。

    2. responseCodeを、返されたRESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. promiseを、recvBufferの先頭 recvLengthバイトを含むArrayBuffer解決します。

  15. promiseを返します。

5.2.1. SmartCardTransmitOptions 辞書

dictionary SmartCardTransmitOptions {
  SmartCardProtocol protocol;
};
protocol

伝送に使用するプロトコル。

5.3. startTransaction() メソッド

startTransaction(transaction, options) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在する場合、promiseを"InvalidStateError" DOMException却下し、 promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、 promiseを返します。

  5. this.[[transactionState]]nullでない場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  6. signalnullに設定されたAbortSignalとします。

  7. options["signal"]が 存在する場合、次の手順を実行します。

    1. options["signal"]が 中止されている場合、promiseoptions["signal"]の 中止理由却下し、 promiseを返します。

    2. signaloptions["signal"]に設定します。

    3. signalキャンセル アルゴリズムを追加します。

  8. this.[[context]].[[operationInProgress]]trueに設定します。

  9. 次の手順を並行して実行します。

    1. this.[[comm]].BeginTransaction()を呼び出します。

    2. responseCodeを、返された[PCSC5] RESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、スマートカードタスク ソースを使用して、thisresponseCodesignaltransaction およびpromiseを用いてBeginTransactionの結果を 処理します。

  10. 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 responseCodeAbortSignal signalSmartCardTransactionCallback transaction、およびPromise promiseが与えられた場合、BeginTransactionの結果を処理するには、 次の手順を実行します。

  1. connection.[[context]]operationInProgressをクリアします。

  2. abortReasonundefinedとします。

  3. signalnullでない場合:

    1. signalからキャンセル アルゴリズムを削除します。

    2. signal中止されている場合、abortReasonsignal中止理由に設定します。

  4. responseCodeSCARD_S_SUCCESSでない場合:

    1. responseCodeSCARD_E_CANCELLEDであり、abortReasonundefinedでない場合、 promiseabortReason却下します。

    2. それ以外の場合、promiseresponseCode対応する例外却下します。

    3. 返ります。

  5. transactionStateを新しいトランザクション状態とし、そのpromise項目を promiseに設定します。

  6. connection.[[transactionState]]transactionStateに設定します。

  7. connection.[[context]].[[activeReaderTransactions]][connection.[[readerName]]]をconnectionに設定します。

  8. callbackPromiseを、transaction呼び出した結果とします。

  9. callbackPromise反応します。

SmartCardConnection connectionトランザクションを終了し、SmartCardDisposition dispositionを使用するには、次の手順を実行します。

  1. 表明connection.[[context]].[[operationInProgress]]falseです。

  2. 表明connection.[[transactionState]]nullではありません。

  3. 表明connection.[[transactionState]]pendingDispositionnullです。

  4. transactionPromiseを、connection.[[transactionState]]promiseとします。

  5. connection.[[comm]]nullの場合:

    1. transactionPromiseを"InvalidStateError" DOMException却下します。

    2. connection.[[transactionState]]nullに設定します。

    3. 返ります。

  6. connection.[[context]].[[operationInProgress]]trueに設定します。

  7. 次の手順を並行して実行します。

    1. connection.[[comm]].EndTransaction()を、 dispositionに対応するDWORDを入力パラメーターとして呼び出します。

    2. responseCodeを、返された[PCSC5] RESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. connection.[[context]]operationInProgressをクリアします。

      2. connection.[[readerName]]を、 connection.[[context]].[[activeReaderTransactions]]から 削除します。

      3. exceptionを、connection.[[transactionState]]pendingExceptionとします。

      4. exceptionnullの場合、次の手順を実行します。

        1. responseCodeSCARD_S_SUCCESSの場合、 transactionPromise解決します。

        2. それ以外の場合、transactionPromiseresponseCode対応する例外却下します。

      5. それ以外の場合、transactionPromiseexception却下します。

      6. connection.[[transactionState]]nullに設定します。

SmartCardConnection connection確定済みトランザクションを終了するには、 次の手順を実行します。

  1. connection.[[transactionState]]nullの場合、これらの手順を中止します。

  2. dispositionを、connection.[[transactionState]]pendingDispositionとします。

  3. dispositionnullの場合、これらの手順を中止します。

  4. connection.[[transactionState]]pendingDispositionnullに設定します。

  5. connectionトランザクションを終了し、 dispositionを使用します。

未完了の[PCSC5] SCARDCOMM操作をキャンセルするには、this.[[comm]].Cancel()を呼び出します。

5.4. status() メソッド

status() メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. this.[[context]].[[operationInProgress]]trueに設定します。

  6. 次の手順を並行して実行します。

    1. pcscReaderを空のSTR[]とします。

    2. pcscState0に設定された[PCSC5] DWORDとします。

    3. activeProtocol0に設定された[PCSC5] DWORDとします。

    4. pcscAtrを、任意の[ISO7816-3] Answer To Reset(ATR)を保持するのに十分な大きさのBYTE[]とします。

    5. this.[[comm]].Status()を、 pcscReaderpcscStateactiveProtocolおよび pcscAtrを出力パラメーターとして呼び出します。

    6. responseCodeを、返されたRESPONSECODEとします。

    7. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. stateを、pcscStateおよびactiveProtocol対応するSmartCardConnectionStateとします。

      4. stateundefinedの場合、 promiseを"UnknownError" DOMException却下し、これらの手順を中止します。

      5. statusを新しいSmartCardConnectionStatusとします。

      6. status["readerName"]を pcscReaderに設定します。

      7. status["state"]を stateに設定します。

      8. status["answerToReset"]を、 pcscAtrに書き込まれたバイトを含むArrayBufferに設定します。

      9. promisestatus解決します。

  7. 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 は、次の手順で作成されます。

  1. pcscState[PCSC5] SCARD_ABSENTの場合、"absent"を返します。

  2. pcscState[PCSC5] SCARD_PRESENTの場合、"present"を返します。

  3. pcscState[PCSC5] SCARD_SWALLOWEDの場合、"swallowed"を返します。

  4. pcscState[PCSC5] SCARD_POWEREDの場合、"powered"を返します。

  5. pcscState[PCSC5] SCARD_NEGOTIABLEの場合、"negotiable"を返します。

  6. pcscState[PCSC5] SCARD_SPECIFICの場合、次の手順を実行します。

    1. activeProtocol[PCSC5] SCARD_PROTOCOL_T0の場合、"t0"を返します。

    2. activeProtocol[PCSC5] SCARD_PROTOCOL_T1の場合、"t1"を返します。

    3. activeProtocol[PCSC5] SCARD_PROTOCOL_RAWの場合、"raw"を返します。

  7. undefinedを返します。

5.5. control() メソッド

control(controlCode, data) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. this.[[context]].[[operationInProgress]]trueに設定します。

  6. pcscControlCodeを、controlCodeを含む [PCSC5] DWORDとします。

  7. dataバッファーソースのコピーを取得し、結果を [PCSC5] BYTE[] inBufferに保存します。

  8. outBufferを、任意の制御コマンド応答を保持するのに十分な大きさの [PCSC5] BYTE[]とします。

  9. outBufferLength0に設定されたDWORDとします。

  10. 次の手順を並行して実行します。

    1. this.[[comm]].Control()を、 pcscControlCodeinBufferoutBufferおよび outBufferLengthを引数として呼び出します。

    2. responseCodeを、返されたRESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. resultBytesを、outBufferの先頭 outBufferLengthバイトとします。

      4. promiseを、this関連するRealmで、 resultBytesからArrayBuffer作成した結果で解決します。

  11. promiseを返します。

5.6. getAttribute() メソッド

getAttribute(tag) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. this.[[context]].[[operationInProgress]]trueに設定します。

  6. 次の手順を並行して実行します。

    1. pcscTagを、tagを含む [PCSC5] DWORDとします。

    2. bufferを、プラットフォームの[PCSC5] 実装によって決定される、このリーダー属性を保持するのに十分な大きさの [PCSC5] BYTE[]とします。

    3. this.[[comm]].GetReaderCapabilities()を、 pcscTagおよびbufferを引数として呼び出します。

    4. responseCodeを、返されたRESPONSECODEとします。

    5. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. resultBytesを、読み取られた属性を含むbufferのバイトとします。

      4. promiseを、this関連するRealmで、 resultBytesからArrayBuffer作成した結果で解決します。

  7. promiseを返します。

5.7. setAttribute() メソッド

setAttribute(tag, value) メソッドの手順は次のとおりです。

  1. promise新しい Promiseとします。

  2. this.[[context]].[[operationInProgress]]trueの場合、promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  3. this.[[context]].[[activeReaderTransactions]][this.[[readerName]]]が 存在し、かつthisと等しくない場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  4. this.[[comm]]nullの場合、 promiseを"InvalidStateError" DOMException却下し、promiseを返します。

  5. this.[[context]].[[operationInProgress]]trueに設定します。

  6. pcscTagを、tagを含む [PCSC5] DWORDとします。

  7. valueバッファーソースのコピーを取得し、結果を [PCSC5] BYTE[] bufferに保存します。

  8. 次の手順を並行して実行します。

    1. this.[[comm]].SetReaderCapabilities()を、 pcscTagおよびbufferを引数として呼び出します。

    2. responseCodeを、返されたRESPONSECODEとします。

    3. グローバルタスクをキューに追加し関連するグローバルオブジェクトであるthis上に、次の手順を実行するスマートカードタスク ソースを使用します。

      1. this.[[context]]operationInProgressをクリアします。

      2. responseCodeSCARD_S_SUCCESSでない場合、 promiseresponseCode対応する例外却下し、これらの手順を中止します。

      3. promise解決します。

  9. 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が与えられた場合、対応する 例外は、次の手順で作成されます。

  1. pcscCodeを、そのRESPONSECODEとします。

  2. pcscCodeSCARD_E_NO_SERVICEの場合、新しい"no-service" SmartCardErrorを返します。

  3. pcscCodeSCARD_E_NO_SMARTCARDの場合、新しい"no-smartcard" SmartCardErrorを返します。

  4. pcscCodeSCARD_E_NOT_READYの場合、新しい"not-ready" SmartCardErrorを返します。

  5. pcscCodeSCARD_E_NOT_TRANSACTEDの場合、新しい"not-transacted" SmartCardErrorを返します。

  6. pcscCodeSCARD_E_PROTO_MISMATCHの場合、新しい"proto-mismatch" SmartCardErrorを返します。

  7. pcscCodeSCARD_E_READER_UNAVAILABLEの場合、新しい"reader-unavailable" SmartCardErrorを返します。

  8. pcscCodeSCARD_W_REMOVED_CARDの場合、新しい"removed-card" SmartCardErrorを返します。

  9. pcscCodeSCARD_W_RESET_CARDの場合、新しい"reset-card" SmartCardErrorを返します。

  10. pcscCodeSCARD_E_SERVER_TOO_BUSYの場合、新しい"server-too-busy" SmartCardErrorを返します。

  11. pcscCodeSCARD_E_SHARING_VIOLATIONの場合、新しい"sharing-violation" SmartCardErrorを返します。

  12. pcscCodeSCARD_E_SYSTEM_CANCELLEDの場合、新しい"system-cancelled" SmartCardErrorを返します。

  13. pcscCodeSCARD_E_UNKNOWN_READERの場合、新しい"unknown-reader" SmartCardErrorを返します。

  14. pcscCodeSCARD_W_UNPOWERED_CARDの場合、新しい"unpowered-card" SmartCardErrorを返します。

  15. pcscCodeSCARD_W_UNRESPONSIVE_CARDの場合、新しい"unresponsive-card" SmartCardErrorを返します。

  16. pcscCodeSCARD_W_UNSUPPORTED_CARDの場合、新しい"unsupported-card" SmartCardErrorを返します。

  17. pcscCodeSCARD_E_UNSUPPORTED_FEATUREの場合、新しい"unsupported-feature" SmartCardErrorを返します。

  18. pcscCodeSCARD_E_INVALID_PARAMETERの場合、新しいTypeErrorを返します。

  19. pcscCodeSCARD_E_INVALID_HANDLEの場合、新しい"InvalidStateError" DOMExceptionを返します。

  20. pcscCodeSCARD_E_SERVICE_STOPPEDの場合、新しい"InvalidStateError" DOMExceptionを返します。

  21. pcscCodeSCARD_P_SHUTDOWNの場合、新しい"AbortError" DOMExceptionを返します。

  22. それ以外の場合、新しい"UnknownError" DOMExceptionを返します。

6.1. SmartCardErrorOptions 辞書

dictionary SmartCardErrorOptions {
  required SmartCardResponseCode responseCode;
};

responseCode メンバーは、SmartCardErrorresponseCode 属性の値です。

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スマート カードサブシステムへのアクセスを提供します。これは、悪用された場合、 ユーザーのセキュリティおよびプライバシーに重大な悪影響を与える可能性がある 強力な機能です。この節では、考慮される脅威と、それらを軽減するための ユーザーエージェントに対する規範的要件について概説します。

スマートカードリーダーおよびその中に存在するカードへのアクセスは、 強力な機能です。ユーザーエージェントは、 明示的な許可なしに、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'に上書きしてもよいものとします(たとえば、ユーザーの判断に基づく場合)。

適合性

文書の 表記規則

適合性要件は、説明的な表明と RFC 2119の用語を組み合わせて 表現されます。 この文書の規範的な部分にあるキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、 「MAY」、および「OPTIONAL」は、 RFC 2119で説明されているとおりに解釈されます。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で表記されるとは限りません。

明示的に非規範的と記された節、例、および注記を除き、 この仕様のすべての文章は規範的です。 [RFC2119]

この仕様の例は、「たとえば」という語で導入されるか、 次のようにclass="example"を使用して 規範的な文章から区別されます。

これは参考例の一例です。

参考注記は「注」という語で始まり、 次のようにclass="note"を使用して 規範的な文章から区別されます。

注:これは参考注記です。

索引

この仕様で定義される 用語

参照によって 定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM標準. 現行標準. URL: https://dom.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高精度時間. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[ISO7816-3]
識別カード-ICカード; 第3部:接点付きカード-電気的インターフェイスおよび伝送プロトコル. 2006年11月1日. 公開済み. URL: https://www.iso.org/standard/38770.html
[ISOLATED-CONTEXTS]
分離された コンテキスト. コミュニティグループ報告書草案. URL: https://wicg.github.io/isolated-web-apps/isolated-contexts.html
[PCSC5]
ICカードと パーソナルコンピューターシステムの相互運用性仕様;第5部:ICカードリソースマネージャーの 定義. 2005年9月30日. 公開済み. URL: https://pcscworkgroup.com/Download/Specifications/pcsc5_v2.01.01.pdf
[PERMISSIONS]
Marcos Caceres; Mike Taylor. 権限. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. 権限 ポリシー. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. 要件レベルを 示すためにRFCで使用するキーワード. 1997年3月. 現在の最良の慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. 現行 標準. URL: https://webidl.spec.whatwg.org/

IDL索引

[Exposed=Window, SecureContext, IsolatedContext]
partial interface Navigator {
  [SameObject] readonly attribute SmartCardResourceManager smartCard;
};

[Exposed=(DedicatedWorker, SharedWorker), SecureContext, IsolatedContext]
partial interface WorkerNavigator {
  [SameObject] readonly attribute SmartCardResourceManager smartCard;
};

[Exposed=(DedicatedWorker, SharedWorker, Window), SecureContext, IsolatedContext]
interface SmartCardResourceManager {
  Promise<SmartCardContext> establishContext();
};

[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 = {});
};

dictionary SmartCardReaderStateIn {
  required DOMString readerName;
  required SmartCardReaderStateFlagsIn currentState;
  unsigned long currentCount;
};

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;
};

dictionary SmartCardReaderStateOut {
  required DOMString readerName;
  required SmartCardReaderStateFlagsOut eventState;
  required unsigned long eventCount;
  ArrayBuffer answerToReset;
};

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;
};

dictionary SmartCardGetStatusChangeOptions {
  DOMHighResTimeStamp timeout;
  AbortSignal signal;
};

enum SmartCardProtocol {
  "raw",
  "t0",
  "t1"
};

dictionary SmartCardConnectResult {
  required SmartCardConnection connection;
  SmartCardProtocol activeProtocol;
};

enum SmartCardAccessMode {
  "shared",
  "exclusive",
  "direct"
};

dictionary SmartCardConnectOptions {
  sequence<SmartCardProtocol> preferredProtocols;
};

[Exposed=(DedicatedWorker, SharedWorker, Window), SecureContext, IsolatedContext]
interface SmartCardConnection {
  Promise<undefined> disconnect(optional SmartCardDisposition disposition = "leave");

  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?> ();

enum SmartCardDisposition {
  "leave",
  "reset",
  "unpower",
  "eject"
};

dictionary SmartCardTransmitOptions {
  SmartCardProtocol protocol;
};

dictionary SmartCardTransactionOptions {
  AbortSignal signal;
};

dictionary SmartCardConnectionStatus {
  required DOMString readerName;
  required SmartCardConnectionState state;
  ArrayBuffer answerToReset;
};

enum SmartCardConnectionState {
  "absent",
  "present",
  "swallowed",
  "powered",
  "negotiable",
  "t0",
  "t1",
  "raw"
};

[
  Exposed=(DedicatedWorker, SharedWorker, Window),
  SecureContext,
  IsolatedContext
] interface SmartCardError : DOMException {
  constructor(optional DOMString message = "", SmartCardErrorOptions options);
  readonly attribute SmartCardResponseCode responseCode;
};

dictionary SmartCardErrorOptions {
  required SmartCardResponseCode responseCode;
};

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"
};