PKCS#11 インターフェイスレイヤー
PKCS#11 インターフェイスレイヤー は、Oracle Database が通信する最上位のコンポーネントです。Oracle が期待する標準の PKCS#11 (Cryptoki) C サーフェスを提示し、各呼び出しを、下位レイヤーが DuoKey Cockpit に運ぶリクエストに変換します。
概要
責務
Cryptoki 関数サーフェス
このレイヤーは、Oracle TDE が駆動する標準の PKCS#11 (Cryptoki) 関数を実装します。Oracle は標準の C_GetFunctionList エントリーポイントを通じてライブラリをロードし、限定されたサブセットを使用します。
- 初期化:
C_Initialize、C_Finalize - スロット/トークン:
C_GetSlotList、C_GetTokenInfo - セッション:
C_OpenSession、C_CloseSession、C_Login、C_Logout - オブジェクト:
C_FindObjectsInit、C_FindObjects、C_GetAttributeValue、C_CreateObject、C_DestroyObject - キー:
C_GenerateKey - 暗号(ラップ/アンラップ):
C_Encrypt、C_Decrypt、およびそれらのマルチパート形式…Update/…Final
セッション管理
このレイヤーはセッション状態を維持し、複数の同時セッションをサポートします。
セッションのライフサイクル:
機能:
- 複数セッション: スロットごとに同時セッションをサポートします。
- 状態追跡: セッションが開いていてユーザー状態にあるかどうかを追跡します。
- 分離: 各セッションは独自のオブジェクトハンドルマッピングテーブルを持ちます。
- クリーンアップ: セッションのクローズ時にリソースを解放します。
C_Login はユーザー状態に入りますが、PIN を送信することはありません。Cockpit への認証は、各リクエストとともに運ばれる access_guid ベアラートークンによって行われます(DuoKey SDK レイヤー を参照)。
オブジェクトハンドル管理
Oracle は整数ハンドルでオブジェクトを参照するのに対し、DuoKey Cockpit は永続的な識別子でキーを参照します。インターフェイスレイヤーは、セッションごとにその間をマッピングします。完全なモデルについては オブジェクトハンドルマッピング を参照してください。
Oracle uses: integer object handle (e.g. 0x12345)
|
Library maps to: DuoKey key identifier
メカニズム処理
このレイヤーは、Oracle TDE が使用する標準の Cryptoki メカニズム(マスターキー用の CKM_AES_KEY_GEN、テーブルおよび表領域キーのラップ用の CKM_AES_CBC_PAD)を受け入れ、操作とそのパラメーター(IV、パディング)を下位レイヤーに運びます。詳細(TDE に長さを保持する AES-CBC パスが必要な理由を含む)については 暗号メカニズム を参照してください。
属性処理
このレイヤーは、オブジェクトの作成と検索のための PKCS#11 属性テンプレートを処理します。一般的な属性は次のとおりです。
- CKA_CLASS — オブジェクトクラス(秘密鍵、データオブジェクト)
- CKA_KEY_TYPE — キータイプ(例:
CKK_AES) - CKA_LABEL / CKA_ID — マスターキーの特定に使用されます
- CKA_ENCRYPT / CKA_DECRYPT / CKA_WRAP / CKA_UNWRAP — 機能フラグ
CKA_VALUE はセンシティブです。C_GetAttributeValue はこれを拒否するため(CKR_ATTRIBUTE_SENSITIVE)、マスターキーのバイト列が呼び出し元に返されることは決してありません。
主要な関数
C_Initialize
pkcs11.toml の構成を読み込み、DuoKey Cockpit への接続を確立します。
- 構成ファイル(または
DKE_PKCS11_*環境変数による上書き)を読み込みます。 access_guidベアラートークンを用いて HTTPS クライアントを準備します。- Cockpit への接続性を検証します。
- 成功時に
CKR_OKを、Cockpit に到達できない場合にCKR_DEVICE_ERRORを返します。
C_OpenSession
トークンとのセッションを開き、セッション状態を初期化し、セッションのオブジェクトハンドルマッピングテーブルを作成します。
C_Login
ユーザー状態に入ります。PIN は送信されず(リクエストごとのベアラートークンが認証情報です)、この呼び出しは対話的なログインを実行するのではなく、準備完了状態を検証します。
C_GenerateKey
AES-256 マスターキーをプロビジョニングします。メカニズムを検証し、属性テンプレートを解析し、Cockpit にキー作成を要求し、返されたキー識別子をハンドルにマッピングして、そのハンドルを Oracle に返します。
C_FindObjects
CKA_LABEL / CKA_ID によってマスターキーを特定し、一致した各キーをセッションハンドルにマッピングします。
C_Encrypt / C_Decrypt
マスターキーによってテーブルおよび表領域キーをラップ/アンラップします。単一パートとマルチパートの両方の形式がサポートされます。このレイヤーは、ハンドルをキー識別子に解決し、操作を Cockpit に運び、結果を返します。
エラー処理
このレイヤーは、下位レイヤーおよびトランスポートのエラーを標準の Cryptoki リターンコードに変換し、Oracle に一貫した結果が見えるようにします。
| 条件 | PKCS#11 コード |
|---|---|
| Cockpit に到達不能/バックエンドエラー | CKR_DEVICE_ERROR |
| 認証失敗 | CKR_PIN_INCORRECT |
| 不明なオブジェクトハンドル | CKR_OBJECT_HANDLE_INVALID |
| 無効なパラメーター | CKR_ARGUMENTS_BAD |
| サポートされていないメカニズム | CKR_MECHANISM_INVALID |
| センシティブ属性の要求 | CKR_ATTRIBUTE_SENSITIVE |
次のステップ
- DuoKey SDK レイヤー → - 操作が DuoKey Cockpit にどのように到達するか
- オブジェクトハンドルマッピング → - ハンドル変換を理解する
- 通信フロー → - 操作がシステムをどのように流れるかを見る