加密作業: 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. 中執行的加密法函數。 您可以使用企業 PKCS #11 (EP11) 透過 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 欄位的列舉類型 (列舉) 值。
  • 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 值。 此欄位包含 PKCS #11 規格 所定義的錯誤碼,或 EP11所定義的供應商延伸。 EP11 僅使用 PKCS #11 所定義的一部分回覆值。 如需相關資訊,請參閱 Enterprise PKCS #11 程式庫結構 中的 10.1.6 回覆值 一節。

提供 Golang 中處理錯誤的 範例

GREP11 函數清單

表格中以星號 (*) 標示的 PKCS #11 函數由 EP11 透過 gRPC實作。 未實作其他函數。

表 1. 說明 EP11 中透過 gRPC 實作的函數
PKCS #11 企業 PKCS #11 透過 gRPC 的企業 PKCS #11 說明
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 Encrypt 加密單一部分資料。
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate 繼續多部分加密作業。
C_EncryptFinal* m_EncryptFinal EncryptFinal 完成多部分加密作業。
N/A m_EncryptSingle EncryptSingle IBM 延伸,Encrypt 的非標準變式。 一次處理資料,使用一次呼叫。 不會傳回任何狀態給主機,但已加密資料除外。
N/A m_ReencryptSingle ReencryptSingle IBM 延伸,Encrypt 的非標準變式。 在雲端 HSM 內單一呼叫中,使用原始金鑰來解密資料,並使用不同的金鑰來加密原始資料。 不會將重新加密資料以外的任何狀態傳回至主機。
C_DecryptInit* m_DecryptInit DecryptInit 起始設定解密作業。
C_Decrypt* m_Decrypt Decrypt 解密單一部分加密資料。
C_DecryptUpdate* m_DecryptUpdate DecryptUpdate 繼續多部分解密作業。
C_DecryptFinal* m_DecryptFinal DecryptFinal 完成多部分解密作業。
N/A m_DecryptSingle DecryptSingle IBM 延伸,Decrypt 的非標準變式。 一次處理資料,使用一次呼叫。 不會傳回任何狀態給主機,但已解密資料除外。
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 的組合。 一次取得資料摘要,使用一次呼叫,而不建構中間摘要狀態,避免不必要的往返
C_SignInit* m_SignInit SignInit 起始設定簽章作業。
C_Sign* m_Sign 簽章 簽署單一部分資料。
C_SignUpdate* m_SignUpdate SignUpdate 繼續多部分簽章作業。
C_SignFinal* m_SignFinal SignFinal 完成多部分簽章作業。
C_SignRecoverInit N/A N/A 起始設定簽章作業,其中會從簽章回復資料。
C_SignRecover N/A N/A 簽署單一部分資料,其中會從簽章回復資料。
N/A m_SignSingle SignSingle IBM 延伸,非標準延伸,SignInit 和 Sign 的組合。 一次簽署資料或對其執行 MAC,使用一次呼叫,且不建構中間的摘要狀態。 不會傳回任何狀態給主機,但結果除外。
C_VerifyInit* m_VerifyInit VerifyInit 起始設定驗證作業。
C_Verify* m_Verify 驗證 驗證單一部分資料上的簽章。
C_VerifyUpdate* m_VerifyUpdate VerifyUpdate 繼續多部分驗證作業。
C_VerifyFinal* m_VerifyFinal VerifyFinal 完成多部分驗證作業。
C_VerifyRecoverInit N/A N/A 起始設定驗證作業,其中可以從簽章回復資料。
C_VerifyRecover N/A N/A 驗證單一部分資料上的簽章,其中可以從簽章回復資料。
N/A m_VerifySingle VerifySingle IBM 延伸,非標準延伸,VerifyInit 與 Verify 的組合。 一次簽署資料或對其執行 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。 可要求的隨機資料長度上限為 1 百萬位元組。
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_XX_ENCODE_CASE_ONE other2,CKM_IBM_DIILITHIUM3
摘要 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: 此機制僅支援無法使用任何 Update GREP11 函數 (例如 EncryptUpdateDecryptUpdateDigestUpdate) 的單一部分作業。

2: 此機制僅適用於 GREP11 SignSingleVerifySingle 作業。

3: IBM 4768 加密卡不支援此機制,且無法用於 SignUpdateVerifyUpdate 作業。

4: 此機制支援單一組件 (SignInitSignVerifyInitVerify)、SignSingleVerifySingle 作業。

支援的屬性及索引鍵類型

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_EXTRACTTABLE 如果金鑰可擷取且可以包裝,則為 CK_TRUE。 EC 私密金鑰,RSA 私密金鑰,DH 私密金鑰,DSA 私密金鑰,AES 金鑰,DES 金鑰,通用金鑰
CKA_IBM_PQC_PARAMS 支援量子後加密法機制的參數。 在 Dilithium 機制 CKM_IBM_DILITHIUM 的情況下,它會提供一個配置物件 ID (OID),代表要使用的 Dilithium 演算法強度。 目前僅支援 Dilithium 4 第 2 輪 的強度。 Dilithium 金鑰
CKA_KEY_TYPE 金鑰的類型。 EC 私密金鑰,EC 公開金鑰,RSA 私密金鑰,RSA 公開金鑰,DH 私密金鑰,DH 公開金鑰,DSA 私密金鑰,DSA 公開金鑰,AES 金鑰,DES 金鑰,通用金鑰
本端 CKA_LOCAL 只有在使用 C_GenerateKeyC_GenerateKeyPair 呼叫在本端產生金鑰 (在記號上),或使用 C_CopyObject 呼叫作為金鑰副本建立金鑰 (將其 CKA_LOCAL 屬性設為 CK_TRUE) 時,才會 CK_TRUE。 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_MODUUS_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) 索引鍵的受支援曲線

當您呼叫 GenerateKeyPair 函數以產生「橢圓曲線 (EC)」索引鍵時,支援機制 CKM_EC_KEY_PAIR_GEN。 曲線名稱參數必須使用 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 有效加密法(SEC)曲線的標準
  • secp256k1
CKM_EC_KEY_Pair_GEN Edwards 曲線
  • Ed25519

用於加密數位資產及產生簽章的受支援曲線

與數位資產及數位簽章相關的機制支援下列曲線。

表 5. 用於加密數位資產及簽章的受支援曲線類型
標準及架構 GREP11 機制 支援的曲線類型 支援的曲線名稱
BIP32/BIP44 CKM_IBM_BTC_DERIVE 有效加密法(SEC)曲線的標準
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE 國家標準與技術機構(NIST)曲線
  • P-256,也稱為 secp256r1 及 prime256v1
SLIP10 CKM_IBM_BTC_DERIVE 有效加密法(SEC)曲線的標準
  • secp256k1
SLIP10 CKM_IBM_BTC_DERIVE Edwards 曲線
  • Ed25519
EdDSA CKM_IBM_ED25519_SHA512 Edwards 曲線
  • Ed25519
施諾爾 CKM_IBM_ECDSA_OTHER 有效加密法(SEC)曲線的標準
  • secp256k1
施諾爾 CKM_IBM_ECDSA_OTHER 國家標準與技術機構(NIST)曲線
  • P-256,也稱為 secp256r1 及 prime256v1
施諾爾 CKM_IBM_ECDSA_OTHER 一般腦庫(BP)曲線
  • BP-256R,也稱為 brainpoolP256r1
施諾爾 CKM_IBM_ECDSA_OTHER 扭曲大腦儲存區(BP)曲線
  • BP-256T,也稱為 brainpoolP256t1
施諾爾 ECSG_IBM_ECSDSA_S256
  • secp256r1
  • secp256k1
  • BP-256R,也稱為 brainpoolP256r1
  • BP-256T,也稱為 brainpoolP256t1
施諾爾-齊利卡 ECCSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R,也稱為 brainpoolP256r1
  • BP-256T,也稱為 brainpoolP256t1

使用 GREP11 函數執行加密作業

您可以透過呼叫根據 PKCS #11 規格的 EP11 實作定義的 GREP11 函數,來執行加密作業。 下列功能說明是根據 PKCS #11 規格所建立,並附有 EP11特定的注意事項。 所有參數定義都採用原始形式的 EP11。 如需 EP11的相關資訊,請參閱 企業 PKCS #11(EP11)程式庫結構

EP11 函數參數對映到可以在下列函數中找到的通訊協定緩衝區類型。 您可以在 Google Developers中進一步瞭解通訊協定緩衝區類型。

因為 EP11 程式庫是 PKCS #11 API 程式庫的子集,而且 GREP11 函數是對應 EP11 函數的變式,所以 EP11 和 PKCS #11 的對應函數也會列在 GREP11 函數表格中供您參考。

GREP11 支援任何具有 gRPC 程式庫的程式設計語言。 在現行階段,API 參考資料只包含 Golang 和 JavaScript 的程式碼 Snippet 或範例。 在稍後階段會強化內容。 程式碼 Snippet 是以下列外部 GitHub 儲存庫為基礎,這些儲存庫提供使用 GREP11 API 的完整範例。 部分程式碼 Snippet 會參照範例儲存庫內的 helper 函數。

擷取支援的加密演算法 

您可以使用下列函數來擷取 GREP11支援的加密演算法或機制。 使用此資訊,您可以瞭解在呼叫函數時可以設定的特定機制。 如需受支援機制的完整清單,您也可以查看 依功能群組分類的機制

GetMechanismList

GetMechanismList 函數會取得記號所支援的機制類型清單。

說明 連結到 EP11 m_GetMechanismList,這是 PKCS #11 C_GetMechanismList 的實作。
參數
    message GetMechanismListRequest {
    }
    message GetMechanismListResponse {
      repeated uint64 Mechs = 2;
    }
    
回覆值 將 EP11 錯誤包裝成 message 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:

  1. 如果 pMechanismListNULL_PTR,則 C_GetMechanismList 只會傳回機制數目 (在 *pulCount中),而不會傳回機制清單。 在這種情況下,進入 C_GetMechanismList*pulCount 的內容沒有任何意義,並且該呼叫會傳回值 CKR_OK
  2. 如果 pMechanism清單 不是 NULL_PTR,則 *pulCount 必須包含 pMechanism清單所指向之緩衝區的大小 (就 CK_MECHANISM_TYPE 元素而言)。 如果該緩衝區夠大,而無法保留機制清單,則會在其中傳回該清單,並傳回 CKR_OK。 否則,呼叫 C_GetMechanismList 會傳回值 CKR_BUFFER_TOO_SMALL。 在任一情況下,值 *pulCount 都會設定為保留機制數目。

因為 C_GetMechanismList 不會配置自己的任何空間,所以應用程式通常會兩次呼叫 C_GetMechanismList。 不過,這不是必要行為。

參數
    CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
      CK_SLOT_ID slotID,
      CK_MECHANISM_TYPE_PTR pMechanismList,
      CK_ULONG_PTR pulCount
    );
    
回覆值 CKR_BUFFER_TO_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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • JavaScript 程式碼 Snippet

    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 錯誤包裝成 message 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_GetMechanism資訊 會取得記號可能支援之特定機制的相關資訊。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_MECHNISM_INVALID、CKR_OK、CKR_SLOT_ID_INVALID、CKR_TOKEN_NOT_PRESENT、CKR_TOKEN_NOT_RECOGNIZED、CKR_ARGUMENTS_BAD。

程式碼 Snippet

  • Golang 程式碼 Snippet

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • JavaScript 程式碼 Snippet

    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> 範本 = 6;
    }
    message GenerateKeyResponse {
      bytes KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_GenerateKey 的實作。

TDES 金鑰是以主機無法觀察到的適當同位檢查來產生。 但是需要它才能適當的交互作業能力: 其他 PKCS #11 實作需要拒絕具有同位檢查問題的 DES 金鑰。

如果物件關聯於階段作業,則 登入 必須傳回 (pin,plen) 給該階段作業。 將 pin 保留為 NULL 會建立一個未連結至登入階段作業的公用物件。

(key,klen) 會傳回金鑰二進位大型物件。(csum,clen) 包含金鑰的總和檢查,亦即,由金鑰加密的全零區塊中最重要的位元組。 例如,針對不使用 CKA_CHECK_VALUE 參數的對稱金鑰機制(如 RC4),可以使用 NULL clen

只有在機制需要金鑰長度 (即 CKA_VALUE_LEN 屬性) 時,才會使用 ptempl。 如果機制隱含地指定金鑰大小,則不會檢查 ptempl 以取得大小。

DSA 和 DH 參數產生會忽略 (csum, clen),並且只會產生參數結構。

DSA,DH 參數 (CKM_DSA_PARAMETER_GEN): 在屬性的 CKA_PRIME_BITS 中傳遞模數位元計數。 將 P、Q、G 結構寫入為明碼輸出 (亦即,不是二進位大型物件)。

pin 二進位大型物件是來自 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_INCONSISTENTCKA_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_CANCELLED、CKR_FUNC_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、r_mecharism_invalid、ckr_handl_cr_hand_session_session_proexpired、ck_rr_r_r_mech_oproper_r_invalid、ck_r_invalid、ck_無效、ck_session_session_session_session_r_session_session_r_r_r CKR_TEMPLATE_INCONSISTENT,CKR_TOKEN_WRITE_PROTECTED,CKR_USER_NOT_LOGGED_IN。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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> PrivKey範本 = 7;
      map<uint64,AttributeValue> PubKey範本 = 8;
      }
    message GenerateKeyPairResponse {
      bytes PrivKeyBytes = 5;
      bytes PubKeyBytes = 6;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_GenerateKeyPair 的實作。

金鑰組參數是從 pmechppublicpprivate 參數中所擷取。 對於 RSA 金鑰,ppublic 指定模數大小。

在 FIPS 模式中,僅支援 1024 + 256 n 位元的 RSA 模數 (整數 n)。 非 FIPS 模式可以在機制參數清單的限制之間產生任何偶數位元數目的金鑰。

公開金鑰格式化為標準 SPKI (主體公開金鑰資訊),可供大部分程式庫讀取。 它由傳輸金鑰特有的 MAC 進行完整性保護,該 MAC 不屬於 SPKI 本身。 DSA 參數產生會在公開金鑰欄位中傳回非 SPKI 結構。

如果您將物件連結至階段作業,則 登入 該階段作業必須傳回 (pin,plen)。 離開 pin NULL 會建立公用物件,在登入階段作業之後仍然存在。

將已包裝的私密金鑰傳回到 (key, klen),而將公開金鑰傳回為 (pubkey, pklen) 中的已設定 MAC 的 ASN.1/DER 結構。

下列受支援具有特殊注意事項的參數組合超出 PKCS #11所記載的範圍:

RSA 金鑰拒絕低於 17 (0x11) 的公用指數。 控制點可以進一步限制接受的最小值。 Fermat4 指數 (0x10001) 由特定控制點進行控制,並符合 FIPS 186-3(第 B.3.1 節)的公用指數限制。

EC 金鑰 (CKM_EC_KEY_PAIR_GEN): 曲線參數可以指定為 OID 或符號名稱 (我們的 namedCurve 變式)。 支援的符號名稱為 "P-nnn" 代表 NIST 曲線 (nnn 是支援的主要位元計數,192-521),"BP-nnnR" 代表一般 BP 曲線。 (名稱必須以 ASCII 字串形式提供,並且不能以零終止。)

DSA 金鑰 (CKM_DSA_KEY_PAIR_GEN):將 P,Q,G 結構作為公用屬性的 CKA_IBM_STRUCT_PARAMS 屬性傳遞。 個別 P、Q、G 參數可能不會透過一般 PKCS #11 參數傳遞,它們必須結合成單一結構。

DH 金鑰 (CKM_DH_PKCS_KEY_PAIR_GEN):將 P,G 結構作為公用屬性的 CKA_IBM_STRUCT_PARAMS 屬性傳遞。 個別 P、G 參數可能不會透過一般 PKCS #11 參數傳遞,它們必須結合成單一結構。 當您選取私密金鑰 (X) 位元計數時,請使用 XCP_U32_VALUE_BITS 屬性。 如果此屬性不存在,或提供明確 0,則會根據 P 位元計數來選取位元計數。

階段作業 (登入) 狀態的使用會取代階段作業的標準使用。 對映在程式庫範圍之外。

pin 二進位大型物件是來自 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_GenerateKey配對 會產生公開和私密金鑰組,以建立新的金鑰物件。hSession 是階段作業的控點; pMechanism 指向金鑰產生機制; pPublicKeyTemplate 指向公開金鑰的範本; ulPublicKeyAttributeCount 是公開金鑰範本中的屬性數目; pPrivateKeyTemplate 指向私密金鑰的範本; ulPrivateKeyAttributeCount 是私密金鑰範本中的屬性數目; phPublic金鑰 指向接收新公開金鑰控點的位置; phPrivate金鑰 指向接收新私密金鑰控點的位置。

因為要產生的金鑰類型隱含在金鑰組產生機制中,所以範本不需要提供金鑰類型。 如果其中一個範本提供的金鑰類型與金鑰產生機制不一致,C_GenerateKeyPair 會失敗,並傳回錯誤碼 CKR_TEMPLATE_INCONSISTENTCKA_CLASS 屬性的處理方式類似。

如果呼叫 C_GenerateKeyPair 無法支援提供給它的精確範本,則會失敗並傳回,而不會建立任何金鑰物件。

C_GenerateKeyPair 的呼叫絕不會只建立一個金鑰並返回。 呼叫可能失敗,且不會建立任何金鑰; 也可能成功,並建立相符的公開和私密金鑰組。

成功呼叫 C_GenerateKeyPair 所建立的金鑰物件,會將 CKA_LOCAL 屬性設為 CK_TRUE

請仔細注意 C_GenerateKeyPair 的引數順序。 最後兩個引數的順序與原始 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_FAILED、CKR_GENERAL_INVALID、ckr_host_memory、ck_handelism_ck_ck_ck_m_devoper_invalid 無效、ck_r_r_invalid 無效、ck_r_r無效、r無效無效、無效無效、無效、無效、無效、ck_domain_domain_domain_無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、無效、、、無效、無效、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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> 範本 = 8;
    }
    message DeriveKeyResponse {
        bytes NewKeyBytes = 6;
        bytes CheckSum = 7;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DeriveKey 的實作。

basekey,bklen 二進位大型物件必須從 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_EXTRACTTABLEKA_NER_ 可擷取 屬性值會影響這些屬性可以為新衍生金鑰保留的值。 如需此類型的任何限制,請參閱 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_CRYPKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_DOMAIN_PARAMS_INVALID、CKR_FUNCTION_FAILED、CKR_GENERAL_INVALID、CKR_HOST_MEMORY、ckrr_key_hand_rck_type_invalid range、ck_key_key_ck_eminvalid 無效、ck_se_se_se_se_se_se_se_se_se_se_r_se_se_se_se_z_se_se_se_se_se_z_r_se_r_k_se_se_se_se_kr_se_kr_kr_se_kr_se_se_kr_z_z_kr_k_kr_k,ck,ck_se_se_k_k_se_se_kr_k_kr_k_k_k_k_kr_k_kr_k_k_k_k_k_k_kr_kr_op_k_k_kr_kr_kr_k_key_k_k_k_k_k_kr_k_k_k_k_k_k_k_k_k_k_k_k_k_key CKR_SESSION_HANDLE_INVALID、CKR_SESSION_READ_ONLY、CKR_TEMPLATE_INCOMPLETE、CKR_TEMPLATE_INCONSISTENT、CKR_TOKEN_WRITE_PROTECTED、CKR_USER_NOT_LOGGED_IN。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    //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 錯誤包裝成 message 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 指向包裝機制; hWrapping金鑰 是包裝金鑰的控點; hKey 是要包裝的金鑰控點; pWrapped金鑰 指向接收已包裝金鑰的位置; 及 pulWrappedKeyLen 指向接收包裝金鑰長度的位置。

C_WrapKey 使用 PKCS #11 API 規格 第 5.2 節中關於產生輸出的說明。

包裝金鑰的 CKA_WRAP 屬性(指出金鑰是否支援包裝)必須是 CK_TRUE。 要包裝的金鑰的 CKA_EXTRACTABLE 屬性也必須是 CK_TRUE

如果因某種記號特有原因,盡管要包裝的金鑰的 CKA_EXTRACTABLE 屬性設定為 CK_TRUE 仍然無法包裝該金鑰,則 C_WrapKey 會失敗,錯誤碼為 CKR_KEY_NOT_WRAPABLE。 如果金鑰只因其長度而無法使用指定的包裝金鑰和機制進行包裝,則 C_WrapKey 會失敗,錯誤碼為 CKR_KEY_SIZE_RANGE

C_WrapKey 可以用於下列情境:

  • 使用支援加密和解密的公開金鑰包裝任何秘密金鑰。
  • 使用其他任何秘密金鑰包裝任何秘密金鑰。 必須考量金鑰大小及機制強度,否則記號可能不容許作業。
  • 使用任何秘密金鑰包裝私密金鑰。

記號會改變哪些類型的金鑰可以使用哪些機制來包裝。

若要分割包裝金鑰,以便它們只能包裝可擷取金鑰的子集,可以在包裝金鑰上使用屬性 CKA_WRAP_TEMPLATE,以指定可與要包裝之金鑰的屬性進行比較的屬性集。 如果所有屬性都符合屬性比對的 C_FindObject 規則,則 wrap 作業會繼續進行。 這個屬性的值是一個屬性範本,而大小是範本中的項目數乘上 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_CRYPKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_HANDLE_INVALID、CKR_KEY_NOT_WRAPPABLE、CKR_KEY_SIZE_INVALID、CKR_KEY_UNEXTRAC_HAND_MAND_MAND_HANDL_UNVALID,CKR_WRAPPING_KEY_SIZE_RANGE,CKR_WRAPPING_KEY_TYPE_INCONSISTENT。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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> 範本 = 9;
    }
    message UnwrapKeyResponse {
        bytes UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_UnwrapKey 的實作。

uwmech 指定用來解密已包裝資料的加密機制。ptempl 是一個 金鑰 (配對) 參數清單,指定如何將未包裝的資料轉換成新的金鑰 (必須包括 CKA_KEY_TYPE)。

產生的物件在 (unwrapped, uwlen) 下作為二進位大型物件傳回。 對稱金鑰在 (csum, cslen) 下傳回其金鑰總和檢查(3 位元組);公開金鑰物件在 (csum, cslen) 中將其公開金鑰作為 SPKI 傳回。 這兩種形式的後面都會有一個 4 位元組的大序排列法值,並對已解除包裝金鑰的位元計數進行編碼。

當 SPKI 轉換成 MACed SPKI 時,必須使用 CKM_IBM_TRANSPORTKEY 作為解除包裝機制。 此模式會提供原始 SPKI 作為已包裝的資料,並忽略 KEK。

UnwrapKey 會產生同位檢查調整 DES 金鑰 (在二進位大型物件內),但容許輸入不適當的同位檢查。

參數
    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 指向新金鑰的範本; ulAttribute計數 是範本中的屬性數目; 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中,unwrap 作業會繼續進行。 這個屬性的值是一個屬性範本,而大小是範本中的項目數乘上 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_ARGUMENT_BAD、CKR_ATTRIBUTE_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_BUFFER_TOO_SMALL、CKR_CRYPKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、ckr_domain_param_param_invalid、ckr_function_failed、ckr_general_error、ckrrrr_mandmech_mand_ck_mech_mak_sez_se,ck_dev_mand_mock_mock_ 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_LENT_RANGE。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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 函數會使用 HSM 內包含的新的已確定主要金鑰來重新加密產生的金鑰二進位大型物件 (BLOB)。 只有在以新的已確定主要金鑰終結 HSM 之後,才能使用重新加密的金鑰。

此函數是只有 GREP11支援的特殊管理指令。 RewrapKeyBlob 沒有對應的 EP11 函數或 PKCS #11 函數。

說明 在確定新的主要金鑰時,將現行主要金鑰所控制之 BLOB 的所有權傳送至新的主要金鑰。
參數
    message RewrapKeyBlobRequest {
    	bytes WrappedKey = 1;
    }
    message RewrapKeyBlobResponse {
    	bytes RewrappedKey = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

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

擷取及修改索引鍵的屬性 

當您產生金鑰或執行金鑰作業時,您可以將屬性範本定義為其中一個參數。 您可以擷取特定金鑰物件的屬性,並在建立金鑰之後修改部分屬性。

GetAttributeValue

GetAttributeValue 函數會取得物件的屬性值。

說明 連結到 EP11 m_GetAttributeValue,這是 PKCS #11 C_GetAttributeValue 的實作。
參數
    message GetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> 屬性 = 3;
    }
    message GetAttributeValueResponse {
        map<uint64,AttributeValue> 屬性 = 4;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_GetAttributeValue 的實作。

不代表或不需要階段作業 (二進位大型物件的一部分),因此不使用 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_GetAttribute值 會取得物件一個以上屬性的值。hSession 是階段作業的控點; hObject 是物件的控點; pTemplate 指向指定要取得哪些屬性值並接收屬性值的範本; ulCount 是範本中的屬性數目。

對於範本中的每個 (type, pValue, ulValueLen) 三項值,C_GetAttributeValue 會執行下列演算法:

  1. 如果無法顯示物件的指定屬性 (亦即,由類型欄位指定的屬性),因為該物件是機密或無法擷取的,則會修改該三項值中的 ulValueLen 欄位,以保留值 CK_UNAVAILABLE_XX_ENCODE_CASE_ONE 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) 的特殊情況下,以 pValue 非空值傳入,如果陣列內元素的 pValue 是 NULL_PTR,則陣列內元素的 ulValueLen 會設為所需的長度。 如果陣列內元素的 pValue 不是 NULL_PTR,則陣列中屬性的 ulValueLen 元素必須反映出對應 pValue 所指向的空間,如果有足夠的空間,則會填入 pValue。 因此,在呼叫 C_GetAttributeValue 以取得這類陣列值之前,請務必起始設定緩衝區的內容。 如果陣列內的任何 ulValueLen 不夠大,它會設為 CK_UNAVAILABLE_XX_ENCODE_CASE_ONE information,且函數會傳回 CKR_BUFFER_TOO_SMALL,如同它在 pTemplate 引數中的屬性 ulValueLen 太小時一樣。 其值為屬性陣列的任何屬性都可透過屬性類型的 CKF_ARRAY_ATTRIBUTE 集進行識別。

錯誤碼 CKR_ATTRIBUTE_SENSITIVECKR_ATTRIBUTE_TYPE_INVALIDCKR_BUFFER_TOO_SMALL 不表示 C_GetAttributeValue的 true 錯誤。 如果對 C_GetAttribute值 的呼叫傳回這三個值中的任何一個值,則該呼叫仍然必須已處理範本中提供給 C_GetAttribute值的每個屬性。 範本中其值可由呼叫 C_GetAttribute值 所傳回的每一個屬性,由呼叫 C_GetAttribute值所傳回。

參數
    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_SESSION_HANDLE_INVALID。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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> 屬性 = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_SetAttributeValue 的實作。

屬性包裝:請參閱 _GetAttrValue

目前,EP11 只會傳送布林值屬性,其他所有屬性都是由主機處理(並且 EP11 不允許修改陣列,例如 WRAP_TEMPLATE)。

不代表或不需要階段作業 (二進位大型物件的一部分),因此不使用 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) 程式庫結構文件回覆值 一章。
說明

C_SetAttributeValue 會修改物件的一或多個屬性值。hSession 是階段作業的控點; hObject 是物件的控點; pTemplate 指向指定要修改哪些屬性值及其新值的範本; ulCount 是範本中的屬性數目。

某些物件可能未修改。 對此類物件呼叫 C_SetAttribute值 會導致 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_BADDED、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_HANDLE_INVALID、CKR_OBJECT_OK、CKRR_TOK_SESSION_INVALID、read_session_ind、ck_not_protected、ck_templat_not_not_uni_r_r_in_

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

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

產生隨機資料

您可以產生高品質隨機資料,例如起始設定值 (IVs)、PIN 及密碼,以在加密作業中使用。

GenerateRandom

GenerateRandom 函數會產生隨機資料。 當您使用此函數時,請確保不要將隨機資料的長度設為零,並將指向隨機資料位置的指標設為 NULL。

說明 連結到 EP11 m_GenerateRandom,這是 PKCS #11 C_GenerateRandom 的實作。
參數
    message GenerateRandomRequest {
        uint64 Len = 1;
    }
    message GenerateRandomResponse {
        bytes Rnd = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_GenerateRandom 的實作。

GenerateRandom 相等於原始 PKCS #11 函數。 在內部,透過符合 FIPS 標準的 DRNG(ANSI X9.31/ISO 18031,取決於 Clic 版本)來傳遞以硬體為種子的熵。

如果主機上有適用的功能可用,則主機程式庫可能會產生亂數,而不分派給後端。 在現行實作中不會這樣做。

此函數不支援大小查詢。

參數
    CK_RV m_GenerateRandom (
        CK_BYTE_PTR rnd, CK_ULONG rndlen,
        target_t 目標
    );
    
回覆值 C_GenerateRandom 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件回覆值 一章。
說明 C_GenerateRandom 會產生隨機或虛擬隨機資料。hSession 是階段作業控點; pRandom資料 指向接收隨機資料的位置; 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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • JavaScript 程式碼 Snippet

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

加密及解密資料

透過指定加密機制,您可以執行對稱或非對稱加密及解密函數。 您可能需要呼叫一系列子函數來加密或解密資料。 例如,多組件資料加密作業由 EncryptInitEncryptUpdateEncryptFinal 子作業組成。

EncryptInit

EncryptInit 函數會起始設定加密作業。 您需要先呼叫此函數才能執行加密。

說明 連結到 EP11 m_EncryptInit,這是 PKCS #11 C_EncryptInit 的實作。
參數
    message EncryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message EncryptInitResponse {
        bytes State = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_EncryptInit 的實作。

(key,klen) 二進位大型物件可以是公開金鑰物件或秘密金鑰二進位大型物件。 金鑰類型必須與 pmech 一致。

針對公開金鑰機制,(key, klen) 必須包含 SPKI。 此 SPKI 使用 MAC 金鑰進行完整性保護,如 GenerateKeyPairUnwrapKey 傳回的內容。 建立加密狀態時,而且沒有階段作業限制。

對於秘密金鑰機制,加密狀態會從 (key,klen)繼承物件階段作業限制。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

(key, klen) 必須是金鑰二進位大型物件。

參數
    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 回覆值的子集。 如需相關資訊,請參閱 企業 PKCS #11 (EP11) 程式庫結構文件回覆值 一章。
說明

C_EncryptInit 會起始設定加密作業。hSession 是階段作業的控點; pMechanism 指向加密機制; hKey 是加密金鑰的控點。

加密金鑰的 CKA_ENCRYPT 屬性(指出金鑰是否支援加密)必須為 CK_TRUE

在應用程式呼叫 C_EncryptInit之後,應用程式可以呼叫 C_Encrypt 來加密單一部分中的資料; 或呼叫 C_EncryptUpdate 零或多次,後面接著 C_EncryptFinal來加密多個部分中的資料。 加密作業在作用中,直到應用程式使用 C_EncryptC_EncryptFinal 的呼叫來取得最後一段密文為止。 若要處理額外資料 (在單一或多個組件中),應用程式必須再次呼叫 C_EncryptInit

參數
    CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
回覆值 CKR_XX_ENCODE_CASE_CAPS_LOCK_ON cryptoki_not_initialized、ckr_device_error、ckr_device_memory、ckr_device_removed、ckr_function_cancelled、ckr_function_failed、ckr_general_error、ckr_host_memory、ckr_key_function_not_permitted、ckr_key_handle_invalid、ckr_key_size_range、ckr_key_key_type_inconsistent、ckr_mechenvalid、ckr_sessionr_mech_opar_handlism_param_op_ck_ck_ckr_ckr_opr_handr_explicit_ck_ck_ck___explicit_r_explicit_r,ckr_r_r___explic謝。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

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

Encrypt

Encrypt 函數會加密單一部分資料。 您不需要針對單一組件加密執行 EncryptUpdateEncryptFinal 子作業。 在呼叫此函數之前,請務必先執行 EncryptInit

說明 連結到 EP11 m_Encrypt,這是 PKCS #11 C_Encrypt 的實作。
參數
    message EncryptRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptResponse {
        bytes Ciphered = 3;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_Encrypt 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

state 二進位大型物件是來自 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_EncryptFinal 的一系列 C_EncryptUpdate 作業。

參數
    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_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_CKR_SESSION_CK_CK_CK_SESSION_HANDEL_INVALID 無效。

程式碼 Snippet

  • Golang 程式碼 Snippet

    plainText := "Encrypt this message"
    
    EncryptRequest := &pb.EncryptRequest {
        State: EncryptInitResponse.State,
        Plain: plainText,
    }
    
    EncryptResponse, err := cryptoClient.Encrypt(context.Background(), EncryptRequest)
    
  • JavaScript 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_EncryptUpdate 的實作。

必須從 PKCS #11 hSession 參數對映 狀態 slen 二進位大型物件。

state 二進位大型物件是來自 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_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_EncryptFinal 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

state 二進位大型物件是從 EncryptInitEncryptUpdate 所輸出。

參數
    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_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。

程式碼 Snippet

  • Golang 程式碼 Snippet

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • JavaScript 程式碼 Snippet

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

EncryptSingle

EncryptSingle 函數會使用一次呼叫來一次處理資料。 它不會將任何狀態傳回至主機,且只會傳回已加密資料。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸,是 EncryptInitEncrypt 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成加密作業。

說明 連結到 EP11 m_EncryptSingle
參數
    message EncryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Plain = 3;
    }
    message EncryptSingleResponse {
        bytes Ciphered = 4;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

Encrypt 的非標準變式。 一次處理資料,使用一次呼叫。 不會傳回任何狀態給主機,只會傳回已加密資料。

這針對可感知 XCP 的應用程式而言,一次加密資料的偏好方法。 在功能上,它相當於 EncryptInit,後面接著 Encrypt,但它會儲存來回轉換、覆蓋及解除覆蓋。

如果後端支援常駐金鑰,則金鑰也可以是常駐金鑰控點。

另請參閱:EncryptEncryptInitDecryptSingle

key 二進位大型物件是來自 GenerateKeyUnwrapKey 的輸出。

參數
    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) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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 內單一呼叫中使用不同的金鑰來加密原始資料。 用於此作業的金鑰類型可以相同或不同。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸。 此單一呼叫是一個可行的選項,其中需要使用不同的金鑰重新加密大量資料,並略過針對每一個需要重新加密的資料項目執行 DecryptSingleEncryptSingle 功能組合的需要。 它不會將任何狀態傳回至主機,且只會傳回重新加密的資料。

說明 連結至 EP11 m_ReencryptSingle
參數
    message ReencryptSingleRequest {
        bytes DecKey = 1;
        bytes EncKey = 2;
        機制 DecMech = 3;
        機制 EncMech = 4;
        bytes Ciphered = 5;
    }
    message ReencryptSingleResponse {
        已接收位元組 = 6;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

Encrypt 的非標準變式。 一次處理資料,使用一次呼叫。 不會傳回任何狀態給主機,只會傳回重新加密的資料。

使用原始金鑰來解密資料,然後在雲端 HSM 內使用不同的金鑰來加密原始資料。

參數
    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_EncryptC_Decrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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 錯誤包裝成 message 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 零或多次,後面接著 C_DecryptFinal來解密多個組件中的資料。 解密作業在作用中,直到應用程式使用 C_DecryptC_DecryptFinal 的呼叫來取得純文字的最終部分為止。 若要處理額外資料 (在單一或多個組件中),應用程式必須再次呼叫 C_DecryptInit

參數
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
        K_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
回覆值 CKR_ARGUMENT_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDL_INVALID、CKR_KEY_SIZE_INSISTENT、CKR_MECHAND_HANDLISM_PARAM_INVALID、ckr_r_mander_handlar_ck_sevis_operis_apro_。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

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

Decrypt

Decrypt 函數會解密單一組件中的資料。 您不需要針對單一部分解密執行 DecryptUpdateDecryptFinal 子作業。 在呼叫此函數之前,請務必先執行 DecryptInit

說明 連結到 EP11 m_Decrypt,這是 PKCS #11 C_Decrypt 的實作。
參數
    message DecryptRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptResponse {
       bytes Plain = 3;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_Decrypt的實作。 它不會更新 (state,slen)

state, slen 二進位大型物件 (BLOB) 必須從 PKCS #11 hSession 參數對映。 state 二進位大型物件是從 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 會解密單一部分中的加密資料。

  • 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_INVALIDCKR_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_not_hand_initialized、ckr_ckr_ckr_invalid、ckr_encsession_data_initial_data_r_data_r_data_r_data_invalid、ck.

程式碼 Snippet

  • Golang 程式碼 Snippet

    DecryptRequest := &pb.DecryptRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext, // encrypted data from a previous encrypt operation
    }
    
    DecryptResponse, err := cryptoClient.Decrypt(context.Background(), DecryptRequest)
    
  • JavaScript 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DecryptUpdate 的實作。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

state 二進位大型物件是從 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_ARGUMENT_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDL_INVALID、CKR_KEY_SIZE_INSISTENT、CKR_MECHAND_HANDLISM_PARAM_INVALID、ckr_r_mander_handlar_ck_sevis_operis_apro_。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DecryptFinal 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

state 二進位大型物件是從 DecryptInitDecryptUpdate 所輸出。

參數
    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 是階段作業的控點; pLast組件 指向接收前次回復資料組件的位置 (如果有的話); pulLastPartLen 指向保留前次回復資料組件長度的位置。

C_DecryptFinal 使用 PKCS #11 API 規格 產生輸出的 5.2 小節中說明的慣例。

解密作業必須以 C_DecryptInit起始設定。 對 C_DecryptFinal 的呼叫一律會終止作用中解密作業,除非它傳回 CKR_BUFFER_TOO_SMALL 或成功呼叫 (亦即,傳回 CKR_OK),以決定保留純文字所需的緩衝區長度。

如果輸入密文資料因為長度不適當而無法解密,則可以傳回 CKR_ENCRYPTED_DATA_INVALIDCKR_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_not_hand_initialized、ckr_ckr_ckr_invalid、ckr_encsession_data_initial_data_r_data_r_data_r_data_invalid、ck.

程式碼 Snippet

  • Golang 程式碼 Snippet

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • JavaScript 程式碼 Snippet

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

DecryptSingle

DecryptSingle 函數會使用一次呼叫來一次處理資料。 它不會傳回任何狀態給主機,只會傳回已解密的資料。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸,是 DecryptInitDecrypt 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成解密作業。

說明 連結至 EP11 m_DecryptSingle
參數
    message DecryptSingleRequest {
        bytes Key = 1;
        Mechanism Mech = 2;
        bytes Ciphered = 3;
    }
    message DecryptSingleResponse {
        bytes Plain = 4;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

Decrypt 的非標準變式。 一次處理資料,使用一次呼叫。 不會傳回任何狀態給主機,只會傳回已解密資料。

這針對可感知 XCP 的應用程式而言,一次加密資料的偏好方法。 在功能上,它相當於 DecryptInit,後面接著 Decrypt,但它會儲存來回轉換、覆蓋及解除覆蓋。

如果後端支援常駐金鑰,則金鑰也可以是常駐金鑰控點。

另請參閱:DecryptDecryptInitEncryptSingle

key 二進位大型物件是來自 GenerateKeyUnwrapKey 的輸出。

參數
    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) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

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

簽署及驗證資料

GREP11 提供一組函數來簽署資料及驗證簽章或訊息鑑別碼 (MAC)。 您可能需要呼叫一系列子功能來執行簽署作業。 例如,多組件資料簽章作業由 SignInitSignUpdateSignFinal 子作業組成。

SignInit

SignInit 函數會起始設定簽章作業。 您必須先呼叫此函數,才能執行簽章作業。

說明 連結至 EP11 m_SignInit,這是 PKCS #11 C_SignInit的實作。
參數
    message SignInitRequest {
        Mechanism Mech = 2;
        bytes PrivKey = 3;
    }
    message SignInitResponse {
        bytes State = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message 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 來登入單一組件; 或呼叫 C_SignUpdate 一次以上,後面接著 C_SignFinal來簽署多個組件中的資料。 簽章作業在作用中,直到應用程式使用呼叫 C_SignC_SignFinal 來取得簽章為止。 若要處理額外資料 (在單一或多個組件中),應用程式必須再次呼叫 C_SignInit

參數
    CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
回覆值 CKR_ARGUMENT_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDL_INVALID、CKR_KEY_SIZE_INSISTENT、CKR_MECHAND_HANDLISM_PARAM_INVALID、ckr_r_mander_handlar_ck_sevis_operis_apro_。

程式碼 Snippet

  • Golang 程式碼 Snippet

    SignInitRequest := &pb.SignInitRequest {
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
    }
    
    SignInitResponse, err := cryptoClient.SignInit(context.Background(), SignInitRequest)
    
  • JavaScript 程式碼 Snippet

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

簽章

Sign 函數會簽署單一部分資料。 您不需要針對單一組件簽章執行 SignUpdateSignFinal 子作業。 在呼叫此函數之前,請務必先執行 SignInit

說明 連結到 EP11 m_Sign,這是 PKCS #11 C_Sign 的實作。
參數
    message SignRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignResponse {
        bytes Signature = 3;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_Sign 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 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_SignFinal 的一系列 C_SignUpdate 作業。

參數
    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_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、ckr_session_user_handle_invalid-

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_SignUpdate 的實作。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 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_SESSION_HANDLE_INVALID、CKR_USER_NOT_LOGGED_IN。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_SignFinal 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 SignInitSignUpdate 的輸出。

參數
    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_CANCELLED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_SESSION_CLOSED、ckr_session_session_handle_invalid、ckr_no_logg_not_invalid.

程式碼 Snippet

  • Golang 程式碼 Snippet

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • JavaScript 程式碼 Snippet

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

SignSingle

SignSingle 函數會在一次呼叫中簽署資料或對資料進行 MAC,而不會建構中間摘要狀態。 它不會將任何狀態傳回至主機,且只會傳回結果。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸,是 SignInitSign 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成簽署作業。

說明 連結至 EP11 m_SignSingle
參數
    message SignSingleRequest {
        bytes PrivKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
    }
    message SignSingleResponse {
        bytes Signature = 4;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

非標準延伸,SignInitSign 的組合。 一次簽署資料或對其執行 MAC,使用一次呼叫,且不建構中間的摘要狀態。 不會傳回任何狀態給主機,只會傳回結果。

這是偏好的簽署方式,不需要額外的來回轉換、加密及解密。 在功能上,SignSingle 相當於後面直接跟著 SignSignInit

(key, klen) 二進位大型物件和 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) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_VerifyInit 的實作。 在給定金鑰二進位大型物件 (key, klen) 的情況下,起始設定 (state, slen) 中的驗證階段作業狀態。 金鑰二進位大型物件可以是公開金鑰物件或 HMAC 金鑰位元組。 金鑰二進位大型物件類型必須與 pmech 一致。

針對公開金鑰機制,(key, klen) 必須包含 SPKI。 此 SPKI CKA_UNWRAP 可以是 MACed (例如,先前由 GenerateKeyPair所傳回) 或只是 SPKI 本身 (如果從外部來源 (例如憑證) 取得)。

如果起始設定 HMAC 作業,則會從 HMAC 金鑰繼承 Verify 物件的階段作業限制。 因為 SPKI 未關聯於階段作業,所以公開金鑰驗證狀態與階段作業無關。

key,klen 二進位大型物件必須從 PKCS #11 hKey 參數對映。

附註: SignInitVerifyInit 在內部 適用於 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 以驗證單一組件中資料的簽章; 或呼叫 C_VerifyUpdate 一或多次,後面接著 C_VerifyFinal以驗證多個組件中資料的簽章。 驗證作業一直處於作用中狀態,直到應用程式呼叫 C_VerifyC_VerifyFinal。 若要處理額外資料 (在單一或多個組件中),應用程式必須再次呼叫 C_VerifyInit

參數
    CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hKey
    );
    
回覆值 CKR_ARGUMENT_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_KEY_FUNCTION_NOT_PERMITTED、CKR_KEY_HANDL_INVALID、CKR_KEY_SIZE_INSISTENT、CKR_MECHAND_HANDLISM_PARAM_INVALID、ckr_r_mander_handlar_ck_sevis_operis_apro_。

程式碼 Snippet

  • Golang 程式碼 Snippet

    VerifyInitRequest := &pb.VerifyInitRequest {
      Mech:   &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
      PubKey: GenerateKeyPairResponse.PubKeyBytes,
    }
    
    VerifyInitResponse, err := cryptoClient.VerifyInit(context.Background(), VerifyInitRequest)
    
  • JavaScript 程式碼 Snippet

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

驗證

Verify 函數會驗證單一部分資料上的簽章。 您不需要執行 VerifyUpdateVerifyFinal 子作業,即可進行單一組件驗證。 在呼叫此函數之前,請務必先執行 VerifyInit

說明 連結到 EP11 m_Verify,這是 PKCS #11 C_Verify 的實作。
參數
    message VerifyRequest {
        bytes State = 1;
        bytes Data = 2;
        bytes Signature = 3;
    }
    message VerifyResponse {
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_Verify 的實作。

不會更新 (state, slen)

資料和簽章的相對順序相反 至 VerifySingle

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 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_VerifyFinal 的一系列 C_VerifyUpdate 作業。

參數
    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_signature_r_invalid、ck_ckr_r_r_signature_r_r_signature_range、ck_r_r_r_r_r_r_signature_r範圍

程式碼 Snippet

  • Golang 程式碼 Snippet

    VerifyRequest := &pb.VerifyRequest {
        State:     VerifyInitResponse.State,
        Data:      msgHash[:],
        Signature: SignResponse.Signature,
    }
    
    VerifyResponse, err := cryptoClient.Verify(context.Background(), VerifyRequest)
    
  • JavaScript 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_VerifyUpdate 的實作。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_VerifyFinal 的實作。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 VerifyInitVerifyUpdate 的輸出。

參數
    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_SESSION_HANDLE_INVALID、CKR_SIGNATURE_INVALID 無效、ckr_signature_range、ckr_signature_r_signature_signature_range。

程式碼 Snippet

  • Golang 程式碼 Snippet

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • JavaScript 程式碼 Snippet

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

VerifySingle

VerifySingle 函數會在一次呼叫中簽署資料或對資料進行 MAC,而不會建構中間摘要狀態。 它不會將任何狀態傳回至主機,且只會傳回驗證結果。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸,是 VerifyInitVerify 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成驗證作業。

說明 連結至 EP11 m_VerifySingle
參數
    message VerifySingleRequest {
        bytes PubKey = 1;
        Mechanism Mech = 2;
        bytes Data = 3;
        bytes Signature = 4;
    }
    message VerifySingleResponse {
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

非標準延伸,VerifyInitVerify 的組合。 一次簽署資料或對其執行 MAC,使用一次呼叫,且不建構中間的摘要狀態。 不會傳回任何狀態給主機,只會傳回驗證結果。 沒有可用的大小查詢,因為此函數傳回布林。

這是驗證簽章的偏好方式,不需要額外的來回轉換、加密、解密。 在功能上,VerifySingle 相當於後面跟著 VerifyVerifyInit

(key, klen) 二進位大型物件和 pmech 機制必須能夠一起傳遞到 VerifyInit

針對公開金鑰機制,(key, klen) 必須包含 SPKI。 此 SPKI 可以是 MACed (例如從 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) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

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

透過訊息摘要保護資料完整性

GREP11 提供一組函數來建立訊息摘要,其設計旨在保護資料片段的完整性。 您可能需要呼叫一系列子函數來執行摘要作業。 例如,多組件摘要作業由 DigestInitDigestUpdateDigestFinal 子作業組成。

DigestInit

DigestInit 函數會起始設定訊息摘要作業。 您必須先執行此功能,才能執行摘要作業。

說明 連結到 EP11 m_DigestInit,這是 PKCS #11 C_DigestInit 的實作。
參數
    message DigestInitRequest {
        Mechanism Mech = 2;
    }
    message DigestInitResponse {
        bytes State = 1;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DigestInit 的實作。

建立已包裝的摘要狀態。

附註:支援大小查詢,但是已包裝狀態一律由後端傳回,這與大多數大小查詢不同(後者傳回輸出大小,而不是實際輸出)。 Digest 狀態足夠小,因此不會產生明顯的傳輸額外負擔。

在大小查詢期間,主機只會捨棄傳回的狀態,而報告二進位大型物件大小(在 len 中)。 當傳回二進位大型物件時,會根據傳回的大小來檢查 len

state,len 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將二進位大型物件連結到階段作業。)

參數
    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 來摘要單一組件中的資料; 或呼叫 C_DigestUpdate 零或多次,後面接著 C_DigestFinal來摘要多個組件中的資料。 除非應用程式使用呼叫 C_DigestFinalC_DigestFinal 來取得訊息摘要,否則訊息摘要作業會處於作用中。 若要處理額外資料 (在單一或多個組件中),應用程式必須再次呼叫 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_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_MECHNISM_INVALID、CKR_MECHNISM_PARAM_INVALID、CKR_OK、CKR_OPERATION_ACTIVE、CKR_PIN_EXPIRED、CKR_SESSION_SESSION_CLOSED、CKR_SESSION_HAND_INVALID、

程式碼 Snippet

  • Golang 程式碼 Snippet

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • JavaScript 程式碼 Snippet

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

摘要

Digest 函數會對單一部分資料進行摘要。 您不需要呼叫 DigestUpdateDigestFinal 函數,即可對單一部分資料進行摘要。 在呼叫此函數之前,請務必先執行 DigestInit。 當您設定參數時,請注意不要將輸入資料的長度指定為零,並將指向輸入資料位置的指標指定為 NULL。

說明 連結到 EP11 m_Digest,這是 PKCS #11 C_Digest 的實作。
參數
    message DigestRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestResponse {
        bytes Digest = 3;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_Digest 的實作。

如果摘要物件在建立之後剛好有 0 (零) 個位元組附加到它,則在零位元組傳送的任何組合中,它仍然可以執行一次摘要,即使嚴格實作需要拒絕它也一樣。

不會更新 (state, slen)

實作可能執行 對主機程式碼中明碼摘要物件的 DigestUpdateDigestFinalDigest 呼叫,完全略過 HSM 後端。 此選項不一定對主機程式碼可見,且不會影響作業的安全 (因為清除物件可能不會摘要機密資料)。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 state 二進位大型物件是來自 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_DigestFinal 的一系列 C_DigestUpdate 作業。

參數
    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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    digestData := []byte("Create a digest for this string")
    DigestRequest := &pb.DigestRequest {
        State: DigestInitResponse.State,
        Data:  digestData,
    }
    
    DigestResponse, err := cryptoClient.Digest(context.Background(), DigestRequest)
    
  • JavaScript 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DigestUpdate 的實作。

DigestUpdate 是多型、 同時接受已包裝或清除摘要物件,以相同格式更新狀態。

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。 (主機程式庫必須將階段作業對映至儲存的狀態。)

state 二進位大型物件是來自 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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    // 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 程式碼 Snippet

    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 錯誤包裝成 message Grep11Error
說明

PKCS #11 C_DigestFinal 的實作。

DigestFinal 是多態函數,並接受已包裝的摘要物件或明文摘要物件。

不會更新 (state, slen)

state,slen 二進位大型物件必須從 PKCS #11 hSession 參數對映。

state 二進位大型物件是來自 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。

程式碼 Snippet

  • Golang 程式碼 Snippet

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • JavaScript 程式碼 Snippet

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

DigestSingle

DigestSingle 函數會透過一次呼叫來一次對資料進行摘要,而不建構中間摘要狀態及不必要的來回轉換。 此函數是標準 PKCS #11 規格的 IBM EP11 延伸,是 DigestInitDigest 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成摘要作業。

說明 連結至 EP11 m_DigestSingle
參數
    message DigestSingleRequest {
        Mechanism Mech = 1;
        bytes Data = 2;
    }
    message DigestSingleResponse {
        bytes Digest = 3;
    }
    
回覆值 將 EP11 錯誤包裝成 message Grep11Error
說明

非標準延伸,DigestInitDigest 的組合。 一次取得資料摘要,使用一次呼叫,而不建構中間摘要狀態,避免不必要的往返。

這針對可感知 XCP 的應用程式而言是對純文字進行摘要的偏好方法。 在功能上,DigestSingle 相當於 DigestInit 後面直接跟著 Digest

如果需要對金鑰進行摘要,則必須 使用 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) 程式庫結構文件回覆值 一章。

程式碼 Snippet

  • Golang 程式碼 Snippet

    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 程式碼 Snippet

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

程式碼範例

GREP11 API 支援使用 gRPC 程式庫的程式設計語言。 提供兩個範例 GitHub 儲存庫,供您測試 GREP11 API: