暗号操作: GREP11 API

IBM Cloud® Hyper Protect Crypto Services は、クラウドの ハードウェア・セキュリティー・モジュール(HSM)A physical appliance that provides on-demand encryption, key management, and key storage as a managed service. で実行される暗号化機能のセットを提供します。 Enterprise PKCS #11 (EP11) over gRPC API 呼び出し (GREP11 とも呼ばれます) によってこれらの関数にリモートからアクセスすることによって、暗号操作を実行できます。

GREP11 関数と PKCS #11 および EP11 との関係について詳しくは、GREP11 の概要を参照してください。

GREP11 API は、単一の暗号装置に対して最大 500 要求/秒を処理できます。

API へのアクセス

GREP11 API 関数呼び出しを実行する前に、初期化のために GREP11 API エンドポイント、サービス ID API キー、IAM エンドポイントが必要です。 詳しくは、GREP11 API 要求の生成を参照してください。

エラー処理

GREP11 は、 エラー処理の gRPC 仕様に依存しています。 エラーが発生すると、 gRPC クライアントは message Status プロトコル・バッファーを受け取ります。

message Status {
    int32 code = 1;
    string message = 2;
    repeated google.protobuf.Any details = 3;
}

エラー・メッセージの説明

  • code には状況コードが入ります。状況コードは、google.rpc.Code フィールドの列挙型 (enum) 値である必要があります。
  • message には、開発者向けのエラー・メッセージ (英語) が入ります。 ユーザー向けのエラー・メッセージはすべて、ローカライズして google.rpc.Status.details フィールドに入れて送信するか、ユーザー自身がローカライズする必要があります。
  • details には、エラーの詳細を伝えるメッセージのリストが入ります。 API で使用できる、一連の共通のメッセージ・タイプがあります。

GREP11 は、Detail フィールドを使用して詳細なエラー・コード情報を追加します。

message Grep11Error {
    uint64 Code = 1;
    string Detail = 2;
    bool Retry = 3;
}

Codeフィールドは、PKCS #11の CK_RV (K) 値にキャストできます。 このフィールドには、 PKCS #11 仕様 または EP11で定義されたベンダー拡張によって定義されたエラー・コードが含まれます。 EP11 では、PKCS #11 で定義されている戻り値のサブセットだけを使用します。 詳しくは、Enterprise PKCS #11 Library structure の『10.1.6 Return values』のセクションを参照してください。

エラーを処理する Golang の が用意されています。

GREP11 関数のリスト

この表のアスタリスク (*) のマークが付いている PKCS #11 関数は、EP11 over gRPC で実装されています。 それ以外の関数は実装されていません。

表 1. gRPC 上の EP11 に実装されている機能について説明します。
PKCS #11 Enterprise PKCS #11 Enterprise PKCS #11 over gRPC 説明
C_Initialize N/A N/A Cryptoki を初期化します。
C_Finalize N/A N/A 各種の Cryptoki 関連のリソースをクリーンアップします。
C_GetInfo N/A N/A Cryptoki に関する一般情報を取得します。
C_GetFunctionList N/A N/A Cryptoki ライブラリー関数のエントリー・ポイントを取得します。
C_GetSlotList N/A N/A システム内のスロットのリストを取得します。
C_GetSlotInfo N/A N/A 特定のスロットに関する情報を取得します。
C_GetTokenInfo N/A N/A 特定のトークンに関する情報を取得します。
C_WaitForSlotEvent N/A N/A スロット・イベント (トークンの挿入や削除など) の発生を待機します。
C_GetMechanismList* m_GetMechanismList GetMechanismList トークンでサポートされるメカニズムのリストを取得します。
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo 特定のメカニズムに関する情報を取得します。
C_InitToken N/A N/A トークンを初期化します。
C_InitPIN N/A N/A 一般ユーザーの PIN を初期化します。
C_SetPIN N/A N/A 現行ユーザーの PIN を変更します。
C_OpenSession N/A N/A アプリケーションと特定のトークンの間の接続を開きます。または、トークン挿入に対するアプリケーションのコールバックをセットアップします。
C_CloseSession N/A N/A セッションを閉じます。
C_CloseAllSessions N/A N/A トークンのすべてのセッションを閉じます。
C_GetSessionInfo N/A N/A セッションに関する情報を取得します。
C_GetOperationState N/A N/A セッションの暗号操作の状態を取得します。
C_SetOperationState N/A N/A セッションの暗号操作の状態を設定します。
C_Login N/A N/A トークンにログインします。
C_Logout N/A N/A トークンからログアウトします。
C_CreateObject N/A N/A オブジェクトを作成します。
C_CopyObject N/A N/A オブジェクトのコピーを作成します。
C_DestroyObject N/A N/A オブジェクトを破棄します。
C_GetObjectSize N/A N/A オブジェクトのサイズ (バイト単位) を取得します。
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue オブジェクトの属性値を取得します。
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue オブジェクトの属性値を変更します。 変更できるのはブール型の属性のみです。
C_FindObjectsInit N/A N/A オブジェクト検索操作を初期化します。
C_FindObjects N/A N/A オブジェクト検索操作を続行します。
C_FindObjectsFinal N/A N/A オブジェクト検索操作を終了します。
C_EncryptInit* m_EncryptInit EncryptInit 暗号化操作を初期化します。
C_Encrypt* m_Encrypt 暗号化 1 部構成のデータを暗号化します。
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate 複数部構成の暗号化操作を続行します。
C_EncryptFinal* m_EncryptFinal EncryptFinal 複数部構成の暗号化操作を終了します。
N/A m_EncryptSingle EncryptSingle IBM 拡張機能。Encrypt の非標準のバリアントです。 1 回の呼び出しで一度にデータを処理します。 暗号化されたデータ以外の状態は、いずれもホストに返されません。
N/A m_ReencryptSingle ReencryptSingle IBM 拡張機能。Encrypt の非標準のバリアントです。 元の鍵でのデータの復号と別の鍵での生データの暗号化が、クラウド HSM 内で 1 回の呼び出しで行われます。 再暗号化されたデータ以外に状態がホストに返されることはありません。
C_DecryptInit* m_DecryptInit DecryptInit 復号操作を初期化します。
C_Decrypt* m_Decrypt 復号 1 部構成の暗号化されたデータを復号します。
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate 複数部構成の復号操作を続行します。
C_DecryptFinal* m_DecryptFinal DecryptFinal 複数部構成の復号操作を終了します。
N/A m_DecryptSingle DecryptSingle IBM 拡張機能。Decrypt の非標準のバリアントです。 1 回の呼び出しで一度にデータを処理します。 復号されたデータ以外の状態は、いずれもホストに返されません。
C_DigestInit* m_DigestInit DigestInit メッセージ・ダイジェスト生成操作を初期化します。
C_Digest* m_Digest ダイジェスト シングルパート・データのダイジェストを生成します。 入力データの長さをゼロにすることはできません。入力データの場所を指すポインターを NULL にすることもできません。
C_DigestUpdate* m_DigestUpdate DigestUpdate 複数部構成のダイジェスト生成操作を続行します。 入力データの長さをゼロにすることはできません。入力データの場所を指すポインターを NULL にすることもできません。
C_DigestKey N/A N/A 鍵のダイジェストを生成します。
C_DigestFinal* m_DigestFinal DigestFinal 複数部構成のダイジェスト生成操作を終了します。
N/A m_DigestSingle DigestSingle IBM 拡張機能。DigestInit と Digest を組み合わせた非標準の拡張機能です。 1 回の呼び出しで一度にデータのダイジェストを生成します。中間のダイジェスト状態を作成することも、不要な往復を行うこともありません。
C_SignInit* m_SignInit SignInit 署名操作を初期化します。
C_Sign* m_Sign 署名 1 部構成のデータに署名します。
C_SignUpdate* m_SignUpdate SignUpdate 複数部構成の署名操作を続行します。
C_SignFinal* m_SignFinal SignFinal 複数部構成の署名操作を終了します。
C_SignRecoverInit N/A N/A 署名操作を初期化します。データが署名から復元されます。
C_SignRecover N/A N/A 1 部構成のデータに署名します。データが署名から復元されます。
N/A m_SignSingle SignSingle IBM 拡張機能。SignInit と Sign を組み合わせた非標準の拡張機能です。 1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 結果以外の状態は、いずれもホストに返されません。
C_VerifyInit* m_VerifyInit VerifyInit 検証操作を初期化します。
C_Verify* m_Verify 検証 1 部構成のデータの署名を検証します。
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate 複数部構成の検証操作を続行します。
C_VerifyFinal* m_VerifyFinal VerifyFinal 複数部構成の検証操作を終了します。
C_VerifyRecoverInit N/A N/A 検証操作を初期化します。検証操作ではデータが署名から復元されます。
C_VerifyRecover N/A N/A 1 部構成のデータの署名を検証します。検証操作ではデータが署名から復元されます。
N/A m_VerifySingle VerifySingle IBM 拡張機能。VerifyInit と Verify を組み合わせた非標準の拡張機能です。 1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 検証結果以外の状態は、いずれもホストに返されません。
C_DigestEncryptUpdate N/A N/A 連続して行う複数部構成のダイジェスト生成 & 暗号化操作を続行します。
C_DecryptDigestUpdate N/A N/A 連続して行う複数部構成の復号 & ダイジェスト操作を続行します。
C_SignEncryptUpdate N/A N/A 連続して行う複数部構成の署名 & 暗号化操作を続行します。
C_DecryptVerifyUpdate N/A N/A 連続して行う複数部構成の復号 & 検証操作を続行します。
C_GenerateKey* m_GenerateKey GenerateKey 共通鍵を生成します。
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair 公開鍵/秘密鍵ペアを生成します。
C_WrapKey* m_WrapKey WrapKey 鍵をラップ (暗号化) します。
C_UnwrapKey* m_UnwrapKey UnwrapKey 鍵をアンラップ (復号) します。
N/A N/A RewrapKeyBlob 新しいマスター鍵がコミットされたときに、現行のマスター鍵で管理されている BLOB の所有権を新しいマスター鍵に移します。 この関数は、GREP11 によってのみサポートされる特殊な管理コマンドです。
C_DeriveKey* m_DeriveKey DeriveKey 基本鍵から鍵を導出します。
C_SeedRandom N/A N/A 乱数発生ルーチンにシード素材を追加します。
C_GenerateRandom* m_GenerateRandom GenerateRandom ランダム・データを生成します。 ランダム・データの長さをゼロにすることはできません。ランダム・データの場所を指すポインターを NULL にすることもできません。 要求できるランダム・データの最大長は、100 万バイトです。
C_GetFunctionStatus N/A N/A レガシー関数。常に CKR_FUNCTION_NOT_PARALLEL を返します。
C_CancelFunction N/A N/A レガシー関数。常に CKR_FUNCTION_NOT_PARALLEL を返します。

サポート対象メカニズム

メカニズムとは、暗号操作を実装するプロセスのことです。 これは、暗号カードのファームウェアのレベルによって異なる場合があります。 以下の表に、現在サポートされているメカニズムと、一般的な GREP11 関数の分類の関係を示しています。

表 2. サポートされる GREP11 メカニズムについて説明します。
関数グループ サポート対象メカニズム
暗号化と復号 CKM_RSA_PKCS1、CKM_RSA_PKCS_OAEP1、CKM_AES_ECB、CKM_AES_CBC、CKM_AES_CBC_PAD、CKM_DES3_ECB、CKM_DES3_CBC、CKM_DES3_CBC_PAD
署名と検証 CKM_RSA_PKCS1, CKM_RSA_PKCS_PSS1, CKM_RSA_X9_311, CKM_SHA1_RSA_PKCS, CKM_SHA256_RSA_PKCS, CKM_SHA224_RSA_PKCS, CKM_SHA384_RSA_PKCS, CKM_SHA512_RSA_PKCS, CKM_SHA1_RSA_PKCS_PSS, CKM_SHA224_RSA_PKCS_PSS, CKM_SHA256_RSA_PKCS_PSS, CKM_SHA384_RSA_PKCS_PSS, CKM_SHA512_RSA_PKCS_PSS, CKM_SHA1_RSA_X9_31, CKM_DSA1, CKM_DSA_SHA1, CKM_ECDSA1, CKM_ECDSA_SHA1, CKM_ECDSA_SHA224, CKM_ECDSA_SHA256, CKM_ECDSA_SHA384, CKM_ECDSA_SHA512, CKM_SHA1_HMAC, CKM_SHA256_HMAC, CKM_SHA384_HMAC, CKM_SHA512_HMAC, CKM_SHA512_224_HMAC, CKM_SHA512_256_HMAC, CKM_IBM_ED25519_SHA5124, CKM_IBM_ECDSA_OTHER2, CKM_IBM_DILITHIUM3
ダイジェスト CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512, CKM_SHA512_224, CKM_SHA512_256
鍵の生成または鍵ペアの生成 CKM_RSA_PKCS_KEY_PAIR_GEN, CKM_RSA_X9_31_KEY_PAIR_GEN, CKM_DSA_KEY_PAIR_GEN, CKM_DSA_PARAMETER_GEN, CKM_EC_KEY_PAIR_GEN (CKM_ECDSA_KEY_PAIR_GEN), CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_PARAMETER_GEN, CKM_GENERIC_SECRET_KEY_GEN, CKM_AES_KEY_GEN, CKM_DES2_KEY_GEN, CKM_DES3_KEY_GEN, CKM_IBM_DILITHIUM
ラップとアンラップ CKM_RSA_PKCS、CKM_RSA_PKCS_OAEP、CKM_AES_ECB、CKM_AES_CBC、CKM_AES_CBC_PAD、CKM_DES3_ECB、CKM_DES3_CBC、CKM_DES3_CBC_PAD
導出 CKM_ECDH1_DERIVE、CKM_DH_PKCS_DERIVE、CKM_DES3_ECB_ENCRYPT_DATA、CKM_SHA1_KEY_DERIVATION、CKM_SHA224_KEY_DERIVATION、CKM_SHA256_KEY_DERIVATION、CKM_SHA384_KEY_DERIVATION、CKM_SHA512_KEY_DERIVATION、CKM_IBM_BTC_DERIVE

1: このメカニズムは、EncryptUpdateDecryptUpdateDigestUpdate などの Update GREP11 関数を使用できないシングルパートの操作のみをサポートします。

2: このメカニズムは、GREP11 SignSingle および VerifySingle 操作でのみ使用可能です。

3: このメカニズムは、IBM 4768 暗号カードではサポートされておらず、SignUpdateおよびVerifyUpdateの操作には使用できません。

4: このメカニズムは、1 部構成 (SignInitSignVerifyInitVerify)、 SignSingle、および VerifySingle の各操作をサポートします。

サポートされる属性と鍵タイプ

GREP11 の属性で定義するオブジェクトの特性によって、オブジェクトの使用方法とアクセス方法がセットアップされます。 以下の表に、サポートされている属性と、サポートされているさまざまな鍵タイプの関係を示します。

表 3. サポートされる属性について説明します。
属性 説明 サポート対象キー・タイプ
CKA_CHECK_VALUE 鍵のチェックサム AES 鍵、DES 鍵
コピー可能 CKA_COPYABLE CKA_TRUE に設定されている場合、 PKCS#11 C_CopyObject 関数を使用してオブジェクトをコピーできます。 EC 秘密鍵、EC 公開鍵、RSA 秘密鍵、RSA 公開鍵、DH 秘密鍵、DH 公開鍵、DSA 秘密鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_DECRYPT 鍵が復号をサポートする場合は CK_TRUE。 EC 秘密鍵、RSA 秘密鍵、DH 秘密鍵、DSA 秘密鍵、AES 鍵、DES 鍵、汎用鍵
CKA_DERIVE 鍵が鍵の導出をサポートする場合 (この鍵から他の鍵を派生させることができる場合) は CK_TRUE。 デフォルトは CK_FALSE です。 EC 秘密鍵、EC 公開鍵、RSA 秘密鍵、RSA 公開鍵、DH 秘密鍵、DH 公開鍵、DSA 秘密鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) ANSI X9.62 パラメーター値の DER エンコード。 EC 秘密鍵、EC 公開鍵
CKA_ENCRYPT 鍵が暗号化をサポートする場合は CK_TRUE。 EC 公開鍵、RSA 公開鍵、DH 公開鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_EXTRACTABLE 鍵が抽出可能でラップできる場合は CK_TRUE。 EC 秘密鍵、RSA 秘密鍵、DH 秘密鍵、DSA 秘密鍵、AES 鍵、DES 鍵、汎用鍵
CKA_IBM_PQC_PARAMS ポスト量子暗号化後のメカニズムのサポート・パラメーター。 Dilithium メカニズムCKM_IBM_DILITHIUMの場合は、使用する Dilithium アルゴリズムの強度を表す、マーシャル・オブジェクト ID (OID) を提供します。 現在は、 Dilithium 4 round 2 の強度のみがサポートされています。 Dilithium キー
CKA_KEY_TYPE キーのタイプ。 EC 秘密鍵、EC 公開鍵、RSA 秘密鍵、RSA 公開鍵、DH 秘密鍵、DH 公開鍵、DSA 秘密鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_LOCAL CK_TRUE は、キーが C_GenerateKey または C_GenerateKeyPair 呼び出しを使用して (トークンに) ローカルに生成された場合や CKA_LOCAL 属性が CK_TRUE に設定されているキーのコピーとして C_CopyObject 呼び出しを使用して作成された場合にのみ生成されます。 EC 秘密鍵、EC 公開鍵、RSA 秘密鍵、RSA 公開鍵、DH 秘密鍵、DH 公開鍵、DSA 秘密鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_MODIFIABLE オブジェクトを変更できる場合は、CK_TRUE に設定します。 EC 秘密鍵、EC 公開鍵、RSA 秘密鍵、RSA 公開鍵、DH 秘密鍵、DH 公開鍵、DSA 秘密鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_MODULUS_BITS 係数 n の長さ (ビット単位)。 RSA パブリック・キー
CKA_PUBLIC_EXPONENT パブリック指数 e。 RSA プライベート・キー
CKA_PUBLIC_KEY_INFO 公開鍵に対する SubjectPublicKeyInfo の DER エンコード。 この値は、基礎となる公開鍵データから派生し、デフォルトでは空です。 RSA 公開鍵、EC 公開鍵
CKA_SIGN 署名がデータに付属している場合の署名を鍵がサポートする場合は CK_TRUE。 EC 秘密鍵、RSA 秘密鍵、DH 秘密鍵、DSA 秘密鍵、AES 鍵、DES 鍵、汎用鍵
CKA_TRUSTED 証明書または鍵は、その作成元アプリケーションでは信頼することができます。 EC 公開鍵、RSA 公開鍵、DH 公開鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_UNWRAP 鍵がアンラップをサポートする場合 (他の鍵のアンラップに使用できる場合) は CK_TRUE。 EC 秘密鍵、RSA 秘密鍵、DH 秘密鍵、DSA 秘密鍵、AES 鍵、DES 鍵、汎用鍵
CKA_VALUE_LEN 鍵値の長さ (バイト単位)。 AES キー
CKA_VERIFY 署名がデータに付属している場合の検証を鍵がサポートする場合は CK_TRUE。 EC 公開鍵、RSA 公開鍵、DH 公開鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_WRAP 鍵がラッピングをサポートする場合 (他の鍵のラッピングに使用できる場合) は CK_TRUE。 EC 公開鍵、RSA 公開鍵、DH 公開鍵、DSA 公開鍵、AES 鍵、DES 鍵、汎用鍵
CKA_WRAP_WITH_TRUSTED CKA_TRUSTED が CK_TRUE に設定されているラッピング鍵でのみ鍵をラップできる場合は CK_TRUE。 デフォルトは CK_FALSE です。 EC 秘密鍵、RSA 秘密鍵、DH 秘密鍵、DSA 秘密鍵、AES 鍵、DES 鍵、汎用鍵

サポートされる曲線

EP11 ライブラリーは、特定のメカニズムに対して限られたタイプの曲線のみをサポートしています。 以下の表に、さまざまなメカニズムに対してサポートされる曲線名をリストします。 曲線名に含まれている数値は、サポートされる基本ビット数を意味しています。

楕円曲線 (EC) 鍵を生成する場合にサポートされる曲線

メカニズム CKM_EC_KEY_PAIR_GEN がサポートされるのは、GenerateKeyPair 関数を呼び出して楕円曲線 (EC) 鍵を生成する場合です。 曲線名パラメーターは、CKA_EC_PARAMS を使用してオブジェクト ID (OID) として指定する必要があります。 OID リポジトリーで曲線名を検索することにより、OID を取得できます。

表 4。 EC 鍵の生成でサポートされる曲線タイプ
GREP11 メカニズム サポートされる曲線タイプ サポートされる曲線名
CKM_EC_KEY_PAIR_GEN 米国連邦情報・技術局(NIST)曲線
  • P-192、別名 secp192r1 および prime192v1。
  • P-224、別名 secp224r1。
  • P-256、別名 secp256r1 および prime256v1。
  • P-384、別名 secp384r1。
  • P-521、別名 secp521r。
CKM_EC_KEY_PAIR_GEN 通常の脳プール(BP)曲線
  • BP-160R、別名 brainpoolP160r1。
  • BP-192R、別名 brainpoolP192r1。
  • BP-224R、別名 brainpoolP224r1。
  • BP-256R、別名 brainpoolP256r1。
  • BP-320R、別名 brainpoolP320r1。
  • BP-384R、別名 brainpoolP384r1。
  • BP-512R、別名 brainpoolP512r1。
CKM_EC_KEY_PAIR_GEN ツイステッド・ブレイン・プール(BP)曲線
  • BP-160T 別名 brainpoolP160t1。
  • BP-192T、別名 brainpoolP192t1。
  • BP-224T、別名 brainpoolP224t1。
  • BP-256T、別名 brainpoolP256t1。
  • BP-320T、別名 brainpoolP320t1。
  • BP-384T、別名 brainpoolP384t1。
  • BP-512T、別名 brainpoolP512t1。
CKM_EC_KEY_PAIR_GEN Standards for Efficient Cryptography(SEC)曲線
  • secp256k1
CKM_EC_KEY_PAIR_GEN エドワーズ曲線
  • Ed25519

デジタル資産を暗号化して署名を生成するためにサポートされる曲線

デジタル資産およびデジタル署名に関連するメカニズムでは、以下の曲線がサポートされます。

表 5. デジタル資産および署名の暗号化でサポートされる曲線タイプ
標準およびスキーム GREP11 メカニズム サポートされる曲線タイプ サポートされる曲線名
BIP32/BIP44 CKM_IBM_BTC_DERIVE Standards for Efficient Cryptography(SEC)曲線
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE 米国連邦情報・技術局(NIST)曲線
  • P-256( secp256r1 および prime256v1 とも呼ばれる)
SLIP10 CKM_IBM_BTC_DERIVE Standards for Efficient Cryptography(SEC)曲線
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE エドワーズ曲線
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 エドワーズ曲線
  • Ed25519
Schnorr その他の CKM_IBM_ECDSA_OTHER Standards for Efficient Cryptography(SEC)曲線
  • secp256k1
Schnorr その他の CKM_IBM_ECDSA_OTHER 米国連邦情報・技術局(NIST)曲線
  • P-256( secp256r1 および prime256v1 とも呼ばれる)
Schnorr その他の CKM_IBM_ECDSA_OTHER 通常の脳プール(BP)曲線
  • BP-256R( brainpoolP256r1 とも呼ばれる)
Schnorr その他の CKM_IBM_ECDSA_OTHER ツイステッド・ブレイン・プール(BP)曲線
  • BP-256T( brainpoolP256t1 とも呼ばれる)
Schnorr ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R( brainpoolP256r1 とも呼ばれる)
  • BP-256T( brainpoolP256t1 とも呼ばれる)
シュノル = ジリカ ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R( brainpoolP256r1 とも呼ばれる)
  • BP-256T( brainpoolP256t1 とも呼ばれる)

GREP11 関数を使用した暗号操作の実行

PKCS #11 仕様の EP11 実装に基づいて定義された GREP11 関数を呼び出して、暗号操作を実行することができます。 以下の関数の説明は、 PKCS #11 仕様に基づいて作成されており、 EP11に固有の注が記載されています。 すべてのパラメーター定義は、EP11 のオリジナルの形式で記載しています。 EP11について詳しくは、 Enterprise PKCS #11(EP11)Library structureを参照してください。

EP11 関数のパラメーターは、以下の関数に記載しているプロトコル・バッファー・タイプにマップされています。 プロトコル・バッファー・タイプについて詳しくは、 Google Developersを参照してください。

EP11 ライブラリーは PKCS #11 API ライブラリーのサブセットであり、GREP11 関数は対応する EP11 関数のバリアントであるので、GREP11 関数の表には、EP11 と PKCS #11 の対応する関数も参考のために記載しています。

GREP11 は、gRPC ライブラリーを使用するあらゆるプログラミング言語をサポートしています。 現段階では、この API リファレンスには Golang および JavaScript のコード・スニペットまたはサンプルだけを記載しています。 今後、段階的に内容を充実させていく予定です。 これらのコード・スニペットは、GREP11 API の包括的な使用例を提供する以下の外部 GitHub リポジトリーに基づいています。 一部のコード・スニペットは、サンプル・リポジトリー内のヘルパー関数を参照します。

サポートされている暗号アルゴリズムの確認

以下の関数を使用すると、GREP11 でサポートされている暗号アルゴリズムまたは暗号メカニズムを確認できます。 この情報から、関数を呼び出すときに設定できる具体的なメカニズムがわかります。 サポートされているメカニズムの完全なリストは、関数のグループ別に分類されたメカニズムでも確認できます。

GetMechanismList

GetMechanismList 関数は、トークンでサポートされるメカニズム・タイプのリストを取得します。

説明 EP11 m_GetMechanismList (PKCS #11 C_GetMechanismList の実装) にバインドされます。
パラメーター
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明 PKCS #11 C_GetMechanismList の実装。
パラメーター
    CK_RV m_GetMechanismList (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE_PTR mechs, CK_ULONG_PTR mechslen,
      target_t ターゲット
    );
    
戻り値 C_GetMechanismList の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_GetMechanismList は、トークンでサポートされるメカニズム・タイプのリストを取得します。 SlotID はトークンのスロットの ID、pulCount はメカニズムの数を受け取る場所のポインターです。

アプリケーションで C_GetMechanismList を呼び出すには、2 つの方法があります。

  1. pMechanismListNULL_PTR にすると、C_GetMechanismList は、メカニズムのリストを返すことなく、メカニズムの数だけを (* pulCount で) 返します。 この場合、C_GetMechanismList に入力する *pulCount の内容に意味はなく、呼び出しでは CKR_OK の値が返されます。
  2. pMechanismListNULL_PTR (R) でない場合、*pulCount には、pMechanismListが指すバッファーのサイズ (CK_MECHANISM_TYPE エレメントに関する) が含まれている必要があります。 そのバッファーがメカニズムのリストを保持できる大きさであれば、リストがそこに戻され、CKR_OK が返されます。 そうでない場合は、C_GetMechanismList の呼び出しで値 CKR_BUFFER_TOO_SMALL が返されます。 いずれにしても、*pulCount にはメカニズムの数が設定されます。

C_GetMechanismList は独自のスペースを割り振らないため、アプリケーションでは C_GetMechanismList を 2 回呼び出すことが多くなります。 ただし、この動作は必須ではありません。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE_PTR pMechanismList,
      CK_ULONG_PTR pulCount
    );
    
戻り値 CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK, CKR_SLOT_ID_INVALID、CKR_TOKEN_NOT_PRESENT、CKR_TOKEN_NOT_RECOGNIZED、CKR_ARGUMENTS_BAD

コード・スニペット

  • Golang コード・スニペット

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • JavaScript コード・スニペット

    client.GetMechanismList({}, (err, data) => {
      if (err) throw err;
    
      console.log('MECHANISMS:', data.Mechs);
    });
    

GetMechanismInfo

GetMechanismInfo 関数は、特定のメカニズムに関する情報を取得します。

説明 EP11 m_GetMechanismInfo (PKCS #11 C_GetMechanismInfo の実装) にバインドされます。
パラメーター
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明 PKCS #11 C_GetMechanismInfo の実装。
パラメーター
    CK_RV m_GetMechanismInfo (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      target_t ターゲット
    );
    
戻り値 C_GetMechanismInfo の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_GetMechanismInfo は、トークンによってサポートされる可能性がある特定のメカニズムに関する情報を取得します。slotID はトークンのスロットの ID、type はメカニズムのタイプ、pInfo は、メカニズム情報を受け取る場所を指します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismInfo)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE type,
      CK_MECHANISM_INFO_PTR pInfo
    );
    
戻り値 CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR, CKR_HOST_MEMORY、CKR_MECHANISM_INVALID、CKR_OK, CKR_SLOT_ID_INVALID、CKR_TOKEN_NOT_PRESENT、CKR_TOKEN_NOT_RECOGNIZED、CKR_ARGUMENTS_BAD

コード・スニペット

  • Golang コード・スニペット

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • JavaScript コード・スニペット

    client.GetMechanismInfo({
      Mech: ep11.CKM_AES_KEY_GEN
      }, (err, data) => {
        if (err) throw err;
    
        console.log('MECHANISM INFO:', data.MechInfo);
    });
    

鍵の生成と導出

GREP11 では、対称および非対称の暗号鍵を生成するための以下の関数が提供されます。 指定したメカニズムとキーの長さによって、さまざまなタイプのキーがさまざまな用途に生成できます。 また、基本鍵から鍵を導出し、鍵長の長い鍵を生成したり、必要な形式の鍵を取得したりすることもできます。

GenerateKey

GenerateKey 関数は、対称暗号化の共通鍵を生成します。

説明 EP11 m_GenerateKey (PKCS #11 C_GenerateKey の実装) にバインドされます。
パラメーター
    message GenerateKeyRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> Template = 6;
    }
    message GenerateKeyResponse {
      bytes KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_GenerateKey の実装。

TDES 鍵が生成され、適切なパリティーも生成されますが、このパリティーはホストからは見えません。 しかし、このパリティーは適切な相互運用性を確保するために必要です。他の PKCS #11 実装では、パリティーの問題がある DES 鍵を拒否する必要があります。

オブジェクトをセッションに結び付ける場合は、そのセッションへの Login(pin, plen) が返される必要があります。 pinNULL のままにすると、ログイン・セッションにバインドされない共通オブジェクトが作成されます。

(key, klen) は、キー blob を返します。(csum, clen) には、キーのチェックサム、つまりキーによって暗号化されたオールゼロ・ブロックの最上位バイトが含まれます。 例えば、CKA_CHECK_VALUE パラメーターのない対称鍵メカニズム (RC4 など) の場合には、NULL の clen にすることもできます。

ptempl を使用するのは、鍵の長さ (つまり CKA_VALUE_LEN 属性) が必要なメカニズムの場合に限られます。 鍵のサイズが暗黙的に指定されるメカニズムの場合は、ptempl のサイズはチェックされません。

DSA と DH のパラメーター生成では、(csum, clen) が無視され、パラメーター構造だけが生成されます。

DSA と DH のパラメーター (CKM_DSA_PARAMETER_GEN): 属性の CKA_PRIME_BITS でモジュラス・ビット・カウントが渡されます。 P、Q、G 構造が (BLOB ではなく) 平文出力として書き込まれます。

pin の BLOB は、Login からの出力です。

PKCS #11 の phKey はどの EP11 パラメーターにもマップされません (ホスト・ライブラリーで、ラップされた鍵をハンドルにバインドする必要があります)。

パラメーター
    CK_RV m_GenerateKey (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
      const unsigned char *pin, size_t pinlen,
      unsigned char * key、size_t * keylen、
      unsigned char *checkSum、size_t *checkSumlen、
      target_t ターゲット
      );
    
戻り値 C_GenerateKey の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_GenerateKey は、シークレット・キーまたはドメイン・パラメーター・セットを生成し、新規オブジェクトを作成します。hSession はセッションのハンドル、pMechanism は生成メカニズム、pTemplate は新しいキーまたはドメイン・パラメーター・セットのテンプレート、ulCount はテンプレート内の属性の数、phKey は新しいキーまたはドメイン・パラメーターのセットのハンドルを受け取るロケーションを指します。

生成メカニズムがドメイン・パラメーター生成用である場合は、CKA_CLASS 属性の値は CKO_DOMAIN_PARAMETERS となり、それ以外の場合は値は CKO_SECRET_KEY となります。

生成する鍵またはドメイン・パラメーターのタイプは生成メカニズムに暗黙的に定義されているので、テンプレートで鍵のタイプを指定する必要はありません。 生成メカニズムと矛盾するキー・タイプが指定されている場合は、C_GenerateKey は失敗し、エラー・コード CKR_TEMPLATE_INCONSISTENT を返します。 CKA_CLASS 属性は同様に扱われます。

指定された正確なテンプレートに対応していない場合、C_GenerateKey の呼び出しは失敗し、オブジェクトを作成せずに戻ります。

C_GenerateKey の呼び出しが成功してオブジェクトが作成されると、そのオブジェクトの CKA_LOCAL 属性が CK_TRUE に設定されます。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)(
      CK_SESSION_HANDLE hSession
      CK_MECHANISM_PTR pMechanism,
      CK_ATTRIBUTE_PTR pTemplate,
      CK_ULONG ulCount,
      CK_OBJECT_HANDLE_PTR phKey
      );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Setup the AES key's attributes
    keyTemplate := ep11.EP11Attributes{
        ep11.CKA_VALUE_LEN:   keyLen / 8,
        ep11.CKA_WRAP:        false,
        ep11.CKA_UNWRAP:      false,
        ep11.CKA_ENCRYPT:     true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_EXTRACTABLE: false,
    }
    
    GenerateKeyRequest := &pb.GenerateKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_AES_KEY_GEN},
        Template: util.AttributeMap(keyTemplate),
    }
    
    GenerateKeyResponse, err := cryptoClient.GenerateKey(context.Background(), GenerateKeyRequest)
    
  • JavaScript コード・スニペット

    let keyLen = 128;
    
    let keyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_VALUE_LEN, keyLen / 8),
      new util.Attribute(ep11.CKA_WRAP, false),
      new util.Attribute(ep11.CKA_UNWRAP, false),
      new util.Attribute(ep11.CKA_ENCRYPT, true),
      new util.Attribute(ep11.CKA_DECRYPT, true),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false),
      new util.Attribute(ep11.CKA_TOKEN, true)
      );
    client.GenerateKey({
      Mech: { Mechanism: ep11.CKM_AES_KEY_GEN },
      Template: keyTemplate,
      KeyId: uuidv4()
    }, (err, data={}) => {
      cb(err, data.KeyBytes, data.CheckSum);
    });
    
    

GenerateKeyPair

GenerateKeyPair 関数は、公開鍵と秘密鍵のペアを生成します。

説明 EP11 m_GenerateKeyPair (PKCS #11 C_GenerateKeyPair の実装) にバインドされます。
パラメーター
    message GenerateKeyPairRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> PrivKeyTemplate = 7;
      map<uint64,AttributeValue> PubKeyTemplate = 8;
      }
    message GenerateKeyPairResponse {
      bytes PrivKeyBytes = 5;
      bytes PubKeyBytes = 6;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_GenerateKeyPair の実装。

鍵ペアのパラメーターは、pmechppublicpprivate の各パラメーターから取得されます。 RSA 鍵の場合は、ppublic でモジュラス・サイズを指定します。

FIPS モードでは、1024+256 n ビットの RSA モジュラーのみがサポートされます (整数 N)。 非 FIPS モードでは、メカニズム・パラメーター・リストの制限内で偶数ビットの鍵を生成できます。

パブリック・キーは、ほとんどのライブラリーで読み取り可能な標準 SPKI (サブジェクト・パブリック・キー情報) としてフォーマットされます。 さらに、SPKI 自体に含まれていない転送鍵固有の MAC によって整合性が確保されます。 DSA パラメーター生成では、非 SPKI 構造が公開鍵フィールドに返されます。

オブジェクトをセッションに結び付ける場合は、そのセッションへの Login(pin, plen) が返される必要があります。 pinNULL のままにすると、ログイン・セッションの後も残る共通オブジェクトが作成されます。

ラップされた秘密鍵が (key, klen) に返され、公開鍵が MAC 署名付きの ASN.1/DER 構造として (pubkey, pklen) に返されます。

以下のサポートされているパラメーターの組み合わせと特別な注意点は、PKCS #11 の文書に記載されていないものです。

RSA 鍵は 17 (0x11) より小さい公開鍵指数を拒否します。 制御点によって、有効な最小値がさらに制限される場合もあります。 Fermat4 指数 0x10001 は、FIPS 186-3 (セクション B.3.1) の公開指数制限に合致する特定の制御点によって制御されます。

EC 鍵 (CKM_EC_KEY_PAIR_GEN): 曲線パラメーターを OID またはシンボル名 (namedCurve バリアント) として指定できます。 サポートされているシンボル名は、NIST 曲線の場合は P-nnn (nnn はサポートされている基本ビット・カウントで、192 から 521 までの範囲)、通常の BP 曲線の場合は BP-nnnR です。 (名前は、ゼロ終了なしの ASCII 文字列として指定する必要があります。)

DSA 鍵 (CKM_DSA_KEY_PAIR_GEN): 公開属性の CKA_IBM_STRUCT_PARAMS 属性として P、Q、G 構造を渡します。 個々の P、Q、G パラメーターを通常の PKCS #11 パラメーターで渡すことはできません。これらのパラメーターを 1 つの構造体にまとめる必要があります。

DH 鍵 (CKM_DH_PKCS_KEY_PAIR_GEN): 公開属性の CKA_IBM_STRUCT_PARAMS 属性として P、G 構造を渡します。 個々の P、G パラメーターを通常の PKCS #11 パラメーターで渡すことはできません。これらのパラメーターを 1 つの構造体にまとめる必要があります。 秘密鍵 (X) ビット・カウントを選択する場合は、XCP_U32_VALUE_BITS 属性を使用してください。 指定しない場合や、明示的に 0 を指定した場合は、ビット・カウントが P ビット・カウントに基づいて選択されます。

標準的な方法でセッションを使用する代わりにセッション (ログイン) の状態を使用できます。 マッピングはライブラリーの有効範囲外になります。

pin の BLOB は、Login からの出力です。

PKCS #11 の hSession はどの EP11 パラメーターにもマップされません (呼び出しはどのセッションにも直接は関連付けられません)。

PKCS #11 の phPublicKey はどの EP11 パラメーターにもマップされません (ホスト・ライブラリーで公開鍵 (SPKI) をハンドルに関連付ける必要があります)。

PKCS #11 の phPrivateKey はどの EP11 パラメーターにもマップされません (ホスト・ライブラリーで秘密鍵をハンドルに関連付ける必要があります)。

パラメーター
    CK_RV m_GenerateKeyPair (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen,
      CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen,
      const unsigned char *pin, size_t pinlen,
      unsigned char *privKey、size_t *privKeylen、
      unsigned char *pubKey、size_t *pubKeylen、
      target_t ターゲット
      );
    
戻り値 C_GenerateKeyPair の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_GenerateKeyPair は、パブリック・キーとプライベート・キーのペアを生成し、新しいキー・オブジェクトを作成します。hSession はセッションのハンドル、pMechanism はキー生成メカニズム、pPublicKeyTemplate はパブリック・キーのテンプレート、ulPublicKeyAttributeCount はパブリック・キー・テンプレートの属性数、pPrivateKeyTemplate はプライベート・キーのテンプレート、UlPrivateKeyAttributeCount はプライベート・キー・テンプレートの属性数、phPublicKey は新しいパブリック・キー・のハンドルを受け取るロケーション、phPrivateKey は新しいプライベート・キーのハンドルを受け取るロケーションを指します。

生成する鍵のタイプは鍵ペア生成メカニズムに暗黙的に定義されているので、テンプレートで鍵のタイプを指定する必要はありません。 いずれかのテンプレートがキー生成メカニズムと矛盾するキー・タイプを提供している場合は、C_GenerateKeyPair は失敗し、エラー・コード CKR_TEMPLATE_INCONSISTENT を返します。 CKA_CLASS 属性も同様に処理されます。

指定された正確なテンプレートに対応していない場合、C_GenerateKeyPair の呼び出しは失敗し、鍵オブジェクトを作成せずに戻ります。

C_GenerateKeyPair の呼び出しでは、1 つの鍵だけが作成されて戻るということはありません。 呼び出しが失敗して鍵が作成されないか、呼び出しが成功して対応する公開鍵/秘密鍵ペアが作成されるかのどちらかです。

C_GenerateKeyPair の正常な呼び出しによって作成されたキー・オブジェクトの CKA_LOCAL 属性は、CK_TRUE に設定されます。

C_GenerateKeyPair の引数の順序に注意してください。 最後の 2 つの引数の順序は、元の Cryptoki バージョン 1.0 の文書に記載されている順序と同じではありません。 これらの二つの引数の順序で、混乱が引き起こされた不幸な事例があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateKeyPair)(
      CK_SESSION_HANDLE hSession,
      CK_MECHANISM_PTR pMechanism,
      CK_ATTRIBUTE_PTR pPublicKeyTemplate,
      CK_ULONG ulPublicKeyAttributeCount,
      CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
      CK_ULONG ulPrivateKeyAttributeCount,
      CK_OBJECT_HANDLE_PTR phPublicKey,
      CK_OBJECT_HANDLE_PTR phPrivateKey
      );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_DOMAIN_PARAMS_INVALID、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR, CKR_HOST_MEMORY、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK, CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Generate RSA key pair
    publicExponent := []byte{0x11}
    publicKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_ENCRYPT:         true,
        ep11.CKA_VERIFY:          true,
        ep11.CKA_MODULUS_BITS:    2048,
        ep11.CKA_PUBLIC_EXPONENT: publicExponent,
        ep11.CKA_EXTRACTABLE:     false,
    }
    privateKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_PRIVATE:     true,
        ep11.CKA_SENSITIVE:   true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_SIGN:        true,
        ep11.CKA_EXTRACTABLE: false,
    }
    GenerateKeypairRequest := &pb.GenerateKeyPairRequest{
        Mech:            &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS_KEY_PAIR_GEN},
        PubKeyTemplate:  util.AttributeMap(publicKeyTemplate),
        PrivKeyTemplate: util.AttributeMap(privateKeyTemplate),
    }
    GenerateKeyPairResponse, err := cryptoClient.GenerateKeyPair(context.Background(), GenerateKeypairRequest)
    
  • JavaScript コード・スニペット

    const publicKeyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_ENCRYPT, true),
      new util.Attribute(ep11.CKA_VERIFY, true),
      new util.Attribute(ep11.CKA_MODULUS_BITS, 2048),
      new util.Attribute(ep11.CKA_PUBLIC_EXPONENT, publicExponent),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false)
    );
    
    const privateKeyTemplate = new util.AttributeMap(
      new util.Attribute(ep11.CKA_PRIVATE, true),
      new util.Attribute(ep11.CKA_SENSITIVE, true),
      new util.Attribute(ep11.CKA_DECRYPT, true),
      new util.Attribute(ep11.CKA_SIGN, true),
      new util.Attribute(ep11.CKA_EXTRACTABLE, false),
    );
    
    client.GenerateKeyPair({
      Mech: {
        Mechanism: ep11.CKM_RSA_PKCS_KEY_PAIR_GEN
      },
      PubKeyTemplate: publicKeyTemplate,
      PrivKeyTemplate: privateKeyTemplate,
      PubKeyId: uuidv4(),
      PrivKeyId: uuidv4()
    }, (err, response) => {
      callback(err, response);
    });
    

DeriveKey

DeriveKey 関数は、基本鍵から鍵を導出します。

説明 EP11 m_DeriveKey (PKCS #11 C_DeriveKey の実装) にバインドされます。
パラメーター
    message DeriveKeyRequest {
        Mechanism Mech = 1;
        bytes BaseKey = 3;
        bytes Data = 4;
        map<uint64,AttributeValue> Template = 8;
    }
    message DeriveKeyResponse {
        bytes NewKeyBytes = 6;
        bytes CheckSum = 7;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DeriveKey の実装。

basekeybklen の BLOB を PKCS #11 の hBaseKey パラメーターからマップする必要があります。

PKCS #11 の hSession はどの EP11 パラメーターにもマップされません (呼び出しはどのセッションにも直接は関連付けられません)。

PKCS #11 の phKey はどの EP11 パラメーターにもマップされません (ホスト・ライブラリーで、返される鍵をハンドルにバインドする必要があります)。

パラメーター
    CK_RV m_DeriveKey (
        CK_MECHANISM_PTR mech,
        CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        const unsigned char *baseKey, size_t baseKeylen,
        const unsigned char *data, size_t datalen,
        const unsigned char *pin, size_t pinlen,
        unsigned char *newKey、size_t *newKeylen、
        unsigned char *checkSum、size_t *checkSumlen、
        target_t ターゲット
    );
    
戻り値 C_DeriveKey の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DeriveKey は、新しいキー・オブジェクトを作成して、ベース・キーからキーを導出します。hSession はセッションのハンドル、pMechanism はキー導出メカニズムを指定する構造、hBaseKey はベース・キーのハンドル、pTemplate は新しいキーのテンプレート、ulAttributeCount はテンプレートの属性数、phKey は導出されたキーのハンドルを受け取るロケーションを指します。

基本鍵の CKA_SENSITIVECKA_ALWAYS_SENSITIVECKA_EXTRACTABLEKA_NEVER_EXTRACTABLE の各属性の値に応じて、新しく導出される鍵についてこれらの属性に保持できる値が変わります。 このタイプの制約については、PKCS #11 API 仕様のセクション 5.16.2 にある個々のキー導出メカニズムの説明を参照してください。

指定された正確なテンプレートに対応していない場合、C_DeriveKey の呼び出しは失敗し、鍵オブジェクトを作成せずに戻ります。

C_DeriveKey の呼び出しが成功して鍵オブジェクトが作成されると、そのオブジェクトの CKA_LOCAL 属性が CK_FALSE に設定されます。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DeriveKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hBaseKey,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_DOMAIN_PARAMS_INVALID、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Derive AES key for Alice
    deriveKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_CLASS:     ep11.CKO_SECRET_KEY,
        ep11.CKA_KEY_TYPE:  ep11.CKK_AES,
        ep11.CKA_VALUE_LEN: 128 / 8,
        ep11.CKA_ENCRYPT:   true,
        ep11.CKA_DECRYPT:   true,
    }
    // Extract Bob's EC coordinates
    combinedCoordinates, err := util.GetPubkeyBytesFromSPKI(bobECKeypairResponse.PubKeyBytes)
    if err != nil {
        return nil, fmt.Errorf("Bob's EC public key cannot obtain coordinates: %s", err)
    }
    
    aliceDeriveKeyRequest := &pb.DeriveKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_ECDH1_DERIVE, Parameter: util.SetMechParm(combinedCoordinates)},
        Template: util.AttributeMap(deriveKeyTemplate),
        BaseKey:  aliceECKeypairResponse.PrivKeyBytes,
    }
    
    // Derive AES key for Alice
    aliceDeriveKeyResponse, err := cryptoClient.DeriveKey(context.Background(),  aliceDeriveKeyRequest)
    
  • JavaScript コード・スニペット

    //results are created through GenerateKeyPair
    const [alice, bob] = results;
    
    const deriveKeyTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_CLASS, ep11.CKO_SECRET_KEY),
    new util.Attribute(ep11.CKA_KEY_TYPE, ep11.CKK_AES),
    new util.Attribute(ep11.CKA_VALUE_LEN, 128/8),
    new util.Attribute(ep11.CKA_ENCRYPT, true),
    new util.Attribute(ep11.CKA_DECRYPT, true),
    );
    
    const derived = [];
    
    async.eachSeries([
    { PubKey: bob.PubKeyBytes, PrivKey: alice.PrivKeyBytes },
    { PubKey: alice.PubKeyBytes, PrivKey: bob.PrivKeyBytes }
    ], (data, cb) => {
    const combinedCoordinates = util.getPubKeyBytesFromSPKI(data.PubKey);
    
    client.DeriveKey({
      Mech: {
        Mechanism: ep11.CKM_ECDH1_DERIVE,
        ParameterB: combinedCoordinates
      },
      Template: deriveKeyTemplate,
      BaseKey: data.PrivKey
    }, (err, data={}) => {
      if (!err) {
        derived.push(data);
      }
    
      cb(err);
    });
    }
    

鍵の保護

鍵をラップして保護できます。また、アンラップ機能を呼び出して鍵を復号することもできます。

WrapKey

WrapKey 関数は、鍵をラップ (暗号化) します。

説明 EP11 m_WrapKey (PKCS #11 C_WrapKey の実装) にバインドされます。
パラメーター
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明 PKCS #11 C_WrapKey の実装。
パラメーター
    CK_RV m_WrapKey (
        const unsigned char *key, size_t keylen,
        const unsigned char *keK, size_t keKlen,
        const unsigned char *macKey, size_t macKeylen,
        const CK_MECHANISM_PTR mech,
        CK_BYTE_PTR wrapped, CK_ULONG_PTR wrappedlen,
        target_t ターゲット
    );
    
戻り値 C_WrapKey の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_WrapKey は、プライベート・キーまたはシークレット・キーをラップ (つまり暗号化) します。hSession はセッションのハンドル、pMechanism はラッピング・メカニズム、hWrappingKey はラッピング・キーのハンドル、hKey はラップ対象キーのハンドル、pWrappedKey はラップされたキーを受け取るロケーション、pulWrappedKeyLen はラップされたキーの長さを受け取るロケーションを指します。

C_WrapKey は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

ラッピング鍵の CKA_WRAP 属性 (鍵がラッピングをサポートするかどうかを示す属性) は、CK_TRUE でなければなりません。 ラップ対象の鍵の CKA_EXTRACTABLE 属性も CK_TRUE でなければなりません。

CKA_EXTRACTABLE 属性が CK_TRUE に設定されていても、トークン固有の理由で鍵をラップできない場合は、エラー・コード CKR_KEY_NOT_WRAPPABLEC_WrapKey は失敗します。 単に鍵長が原因で、指定されたラッピング鍵とラッピング・メカニズムで鍵をラップできない場合は、エラー・コード CKR_KEY_SIZE_RANGEC_WrapKey は失敗します。

C_WrapKey を使用できるのは、以下の場合です。

  • 暗号化と復号をサポートする公開鍵で共通鍵をラップする場合。
  • 他の共通鍵で共通鍵をラップする場合。 鍵のサイズとメカニズムの強度を考慮する必要があります。トークンによっては操作が可能でない場合があるからです。
  • 共通鍵で秘密鍵をラップする場合。

どのタイプの鍵をどのメカニズムでラップできるかは、トークンによって異なります。

ラッピング・キーをパーティション化して、抽出可能なキーのサブセットのみをラップできるようにするには、ラッピング・キーで属性 CKA_WRAP_TEMPLATE を使用して、ラッピング対象キーの属性と比較できる属性セットを指定します。 属性マッチングの C_FindObject ルールに基づいてすべての属性が一致すると、ラップ処理が開始されます。 この属性の値は属性テンプレートであり、サイズはテンプレート内の項目数に CK_ATTRIBUTE のサイズを乗算した値になります。 この属性を指定しなければ、どのテンプレートも受け入れられます。 存在しない属性はチェックされません。 鍵をラップしようとしたときに属性の不一致が発生すると、関数から CKR_KEY_HANDLE_INVALID が返されます。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_WrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hWrappingKey,
        CK_OBJECT_HANDLE hKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG_PTR pulWrappedKeyLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_HANDLE_INVALID、CKR_KEY_NOT_WRAPPABLE、CKR_KEY_SIZE_RANGE、CKR_KEY_UNEXTRACTABLE、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN、CKR_WRAPPING_KEY_HANDLE_INVALID、CKR_WRAPPING_KEY_SIZE_RANGE、CKR_WRAPPING_KEY_TYPE_INCONSISTENT

コード・スニペット

  • Golang コード・スニペット

    WrapKeyRequest := &pb.WrapKeyRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:  GenerateKeyPairResponse.PubKeyBytes,
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    WrapKeyResponse, err := cryptoClient.WrapKey(context.Background(), WrapKeyRequest)
    
  • JavaScript コード・スニペット

    client.WrapKey({
      Mech: {
        Mechanism: ep11.CKM_RSA_PKCS
      },
      KeK: rsa.PubKeyBytes,
      Key: aes.KeyBytes
    }, (err, data={}) => {
      cb(err, data.Wrapped);
    });
    

UnwrapKey

UnwrapKey関数は、鍵をアンラップ (復号) します。

説明 EP11 m_UnwrapKey (PKCS #11 C_UnwrapKey の実装) にバインドされます。
パラメーター
    message UnwrapKeyRequest {
        bytes Wrapped = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 5;
        map<uint64,AttributeValue> Template = 9;
    }
    message UnwrapKeyResponse {
        bytes UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_UnwrapKey の実装。

uwmech は、ラップされたデータの復号に使用される暗号化メカニズムを指定します。ptemplkey(pair) パラメーター・リストで、アンラップされたデータを新しいキーに変換する方法を指定します (CKA_KEY_TYPE が含まれていること)。

生成されたオブジェクトは、BLOB として (unwrapped, uwlen) に返されます。 対称鍵では、鍵のチェックサム (3 バイト) が (csum, cslen) に返されます。公開鍵オブジェクトでは、公開鍵が SPKI として (csum, cslen) に返されます。 どちらの形式の場合も、アンラップした鍵のビット・カウントをエンコードした 4 バイトのビッグ・エンディアン値が後に続きます。

SPKI を MAC 署名付き SPKI に変換する場合は、アンラップ・メカニズムとして CKM_IBM_TRANSPORTKEY を使用する必要があります。 このモードでは、ラップしたデータとして未加工の SPKI を指定します。KEK は無視されます。

UnwrapKey では、パリティーで調整された DES 鍵が (BLOB 内に) 生成されますが、パリティーが正しくない入力も許容されます。

パラメーター
    CK_RV m_UnwrapKey (
        const CK_BYTE_PTR wrapped, CK_ULONG wrappedlen,
        const unsigned char *keK, size_t keKlen,
        const unsigned char *macKey, size_t macKeylen,
        const unsigned char *pin, size_t pinlen,
        const CK_MECHANISM_PTR mech,
        const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        unsigned char * unwrapped、size_t * unwrappedlen、
        CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen,
        target_t ターゲット
    );
    
戻り値 C_UnwrapKey の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_UnwrapKey は、ラップされたキーをアンラップ (復号) して、新しいプライベート・キーまたはプライベート・キー・オブジェクトを作成します。hSession はセッションのハンドル、pMechanism はアンラップ・メカニズム、hUnwrappingKey はアンラップ・キーのハンドル、pWrappedKey はラップされたキー、ulWrappedKeyLen はラップされたキーの長さ、pTemplate は新しいキーのテンプレート、ulAttributeCount はテンプレートの属性数、phKey はリカバリーされたキーのハンドルを受け取るロケーションを指します。

アンラッピング鍵の CKA_UNWRAP 属性 (鍵がアンラッピングをサポートするかどうかを示す属性) は、CK_TRUE でなければなりません。

新しい鍵では、CKA_ALWAYS_SENSITIVE 属性が CK_FALSE に設定され、CKA_NEVER_EXTRACTABLE 属性も CK_FALSE に設定されます。 CKA_EXTRACTABLE 属性は、デフォルトでは CK_TRUE に設定されます。

変更や変更の試行ができるメカニズムもあります。 キーがアンラップされると同時に、pMechanism 構造の内容もアンラップされます。

指定された正確なテンプレートに対応していない場合、C_UnwrapKey の呼び出しは失敗し、鍵オブジェクトを作成せずに戻ります。

C_UnwrapKey の呼び出しが成功して鍵オブジェクトが作成されると、そのオブジェクトの CKA_LOCAL 属性が CK_FALSE に設定されます。

キーのサブセットのみをアンラップできるようにアンラッピング・キーをパーティション化するには、アンラッピング・キーで属性 CKA_UNWRAP_TEMPLATE を使用して、アンラップ対象キーの属性に追加される属性セットを指定します。 これらの属性が、pTemplate 内のユーザー指定の属性テンプレートと矛盾しない場合は、アンラップ処理が開始されます。 この属性の値は属性テンプレートであり、サイズはテンプレート内の項目数に CK_ATTRIBUTE のサイズを乗算した値になります。 この属性がアンラップ鍵に存在しない場合、追加の属性は追加されません。 キーをアンラップしようとしたときに属性の競合が発生した場合は、関数 SHALL は CKR_TEMPLATE_INCONSISTENT を返します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hUnwrappingKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG ulWrappedKeyLen,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_DOMAIN_PARAMS_INVALID、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_UNWRAPPING_KEY_HANDLE_INVALID、CKR_UNWRAPPING_KEY_SIZE_RANGE、CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT、CKR_USER_NOT_LOGGED_IN、CKR_WRAPPED_KEY_INVALID、CKR_WRAPPED_KEY_LEN_RANGE

コード・スニペット

  • Golang コード・スニペット

    aesUnwrapKeyTemplate := ep11.EP11Attributes{
        ep11.CKA_CLASS:       ep11.CKO_SECRET_KEY,
        ep11.CKA_KEY_TYPE:    ep11.CKK_AES,
        ep11.CKA_VALUE_LEN:   128 / 8,
        ep11.CKA_ENCRYPT:     true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_EXTRACTABLE: true, // must be true to be wrapped
    }
    UnwrapKeyRequest := &pb.UnwrapKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:      GenerateKeyPairResponse.PrivKeyBytes,
        Wrapped:  WrapKeyResponse.Wrapped,
        Template: util.AttributeMap(aesUnwrapKeyTemplate),
    }
    
    // Unwrap the AES key
    UnwrapKeyResponse, err := cryptoClient.UnwrapKey(context.Background(), UnwrapKeyRequest)
    
  • JavaScript コード・スニペット

    const aesUnwrapKeyTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_CLASS, ep11.CKO_SECRET_KEY),
    new util.Attribute(ep11.CKA_KEY_TYPE, ep11.CKK_AES),
    new util.Attribute(ep11.CKA_VALUE_LEN, 128/8),
    new util.Attribute(ep11.CKA_ENCRYPT, true),
    new util.Attribute(ep11.CKA_DECRYPT, true),
    new util.Attribute(ep11.CKA_EXTRACTABLE, true)
    );
    
    client.UnwrapKey({
        Mech: {
            Mechanism: ep11.CKM_RSA_PKCS
        },
        KeK: rsa.PrivKeyBytes,
        Wrapped: wrapped,
        Template: aesUnwrapKeyTemplate
    }, (err, data={}) => {
        cb(err, wrapped, data.UnwrappedBytes, data.CheckSum);
    });
    

RewrapKeyBlob

RewrapKeyBlob 関数は、生成された鍵のバイナリー・ラージ・オブジェクト (BLOB) を、新しくコミットされたマスター鍵 (HSM に保管されます) で再暗号化します。 再暗号化された鍵は、新しくコミットされたマスター鍵で HSM がファイナライズされるまで使用できません。

この関数は、GREP11 によってのみサポートされる特殊な管理コマンドです。 RewrapKeyBlob に対応する EP11 関数や PKCS #11 関数はありません。

説明 新しいマスター鍵がコミットされたときに、現行のマスター鍵で管理されている BLOB の所有権を新しいマスター鍵に移します。
パラメーター
    message RewrapKeyBlobRequest {
    	bytes WrappedKey = 1;
    }
    message RewrapKeyBlobResponse {
    	bytes RewrappedKey = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。

コード・スニペット

  • Golang コード・スニペット

    RewrapKeyBlobRequest := &pb.RewrapKeyBlobRequest {
        WrappedKey: GenerateKeyResponse.KeyBytes,
    }
    
    // Rewrap an existing key blob using the HSM's new wrapping key
    RewrapKeyBlobResponse, err := cryptoClient.RewrapKeyBlob(context.Background(),  RewrapKeyBlobRequest)
    
  • JavaScript コード・スニペット

    client.RewrapKeyBlob({
      WrappedKey: wrappedKey
    }, (err, response) => {
      callback(err, response);
    });
    

鍵の属性の表示および変更

鍵を生成したり、鍵操作を実行したりするときには、パラメーターの 1 つとして属性テンプレートを定義します。 鍵の生成後に、特定の鍵オブジェクトの属性を表示したり、一部の属性を変更したりできます。

GetAttributeValue

GetAttributeValue 関数は、オブジェクトの属性値を取得します。

説明 EP11 m_GetAttributeValue (PKCS #11 C_GetAttributeValue の実装) にバインドされます。
パラメーター
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> Attributes = 4;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_GetAttributeValue の実装。

(BLOB に含まれている) セッションに対応していない、またはセッションを必要としないので 、hSession パラメーターは使用しません。

EP11 では、汎用的なデコードの方法ではなく、実際の値を列挙するなどの、より単純なデコードの方法を使用します。

パラメーター
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        target_t ターゲット
    );
    
戻り値 C_GetAttributeValue の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_GetAttributeValue は、オブジェクトの 1 つ以上の属性の値を取得します。hSession はセッションのハンドル、hObject はオブジェクトのハンドル、pTemplate は取得する属性値を指定し、属性値を受け取るテンプレート、UlCount はテンプレートの属性数を指します。

テンプレート内のトリプル (typepValueulValueLen) ごとに、C_GetAttributeValue は以下のアルゴリズムを実行します。

  1. 機密オブジェクトや抽出不能なオブジェクトであるために、指定された属性 (つまり、type フィールドで指定された属性) を確認できない場合は、そのトリプルの ulValueLen フィールドが、値 CK_UNAVAILABLE_INFORMATION を保持できる長さに変更されます。
  2. そうではなく、オブジェクトの指定された値が無効な場合 (オブジェクトにそのような属性がない場合) は、そのトリプルの ulValueLen フィールドが、値 CK_UNAVAILABLE_INFORMATION を保持できる長さに変更されます。
  3. そうではなく、pValue フィールドの値が NULL_PTR である場合、ulValueLen フィールドが、オブジェクトの指定された属性の正確な長さに変更されます。
  4. そうではなく、ulValueLen に指定された長さが、オブジェクトの指定された属性の値を保持できる長さである場合は、その属性が pValue にあるバッファーにコピーされ、ulValueLen フィールドが属性の正確な長さに変更されます。
  5. そうではない場合は、ulValueLen フィールドが、値 CK_UNAVAILABLE_INFORMATION を保持できる長さに変更されます。

要求されたいずれかの属性がケース 1 に該当する場合は、呼び出しで値 CKR_ATTRIBUTE_SENSITIVE が返される必要があります。 要求されたいずれかの属性がケース 2 に該当する場合は、呼び出しで値 CKR_ATTRIBUTE_TYPE_INVALID が返される必要があります。 要求されたいずれかの属性がケース 5 に該当する場合は、呼び出しで値 CKR_BUFFER_TOO_SMALL が返される必要があります。 複数のエラー・コードが該当する場合は、通常どおり、Cryptoki からそのすべてが返されます。 CKR_OK が返されるのは、要求されたいずれの属性もどのケースにも該当しない場合に限られます。

値が配列 (CKA_WRAP_TEMPLATE など) である属性の特殊なケースで、NULL ではなく pValue で渡される場合は、その配列のエレメントの pValue が NULL_PTR であれば、配列のエレメントの ulValueLen は必要な長さに設定されます。 配列内の要素の pValue が NULL_PTR でない場合は、配列内の属性の ulValueLen 要素が、対応する pValue が指すスペースを反映していなければならず、十分なスペースがある場合は pValue に値が設定されます。 したがって、そのような配列値を取得するために C_GetAttributeValue が呼び出される前に、バッファーの内容を初期化することが重要です。 配列内の ulValueLen の大きさが十分でない場合は、値が CK_UNAVAILABLE_INFORMATION に設定され、関数から CKR_BUFFER_TOO_SMALL が返されます。これは、pTemplate 引数の属性の ulValueLen が小さすぎる場合と同じ動作です。 属性の配列を値として持つ属性は、属性タイプに CKF_ARRAY_ATTRIBUTE を設定することで識別できます。

エラー・コード CKR_ATTRIBUTE_SENSITIVECKR_ATTRIBUTE_TYPE_INVALIDCKR_BUFFER_TOO_SMALL は、C_GetAttributeValue の実際のエラーではありません。 C_GetAttributeValue の呼び出しでこの 3 つの値のいずれかが返された場合は、C_GetAttributeValue に渡したテンプレート内のすべての属性が処理されています。 C_GetAttributeValue の呼び出しで値を返すことができるテンプレート内の各属性が、C_GetAttributeValue の呼び出しで返されます。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_SENSITIVE、CKR_ATTRIBUTE_TYPE_INVALID、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OBJECT_HANDLE_INVALID、CKR_OK, CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    // Only retrieve supported EP11 attributes
    attributeList := ep11.EP11Attributes{
        ep11.CKA_DECRYPT: false, // attribute where you would like to retrieve its current value
    }
    
    GetAttributeValueRequest := &pb.GetAttributeValueRequest{
        Object:     GenerateKeyPairResponse.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    
    GetAttributeValueResponse, err := cryptoClient.GetAttributeValue(context.Background(), GetAttributeValueRequest)
    
  • JavaScript コード・スニペット

    const attributeTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_SIGN, 0)
    );
    
    client.GetAttributeValue({
      Object: keys.PrivKey,
      Attributes: attributeTemplate
    }, (err, response) => {
      callback(err, response);
      console.log('ATTRIBUTE:', response.Attributes);
    });
    

SetAttributeValue

SetAttributeValue 関数は、オブジェクトの属性値を変更します。

説明 EP11 m_SetAttributeValue (PKCS #11 C_SetAttributeValue の実装) にバインドされます。
パラメーター
    message SetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> Attributes = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_SetAttributeValue の実装。

属性パッキング: _GetAttrValue を参照してください。

現在のところ Ep11 では、送信されるのはブール属性だけで、他のすべての属性はホストによって処理されます (WRAP_TEMPLATE などの配列は変更されません)。

(BLOB に含まれている) セッションに対応していない、またはセッションを必要としないので、PKCS #11 の hSession パラメーターは使用しません。

パラメーター
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        target_t ターゲット
    );
    
戻り値 C_SetAttributeValue の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

_SetAttributeValue は、オブジェクトの 1 つ以上の属性の値を変更します。hSession はセッションのハンドル、hObject はオブジェクトのハンドル、pTemplate は変更する属性値とその新しい値を指定するテンプレート、ulCount はテンプレートの属性数を指します。

変更できないオブジェクトもあります。 そのようなオブジェクトに対して C_SetAttributeValue を呼び出すと、エラー・コード CKR_ACTION_PROHIBITED が返されます。 アプリケーションは、オブジェクトの CKA_MODIFIABLE 属性に基づいて、オブジェクトが変更可能かどうかを判別できます。

読み取り専用セッションで変更できるのはセッション・オブジェクトだけです。

テンプレートでは、変更可能なオブジェクトの任意の属性の新しい値を指定できます。 オブジェクトの他の既存の属性と互換性のない属性の値がテンプレートに指定されている場合は、呼び出しは失敗し、リターン・コード CKR_TEMPLATE_INCONSISTENT が返されます。

すべての属性を変更できるわけではありません。詳細については、PKCS #11 API 仕様セクション 4.1.2 を参照してください。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
戻り値 CKR_ACTION_PROHIBITED、CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OBJECT_HANDLE_INVALID、CKR_OK、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Only set supported R/W EP11 attributes
    attributeList := ep11.EP11AttributeP{
        CKA_DECRYPT: true,
    }
    
    SetAttributeValueRequest := &pb.SetAttributeValueRequest{
        Object:     GenerateKeyPair.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    SetAttributeValueResponse, err := cryptoClient.SetAttributeValue(context.Background(), SetAttributeValueRequest)
    
  • JavaScript コード・スニペット

    const attributeTemplate = new util.AttributeMap(
    new util.Attribute(ep11.CKA_SIGN, true)
    );
    
    client.SetAttributeValue({
      Object: keys.PrivKey,
      Attributes: attributeTemplate
    }, (err, response) => {
      callback(err, response);
    });
    

ランダム・データの生成

暗号操作で使用するための高品質のランダム・データ (初期設定値 (IV)、PIN、パスワードなど) を生成できます。

GenerateRandom

GenerateRandom 関数は、ランダム・データを生成します。 この関数を使用するときには、ランダム・データの長さをゼロに設定しないでください。また、ランダム・データの場所を指すポインターを NULL に設定しないでください。

説明 EP11 m_GenerateRandom (PKCS #11 C_GenerateRandom の実装) にバインドされます。
パラメーター
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_GenerateRandom の実装。

GenerateRandom は元の PKCS #11 関数と同じです。 内部では、ハードウェアでシードされたエントロピーが、FIPS 準拠の DRNG (Clic のバージョンに応じて ANSI X9.31 か ISO 18031 のどちらか) で渡されます。

適切な機能がホストで有効になっていれば、バックエンドに送ることなくホスト・ライブラリーで乱数を生成できます。 現在の実装ではこれは実行されません。

この関数はサイズの照会をサポートしていません。

パラメーター
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        target_t ターゲット
    );
    
戻り値 C_GenerateRandom の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明 C_GenerateRandom は、ランダム・データまたは疑似ランダム・データを生成します。hSession はセッションのハンドル、pRandomData はランダム・データを受け取るロケーション、ulRandomLen は生成されるランダム・データまたは疑似ランダム・データのバイト単位の長さを指します。
パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pRandomData,
        CK_ULONG ulRandomLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、 CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、 CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、 CKR_OK、CKR_OPERATION_ACTIVE、CKR_RANDOM_NO_RNG、CKR_SESSION_CLOSED、 CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN。

コード・スニペット

  • Golang コード・スニペット

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • JavaScript コード・スニペット

    client.GenerateRandom({
      Len: ep11.AES_BLOCK_SIZE
    }, (err, response) => {
      callback(err, response);
    });
    

データの暗号化と復号

暗号メカニズムを指定して、対称または非対称の暗号化関数または復号関数を実行できます。 データを暗号化または復号するために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータの暗号化操作は、EncryptInitEncryptUpdate、および EncryptFinal のサブ操作で構成されます。

EncryptInit

EncryptInit 関数は、暗号化操作を初期化します。 暗号化を実行するには、まずこの関数を呼び出す必要があります。

説明 EP11 m_EncryptInit (PKCS #11 C_EncryptInit の実装) にバインドされます。
パラメーター
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_EncryptInit の実装。

(key, klen) の BLOB には、公開鍵のオブジェクトまたは秘密鍵の BLOB を指定できます。 鍵のタイプは pmech と整合していなければなりません。

公開鍵のメカニズムの場合は、(key, klen) に SPKI を指定する必要があります。 この SPKI は、GenerateKeyPair または UnwrapKey で返される MAC 鍵によって整合性が確保されています。 Encrypt の状態は、セッション制限なしで作成されます。

秘密鍵メカニズムの場合、Encrypt の状態は、(key, klen) からオブジェクト・セッション制限を継承します。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

(key, klen) は鍵の BLOB でなければなりません。

パラメーター
    CK_RV m_EncryptInit (
        unsigned char * state、size_t * statelen、
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        target_t ターゲット
    );
    
戻り値 C_EncryptInit の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_EncryptInit は、暗号化操作を初期化します。hSession はセッションのハンドル、pMechanism は暗号化メカニズム、hKey は暗号キーのハンドルを指します。

暗号鍵の CKA_ENCRYPT 属性 (鍵が暗号化をサポートするかどうかを示す属性) は、CK_TRUE でなければなりません。

アプリケーションは C_EncryptInit を呼び出した後に、C_Encrypt を呼び出して 1 部構成のデータを暗号化するか、C_EncryptUpdate をゼロ回以上呼び出してから C_EncryptFinal を呼び出して複数部構成のデータを暗号化することができます。 暗号化操作は、アプリケーションが C_Encrypt または C_EncryptFinal の呼び出しを使用して最終的な暗号文を取得するまでアクティブです。 (1 部構成または複数部構成の) データを追加で処理するには、アプリケーションはもう一度 C_EncryptInit を呼び出す必要があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
戻り値 CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN。

コード・スニペット

  • Golang コード・スニペット

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    EncryptInitRequest := &pb.EncryptInitRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    EncryptInitResponse, err := cryptoClient.EncryptInit(context.Background(), EncryptInitRequest)
    
  • JavaScript コード・スニペット

    client.EncryptInit({
    	Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: key
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

暗号化

Encrypt 関数は、1 部構成のデータを暗号化します。 1 部構成の暗号化では、EncryptUpdateEncryptFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず EncryptInit を実行するようにしてください。

説明 EP11 m_Encrypt (PKCS #11 C_Encrypt の実装) にバインドされます。
パラメーター
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_Encrypt の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、EncryptInit からの出力です。

パラメーター
    CK_RV m_Encrypt (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        target_t ターゲット
    );
    
戻り値 C_Encrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_Encrypt は、シングルパート・データを暗号化します。hSession はセッションのハンドル、pDATA はデータ、ulDataLen はデータのバイト単位の長さ、pEncryptedData は暗号化されたデータを受け取るロケーション、pulEncryptedDataLen は暗号化されたデータのバイト単位の長さを保持するロケーションを指します。

C_Encrypt は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

暗号化操作を C_EncryptInit で初期化する必要があります。 C_Encrypt を呼び出すと、必ずアクティブな暗号化操作が終了します。ただし、暗号化テキストを保持するために必要なバッファーの長さを判別するために CKR_BUFFER_TOO_SMALL が返されるか、または呼び出しが成功した場合 (つまり CKR_OK が返された呼び出し) を除きます。

複数部構成の操作を終了するために C_Encrypt を使用することはできません。この関数は、C_EncryptInit の後に、C_EncryptUpdate の呼び出しを挟まずに呼び出す必要があります。

一部の暗号化メカニズムでは、入力プレーン・テキスト・データに一定の長さの制約があります (メカニズムは比較的短いプレーン・テキストのみを暗号化できるため、またはメカニズムの入力データは整数のブロック数で構成される必要があるため)。 この制約を満たしていないと、C_Encrypt は戻りコード CKR_DATA_LEN_RANGE で失敗します。

プレーン・テキストと暗号化テキストは同じ場所に置くことができます。つまり、 pDatapEncryptedData が同じ場所を指していれば問題ありません。

ほとんどのメカニズムでは、C_Encrypt は、一連の C_EncryptUpdate 操作の後に C_EncryptFinal を実行するのと同じです。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pEncryptedData,
        CK_ULONG_PTR pulEncryptedDataLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_INVALID、CKR_DATA_LEN_RANGE、CKR_DEVICE_MEMORY、CKR_DEVICE_VICE_REMOVED、CKR_FUNCTION_CANCELED、CKRR_NO_BUFFTION_CLOSED

コード・スニペット

  • Golang コード・スニペット

    plainText := "Encrypt this message"
    
    EncryptRequest := &pb.EncryptRequest {
        State: EncryptInitResponse.State,
        Plain: plainText,
    }
    
    EncryptResponse, err := cryptoClient.Encrypt(context.Background(), EncryptRequest)
    
  • JavaScript コード・スニペット

    client.Encrypt({
      State: state,
      Plain: Buffer.from(message)
    }, (err, response) => {
      callback(err, response);
    });
    

EncryptUpdate

EncryptUpdate 関数は、複数部構成の暗号化操作を続行します。 この関数を呼び出す前に、まず EncryptInit を実行するようにしてください。

説明 EP11 m_EncryptUpdate (PKCS #11 C_EncryptUpdate の実装) にバインドされます。
パラメーター
    message EncryptUpdateRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptUpdateResponse {
        bytes State = 1;
        bytes Ciphered = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_EncryptUpdate の実装。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、EncryptInit からの出力です。

パラメーター
    CK_RV m_EncryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        target_t ターゲット
    );
    
戻り値 C_EncryptUpdate の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_EncryptUpdate はマルチパートの暗号化操作を続行し、別のデータ・パートを処理します。hSession はセッションのハンドル、pPart はデータ・パート、ulPartLen はデータ・パートの長さ、pEncryptedPart は暗号化されたデータ・パートを受け取るロケーション、pulEncryptedPartLen は暗号化されたデータ・パートの長さ (バイト単位) を保持するロケーションを指します。

C_EncryptUpdate は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

暗号化操作を C_EncryptInit で初期化する必要があります。 この関数は、連続して何度でも呼び出せます。 C_EncryptUpdate を呼び出して CKR_BUFFER_TOO_SMALL 以外のエラーが発生すると、現在の暗号化操作が終了します。

平文暗号文を同じ場所に配置できます。つまり、pPartpEncryptedPart が同じ場所を指していてもかまいません。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen,
        CK_BYTE_PTR pEncryptedPart,
        CK_ULONG_PTR pulEncryptedPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    plainText := `
    This is a very long message that needs to be encrypted by performing
    multiple EncrypytUpdate functions`
    
    // Use EncryptUpdate if you would like to breakup
    // the encrypt operation into multiple suboperations
    EncryptUpdateRequest1 := &pb.EncryptUpdateRequest {
        State: EncryptInitResponse.State,
        Plain: plainText[:20],
    }
    
    EncryptUpdateResponse, err := cryptoClient.EncryptUpdate(context.Background(), EncryptUpdateRequest1)
    
    ciphertext := EncryptUpdateResponse.Ciphered[:]
    
    EncryptUpdateRequest2 := &pb.EncryptUpdateRequest {
        State: EncryptUpdateResponse.State,
        Plain: plainText[20:],
    }
    
    EncryptUpdateResponse, err := cryptoClient.EncryptUpdate(context.Background(), EncryptUpdateRequest2)
    
    ciphertext = append(ciphertext, EncryptUpdateResponse.Ciphered...)
    
  • JavaScript コード・スニペット

    client.EncryptUpdate({
      State: state,
      Plain: Buffer.from(message.substr(20))
    }, (err, data={}) => {
      cb(err, data.State, Buffer.concat([ciphertext, data.Ciphered]));
    });
    

EncryptFinal

EncryptFinal 関数は、複数部構成の暗号化操作を終了します。

説明 EP11 m_EncryptFinal (PKCS #11 C_EncryptFinal の実装) にバインドされます。
パラメーター
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_EncryptFinal の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、EncryptInit および EncryptUpdate からの出力です。

パラメーター
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        target_t ターゲット
    );
    
戻り値 C_EncryptFinal の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_EncryptFinal は、マルチパートの暗号化操作を終了します。hSession はセッションのハンドル、pLastEncryptedPart は、最後に暗号化されたデータ・パートがあれば受け取るロケーション、pulLastEncryptedPartLen は最後に暗号化されたデータ・パートの長さを保持するロケーションを指します。

C_EncryptFinal は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

暗号化操作を C_EncryptInit で初期化する必要があります。 C_EncryptFinal を呼び出すと、必ず、アクティブな暗号化操作が終了します。ただし、呼び出しで CKR_BUFFER_TOO_SMALL が返された場合や、暗号文を保持するのに必要なバッファー長を確認するために呼び出して成功した場合 (つまり CKR_OK が返された場合) は別です。

一部のマルチパート暗号化メカニズムでは、入力プレーン・テキスト・データに一定の長さの制約があります。これは、メカニズムの入力データが整数のブロック数で構成されている必要があるためです。 この制約を満たしていないと、C_EncryptFinal は戻りコード CKR_DATA_LEN_RANGE で失敗します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastEncryptedPart,
        CK_ULONG_PTR pulLastEncryptedPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • JavaScript コード・スニペット

    client.EncryptFinal({
      State: state
    }, (err, data={}) => {
      cb(err, Buffer.concat([ciphertext, data.Ciphered]));
    });
    

EncryptSingle

EncryptSingle 関数は、1 回の呼び出しで一度にデータを処理します。 この関数は状態をホストに返すことはなく、暗号化されたデータのみを返します。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能であり、EncryptInit 関数と Encrypt 関数を組み合わせたものです。 一連の呼び出しではなく、1 回の呼び出しで暗号化操作を実行できます。

説明 EP11 m_EncryptSingle にバインドされます。
パラメーター
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

Encrypt の非標準のバリアント。 1 回の呼び出しで一度にデータを処理します。 暗号化されたデータだけがホストに返され、状態は返されません。

XCP 対応アプリケーションには、データを一度に暗号化するこの方法をお勧めします。 機能的には、これは EncryptInit の直後に Encrypt を実行するのと同じですが、往復、ラップ、アンラップの処理を行わずに済みます。

バックエンドが常駐鍵をサポートしている場合は、この鍵を常駐鍵のハンドルとして使用することも可能です。

EncryptEncryptInitDecryptSingle も参照してください。

key の BLOB は、GenerateKey および UnwrapKey からの出力です。

パラメーター
    CK_RV m_EncryptSingle (
        const unsigned char *key, size_t keylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        target_t ターゲット
    );
    
戻り値 C_Encrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(),  GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    plainText := "Encrypt this message"
    EncryptSingleRequest := &pb.EncryptSingleRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
        Plain: plainText,
    }
    
    EncryptSingleResponse, err := cryptoClient.EncryptSingle(context.Background(), EncryptSingleRequest)
    
  • JavaScript コード・スニペット

    client.EncryptSingle({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: aliceDerived.NewKey,
      Plain: Buffer.from(message)
    }, (err, response) => {
      callback(err, response);
    });
    

ReencryptSingle

ReencryptSingle 関数を使用すると、元のキーを使用してデータを復号してから、クラウド HSM で 1 回呼び出すと、別のキーで raw データを暗号化できます。 この操作に使用されるキー・タイプは、同じものでも別のものでも問題ありません。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能です。 大量のデータを異なる鍵で再暗号化する必要がある状況では、この関数を 1 回呼び出すことが 1 つの有効な選択肢となります。これを使用すると、再暗号化する必要があるデータ項目ごとに DecryptSingle 関数と EncryptSingle 関数を組み合わせて実行する手間が省かれます。 この関数は状態をホストに返すことはなく、再暗号化されたデータのみを返します。

説明 EP11 m_ReencryptSingle にバインドします。
パラメーター
    message ReencryptSingleRequest {
        bytes DecKey = 1;
        bytes EncKey = 2;
        Mechanism DecMech = 3;
        Mechanism EncMech = 4;
        bytes Ciphered = 5;
    }
    message ReencryptSingleResponse {
        bytes Reciphered = 6;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

Encrypt の非標準のバリアント。 1 回の呼び出しで一度にデータを処理します。 再暗号化されたデータだけがホストに返され、状態は返されません。

元のキーを使用してデータを復号し、クラウド HSM の別のキーで raw データを暗号化します。

パラメーター
    CK_RV m_ReencryptSingle (
        const unsigned char * dkey、size_t dkeylen、
        const unsigned char * ekey、size_t ekeylen、
        CK_MECHANISM_PTR decmech,
        CK_MECHANISM_PTR encmech,
        CK_BYTE_PTR in, CK_ULONG inlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        target_t ターゲット
    );
    
戻り値 C_Encrypt および C_Decrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    var msg = []byte("Data to encrypt")
    EncryptKey1Request := &pb.EncryptSingleRequest{
        Key:   GenerateKey1Response.KeyBytes,
        Mech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Plain: msg,
    }
    EncryptKey1Response, err := cryptoClient.EncryptSingle(context.Background(), EncryptKey1Request)
    if err != nil {
        return nil, fmt.Errorf("Encrypt error: %s", err)
    }
    
    ReencryptSingleRequest := &pb.ReencryptSingleRequest{
        DecKey:   GenerateKey1Response.KeyBytes, // original key
        EncKey:   GenerateKey2Response.KeyBytes, // new key
        DecMech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        EncMech:  &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Ciphered: RencryptKey1Response.Ciphered,
    }
    
    ReencryptSingleResponse, err := cryptoClient.ReencryptSingle(context.Background(), ReencryptSingleRequest)
    
  • JavaScript コード・スニペット

    client.ReencryptSingle({
    Decmech: {
      Mechanism: mech1,
      ParameterB: iv
    },
    Encmech: {
      Mechanism: mech2,
      ParameterB: iv
    },
    In: encipherState.Ciphered,
    DKey: keyBlob1,
    Ekey: keyBlob2,
    }, (err, response) => {
    callback(err, response);
    });
    

DecryptInit

DecryptInit 関数は、復号操作を初期化します。 復号を実行するには、まずこの関数を呼び出す必要があります。

説明 EP11 m_DecryptInit (PKCS #11 C_DecryptInit の実装) にバインドされます。
パラメーター
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明 PKCS #11 C_DecryptInit の実装。
パラメーター
    CK_RV m_DecryptInit (
        unsigned char * state、size_t * statelen、
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        target_t ターゲット
    );
    
戻り値 C_DecryptInit の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DecryptInit は、復号操作を初期化します。hSession はセッションのハンドル、pMechanism は復号メカニズム、hKey は復号キーのハンドルを指します。

復号鍵の CKA_DECRYPT 属性 (鍵が復号をサポートするかどうかを示す属性) は、CK_TRUE でなければなりません。

アプリケーションが C_DecryptInit を呼び出すと、アプリケーションは C_Decrypt を呼び出してシングルパートのデータを復号するか、または C_DecryptUpdate を 0 回かそれ以上呼び出してから、C_DecryptFinal を呼び出してマルチパートのデータを復号できます。 復号操作は、アプリケーションが C_Decrypt または C_DecryptFinal の呼び出しを使用して最終的な平文を取得するまでアクティブです。 (1 部構成または複数部構成の) データを追加で処理するには、アプリケーションはもう一度 C_DecryptInit を呼び出す必要があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
        K_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    DecryptInitRequest := &pb.DecryptInitRequest{
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    DecryptInitResponse, err := cryptoClient.DecryptInit(context.Background(), DecryptInitRequest)
    
  • JavaScript コード・スニペット

    client.DecryptInit({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: key
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

復号

Decrypt 関数は、1 部構成のデータを復号します。 1 部構成の復号では、DecryptUpdateDecryptFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず DecryptInit を実行するようにしてください。

説明 EP11 m_Decrypt (PKCS #11 C_Decrypt の実装) にバインドされます。
パラメーター
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_Decrypt の実装 (state, slen) は更新されません。

state、slen のバイナリー・ラージ・オブジェクト (BLOB) を PKCS #11 の hSession パラメーターからマップする必要があります。 state の BLOB は、DecryptInit からの出力です。

パラメーター
    CK_RV m_Decrypt (const unsigned char *state, size_t slen,
        CK_BYTE_PTR cipher, CK_ULONG clen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plen,
        target_t ターゲット
    );
    
戻り値 C_Decrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_Decrypt は、1 部構成の暗号化されたデータを復号します。

  • hSession はセッション・ハンドルです。
  • pEncryptedData は暗号化されたデータのポインターです。
  • ulEncryptedDataLen は暗号化されたデータの長さです。
  • pData は、復元されたデータを受け取る場所のポインターです。
  • pulDataLen は、復元されたデータの長さを保持する場所のポインターです。

C_Decrypt は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

復号操作を C_DecryptInit で初期化する必要があります。 C_Decrypt を呼び出すと、 CKR_BUFFER_TOO_SMALL が返されるか、プレーン・テキストを保持するために必要なバッファーの長さを判別するために CKR_OK が返される正常な呼び出しでない限り、アクティブな暗号化解除操作が常に終了します。

複数部構成の操作を終了するために C_Decrypt を使用することはできません。この関数は、C_DecryptInit の後に、C_DecryptUpdate の呼び出しを挟まずに呼び出す必要があります。

暗号化テキストとプレーン・テキストは同じ場所に置くことができます。つまり、 pEncryptedData と pData が同じ場所を指している場合にも許容されます。

入力の暗号データの長さが適切でないために復号できない場合は、CKR_ENCRYPTED_DATA_INVALID または CKR_ENCRYPTED_DATA_LEN_RANGE のいずれかが返される可能性があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_Decrypt)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pEncryptedData,
        CK_ULONG ulEncryptedDataLen,
        CK_BYTE_PTR pData,
        CK_ULONG_PTR pulDataLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_ENCRYPTED_DATA_INVALID、CKR_ENCRYPTED_DATA_LEN_RANGE、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    DecryptRequest := &pb.DecryptRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext, // encrypted data from a previous encrypt operation
    }
    
    DecryptResponse, err := cryptoClient.Decrypt(context.Background(), DecryptRequest)
    
  • JavaScript コード・スニペット

    client.Decrypt({
      State: state,
      Ciphered: ciphertext
    }, (err, response) => {
      callback(err, response);
    });
    

DecryptUpdate

DecryptUpdate 関数は、複数部構成の復号操作を続行します。 この関数を呼び出す前に、まず DecryptInit を実行するようにしてください。

説明 EP11 m_DecryptUpdate (PKCS #11 C_DecryptUpdate の実装) にバインドされます。
パラメーター
    message DecryptUpdateRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptUpdateResponse {
        bytes State = 1;
        bytes Plain = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DecryptUpdate の実装。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、DecryptInit からの出力です。

パラメーター
    CK_RV m_DecryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        target_t ターゲット
    );
    
戻り値 C_DecryptUpdate の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DecryptUpdate は、別の暗号化データ・パートを処理して、マルチパートの復号操作を続行します。hSession はセッションのハンドル、pEncryptedPart はデータの暗号化されたパート、ulEncryptedPartLen はデータの暗号化されたパートの長さ、pPart はデータのリカバリーされたパートを受け取るロケーション、pulPartLen はデータのリカバリーされたパートの長さを保持するロケーションを指します。

C_DecryptUpdate は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

復号操作を C_DecryptInit で初期化する必要があります。 この関数は、連続して何度でも呼び出せます。 C_DecryptUpdate を呼び出して CKR_BUFFER_TOO_SMALL 以外のエラーが発生すると、現在の復号操作が終了します。

暗号化テキストとプレーン・テキストは同じ場所に置くことができます。つまり、 pEncryptedPartpPart が同じ場所を指していれば問題ありません。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pEncryptedPart,
        CK_ULONG ulEncryptedPartLen,
        CK_BYTE_PTR pPart,
        CK_ULONG_PTR pulPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    // Use DecryptUpdate if you would like to breakup
    // the decrypt operation into multiple suboperations
    DecryptUpdateRequest1 := &pb.DecryptUpdateRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext[:16], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest1)
    
    plaintext := DecryptUpdateResponse.Plain[:]
    
    DecryptUpdateRequest2 := &pb.DecryptUpdateRequest{
        State:    DecryptUpdateResponse.State,
        Ciphered: ciphertext[16:], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest2)
    
    plaintext = append(plaintext, DecryptUpdateResponse.Plain...)
    
  • JavaScript コード・スニペット

    client.DecryptUpdate({
    State: state,
    Ciphered: ciphertext.slice(0, 16)
    }, (err, data={}) => {
    cb(err, data.State, data.Plain);
    });
    

DecryptFinal

DecryptFinal 関数は、複数部構成の復号操作を終了します。

説明 EP11 m_DecryptFinal (PKCS #11 C_DecryptFinal の実装) にバインドされます。
パラメーター
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DecryptFinal の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、DecryptInit および DecryptUpdate からの出力です。

パラメーター
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        target_t ターゲット
    );
    
戻り値 C_DecryptFinal の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DecryptFinal は、マルチパートの復号操作を終了します。hSession はセッションのハンドル、pLastPart は最後にリカバリーされたデータ・パートがあれば受け取るロケーション、pulLastPartLen は最後にリカバリーされたデータ・パートの長さを保持するロケーションを指します。

C_DecryptFinal は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

復号操作を C_DecryptInit で初期化する必要があります。 C_DecryptFinal の呼び出しは、 CKR_BUFFER_TOO_SMALL を戻すか、またはテキスト・プレーン・テキストを保持するために必要なバッファーの長さを判別するための正常な呼び出し (つまり、 が CKR_OKを戻す呼び出し) でない限り、常にアクティブな暗号化解除操作を終了します。

入力の暗号データの長さが適切でないために復号できない場合は、CKR_ENCRYPTED_DATA_INVALID または CKR_ENCRYPTED_DATA_LEN_RANGE のいずれかが返される可能性があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pLastPart,
        CK_ULONG_PTR pulLastPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_ENCRYPTED_DATA_INVALID、CKR_ENCRYPTED_DATA_LEN_RANGE、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • JavaScript コード・スニペット

    client.DecryptFinal({
      State: state
    }, (err, data={}) => {
      cb(err, Buffer.concat([plaintext, data.Plain]));
    });
    

DecryptSingle

DecryptSingle 関数は、1 回の呼び出しで一度にデータを処理します。 この関数は状態をホストに返すことはなく、復号されたデータのみを返します。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能であり、DecryptInit 関数と Decrypt 関数を組み合わせたものです。 一連の呼び出しではなく、1 回の呼び出しで復号操作を実行できます。

説明 EP11 m_DecryptSingle にバインドします。
パラメーター
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

Decrypt の非標準のバリアント。 1 回の呼び出しで一度にデータを処理します。 復号されたデータだけがホストに返され、状態は返されません。

XCP 対応アプリケーションには、データを一度に暗号化するこの方法をお勧めします。 機能的には、これは DecryptInit の直後に Decrypt を実行するのと同じですが、往復、ラップ、アンラップの処理を行わずに済みます。

バックエンドが常駐鍵をサポートしている場合は、この鍵を常駐鍵のハンドルとして使用することも可能です。

DecryptDecryptInitEncryptSingle も参照してください。

key の BLOB は、GenerateKey および UnwrapKey からの出力です。

パラメーター
    CK_RV m_DecryptSingle (
        const unsigned char *key, size_t keylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        target_t ターゲット
    );
    
戻り値 C_Decrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    // Generate 16 bytes of random data for the initialization vector
    GenerateRandomRequest := &pb.GenerateRandomRequest{
        Len: (uint64)(ep11.AES_BLOCK_SIZE),
    }
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(),  GenerateRandomRequest)
    if err != nil {
        return nil, fmt.Errorf("GenerateRandom error: %s", err)
    }
    iv := GenerateRandomResponse.Rnd[:ep11.AES_BLOCK_SIZE]
    fmt.Println("Generated IV")
    
    DecryptSingleRequest := &pb.DecryptSingleRequest {
        Key:      GenerateKeyResponse.KeyBytes,
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)},
        Ciphered: EncryptSingleResponse.Ciphered, // encrypted data from a previous encrypt operation
    }
    
    DecryptSingleResponse, err := cryptoClient.DecryptSingle(context.Background(), DecryptSingleRequest)
    
  • JavaScript コード・スニペット

    client.DecryptSingle({
      Mech: {
        Mechanism: ep11.CKM_AES_CBC_PAD,
        ParameterB: iv
      },
      Key: bobDerived.NewKey,
      Ciphered: ciphertext
    }, (err, response) => {
      callback(err, response);
    });
    

データの署名と検証

GREP11 には、データの署名や、署名またはメッセージ認証コード (MAC) の検証を行う一連の関数があります。 1 回の署名操作を実行するために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータの署名操作は、SignInitSignUpdate、および SignFinal のサブ操作で構成されます。

SignInit

SignInit関数は、署名操作を初期化します。 署名操作を実行するには、まずこの関数を呼び出す必要があります。

説明 EP11 M_SignInit にバインドしますが、これは PKCS #11 C_SignInit の実装です。
パラメーター
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明 PKCS #11 C_SignInit の実装。
パラメーター
    CK_RV m_SignInit (
        unsigned char * state、size_t * statelen、
        CK_MECHANISM_PTR mech,
        const unsigned char *privKey, size_t privKeylen,
        target_t ターゲット
    );
    
戻り値 C_Decrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_SignInit) は署名操作を初期化しますが、署名はデータの付録です。hSession はセッションのハンドル、pMechanism は署名メカニズム、hKey は署名キーのハンドルを指します。

署名鍵の CKA_SIGN 属性 (鍵が署名の付属をサポートするかどうかを示す属性) は、CK_TRUE でなければなりません。

アプリケーションは C_SignInit を呼び出した後に、C_Sign を呼び出して 1 部構成のデータに署名するか、C_SignUpdate を 1 回以上呼び出してから C_SignFinal を呼び出して複数部構成のデータに署名することができます。 署名操作は、アプリケーションが C_Sign または C_SignFinal の呼び出しを使用して署名を取得するまでアクティブです。 (1 部構成または複数部構成の) データを追加で処理するには、アプリケーションはもう一度 C_SignInit を呼び出す必要があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    SignInitRequest := &pb.SignInitRequest {
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
    }
    
    SignInitResponse, err := cryptoClient.SignInit(context.Background(), SignInitRequest)
    
  • JavaScript コード・スニペット

    client.SignInit({
      Mech: {
        Mechanism: ep11.CKM_SHA1_RSA_PKCS
      },
      PrivKey: keys.PrivKeyBytes
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

署名

Sign 関数は、1 部構成のデータに署名します。 1 部構成の署名では、SignUpdateSignFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず SignInit を実行するようにしてください。

説明 EP11 m_Sign (PKCS #11 C_Sign の実装) にバインドされます。
パラメーター
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_Sign の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、SignInit からの出力です。

パラメーター
    CK_RV m_Sign (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        target_t ターゲット
    );
    
戻り値 C_Sign の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_Sign は、署名がデータの付録であるシングル・パートでデータに署名します。hSession はセッションのハンドル、pDATA はデータ、ulDataLen はデータの長さ、pSignature は署名を受け取るロケーション、pulSignatureLen は署名の長さを保持するロケーションを指します。

C_Sign は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

署名操作を C_SignInit で初期化する必要があります。 C_Sign を呼び出すと、必ず、アクティブな署名操作が終了します。ただし、呼び出しで CKR_BUFFER_TOO_SMALL が返された場合や、署名を保持するのに必要なバッファー長を確認するために呼び出して成功した場合 (つまり CKR_OK が返された場合) は別です。

複数部構成の操作を終了するために C_Sign を使用することはできません。この関数は、C_SignInit の後に、C_SignUpdate の呼び出しを挟まずに呼び出す必要があります。

ほとんどのメカニズムでは、C_Sign は、一連の C_SignUpdate 操作の後に C_SignFinal を実行するのと同じです。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_Sign)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_INVALID、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN、CKR_FUNCTION_REJECTED

コード・スニペット

  • Golang コード・スニペット

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignRequest := &pb.SignRequest{
        State: SignInitResponse.State,
        Data:  msgHash[:],
    }
    
    // Sign the data
    SignResponse, err := cryptoClient.Sign(context.Background(), SignRequest)
    
  • JavaScript コード・スニペット

    client.Sign({
      State: state,
      Data: dataToSign
    }, (err, data={}) => {
      cb(err, data.Signature);
    });
    

SignUpdate

SignUpdate 関数は、複数部構成の署名操作を続行します。 この関数を呼び出す前に、まず SignInit を実行するようにしてください。

説明 EP11 m_SignUpdate (PKCS #11 C_SignUpdate の実装) にバインドされます。
パラメーター
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_SignUpdate の実装。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、SignInit からの出力です。

パラメーター
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        target_t ターゲット
    );
    
戻り値 C_SignUpdate の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_SignUpdate はマルチパート署名操作を続行し、別のデータ・パートを処理します。hSession はセッションのハンドル、pPart はデータ・パート、ulPartLen はデータ・パートの長さを指します。

署名操作を C_SignInit で初期化する必要があります。 この関数は、連続して何度でも呼び出せます。 C_SignUpdate を呼び出してエラーが発生すると、現在の署名操作が終了します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN。

コード・スニペット

  • Golang コード・スニペット

    // Use SignUpdate if you would like to breakup
    // the sign operation into multiple suboperations
    SignUpdateRequest1 := &pb.SignUpdateRequest {
        State: SignInitResponse.State,
        Data:  msgHash[:16],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest1)
    
    SignUpdateRequest2 := &pb.SignUpdateRequest {
        State: SignUpdateResponse.State,
        Data:  msgHash[16:],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest2)
    
  • JavaScript コード・スニペット

    client.SignUpdate({
      State: state,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

SignFinal

SignFinal 関数は、複数部構成の署名操作を終了します。

説明 EP11 m_SignFinal (PKCS #11 C_SignFinal の実装) にバインドされます。
パラメーター
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_SignFinal の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、SignInit および SignUpdate からの出力です。

パラメーター
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        target_t ターゲット
    );
    
戻り値 C_SignFinal の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_SignFinal はマルチパートの署名操作を終了し、署名を返します。hSession はセッションのハンドル、pSignature は署名を受け取るロケーション、pulSignatureLen は署名の長さを保持するロケーションを指します。

C_SignFinal は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

署名操作を C_SignInit で初期化する必要があります。 C_SignFinal を呼び出すと、必ず、アクティブな署名操作が終了します。ただし、呼び出しで CKR_BUFFER_TOO_SMALL が返された場合や、署名を保持するのに必要なバッファー長を確認するために呼び出して成功した場合 (つまり CKR_OK が返された場合) は別です。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN、CKR_FUNCTION_REJECTED

コード・スニペット

  • Golang コード・スニペット

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • JavaScript コード・スニペット

    client.SignFinal({
      State: state
    }, (err, response) => {
      callback(err, response);
    });
    

SignSingle

SignSingle 関数は、1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 この関数は状態をホストに返すことはなく、結果のみを返します。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能であり、SignInit 関数と Sign 関数を組み合わせたものです。 一連の呼び出しではなく、1 回の呼び出しで署名操作を実行できます。

説明 EP11 m_SignSingle にバインドします。
パラメーター
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

非標準の拡張機能であり、SignInitSign の組み合わせです。 1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 結果だけがホストに返され、状態は返されません。

これがお勧めする署名方法です。往復、暗号化、および復号を追加で行う必要がないからです。 機能的には、SignSingle は、SignInit の直後に Sign を実行するのと同じです。

(key, klen) の BLOB と pmech のメカニズムを一緒に SignInit に渡せなければなりません。

HMAC 署名および CMAC 署名の複数データ要求がサポートされます (サブ変数 2 および 3)。

SignInitSignVerifySingle も参照してください。

パラメーター
    CK_RV m_SignSingle (
        const unsigned char *privKey, size_t privKeylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        target_t ターゲット
    );
    
戻り値 C_Decrypt の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignSingleRequest := &pb.SignSingleRequest {
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:    msgHash[:],
    }
    
    SignSingleResponse, err := cryptoClient.SignSingle(context.Background(), SignSingleRequest)
    
  • JavaScript コード・スニペット

    client.SignSingle({
      Mech: {
        Mechanism: ep11.CKM_ECDSA
      },
      PrivKey: key,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

VerifyInit

VerifyInit 関数は、検証操作を初期化します。 署名を検証するには、まずこの関数を呼び出す必要があります。

説明 EP11 m_VerifyInit (PKCS #11 C_VerifyInit の実装) にバインドされます。
パラメーター
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_VerifyInit の実装。 鍵の BLOB (key, klen) を指定して、(state, slen) で検証セッションの状態を初期化します。 鍵の BLOB には、公開鍵オブジェクトまたは HMAC 鍵バイトを指定できます。 鍵の BLOB のタイプは pmech と整合していなければなりません。

公開鍵のメカニズムの場合は、(key, klen) に SPKI を指定する必要があります。 この SPKI の CKA_UNWRAP は、MAC 署名付きのもの (GenerateKeyPair で返されたものなど) でも、SPKI 自体 (証明書などの外部ソースから取得されたもの) でもかまいません。

HMAC 操作が初期化される場合は、Verify オブジェクトのセッション制限が HMAC 鍵から継承されます。 SPKI はセッションに結び付けられないので、公開鍵の Verify の状態にはセッションはありません。

keyklen の BLOB を PKCS #11 の hKey パラメーターからマップする必要があります。

: SignInit および VerifyInit は、 HMAC およびその他の symmetric/MAC メカニズムの場合も同じです。

パラメーター
    CK_RV m_VerifyInit (
        unsigned char * state、size_t * statelen、
        CK_MECHANISM_PTR mech,
        const unsigned char *pubKey, size_t pubKeylen,
        target_t ターゲット
    );
    
戻り値 C_VerifyInit の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_VerifyInit は検証操作を初期化しますが、署名はデータの付録です。hSession はセッションのハンドル、pMechanism は検査メカニズムを指定する構造、hKey は検査キーのハンドルを指します。

検証鍵の CKA_VERIFY 属性 (署名が付属しているデータの検証を鍵がサポートしているかどうかを示す属性) は、 CK_TRUE でなければなりません。

アプリケーションは C_VerifyInit を呼び出した後に、C_Verify を呼び出して 1 部構成のデータの署名を検証するか、C_VerifyUpdate を 1 回以上呼び出してから C_VerifyFinal を呼び出して複数部構成のデータの署名を検証することができます。 検証操作は、アプリケーションが C_Verify または C_VerifyFinal を呼び出すまでアクティブです。 (1 部構成または複数部構成の) データを追加で処理するには、アプリケーションはもう一度 C_VerifyInit を呼び出す必要があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDLE_INVALID、CKR_KEY_SIZE_RANGE、CKR_KEY_TYPE_INCONSISTENT、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN

コード・スニペット

  • Golang コード・スニペット

    VerifyInitRequest := &pb.VerifyInitRequest {
      Mech:   &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
      PubKey: GenerateKeyPairResponse.PubKeyBytes,
    }
    
    VerifyInitResponse, err := cryptoClient.VerifyInit(context.Background(), VerifyInitRequest)
    
  • JavaScript コード・スニペット

    client.VerifyInit({
      Mech: {
        Mechanism: ep11.CKM_SHA1_RSA_PKCS
      },
      PubKey: keys.PubKeyBytes
    }, (err, data={}) => {
      cb(err, signature, data.State);
    });
    

検証

Verify 関数は、1 部構成のデータの署名を検証します。 1 部構成の検証では、VerifyUpdateVerifyFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず VerifyInit を実行するようにしてください。

説明 EP11 m_Verify (PKCS #11 C_Verify の実装) にバインドされます。
パラメーター
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_Verify の実装。

(state, slen) は更新されません。

データと署名の相対順序が逆になります。 VerifySingleに送信されます。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、VerifyInit からの出力です。

パラメーター
    CK_RV m_Verify (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        target_t ターゲット
    );
    
戻り値 C_Verify の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_Verify は、シングルパート操作で署名を検証しますが、署名はデータの付録です。hSession はセッションのハンドル、pDATA はデータを指し、ulDataLen はデータの長さ、pSignature は署名、ulSignatureLen は署名の長さを指します。

検証操作を C_VerifyInit で初期化する必要があります。 C_Verify を呼び出すと、必ず、アクティブな検証操作が終了します。

C_Verify の呼び出しが成功すると、CKR_OK (指定された署名が有効であることを示す値) または CKR_SIGNATURE_INVALID (指定された署名が無効であることを示す値) が返される必要があります。 長さだけが理由で署名が無効な場合は、CKR_SIGNATURE_LEN_RANGE が返される必要があります。 どの場合も、アクティブな署名操作は終了します。

複数部構成の操作を終了するために C_Verify を使用することはできません。この関数は、C_VerifyInit の後に、C_VerifyUpdate の呼び出しを挟まずに呼び出す必要があります。

ほとんどのメカニズムでは、C_Verify は、一連の C_VerifyUpdate 操作の後に C_VerifyFinal を実行するのと同じです。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_Verify)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_INVALID、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SIGNATURE_INVALID、CKR_SIGNATURE_LEN_RANGE

コード・スニペット

  • Golang コード・スニペット

    VerifyRequest := &pb.VerifyRequest {
        State:     VerifyInitResponse.State,
        Data:      msgHash[:],
        Signature: SignResponse.Signature,
    }
    
    VerifyResponse, err := cryptoClient.Verify(context.Background(), VerifyRequest)
    
  • JavaScript コード・スニペット

    client.Verify({
      State: state,
      Data: dataToSign,
      Signature: signature
    }, (err, data={}) => {
      cb(err, signature);
    });
    

VerifyUpdate

VerifyUpdate 関数は、複数部構成の検証操作を続行します。 この関数を呼び出す前に、まず VerifyInit を実行するようにしてください。

説明 EP11 m_VerifyUpdate (PKCS #11 C_VerifyUpdate の実装) にバインドされます。
パラメーター
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_VerifyUpdate の実装。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、VerifyInit からの出力です。

パラメーター
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        target_t ターゲット
    );
    
戻り値 C_VerifyUpdate の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_VerifyUpdate はマルチパートの検査操作を続行し、別のデータ・パートを処理します。hSession はセッションのハンドル、pPart はデータ・パート、ulPartLen はデータ・パートの長さを指します。

検証操作を C_VerifyInit で初期化する必要があります。 この関数は、連続して何度でも呼び出せます。 C_VerifyUpdate を呼び出してエラーが発生すると、現在の検査操作は終了します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    // Use VerifyUpdate if you would like to breakup
    // the verify operation into multiple suboperations
    VerifyUpdateRequest1 := &pb.VerifyUpdateRequest {
      State: VerifyInitResponse.State,
      Data:  msgHash[:16],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest1)
    
    VerifyUpdateRequest2 := &pb.VerifyUpdateRequest {
      State: VerifyUpdateResponse.State,
      Data:  msgHash[16:],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest2)
    
  • JavaScript コード・スニペット

    client.VerifyUpdate({
      State: state,
      Data: digest
    }, (err, response) => {
      callback(err, response);
    });
    

VerifyFinal

VerifyFinal 関数は、複数部構成の検証操作を終了します。

説明 EP11 m_VerifyFinal (PKCS #11 C_VerifyFinal の実装) にバインドされます。
パラメーター
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_VerifyFinal の実装。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、VerifyInit および VerifyUpdate からの出力です。

パラメーター
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        target_t ターゲット
    );
    
戻り値 C_VerifyFinal の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_VerifyFinal は署名を検査して、マルチパート検査操作を終了します。hSession はセッションのハンドル、pSignature は署名、ulSignatureLen は署名の長さを指します。

検証操作を C_VerifyInit で初期化する必要があります。 C_VerifyFinal を呼び出すと、必ず、アクティブな検証操作が終了します。

C_VerifyFinal の呼び出しが成功すると、CKR_OK (指定された署名が有効であることを示す値) または CKR_SIGNATURE_INVALID (指定された署名が無効であることを示す値) が返される必要があります。 長さが理由で署名が無効な場合は、CKR_SIGNATURE_LEN_RANGE が返される必要があります。 どの場合も、アクティブな検証操作は終了します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_SIGNATURE_INVALID、CKR_SIGNATURE_LEN_RANGE

コード・スニペット

  • Golang コード・スニペット

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • JavaScript コード・スニペット

    client.VerifyFinal({
      State: state,
      Signature: signature
    }, (err, response) => {
      callback(err, response);
    });
    

VerifySingle

VerifySingle 関数は、1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 この関数は状態をホストに返すことはなく、検証結果のみを返します。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能であり、VerifyInit 関数と Verify 関数を組み合わせたものです。 一連の呼び出しではなく、1 回の呼び出しで検証操作を実行できます。

説明 EP11 m_VerifySingle にバインドします。
パラメーター
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

非標準の拡張機能であり、VerifyInitVerify の組み合わせです。 1 回の呼び出しで一度にデータに署名または MAC 署名を付けます。中間のダイジェスト状態は作成されません。 検証結果だけがホストに返され、状態は返されません。 この関数はブール値を返すので、サイズの照会はできません。

これがお勧めする署名の検証方法です。往復、暗号化、および復号を追加で行う必要がないからです。 機能的には、VerifySingle は、VerifyInit の直後に Verify を実行するのと同じです。

(key, klen) の BLOB と pmech のメカニズムを一緒に VerifyInit に渡せなければなりません。

公開鍵のメカニズムの場合は、(key, klen) に SPKI を指定する必要があります。 この SPKI は、MAC 署名付きのもの (GenerateKeyPair で公開鍵として返されたものなど) でも、SPKI 自体 (証明書などの外部ソースから取得されたもの) でもかまいません。

VerifyInitVerifySignSingle も参照してください。

パラメーター
    CK_RV m_VerifySingle (
        const unsigned char *pubKey, size_t pubKeylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        target_t ターゲット
    );
    
戻り値 C_VerifySingle の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    VerifySingleRequest := &pb.VerifySingleRequest {
        PubKey:    GenerateKeyPairResponse.PubKeyByytes,
        Mech:      &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:      msgHash[:],
        Signature: SignSingleResponse.Signature,
    }
    
    VerifySingleResponse, err := cryptoClient.VerifySingle(context.Background(), VerifySingleRequest)
    
  • JavaScript コード・スニペット

    client.VerifySingle({
      Mech: {
        Mechanism: ep11.CKM_SHA256_RSA_PKCS
      },
      PubKey: keys.PubKey,
      Data: digest,
      Signature: signature
    }, (err, response) => {
      callback(err, response);
    });
    

メッセージ・ダイジェストを使用したデータの完全性の保護

GREP11 には、データの完全性を保護するために設計されたメッセージ・ダイジェストを生成するための一連の関数が用意されています。 1 回のダイジェスト生成操作を行うために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータのダイジェスト生成操作は、DigestInitDigestUpdate、および DigestFinal のサブ操作で構成されます。

DigestInit

DigestInit 関数は、メッセージ・ダイジェスト生成操作を初期化します。 ダイジェスト生成操作を実行するには、まずこの関数を実行する必要があります。

説明 EP11 m_DigestInit (PKCS #11 C_DigestInit の実装) にバインドされます。
パラメーター
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DigestInit の実装。

ラップされたダイジェスト状態を作成します。

: サイズの照会がサポートされます。ただし、ほとんどのサイズの照会では実際の出力ではなく出力のサイズが返されるのに対し、この関数では、常に、ラップされた状態がバックエンドから返されます。 Digest の状態は小さいので、転送のオーバーヘッドが問題になることはありません。

サイズの照会では、単に、戻された状態をホストが破棄して BLOB のサイズ (len) を報告します。 BLOB が戻されるときに、戻されるサイズと len が比較されます。

statelen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります (ホスト・ライブラリーで BLOB をセッションに結び付けなければなりません)。

パラメーター
    CK_RV m_DigestInit (
        unsigned char * state、size_t * len、
        const CK_MECHANISM_PTR mech,
        target_t ターゲット
    );
    
戻り値 C_DigestInit の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DigestInit は、メッセージ・ダイジェスト生成操作を初期化します。hSession はセッションのハンドル、pMechanism はダイジェスト・メカニズムを指します。

アプリケーションは C_DigestInit を呼び出した後に、C_Digest を呼び出して 1 部構成のデータのダイジェストを生成するか、C_DigestUpdate をゼロ回以上呼び出してから C_DigestFinal を呼び出して複数部構成のデータのダイジェストを生成することができます。 メッセージ・ダイジェスト生成操作は、アプリケーションが C_Digest または C_DigestFinal の呼び出しを使用してメッセージ・ダイジェストを取得するまでアクティブになります。 (1 部構成または複数部構成の) データを追加で処理するには、アプリケーションはもう一度 1C_DigestInit1 を呼び出す必要があります。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_MECHANISM_INVALID、CKR_MECHANISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN。

コード・スニペット

  • Golang コード・スニペット

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • JavaScript コード・スニペット

    client.DigestInit({
      Mech: {
        Mechanism: ep11.CKM_SHA256
      }
    }, (err, response) => {
      callback(err, response);
    });
    

ダイジェスト

Digest 関数は、1 部構成のデータのダイジェストを生成します。 1 部構成のデータのダイジェスト生成操作では、DigestUpdate 関数および DigestFinal 関数を呼び出す必要はありません。 この関数を呼び出す前に、まず DigestInit を実行するようにしてください。 パラメーターを設定するときには、入力データの長さをゼロに指定しないでください。また、入力データの場所を指すポインターを NULL に指定しないでください。

説明 EP11 m_Digest (PKCS #11 C_Digest の実装) にバインドされます。
パラメーター
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_Digest の実装。

ダイジェスト・オブジェクトの作成後に、ゼロ・バイト転送の任意の組み合わせで、ちょうど 0 (ゼロ) バイトがそのオブジェクトの末尾に追加された場合でも、ワン・パス・ダイジェストを実行できますが、厳格な実装ではそのオブジェクトは拒否される必要があります。

(state, slen) は更新されません。

実装は以下を実行できます DigestUpdateDigestFinal、またはホスト・コード内の平文ダイジェスト・オブジェクトに対する Digest 呼び出し (HSM バックエンド全体をバイパスする)。 この選択はホスト・コードで認識してもしなくてもかまいません。操作のセキュリティーには影響しません (平文オブジェクトでは機密データのダイジェストを生成できないからです)。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 state の BLOB は、DigestInit からの出力です。

パラメーター
    CK_RV m_Digest (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        target_t ターゲット
    );
    
戻り値 C_Digest の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_Digest は、データをシングル・パートにダイジェスト化します。hSession はセッションのハンドル、pData はデータ、ulDataLen はデータの長さ、pDigest はメッセージ・ダイジェストを受け取るロケーション、pulDigestLen はメッセージ・ダイジェストの長さを保持するロケーションを指します。

C_Digest は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

ダイジェスト生成操作を C_DigestInit で初期化する必要があります。 C_Digest を呼び出すと、必ず、アクティブなダイジェスト生成操作が終了されます。ただし、呼び出しで CKR_BUFFER_TOO_SMALL が返された場合、およびメッセージ・ダイジェストを保持するのに必要なバッファー長を確認するために呼び出して成功した場合 (つまり CKR_OK が返された場合) は別です。

複数部構成の操作を終了するために C_Digest を使用することはできません。この関数は、C_DigestInit の後に、C_DigestUpdate の呼び出しを挟まずに呼び出す必要があります。

入力データとダイジェスト出力を同じ場所に配置できます。つまり、pData と pDigest が同じ場所を指していてもかまいません。

C_Digest は、一連の C_DigestUpdate 操作の後に C_DigestFinal を実行するのと同じです。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_Digest)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    digestData := []byte("Create a digest for this string")
    DigestRequest := &pb.DigestRequest {
        State: DigestInitResponse.State,
        Data:  digestData,
    }
    
    DigestResponse, err := cryptoClient.Digest(context.Background(), DigestRequest)
    
  • JavaScript コード・スニペット

    client.Digest({
        State: state,
        Data: Buffer.from(digestData)
      }, (err, data={}) => {
        cb(err, data.Digest);
      });
    }
    

DigestUpdate

DigestUpdate 関数は、複数部構成のダイジェスト生成操作を続行します。 この関数を呼び出す前に、まず DigestInit を実行するようにしてください。 パラメーターを設定するときには、入力データの長さをゼロに指定しないでください。また、入力データの場所を指すポインターを NULL に指定しないでください。

説明 EP11 m_DigestUpdate (PKCS #11 C_DigestUpdate の実装) にバインドされます。
パラメーター
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DigestUpdate の実装。

DigestUpdate はポリモアフィックです。 ラップされたダイジェスト・オブジェクトまたはクリアされたダイジェスト・オブジェクトの両方を受け入れ、同じ形式で状態を更新します。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。 (ホスト・ライブラリーで、保存されている状態にセッションをマップしなければなりません)。

state の BLOB は、DigestInitDigestUpdateDigestKey からの出力です。

DigestInit も参照してください。

パラメーター
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        target_t ターゲット
    );
    
戻り値 C_DigestUpdate の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DigestUpdate はマルチパートのメッセージ・ダイジェスト生成操作を続行し、別のデータ・パートを処理します。hSession はセッションのハンドル、pPart はデータ・パート、ulPartLen はデータ・パートの長さを指します。

メッセージ・ダイジェスト生成操作を C_DigestInit で初期化する必要があります。 この関数と C_DigestKey の呼び出しは、任意の順序で何度でも繰り返せます。 C_DigestUpdate を呼び出してエラーが発生すると、現在のダイジェスト生成操作が終了します。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pPart,
        CK_ULONG ulPartLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    // Use DigestUpdate if you would like to breakup
    // the digest operation into multiple suboperations
    DigestUpdateRequest1 := &pb.DigestUpdateRequest {
        State: DigestInitResponse.State,
        Data:  digestData[:16],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest1)
    
    DigestUpdateRequest2 := &pb.DigestUpdateRequest {
        State: DigestUpdateResponse.State,
        Data:  digestData[16:],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest2)
    
  • JavaScript コード・スニペット

    client.DigestUpdate({
      State: state,
      Data: Buffer.from(digestData.substr(0, 64))
    }, (err, data={}) => {
      cb(err, data.State);
    });
    

DigestFinal

DigestFinal 関数は、複数部構成のダイジェスト生成操作を終了します。

説明 EP11 m_DigestFinal (PKCS #11 C_DigestFinal の実装) にバインドされます。
パラメーター
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

PKCS #11 C_DigestFinal の実装。

DigestFinal は多様な性質を持つ関数です。ラップされたダイジェスト・オブジェクトと平文のダイジェスト・オブジェクトの両方を受け入れます。

(state, slen) は更新されません。

stateslen の BLOB を PKCS #11 の hSession パラメーターからマップする必要があります。

state の BLOB は、DigestInitDigestUpdateDigestKey からの出力です。

パラメーター
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        target_t ターゲット
    );
    
戻り値 C_DigestFinal の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。
説明

C_DigestFinal はマルチパートのメッセージ・ダイジェスト生成操作を終了し、メッセージ・ダイジェストを返します。hSession はセッションのハンドル、pDigest はメッセージ・ダイジェストを受け取るロケーション、pulDigestLen はメッセージ・ダイジェストの長さを保持するロケーションを指します。

C_DigestFinal は、PKCS #11 API 仕様のセクション 5.2 で説明されている出力の生成に関する規則を使用します。

ダイジェスト生成操作を C_DigestInit で初期化する必要があります。 C_DigestFinal を呼び出すと、必ず、アクティブなダイジェスト生成操作が終了されます。ただし、呼び出しで CKR_BUFFER_TOO_SMALL が返された場合、およびメッセージ・ダイジェストを保持するのに必要なバッファー長を確認するために呼び出して成功した場合 (つまり CKR_OK が返された場合) は別です。

パラメーター
    CK_DEFINE_FUNCTION(CK_RV, C_DigestFinal)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
戻り値 CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID

コード・スニペット

  • Golang コード・スニペット

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • JavaScript コード・スニペット

    client.DigestFinal({
      State: state
    }, (err, response) => {
      callback(err, response);
    });
    

DigestSingle

DigestSingle 関数は、1 回の呼び出しで一度にデータのダイジェストを生成します。中間のダイジェスト状態を作成することも、不要な往復を行うこともありません。 この関数は、標準 PKCS #11 の仕様に対する IBM EP11 の拡張機能であり、DigestInit 関数と Digest 関数を組み合わせたものです。 一連の呼び出しではなく、1 回の呼び出しでダイジェスト生成操作を実行できます。

説明 EP11 m_DigestSingle にバインドします。
パラメーター
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
戻り値 EP11 エラーがメッセージ Grep11Error にラップされます。
説明

非標準の拡張機能であり、DigestInitDigest の組み合わせです。 1 回の呼び出しで一度にデータのダイジェストを生成します。中間のダイジェスト状態を作成することも、不要な往復を行うこともありません。

XCP 対応アプリケーションで平文のダイジェストを生成するには、この方法をお勧めします。 機能的には、DigestSingle は、DigestInit の直後に Digest を実行するのと同じです。

この関数は鍵の BLOB を処理しないので、鍵のダイジェストを生成する場合は、DigestInitDigestKey を使用する必要があります

ダイジェスト結果だけがホストに返され、状態は返されません。 すべて PKCS #11 呼び出しから直接使用するため、PKCS #11 以外のパラメーターはありません。

パラメーター
    CK_RV m_DigestSingle (
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        target_t ターゲット
    );
    
戻り値 C_DigestSingle の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書リターン値の章を参照してください。

コード・スニペット

  • Golang コード・スニペット

    digestData := []byte("Create a digest for this string")
    DigestSingleRequest := &pb.DigestSingleRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
        Data: digestData,
    }
    
    DigestSingleResponse, err := cryptoClient.DigestSingle(context.Background(), DigestSingleRequest)
    
  • JavaScript コード・スニペット

    client.DigestSingle({
      Mech: {
        Mechanism: ep11.CKM_SHA256
      },
      Data: Buffer.from(digestData)
    }, (err, response) => {
      callback(err, response);
    });
    

コード例

GREP11 API は、 gRPC ライブラリーを使用するプログラミング言語をサポートします。 GREP11 API をテストするために次の 2 つのサンプル GitHub リポジトリーが用意されています。