暗号操作: 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 で実装されています。 それ以外の関数は実装されていません。
| 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 関数の分類の関係を示しています。
| 関数グループ | サポート対象メカニズム |
|---|---|
| 暗号化と復号 | 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: このメカニズムは、EncryptUpdate、DecryptUpdate、DigestUpdate などの Update GREP11 関数を使用できないシングルパートの操作のみをサポートします。
2: このメカニズムは、GREP11 SignSingle および VerifySingle 操作でのみ使用可能です。
3: このメカニズムは、IBM 4768 暗号カードではサポートされておらず、SignUpdateおよびVerifyUpdateの操作には使用できません。
4: このメカニズムは、1 部構成 (SignInit、 Sign、 VerifyInit、 Verify)、 SignSingle、および VerifySingle の各操作をサポートします。
サポートされる属性と鍵タイプ
GREP11 の属性で定義するオブジェクトの特性によって、オブジェクトの使用方法とアクセス方法がセットアップされます。 以下の表に、サポートされている属性と、サポートされているさまざまな鍵タイプの関係を示します。
| 属性 | 説明 | サポート対象キー・タイプ |
|---|---|---|
| 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 を取得できます。
| GREP11 メカニズム | サポートされる曲線タイプ | サポートされる曲線名 |
|---|---|---|
| CKM_EC_KEY_PAIR_GEN | 米国連邦情報・技術局(NIST)曲線 |
|
| CKM_EC_KEY_PAIR_GEN | 通常の脳プール(BP)曲線 |
|
| CKM_EC_KEY_PAIR_GEN | ツイステッド・ブレイン・プール(BP)曲線 |
|
| CKM_EC_KEY_PAIR_GEN | Standards for Efficient Cryptography(SEC)曲線 |
|
| CKM_EC_KEY_PAIR_GEN | エドワーズ曲線 |
|
デジタル資産を暗号化して署名を生成するためにサポートされる曲線
デジタル資産およびデジタル署名に関連するメカニズムでは、以下の曲線がサポートされます。
| 標準およびスキーム | GREP11 メカニズム | サポートされる曲線タイプ | サポートされる曲線名 |
|---|---|---|---|
| BIP32/BIP44 | CKM_IBM_BTC_DERIVE | Standards for Efficient Cryptography(SEC)曲線 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | 米国連邦情報・技術局(NIST)曲線 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | Standards for Efficient Cryptography(SEC)曲線 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | エドワーズ曲線 |
|
| EdDSA | CKM_IBM_ED25519_SHA512 | エドワーズ曲線 |
|
| Schnorr | その他の CKM_IBM_ECDSA_OTHER | Standards for Efficient Cryptography(SEC)曲線 |
|
| Schnorr | その他の CKM_IBM_ECDSA_OTHER | 米国連邦情報・技術局(NIST)曲線 |
|
| Schnorr | その他の CKM_IBM_ECDSA_OTHER | 通常の脳プール(BP)曲線 |
|
| Schnorr | その他の CKM_IBM_ECDSA_OTHER | ツイステッド・ブレイン・プール(BP)曲線 |
|
| Schnorr | ECSG_IBM_ECSDSA_S256 |
|
|
| シュノル = ジリカ | ECSG_IBM_ECSDSA_COMPR_MULTI |
|
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
アプリケーションで
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
|
|---|---|
| パラメーター |
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 TDES 鍵が生成され、適切なパリティーも生成されますが、このパリティーはホストからは見えません。 しかし、このパリティーは適切な相互運用性を確保するために必要です。他の PKCS #11 実装では、パリティーの問題がある DES 鍵を拒否する必要があります。 オブジェクトをセッションに結び付ける場合は、そのセッションへの
DSA と DH のパラメーター生成では、 DSA と DH のパラメーター (
PKCS #11 の |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
生成メカニズムがドメイン・パラメーター生成用である場合は、 生成する鍵またはドメイン・パラメーターのタイプは生成メカニズムに暗黙的に定義されているので、テンプレートで鍵のタイプを指定する必要はありません。 生成メカニズムと矛盾するキー・タイプが指定されている場合は、 指定された正確なテンプレートに対応していない場合、
|
|---|---|
| パラメーター |
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 鍵ペアのパラメーターは、 FIPS モードでは、1024+256 パブリック・キーは、ほとんどのライブラリーで読み取り可能な標準 SPKI (サブジェクト・パブリック・キー情報) としてフォーマットされます。 さらに、SPKI 自体に含まれていない転送鍵固有の MAC によって整合性が確保されます。 DSA パラメーター生成では、非 SPKI 構造が公開鍵フィールドに返されます。 オブジェクトをセッションに結び付ける場合は、そのセッションへの ラップされた秘密鍵が 以下のサポートされているパラメーターの組み合わせと特別な注意点は、PKCS #11 の文書に記載されていないものです。 RSA 鍵は 17 (0x11) より小さい公開鍵指数を拒否します。 制御点によって、有効な最小値がさらに制限される場合もあります。 Fermat4 指数 0x10001 は、FIPS 186-3 (セクション B.3.1) の公開指数制限に合致する特定の制御点によって制御されます。 EC 鍵 ( DSA 鍵 ( DH 鍵 ( 標準的な方法でセッションを使用する代わりにセッション (ログイン) の状態を使用できます。 マッピングはライブラリーの有効範囲外になります。
PKCS #11 の PKCS #11 の PKCS #11 の |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
生成する鍵のタイプは鍵ペア生成メカニズムに暗黙的に定義されているので、テンプレートで鍵のタイプを指定する必要はありません。 いずれかのテンプレートがキー生成メカニズムと矛盾するキー・タイプを提供している場合は、 指定された正確なテンプレートに対応していない場合、
|
|---|---|
| パラメーター |
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
PKCS #11 の PKCS #11 の |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
基本鍵の 指定された正確なテンプレートに対応していない場合、
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
ラッピング鍵の
どのタイプの鍵をどのメカニズムでラップできるかは、トークンによって異なります。 ラッピング・キーをパーティション化して、抽出可能なキーのサブセットのみをラップできるようにするには、ラッピング・キーで属性 |
|---|---|
| パラメーター |
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
生成されたオブジェクトは、BLOB として SPKI を MAC 署名付き SPKI に変換する場合は、アンラップ・メカニズムとして CKM_IBM_TRANSPORTKEY を使用する必要があります。 このモードでは、ラップしたデータとして未加工の SPKI を指定します。KEK は無視されます。
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
アンラッピング鍵の 新しい鍵では、 変更や変更の試行ができるメカニズムもあります。 キーがアンラップされると同時に、 指定された正確なテンプレートに対応していない場合、
キーのサブセットのみをアンラップできるようにアンラッピング・キーをパーティション化するには、アンラッピング・キーで属性 |
|---|---|
| パラメーター |
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 (BLOB に含まれている) セッションに対応していない、またはセッションを必要としないので 、 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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
テンプレート内のトリプル (
要求されたいずれかの属性がケース 1 に該当する場合は、呼び出しで値 値が配列 ( エラー・コード |
|---|---|
| パラメーター |
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 属性パッキング: _GetAttrValue を参照してください。 現在のところ Ep11 では、送信されるのはブール属性だけで、他のすべての属性はホストによって処理されます (WRAP_TEMPLATE などの配列は変更されません)。 (BLOB に含まれている) セッションに対応していない、またはセッションを必要としないので、PKCS #11 の |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
変更できないオブジェクトもあります。 そのようなオブジェクトに対して 読み取り専用セッションで変更できるのはセッション・オブジェクトだけです。 テンプレートでは、変更可能なオブジェクトの任意の属性の新しい値を指定できます。 オブジェクトの他の既存の属性と互換性のない属性の値がテンプレートに指定されている場合は、呼び出しは失敗し、リターン・コード すべての属性を変更できるわけではありません。詳細については、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
適切な機能がホストで有効になっていれば、バックエンドに送ることなくホスト・ライブラリーで乱数を生成できます。 現在の実装ではこれは実行されません。 この関数はサイズの照会をサポートしていません。 |
|---|---|
| パラメーター |
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); });
データの暗号化と復号
暗号メカニズムを指定して、対称または非対称の暗号化関数または復号関数を実行できます。 データを暗号化または復号するために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータの暗号化操作は、EncryptInit、EncryptUpdate、および 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
公開鍵のメカニズムの場合は、 秘密鍵メカニズムの場合、Encrypt の状態は、
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
暗号鍵の アプリケーションは |
|---|---|
| パラメーター |
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 部構成の暗号化では、EncryptUpdate と EncryptFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず 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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
暗号化操作を 複数部構成の操作を終了するために 一部の暗号化メカニズムでは、入力プレーン・テキスト・データに一定の長さの制約があります (メカニズムは比較的短いプレーン・テキストのみを暗号化できるため、またはメカニズムの入力データは整数のブロック数で構成される必要があるため)。 この制約を満たしていないと、 プレーン・テキストと暗号化テキストは同じ場所に置くことができます。つまり、 ほとんどのメカニズムでは、 |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
暗号化操作を
|
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
暗号化操作を 一部のマルチパート暗号化メカニズムでは、入力プレーン・テキスト・データに一定の長さの制約があります。これは、メカニズムの入力データが整数のブロック数で構成されている必要があるためです。 この制約を満たしていないと、 |
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
XCP 対応アプリケーションには、データを一度に暗号化するこの方法をお勧めします。 機能的には、これは バックエンドが常駐鍵をサポートしている場合は、この鍵を常駐鍵のハンドルとして使用することも可能です。
|
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
元のキーを使用してデータを復号し、クラウド 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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
復号鍵の アプリケーションが |
|---|---|
| パラメーター |
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 部構成の復号では、DecryptUpdate と DecryptFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず 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 state、slen のバイナリー・ラージ・オブジェクト (BLOB) を PKCS #11 の |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
復号操作を 複数部構成の操作を終了するために 暗号化テキストとプレーン・テキストは同じ場所に置くことができます。つまり、 pEncryptedData と pData が同じ場所を指している場合にも許容されます。 入力の暗号データの長さが適切でないために復号できない場合は、 |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
復号操作を 暗号化テキストとプレーン・テキストは同じ場所に置くことができます。つまり、 |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
復号操作を 入力の暗号データの長さが適切でないために復号できない場合は、 |
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
XCP 対応アプリケーションには、データを一度に暗号化するこの方法をお勧めします。 機能的には、これは バックエンドが常駐鍵をサポートしている場合は、この鍵を常駐鍵のハンドルとして使用することも可能です。
|
|---|---|
| パラメーター |
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 回の署名操作を実行するために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータの署名操作は、SignInit、SignUpdate、および 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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
署名鍵の アプリケーションは |
|---|---|
| パラメーター |
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 部構成の署名では、SignUpdate と SignFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず 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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
署名操作を 複数部構成の操作を終了するために ほとんどのメカニズムでは、 |
|---|---|
| パラメーター |
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 の実装。
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
署名操作を |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
署名操作を |
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
非標準の拡張機能であり、 これがお勧めする署名方法です。往復、暗号化、および復号を追加で行う必要がないからです。 機能的には、
HMAC 署名および CMAC 署名の複数データ要求がサポートされます (サブ変数 2 および 3)。
|
|---|---|
| パラメーター |
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 公開鍵のメカニズムの場合は、 HMAC 操作が初期化される場合は、
注: |
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
検証鍵の アプリケーションは |
|---|---|
| パラメーター |
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 部構成の検証では、VerifyUpdate と VerifyFinal のサブ操作を実行する必要はありません。 この関数を呼び出す前に、まず 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
データと署名の相対順序が逆になります。
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
検証操作を
複数部構成の操作を終了するために ほとんどのメカニズムでは、 |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
検証操作を |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
検証操作を
|
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
非標準の拡張機能であり、 これがお勧めする署名の検証方法です。往復、暗号化、および復号を追加で行う必要がないからです。 機能的には、
公開鍵のメカニズムの場合は、
|
|---|---|
| パラメーター |
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 回のダイジェスト生成操作を行うために、一連のサブ関数を呼び出す必要がある場合があります。 例えば、複数部構成のデータのダイジェスト生成操作は、DigestInit、DigestUpdate、および DigestFinal のサブ操作で構成されます。
DigestInit
DigestInit 関数は、メッセージ・ダイジェスト生成操作を初期化します。 ダイジェスト生成操作を実行するには、まずこの関数を実行する必要があります。
| 説明 | EP11 m_DigestInit (PKCS #11 C_DigestInit の実装) にバインドされます。 |
|
|---|---|---|
| パラメーター |
message DigestInitRequest {
Mechanism Mech = 2;
}
message DigestInitResponse {
bytes State = 1;
}
|
|
| 戻り値 | EP11 エラーがメッセージ Grep11Error にラップされます。 |
| 説明 |
PKCS #11 ラップされたダイジェスト状態を作成します。 注: サイズの照会がサポートされます。ただし、ほとんどのサイズの照会では実際の出力ではなく出力のサイズが返されるのに対し、この関数では、常に、ラップされた状態がバックエンドから返されます。 サイズの照会では、単に、戻された状態をホストが破棄して BLOB のサイズ (
|
|---|---|
| パラメーター |
CK_RV m_DigestInit (
unsigned char * state、size_t * len、
const CK_MECHANISM_PTR mech,
target_t ターゲット
);
|
| 戻り値 | C_DigestInit の戻り値のサブセット。 詳細については、Enterprise PKCS #11 (EP11) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
アプリケーションは |
|---|---|
| パラメーター |
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 ダイジェスト・オブジェクトの作成後に、ゼロ・バイト転送の任意の組み合わせで、ちょうど 0 (ゼロ) バイトがそのオブジェクトの末尾に追加された場合でも、ワン・パス・ダイジェストを実行できますが、厳格な実装ではそのオブジェクトは拒否される必要があります。
実装は以下を実行できます
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
ダイジェスト生成操作を 複数部構成の操作を終了するために 入力データとダイジェスト出力を同じ場所に配置できます。つまり、pData と pDigest が同じ場所を指していてもかまいません。
|
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
メッセージ・ダイジェスト生成操作を |
|---|---|
| パラメーター |
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
|
|---|---|
| パラメーター |
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) ライブラリー構造文書のリターン値の章を参照してください。 |
| 説明 |
ダイジェスト生成操作を |
|---|---|
| パラメーター |
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 にラップされます。 |
| 説明 |
非標準の拡張機能であり、 XCP 対応アプリケーションで平文のダイジェストを生成するには、この方法をお勧めします。 機能的には、 この関数は鍵の BLOB を処理しないので、鍵のダイジェストを生成する場合は、 ダイジェスト結果だけがホストに返され、状態は返されません。 すべて 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 リポジトリーが用意されています。