加密作業: 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實作。 未實作其他函數。
| 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 函數種類的關係。
| 函數群組 | 支援的機制 |
|---|---|
| 加密和解密 | 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 函數 (例如 EncryptUpdate、DecryptUpdate 及 DigestUpdate) 的單一部分作業。
2: 此機制僅適用於 GREP11 SignSingle 及 VerifySingle 作業。
3: IBM 4768 加密卡不支援此機制,且無法用於 SignUpdate 及 VerifyUpdate 作業。
4: 此機制支援單一組件 (SignInit、Sign、VerifyInit、Verify)、SignSingle 及 VerifySingle 作業。
支援的屬性及索引鍵類型
GREP11 屬性定義物件性質,以設定如何使用及存取物件。 下表顯示支援的屬性及其與各種受支援索引鍵類型的關係。
| 屬性 | 說明 | 支援的金鑰類型 |
|---|---|---|
| CKA_CHECK_VALUE | 金鑰的總和檢查 | AES 金鑰,DES 金鑰 |
| CKA_COPYABLE | 如果設為 CKA_TRUE,則可以使用 PKCS#11 C_CopyObject 函數來複製物件 | EC 私密金鑰,EC 公開金鑰,RSA 私密金鑰,RSA 公開金鑰,DH 私密金鑰,DH 公開金鑰,DSA 私密金鑰,DSA 公開金鑰,AES 金鑰,DES 金鑰,通用金鑰 |
| CKA_DECRYPT | 如果金鑰支援解密,則為 CK_TRUE。 | EC 私密金鑰,RSA 私密金鑰,DH 私密金鑰,DSA 私密金鑰,AES 金鑰,DES 金鑰,通用金鑰 |
| CKA_DERIVE | 如果金鑰支援金鑰衍生 (其他金鑰可以從此金鑰衍生),則為 CK_TRUE。 預設值為 CK_FALSE。 | EC 私密金鑰,EC 公開金鑰,RSA 私密金鑰,RSA 公開金鑰,DH 私密金鑰,DH 公開金鑰,DSA 私密金鑰,DSA 公開金鑰,AES 金鑰,DES 金鑰,通用金鑰 |
| CKA_EC_PARAMS (CKA_ECDSA_PARAMS) | ANSI X9.62 參數值的 DER 編碼。 | EC 私密金鑰,EC 公開金鑰 |
| CKA_ENCRYPT | 如果金鑰支援加密,則為 CK_TRUE。 | EC 公開金鑰、RSA 公開金鑰、DH 公開金鑰、DSA 公開金鑰、AES 金鑰、DES 金鑰、通用金鑰 |
| CKA_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_GenerateKey 或 C_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。
| GREP11 機制 | 支援的曲線類型 | 支援的曲線名稱 |
|---|---|---|
| CKM_EC_KEY_Pair_GEN | 國家標準與技術機構(NIST)曲線 |
|
| CKM_EC_KEY_Pair_GEN | 一般腦庫(BP)曲線 |
|
| CKM_EC_KEY_Pair_GEN | 扭曲大腦儲存區(BP)曲線 |
|
| CKM_EC_KEY_Pair_GEN | 有效加密法(SEC)曲線的標準 |
|
| CKM_EC_KEY_Pair_GEN | Edwards 曲線 |
|
用於加密數位資產及產生簽章的受支援曲線
與數位資產及數位簽章相關的機制支援下列曲線。
| 標準及架構 | GREP11 機制 | 支援的曲線類型 | 支援的曲線名稱 |
|---|---|---|---|
| BIP32/BIP44 | CKM_IBM_BTC_DERIVE | 有效加密法(SEC)曲線的標準 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | 國家標準與技術機構(NIST)曲線 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | 有效加密法(SEC)曲線的標準 |
|
| SLIP10 | CKM_IBM_BTC_DERIVE | Edwards 曲線 |
|
| EdDSA | CKM_IBM_ED25519_SHA512 | Edwards 曲線 |
|
| 施諾爾 | CKM_IBM_ECDSA_OTHER | 有效加密法(SEC)曲線的標準 |
|
| 施諾爾 | CKM_IBM_ECDSA_OTHER | 國家標準與技術機構(NIST)曲線 |
|
| 施諾爾 | CKM_IBM_ECDSA_OTHER | 一般腦庫(BP)曲線 |
|
| 施諾爾 | CKM_IBM_ECDSA_OTHER | 扭曲大腦儲存區(BP)曲線 |
|
| 施諾爾 | ECSG_IBM_ECSDSA_S256 |
|
|
| 施諾爾-齊利卡 | ECCSG_IBM_ECSDSA_COMPR_MULTI |
|
使用 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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
有兩種方法可供應用程式呼叫
因為 |
|---|---|
| 參數 |
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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
|
|---|---|
| 參數 |
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 TDES 金鑰是以主機無法觀察到的適當同位檢查來產生。 但是需要它才能適當的交互作業能力: 其他 PKCS #11 實作需要拒絕具有同位檢查問題的 DES 金鑰。 如果物件關聯於階段作業,則
只有在機制需要金鑰長度 (即 DSA 和 DH 參數產生會忽略 DSA,DH 參數 (
PKCS #11 |
|---|---|
| 參數 |
CK_RV m_GenerateKey (
CK_MECHANISM_PTR mech,
CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
const unsigned char *pin, size_t pinlen,
unsigned char * key,size_t * keylen,
unsigned char *checkSum,size_t *checkSumlen,
target_t 目標
);
|
| 回覆值 | C_GenerateKey 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
如果產生機制用於網域參數產生,則 因為要產生的金鑰或網域參數的類型在產生機制中是隱含的,所以範本不需要提供金鑰類型。 如果它提供的金鑰類型與產生機制不一致,則 如果對 成功呼叫 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)(
CK_SESSION_HANDLE hSession
CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount,
CK_OBJECT_HANDLE_PTR phKey
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_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 金鑰組參數是從 在 FIPS 模式中,僅支援 1024 + 256 公開金鑰格式化為標準 SPKI (主體公開金鑰資訊),可供大部分程式庫讀取。 它由傳輸金鑰特有的 MAC 進行完整性保護,該 MAC 不屬於 SPKI 本身。 DSA 參數產生會在公開金鑰欄位中傳回非 SPKI 結構。 如果您將物件連結至階段作業,則 將已包裝的私密金鑰傳回到 下列受支援具有特殊注意事項的參數組合超出 PKCS #11所記載的範圍: RSA 金鑰拒絕低於 17 (0x11) 的公用指數。 控制點可以進一步限制接受的最小值。 Fermat4 指數 (0x10001) 由特定控制點進行控制,並符合 FIPS 186-3(第 B.3.1 節)的公用指數限制。 EC 金鑰 ( DSA 金鑰 ( DH 金鑰 ( 階段作業 (登入) 狀態的使用會取代階段作業的標準使用。 對映在程式庫範圍之外。
PKCS #11 PKCS #11 PKCS #11 |
|---|---|
| 參數 |
CK_RV m_GenerateKeyPair (
CK_MECHANISM_PTR mech,
CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen,
CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen,
const unsigned char *pin, size_t pinlen,
unsigned char *privKey,size_t *privKeylen,
unsigned char *pubKey,size_t *pubKeylen,
target_t 目標
);
|
| 回覆值 | C_GenerateKeyPair 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
因為要產生的金鑰類型隱含在金鑰組產生機制中,所以範本不需要提供金鑰類型。 如果其中一個範本提供的金鑰類型與金鑰產生機制不一致, 如果呼叫 對 成功呼叫 請仔細注意 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKeyPair)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pPublicKeyTemplate,
CK_ULONG ulPublicKeyAttributeCount,
CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
CK_ULONG ulPrivateKeyAttributeCount,
CK_OBJECT_HANDLE_PTR phPublicKey,
CK_OBJECT_HANDLE_PTR phPrivateKey
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_CURVE_NOT_SUPPORTED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_DOMAIN_PARAMS_INVALID、CKR_FUNCTION_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
PKCS #11 PKCS #11 |
|---|---|
| 參數 |
CK_RV m_DeriveKey (
CK_MECHANISM_PTR mech,
CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
const unsigned char *baseKey, size_t baseKeylen,
const unsigned char *data, size_t datalen,
const unsigned char *pin, size_t pinlen,
unsigned char *newKey,size_t *newKeylen,
unsigned char *checkSum,size_t *checkSumlen,
target_t 目標
);
|
| 回覆值 | C_DeriveKey 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
基本索引鍵的 如果對 成功呼叫 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DeriveKey)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hBaseKey,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount,
CK_OBJECT_HANDLE_PTR phKey
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_READ_ONLY、CKR_ATTRIBUTE_TYPE_INVALID、CKR_ATTRIBUTE_VALUE_INVALID、CKR_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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
包裝金鑰的 如果因某種記號特有原因,盡管要包裝的金鑰的
記號會改變哪些類型的金鑰可以使用哪些機制來包裝。 若要分割包裝金鑰,以便它們只能包裝可擷取金鑰的子集,可以在包裝金鑰上使用屬性 |
|---|---|
| 參數 |
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
產生的物件在 當 SPKI 轉換成 MACed SPKI 時,必須使用 CKM_IBM_TRANSPORTKEY 作為解除包裝機制。 此模式會提供原始 SPKI 作為已包裝的資料,並忽略 KEK。
|
|---|---|
| 參數 |
CK_RV m_UnwrapKey (
const CK_BYTE_PTR wrapped, CK_ULONG wrappedlen,
const unsigned char *keK, size_t keKlen,
const unsigned char *macKey, size_t macKeylen,
const unsigned char *pin, size_t pinlen,
const CK_MECHANISM_PTR mech,
const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
unsigned char * unwrapped,size_t * unwrappedlen,
CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen,
target_t 目標
);
|
| 回覆值 | C_UnwrapKey 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
解除包裝金鑰的 新機碼將 部分機制可以修改,或嘗試修改。 在解除包裝金鑰的同時, 如果呼叫 成功呼叫 若要分割解除包裝金鑰,以便它們只能解除包裝金鑰的子集,可以在解除包裝金鑰上使用屬性 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hUnwrappingKey,
CK_BYTE_PTR pWrappedKey,
CK_ULONG ulWrappedKeyLen,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount,
CK_OBJECT_HANDLE_PTR phKey
);
|
| 回覆值 | CKR_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 不代表或不需要階段作業 (二進位大型物件的一部分),因此不使用 EP11 使用更直接明確的方式來解碼,例如列舉實際值,而不是採取較一般的方式。 |
|---|---|
| 參數 |
CK_RV m_GetAttributeValue (
const unsigned char *object, size_t objectlen,
CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
target_t 目標
);
|
| 回覆值 | C_GetAttributeValue 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
對於範本中的每個 (
如果案例 1 適用於任何所要求的屬性,則呼叫需要傳回值 在屬性值為屬性陣列 (例如 錯誤碼 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_SENSITIVE、CKR_ATTRIBUTE_TYPE_INVALID、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OBJECT_HANDLE_INVALID、CKR_OK、CKR_SESSION_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 屬性包裝:請參閱 _GetAttrValue 目前,EP11 只會傳送布林值屬性,其他所有屬性都是由主機處理(並且 EP11 不允許修改陣列,例如 WRAP_TEMPLATE)。 不代表或不需要階段作業 (二進位大型物件的一部分),因此不使用 PKCS #11 |
|---|---|
| 參數 |
CK_RV m_SetAttributeValue (
unsigned char *object, size_t objectlen,
CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
target_t 目標
);
|
| 回覆值 | C_SetAttributeValue 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
某些物件可能未修改。 對此類物件呼叫 在唯讀階段作業期間,只能修改階段作業物件。 範本可以為物件的任何屬性指定可修改的新值。 如果範本指定的屬性值與物件的其他現有屬性不相容,則呼叫會失敗,回覆碼為 並非所有屬性都可以修改; 如需相關資訊,請參閱 PKCS #11 API 規格 的 4.1.2 小節。 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount
);
|
| 回覆值 | CKR_ACTION_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
如果主機上有適用的功能可用,則主機程式庫可能會產生亂數,而不分派給後端。 在現行實作中不會這樣做。 此函數不支援大小查詢。 |
|---|---|
| 參數 |
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); });
加密及解密資料
透過指定加密機制,您可以執行對稱或非對稱加密及解密函數。 您可能需要呼叫一系列子函數來加密或解密資料。 例如,多組件資料加密作業由 EncryptInit、EncryptUpdate 及 EncryptFinal 子作業組成。
EncryptInit
EncryptInit 函數會起始設定加密作業。 您需要先呼叫此函數才能執行加密。
| 說明 | 連結到 EP11 m_EncryptInit,這是 PKCS #11 C_EncryptInit 的實作。 |
|
|---|---|---|
| 參數 |
message EncryptInitRequest {
Mechanism Mech = 2;
bytes Key = 3;
}
message EncryptInitResponse {
bytes State = 1;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
PKCS #11
針對公開金鑰機制, 對於秘密金鑰機制,加密狀態會從
|
|---|---|
| 參數 |
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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
加密金鑰的 在應用程式呼叫 |
|---|---|
| 參數 |
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 函數會加密單一部分資料。 您不需要針對單一組件加密執行 EncryptUpdate 和 EncryptFinal 子作業。 在呼叫此函數之前,請務必先執行 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 不會更新
|
|---|---|
| 參數 |
CK_RV m_Encrypt (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR plain, CK_ULONG plainlen,
CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
target_t 目標
);
|
| 回覆值 | C_Encrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
加密作業必須以
對於部分加密機制,輸入純文字資料具有特定長度限制 (因為該機制只能加密相對較短的純文字片段,或因為該機制的輸入資料必須由整數區塊組成)。 如果未滿足這些限制,則 純文字及密文可以位於相同位置,亦即,如果 對於大部分機制, |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pEncryptedData,
CK_ULONG_PTR pulEncryptedDataLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_INVALID、CKR_DATA_LEN_RANGE、CKR_DEVICE_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 必須從 PKCS #11
|
|---|---|
| 參數 |
CK_RV m_EncryptUpdate (
unsigned char *state, size_t statelen,
CK_BYTE_PTR plain, CK_ULONG plainlen,
CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
target_t 目標
);
|
| 回覆值 | C_EncryptUpdate 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
加密作業必須以
|
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen,
CK_BYTE_PTR pEncryptedPart,
CK_ULONG_PTR pulEncryptedPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_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 不會更新
|
|---|---|
| 參數 |
CK_RV m_EncryptFinal (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
target_t 目標
);
|
| 回覆值 | C_EncryptFinal 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
加密作業必須以 對於部分多部分加密機制,輸入純文字資料具有特定長度限制,因為機制的輸入資料必須由整數區塊組成。 如果未滿足這些限制,則 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pLastEncryptedPart,
CK_ULONG_PTR pulLastEncryptedPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_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 延伸,是 EncryptInit 和 Encrypt 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成加密作業。
| 說明 | 連結到 EP11 m_EncryptSingle |
|
|---|---|---|
| 參數 |
message EncryptSingleRequest {
bytes Key = 1;
Mechanism Mech = 2;
bytes Plain = 3;
}
message EncryptSingleResponse {
bytes Ciphered = 4;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
這針對可感知 XCP 的應用程式而言,一次加密資料的偏好方法。 在功能上,它相當於 如果後端支援常駐金鑰,則金鑰也可以是常駐金鑰控點。 另請參閱:
|
|---|---|
| 參數 |
CK_RV m_EncryptSingle (
const unsigned char *key, size_t keylen,
CK_MECHANISM_PTR mech,
CK_BYTE_PTR plain, CK_ULONG plainlen,
CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
target_t 目標
);
|
| 回覆值 | C_Encrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
程式碼 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 延伸。 此單一呼叫是一個可行的選項,其中需要使用不同的金鑰重新加密大量資料,並略過針對每一個需要重新加密的資料項目執行 DecryptSingle 及 EncryptSingle 功能組合的需要。 它不會將任何狀態傳回至主機,且只會傳回重新加密的資料。
| 說明 | 連結至 EP11 m_ReencryptSingle。 |
|
|---|---|---|
| 參數 |
message ReencryptSingleRequest {
bytes DecKey = 1;
bytes EncKey = 2;
機制 DecMech = 3;
機制 EncMech = 4;
bytes Ciphered = 5;
}
message ReencryptSingleResponse {
已接收位元組 = 6;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
使用原始金鑰來解密資料,然後在雲端 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_Encrypt 及 C_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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
解密金鑰的 在應用程式呼叫 |
|---|---|
| 參數 |
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 函數會解密單一組件中的資料。 您不需要針對單一部分解密執行 DecryptUpdate 和 DecryptFinal 子作業。 在呼叫此函數之前,請務必先執行 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 state, slen 二進位大型物件 (BLOB) 必須從 PKCS #11 |
|---|---|
| 參數 |
CK_RV m_Decrypt (const unsigned char *state, size_t slen,
CK_BYTE_PTR cipher, CK_ULONG clen,
CK_BYTE_PTR plain, CK_ULONG_PTR plen,
target_t 目標
);
|
| 回覆值 | C_Decrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
解密作業需要以
密文和純文字可以位於相同位置,這表示如果 pEncryptedData 和 pData 指向相同位置,就可以接受。 如果輸入密文資料因長度不適當而無法解密,則可能會傳回 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_Decrypt)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedData,
CK_ULONG ulEncryptedDataLen,
CK_BYTE_PTR pData,
CK_ULONG_PTR pulDataLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_ENCRYPTED_DATA_INVALID、CKR_ENCRYPTED_DATA_LEN_RANGE、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、ckr_general_error、ckr_host_memory、ckr_ok、ckr_operation_not_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
|
|---|---|
| 參數 |
CK_RV m_DecryptUpdate (
unsigned char *state, size_t statelen,
CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
target_t 目標
);
|
| 回覆值 | C_DecryptUpdate 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值一章。 |
| 說明 |
解密作業必須以 密文和純文字可以位於相同位置,亦即,如果 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedPart,
CK_ULONG ulEncryptedPartLen,
CK_BYTE_PTR pPart,
CK_ULONG_PTR pulPartLen
);
|
| 回覆值 | CKR_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 不會更新
|
|---|---|
| 參數 |
CK_RV m_DecryptFinal (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
target_t 目標
);
|
| 回覆值 | C_DecryptFinal 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
解密作業必須以 如果輸入密文資料因為長度不適當而無法解密,則可以傳回 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pLastPart,
CK_ULONG_PTR pulLastPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_ENCRYPTED_DATA_INVALID、CKR_ENCRYPTED_DATA_LEN_RANGE、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、ckr_general_error、ckr_host_memory、ckr_ok、ckr_operation_not_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 延伸,是 DecryptInit 和 Decrypt 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成解密作業。
| 說明 | 連結至 EP11 m_DecryptSingle。 |
|
|---|---|---|
| 參數 |
message DecryptSingleRequest {
bytes Key = 1;
Mechanism Mech = 2;
bytes Ciphered = 3;
}
message DecryptSingleResponse {
bytes Plain = 4;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
這針對可感知 XCP 的應用程式而言,一次加密資料的偏好方法。 在功能上,它相當於 如果後端支援常駐金鑰,則金鑰也可以是常駐金鑰控點。 另請參閱:
|
|---|---|
| 參數 |
CK_RV m_DecryptSingle (
const unsigned char *key, size_t keylen,
CK_MECHANISM_PTR mech,
CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
target_t 目標
);
|
| 回覆值 | C_Decrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
程式碼 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)。 您可能需要呼叫一系列子功能來執行簽署作業。 例如,多組件資料簽章作業由 SignInit、SignUpdate 及 SignFinal 子作業組成。
SignInit
SignInit 函數會起始設定簽章作業。 您必須先呼叫此函數,才能執行簽章作業。
| 說明 | 連結至 EP11 m_SignInit,這是 PKCS #11 C_SignInit的實作。 |
|
|---|---|---|
| 參數 |
message SignInitRequest {
Mechanism Mech = 2;
bytes PrivKey = 3;
}
message SignInitResponse {
bytes State = 1;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 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) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
簽章金鑰的 在應用程式呼叫 |
|---|---|
| 參數 |
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 函數會簽署單一部分資料。 您不需要針對單一組件簽章執行 SignUpdate 及 SignFinal 子作業。 在呼叫此函數之前,請務必先執行 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 不會更新
|
|---|---|
| 參數 |
CK_RV m_Sign (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
target_t 目標
);
|
| 回覆值 | C_Sign 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
簽署作業必須以
對於大部分機制, |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_Sign)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pSignature,
CK_ULONG_PTR pulSignatureLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_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 的實作。
|
|---|---|
| 參數 |
CK_RV m_SignUpdate (
unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
target_t 目標
);
|
| 回覆值 | C_SignUpdate 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
簽章作業必須以 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_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 不會更新
|
|---|---|
| 參數 |
CK_RV m_SignFinal (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
target_t 目標
);
|
| 回覆值 | C_SignFinal 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
簽署作業必須以 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pSignature,
CK_ULONG_PTR pulSignatureLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_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 延伸,是 SignInit 和 Sign 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成簽署作業。
| 說明 | 連結至 EP11 m_SignSingle。 |
|
|---|---|---|
| 參數 |
message SignSingleRequest {
bytes PrivKey = 1;
Mechanism Mech = 2;
bytes Data = 3;
}
message SignSingleResponse {
bytes Signature = 4;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
非標準延伸, 這是偏好的簽署方式,不需要額外的來回轉換、加密及解密。 在功能上,
支援 HMAC 和 CMAC 簽章的多重資料要求 (子變式 2 和 3)。 另請參閱: |
|---|---|
| 參數 |
CK_RV m_SignSingle (
const unsigned char *privKey, size_t privKeylen,
CK_MECHANISM_PTR mech,
CK_BYTE_PTR data, CK_ULONG datalen,
CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
target_t 目標
);
|
| 回覆值 | C_Decrypt 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
程式碼 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 針對公開金鑰機制, 如果起始設定 HMAC 作業,則會從 HMAC 金鑰繼承
附註: |
|---|---|
| 參數 |
CK_RV m_VerifyInit (
unsigned char * state,size_t * statelen,
CK_MECHANISM_PTR mech,
const unsigned char *pubKey, size_t pubKeylen,
target_t 目標
);
|
| 回覆值 | C_VerifyInit 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
驗證金鑰的 在應用程式呼叫 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey
);
|
| 回覆值 | CKR_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 函數會驗證單一部分資料上的簽章。 您不需要執行 VerifyUpdate 和 VerifyFinal 子作業,即可進行單一組件驗證。 在呼叫此函數之前,請務必先執行 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 不會更新 資料和簽章的相對順序相反 至
|
|---|---|
| 參數 |
CK_RV m_Verify (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
CK_BYTE_PTR signature, CK_ULONG signaturelen,
target_t 目標
);
|
| 回覆值 | C_Verify 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
驗證作業必須以 成功呼叫
對於大部分機制, |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_Verify)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pSignature,
CK_ULONG ulSignatureLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_INVALID、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID、ckr_signature_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
|
|---|---|
| 參數 |
CK_RV m_VerifyUpdate (
unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
target_t 目標
);
|
| 回覆值 | C_VerifyUpdate 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
驗證作業必須以 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。 |
程式碼 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 不會更新
|
|---|---|
| 參數 |
CK_RV m_VerifyFinal (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR signature, CK_ULONG signaturelen,
target_t 目標
);
|
| 回覆值 | C_VerifyFinal 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
驗證作業必須以 成功呼叫 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pSignature,
CK_ULONG ulSignatureLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DATA_LEN_RANGE、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_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 延伸,是 VerifyInit 和 Verify 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成驗證作業。
| 說明 | 連結至 EP11 m_VerifySingle。 |
|
|---|---|---|
| 參數 |
message VerifySingleRequest {
bytes PubKey = 1;
Mechanism Mech = 2;
bytes Data = 3;
bytes Signature = 4;
}
message VerifySingleResponse {
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
非標準延伸, 這是驗證簽章的偏好方式,不需要額外的來回轉換、加密、解密。 在功能上,
針對公開金鑰機制, 另請參閱: |
|---|---|
| 參數 |
CK_RV m_VerifySingle (
const unsigned char *pubKey, size_t pubKeylen,
CK_MECHANISM_PTR mech,
CK_BYTE_PTR data, CK_ULONG datalen,
CK_BYTE_PTR signature, CK_ULONG signaturelen,
target_t 目標
);
|
| 回覆值 | C_VerifySingle 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
程式碼 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 提供一組函數來建立訊息摘要,其設計旨在保護資料片段的完整性。 您可能需要呼叫一系列子函數來執行摘要作業。 例如,多組件摘要作業由 DigestInit、DigestUpdate 及 DigestFinal 子作業組成。
DigestInit
DigestInit 函數會起始設定訊息摘要作業。 您必須先執行此功能,才能執行摘要作業。
| 說明 | 連結到 EP11 m_DigestInit,這是 PKCS #11 C_DigestInit 的實作。 |
|
|---|---|---|
| 參數 |
message DigestInitRequest {
Mechanism Mech = 2;
}
message DigestInitResponse {
bytes State = 1;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
PKCS #11 建立已包裝的摘要狀態。 附註:支援大小查詢,但是已包裝狀態一律由後端傳回,這與大多數大小查詢不同(後者傳回輸出大小,而不是實際輸出)。 在大小查詢期間,主機只會捨棄傳回的狀態,而報告二進位大型物件大小(在
|
|---|---|
| 參數 |
CK_RV m_DigestInit (
unsigned char * state,size_t * len,
const CK_MECHANISM_PTR mech,
target_t 目標
);
|
| 回覆值 | C_DigestInit 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
在應用程式呼叫 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_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 函數會對單一部分資料進行摘要。 您不需要呼叫 DigestUpdate 及 DigestFinal 函數,即可對單一部分資料進行摘要。 在呼叫此函數之前,請務必先執行 DigestInit。 當您設定參數時,請注意不要將輸入資料的長度指定為零,並將指向輸入資料位置的指標指定為 NULL。
| 說明 | 連結到 EP11 m_Digest,這是 PKCS #11 C_Digest 的實作。 |
|
|---|---|---|
| 參數 |
message DigestRequest {
bytes State = 1;
bytes Data = 2;
}
message DigestResponse {
bytes Digest = 3;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
PKCS #11 如果摘要物件在建立之後剛好有 0 (零) 個位元組附加到它,則在零位元組傳送的任何組合中,它仍然可以執行一次摘要,即使嚴格實作需要拒絕它也一樣。 不會更新 實作可能執行 對主機程式碼中明碼摘要物件的
|
|---|---|
| 參數 |
CK_RV m_Digest (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
target_t 目標
);
|
| 回覆值 | C_Digest 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
摘要作業必須以
輸入資料及摘要輸出可以位於相同位置,亦即,如果 pData 及 pDigest 指向相同位置,則可以正常。
|
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_Digest)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pDigest,
CK_ULONG_PTR pulDigestLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。 |
程式碼 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
另請參閱: |
|---|---|
| 參數 |
CK_RV m_DigestUpdate (
unsigned char *state, size_t statelen,
CK_BYTE_PTR data, CK_ULONG datalen,
target_t 目標
);
|
| 回覆值 | C_DigestUpdate 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
訊息摘要作業必須以 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。 |
程式碼 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
不會更新
|
|---|---|
| 參數 |
CK_RV m_DigestFinal (
const unsigned char *state, size_t statelen,
CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
target_t 目標
);
|
| 回覆值 | C_DigestFinal 回覆值的子集。 如需相關資訊,請參閱 Enterprise PKCS #11 (EP11) 程式庫結構文件的 回覆值 一章。 |
| 說明 |
摘要作業必須以 |
|---|---|
| 參數 |
CK_DEFINE_FUNCTION(CK_RV, C_DigestFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pDigest,
CK_ULONG_PTR pulDigestLen
);
|
| 回覆值 | CKR_ARGUMENTS_BAD、CKR_BUFFER_TOO_SMALL、CKR_CRYPTOKI_NOT_INITIALIZED、CKR_DEVICE_ERROR、CKR_DEVICE_MEMORY、CKR_DEVICE_REMOVED、CKR_FUNCTION_CANCELED、CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY、CKR_OK、CKR_OPERATION_NOT_INITIALIZED、CKR_SESSION_CLOSED、CKR_SESSION_HANDLE_INVALID。 |
程式碼 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 延伸,是 DigestInit 和 Digest 函數的組合。 它可讓您使用單一呼叫而非一系列呼叫來完成摘要作業。
| 說明 | 連結至 EP11 m_DigestSingle。 |
|
|---|---|---|
| 參數 |
message DigestSingleRequest {
Mechanism Mech = 1;
bytes Data = 2;
}
message DigestSingleResponse {
bytes Digest = 3;
}
|
|
| 回覆值 | 將 EP11 錯誤包裝成 message Grep11Error。 |
| 說明 |
非標準延伸, 這針對可感知 XCP 的應用程式而言是對純文字進行摘要的偏好方法。 在功能上, 如果需要對金鑰進行摘要,則必須 使用 不會傳回任何狀態給主機,只會傳回摘要結果。 沒有非 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: