メインコンテンツまでスキップ

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

セッション管理​

このレイヤーはセッション状態を維持し、複数の同時セッションをサポートします。

セッションのライフサイクル:

機能:

  • 複数セッション: スロットごとに同時セッションをサポートします。
  • 状態追跡: セッションが開いていてユーザー状態にあるかどうかを追跡します。
  • 分離: 各セッションは独自のオブジェクトハンドルマッピングテーブルを持ちます。
  • クリーンアップ: セッションのクローズ時にリソースを解放します。
PIN は送信されません

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

次のステップ​