IBM Cloud Docs
加密操作: GREP11 API

加密操作: 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. 中执行的密码术功能。 您可以通过 gRPC API 调用 (也称为 GREP11) 通过 Enterprise PKCS #11 (EP11) 远程访问这些功能来执行加密操作。

有关 GREP11 函数如何与 PKCS #11 和 EP11相关的更多信息,请参阅 GREP11 简介

对于单个加密单元,GREP11 API 最多可以处理 500 个请求/秒。

访问 API

在执行任何 GREP11 API 函数调用之前,需要使用 GREP11 API 端点,服务标识 API 密钥和 IAM 端点进行初始化。 有关更多信息,请参阅 生成 GREP11 API 请求

错误处理

GREP11 依赖于 错误处理的 gRPC 规范。 发生错误时,gRPC 客户机将接收 message Status 协议缓冲区

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

在错误消息中,

  • code 包含状态码,该状态码需要是 google.rpc.Code 字段的枚举类型 (enum) 值。
  • message 包含面向开发者的错误消息(英语)。 任何面向用户的错误消息都需要在 google.rpc.Status.details 字段中进行本地化和发送,或者由用户进行本地化。
  • details 列出了包含错误详细信息的消息。 提供了一组公共消息类型供 API 使用。

GREP11 使用 Detail 字段附加额外的错误代码信息。

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

Code 字段可以强制转换为 PKCS #11中的 CK_RV 值。 此字段包含由 PKCS #11 规范 定义的错误代码或由 EP11定义的供应商扩展。 EP11 仅使用 PKCS #11 所定义的一部分返回值。 有关更多信息,请参阅 Enterprise PKCS #11 库结构 中的 10.1.6 返回值 部分。

在 Golang 中提供了处理错误的 示例

GREP11 函数列表

表中标有星号 (*) 的 PKCS #11 函数由 EP11 over gRPC实现。 其他函数未实现。

表 1. 描述 EP11 over gRPC 中实现的函数
PKCS #11 企业 PKCS #11 通过 gRPC 执行的企业 PKCS #11 描述
C_Initialize 不适用 不适用 初始化 Cryptoki。
C_Finalize 不适用 不适用 清除与 Cryptoki 关联的各种资源。
C_GetInfo 不适用 不适用 获取有关 Cryptoki 的常规信息。
C_GetFunctionList 不适用 不适用 获取 Cryptoki 库函数的入口点。
C_GetSlotList 不适用 不适用 获取系统中槽的列表。
C_GetSlotInfo 不适用 不适用 获取有关特定槽的信息。
C_GetTokenInfo 不适用 不适用 获取有关特定令牌的信息。
C_WaitForSlotEvent 不适用 不适用 等待发生槽事件 (令牌插入,除去等)。
C_GetMechanismList* m_GetMechanismList GetMechanismList 获取令牌支持的机制列表。
C_GetMechanismInfo* m_GetMechanismInfo GetMechanismInfo 获取有关特定机制的信息。
C_InitToken 不适用 不适用 初始化令牌。
C_InitPIN 不适用 不适用 初始化标准用户的 PIN。
C_SetPIN 不适用 不适用 修改当前用户的 PIN。
C_OpenSession 不适用 不适用 打开应用程序与特定令牌之间的连接,或设置应用程序回调以插入令牌。
C_CloseSession 不适用 不适用 关闭会话。
C_CloseAllSessions 不适用 不适用 使用令牌关闭所有会话。
C_GetSessionInfo 不适用 不适用 获取有关会话的信息。
C_GetOperationState 不适用 不适用 获取会话的加密操作状态。
C_SetOperationState 不适用 不适用 设置会话的加密操作状态。
C_Login 不适用 不适用 登录到令牌。
C_Logout 不适用 不适用 从令牌注销。
C_CreateObject 不适用 不适用 创建对象。
C_CopyObject 不适用 不适用 创建对象的副本。
C_DestroyObject 不适用 不适用 销毁对象。
C_GetObjectSize 不适用 不适用 获取对象的大小(以字节为单位)。
C_GetAttributeValue* m_GetAttributeValue GetAttributeValue 获取对象的属性值。
C_SetAttributeValue* m_SetAttributeValue SetAttributeValue 修改对象的属性值。 只能修改布尔属性。
C_FindObjectsInit 不适用 不适用 初始化对象搜索操作。
C_FindObjects 不适用 不适用 持续执行对象搜索操作。
C_FindObjectsFinal 不适用 不适用 完成对象搜索操作。
C_EncryptInit* m_EncryptInit EncryptInit 初始化加密操作。
C_Encrypt* m_Encrypt Encrypt 加密单部分数据。
C_EncryptUpdate* m_EncryptUpdate EncryptUpdate 持续执行多部分加密操作。
C_EncryptFinal* m_EncryptFinal EncryptFinal 完成多部分加密操作。
不适用 m_EncryptSingle EncryptSingle IBM 扩展,Encrypt 的非标准变体。 用于通过一个调用一次性处理数据。 此函数不会将任何状态返回到主机,仅返回加密数据。
不适用 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 完成多部分解密操作。
不适用 m_DecryptSingle DecryptSingle IBM 扩展,Decrypt 的非标准变体。 用于通过一个调用一次性处理数据。 此函数不会将任何状态返回到主机,仅返回解密数据。
C_DigestInit* m_DigestInit DigestInit 初始化消息摘要操作。
C_Digest* m_Digest 摘要 对单部分数据进行摘要。 输入数据的长度不能为零,指向输入数据位置的指针不能为 NULL。
C_DigestUpdate* m_DigestUpdate DigestUpdate 持续执行多部分摘要操作。 输入数据的长度不能为零,指向输入数据位置的指针不能为 NULL。
C_DigestKey 不适用 不适用 对密钥进行摘要。
C_DigestFinal* m_DigestFinal DigestFinal 完成多部分摘要操作。
不适用 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 不适用 不适用 初始化签名操作,其中数据从签名中恢复。
C_SignRecover 不适用 不适用 对单部分数据进行签名,其中数据是从签名中恢复的。
不适用 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 不适用 不适用 初始化验证操作,其中数据是从签名恢复。
C_VerifyRecover 不适用 不适用 验证单部分数据上的签名,其中数据是从签名恢复的。
不适用 m_VerifySingle VerifySingle IBM 扩展,非标准扩展,VerifyInit 和 Verify 的组合。 用于通过一个调用一次性对数据签名或设置 MAC,而不构造中间摘要状态。 此函数不会将任何状态返回到主机,仅返回验证结果。
C_DigestEncryptUpdate 不适用 不适用 持续同时执行多部分摘要和加密操作。
C_DecryptDigestUpdate 不适用 不适用 持续同时执行多部分解密和摘要操作。
C_SignEncryptUpdate 不适用 不适用 持续同时执行多部分签名和加密操作。
C_DecryptVerifyUpdate 不适用 不适用 持续同时执行多部分解密和验证操作。
C_GenerateKey* m_GenerateKey GenerateKey 生成密钥。
C_GenerateKeyPair* m_GenerateKeyPair GenerateKeyPair 生成公用密钥和专用密钥对。
C_WrapKey* m_WrapKey WrapKey 打包(加密)密钥。
C_UnwrapKey* m_UnwrapKey UnwrapKey 解包(解密)密钥。
不适用 不适用 RewrapKeyBlob 在落实新的主密钥时,将当前主密钥所控制的 BLOB 的所有权转移到新的主密钥。 此功能是仅受 GREP11支持的特殊管理命令。
C_DeriveKey* m_DeriveKey DeriveKey 从基本密钥派生密钥。
C_SeedRandom 不适用 不适用 将种子材料添加到随机数字生成器。
C_GenerateRandom* m_GenerateRandom GenerateRandom 生成随机数据。 随机数据的长度不能为零,指向随机数据位置的指针不能为 NULL。 可请求的随机数据的最大长度为 1 百万字节。
C_GetFunctionStatus 不适用 不适用 始终返回 CKR_FUNCTION_NOT_PARALLEL 的旧函数。
C_CancelFunction 不适用 不适用 始终返回 CKR_FUNCTION_NOT_PARALLEL 的旧函数。

支持的机制

机制被称为实现加密操作的过程。 它可能因加密卡中的固件级别而异。 下表显示了当前支持的机制以及它们与公共 GREP11 函数类别的关系。

表 2. 描述受支持的 GREP11 机制
函数组 支持的机制
加密和解密 CKM_RSA_PKCS1,CKM_RSA_PKCS_OAEP1,CKM_AES_ECB,CKM_AES_CBC,CKM_AES_CBC_PAD,CKM_DES3_ECB,CKM_DES3_CBC,CKM_DES3_CBC_PAD
签名和验证 CKM_RSA_PKCS1,CKM_RSA_PKCS_PSS1,CKM_RSA_X9_311,CKM_SHA1_RSA_PKCS,CKM_SHA256_RSA_PKCS,CKM_SHA224_RSA_PKCS,CKM_SHA384_RSA_PKCS,CKM_SHA512_RSA_PKCS,CKM_SHA1_RSA_PKCS_PSS,CKM_SHA224_RSA_PKCS_PSS,CKM_SHA256_RSA_PKCS_PSS,CKM_SHA384_RSA_PKCS_PSS,CKM_SHA512_RSA_PKCS_PSS,CKM_SHA1_RSA_X9_31,CKM_DSA1,CKM_DSA_SHA1,CKM_ECDSA1,CKM_ECDSA_SHA1,CKM_ECDSA_SHA224,CKM_ECDSA_SHA256,CKM_ECDSA_SHA384,CKM_ECDSA_SHA512,CKM_SHA1_HMAC,CKM_SHA256_HMAC,CKM_SHA384_HMAC,CKM_SHA512_HMAC CKM_SHA512_224_HMAC,CKM_SHA512_256_HMAC,CKM_IBM_ED25519_SHA5124,CKM_IBM_ECDSA_OTHER2,CKM_IBM_DILITHIUM3
摘要 CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512, CKM_SHA512_224, CKM_SHA512_256
生成密钥或生成密钥对 CKM_RSA_PKCS_KEY_PAIR_GEN,CKM_RSA_X9_31_KEY_PAIR_GEN,CKM_DSA_KEY_PAIR_GEN,CKM_DSA_PARAMETER_GEN,CKM_EC_KEY_PAIR_GEN (CKM_ECDSA_KEY_PAIR_GEN),CKM_DH_PKCS_KEY_PAIR_GEN,CKM_DH_PKCS_PARAMETER_GEN,CKM_GENERIC_SECRET_KEY_GEN,M_AES_GEN
打包和解包 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_EXTRACTABLE 如果密钥可抽取且可封装,那么值为 CK_TRUE。 EC 专用密钥,RSA 专用密钥,DH 专用密钥,DSA 专用密钥,AES 密钥,DES 密钥,通用密钥
CKA_IBM_PQC_PARAMS 支持量子后密码机制的参数。 对于 Dilithium 机制 CKM_IBM_DILITHIUM,它提供了表示要使用的 Dilithium 算法强度的编组对象标识 (OID)。 目前,仅支持 Dilithium 4 round 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 密钥,通用密钥
可修改的 如果可以修改对象,请设置为 CK_TRUE。 EC 专用密钥,EC 公用密钥,RSA 专用密钥,RSA 公用密钥,DH 专用密钥,DH 公用密钥,DSA 专用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥
CKA_MODULUS_BITS 长度(以模数 n 的位数计)。 RSA 公用密钥
CKA_publIC_EXPONENT 公共指数 e。 RSA 专用密钥
CKA_publIC_KEY_INFO 公用密钥的 SubjectPublicKeyInfo 的 DER 编码。 该值派生自底层公用密钥数据,缺省情况下为空。 RSA 公用密钥,EC 公用密钥
CKA_SIGN 如果密钥支持特征符是数据附录的特征符,那么值为 CK_TRUE。 EC 专用密钥,RSA 专用密钥,DH 专用密钥,DSA 专用密钥,AES 密钥,DES 密钥,通用密钥
CKA_TRUSTED 证书或密钥可受信于已创建的应用程序。 EC 公用密钥,RSA 公用密钥,DH 公用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥
CKA_UNWRAP 如果键支持解包 (可用于解包其他键),那么值为 CK_TRUE。 EC 专用密钥,RSA 专用密钥,DH 专用密钥,DSA 专用密钥,AES 密钥,DES 密钥,通用密钥
CKA_VALUE_LEN 长度(以密钥值的字节数计)。 AES 密钥
CKA_VERIFY 如果密钥支持验证(其中签名是数据的附录),那么值为 CK_TRUE。 EC 公用密钥,RSA 公用密钥,DH 公用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥
CKA_WRAP 如果密钥支持回绕 (可用于回绕其他密钥),那么值为 CK_TRUE。 EC 公用密钥,RSA 公用密钥,DH 公用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥
CKA_WRAP_WITH_TRUSTED 如果只能使用将 CKA_TRUSTED 设置为 CK_TRUE 的回绕键来回绕键,那么值为 CK_TRUE。 缺省值为 CK_FALSE。 EC 专用密钥,RSA 专用密钥,DH 专用密钥,DSA 专用密钥,AES 密钥,DES 密钥,通用密钥

支持的曲线

对于某些机制,EP11 库支持有限类型的曲线。 下表列出了不同机制的受支持曲线名称。 曲线名称中的数字表示受支持的主位计数。

用于生成椭圆曲线 (EC) 键的受支持曲线

当您调用 GenerateKeyPair 函数以生成椭圆曲线 (EC) 键时,支持机制 CKM_EC_KEY_PAIR_GEN。 必须使用 CKA_EC_PARAMS 将曲线名称参数指定为对象标识 (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
施诺尔-齐利卡 ECSG_IBM_ECSDSA_COMPR_MULTI
  • secp256r1
  • secp256k1
  • BP-256R,也称为 brainpoolP256r1
  • BP-256T,也称为 brainpoolP256t1

使用 GREP11 函数执行加密操作

您可以通过调用基于 PKCS #11 规范的 EP11 实现定义的 GREP11 函数来执行加密操作。 以下函数描述是根据 PKCS #11 规范创建的,注释特定于 EP11。 所有参数定义都采用原始形式的 EP11。 有关 EP11的更多信息,请参阅 Enterprise PKCS #11(EP11)库结构

EP11 函数参数映射到可以在以下函数中找到的协议缓冲区类型。 您可以在 Google Developers中了解有关协议缓冲区类型的更多信息。

由于 EP11 库是 PKCS #11 API 库的子集,并且 GREP11 函数是相应 EP11 函数的变体,因此 EP11 和 PKCS #11 的相应函数也会列在 GREP11 函数表中供您参考。

GREP11 支持使用 gRPC 库的任何编程语言。 在当前阶段,API 参考中仅包含 Golang 和 JavaScript 的代码片段或示例。 内容将在以后的阶段中进行扩充。 代码片段基于以下外部 GitHub 存储库,这些存储库提供了使用 GREP11 API 的完整示例。 示例存储库中的某些代码片段引用帮助程序函数。

正在检索受支持的加密算法 

您可以使用以下函数来检索 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,
      目标
    );
    
返回值 C_GetMechanismList 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_GetMechanismList 用于获取令牌支持的机制类型的列表。 SlotID 是令牌槽的标识;pulCount 指向接收机制数的位置。

有两种方法可供应用程序调用 C_GetMechanismList:

  1. 如果 pMechanismListNULL_PTR,那么 C_GetMechanismList 执行的所有操作都是返回机制数 (在 *pulCount中),而不返回机制列表。 在这种情况下,进入 C_GetMechanismList*pulCount 的内容没有任何褒意义,并且该调用会返回值 CKR_OK
  2. 如果 pMechanismList 不是 NULL_PTR,那么 *pulCount 必须包含 pMechanismList指向的缓冲区的大小 (根据 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_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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_REMOVED,CKR_ARGUMENTS_BAD。

代码片段

  • Golang 代码片段

    GetMechanismListRequest := &pb.GetMechanismListRequest {
    }
    
    GetMechanismListResponse, err := cryptoClient.GetMechanismList(context.Background(), GetMechanismListRequest)
    
  • JavaScript 代码片段

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

GetMechanismInfo

GetMechanismInfo 函数用于获取有关特定机制的信息。

描述 绑定到 EP11 m_GetMechanismInfo,这是 PKCS #11 C_GetMechanismInfo 的实现。
参数
    message GetMechanismInfoRequest {
      uint64 Mech = 2;
    }
    message GetMechanismInfoResponse {
      MechanismInfo MechInfo = 3;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述 PKCS #11 C_GetMechanismInfo 的实现。
参数
    CK_RV m_GetMechanismInfo (
      CK_SLOT_ID slot,
      CK_MECHANISM_TYPE mech,
      CK_MECHANISM_INFO_PTR mechInfo,
      目标
    );
    
返回值 C_GetMechanismInfo 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_GetMechanism信息 获取有关令牌可能支持的特定机制的信息。slotID 是令牌槽的标识; 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_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_机械化 ISM_INVALID,CKR_OK,CKR_SLOT_ID_INVALID,CKR_TOKEN_NOT_PRESENT,CKR_TOKEN_NOT_REMOVED,CKR_ARGUMENTS_BAD。

代码片段

  • Golang 代码片段

    GetMechanismInfoRequest := &pb.GetMechanismInfoRequest {
        Mech: ep11.CKM_RSA_PKCS,
    }
    
    GetMechanismInfoResponse, err := cryptoClient.GetMechanismInfo(context.Background(), GetMechanismInfoRequest)
    
  • JavaScript 代码片段

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

生成和派生密钥

GREP11 提供了以下函数来生成对称密钥和非对称密钥。 根据您指定的机制和密钥长度,可以为各种用法生成各种类型的密钥。 您还可以从基本密钥派生密钥,以将密钥延伸到较长的密钥或获取所需格式的密钥。

GenerateKey

GenerateKey 函数生成用于对称加密的密钥。

描述 绑定到 EP11 m_GenerateKey,这是 PKCS #11 C_GenerateKey 的实现。
参数
    message GenerateKeyRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> 模板 = 6;
    }
    message GenerateKeyResponse {
      字节 KeyBytes = 4;
      bytes CheckSum = 5;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_GenerateKey 的实现。

TDES 密钥是使用正确的奇偶性校验生成的,主机无法观察到该奇偶性校验。 但是需要它才能实现正确的互操作性: 其他 PKCS #11 实现需要拒绝具有奇偶性校验问题的 DES 密钥。

如果对象与会话绑定,那么 (pin,plen) 必须由 Login 返回到该会话。 将 pin 保留为 NULL 会创建一个未绑定到登录会话的公共对象。

(key,klen) 返回密钥 blob。(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 结构写入为 cleartext 输出 (即,不是 blob)。

pin BLOB 是从 Login 输出的。

PKCS #11 phKey 未映射到任何 EP11 参数。 (主机库必须将打包的密钥绑定到句柄。)

参数
    CK_RV m_GenerateKey (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
      const unsigned char *pin, size_t pinlen,
      Unsigned char * key,size_t * keylen,
      Unsigned char *checkSum,size_t *checkSumlen
      目标
      );
    
返回值 C_GenerateKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_GenerateKey 生成密钥或一组域参数,从而创建新对象。hSession 是会话的句柄; pMechanism 指向生成机制; pTemplate 指向新密钥或一组域参数的模板; ulCount 是模板中的属性数; phKey 指向接收新密钥或一组域参数的句柄的位置。

如果生成机制用于域参数生成,那么 CKA_CLASS 属性的值为 CKO_DOMAIN_PARAMETERS; 否则,它的值为 CKO_secret T_KEY

由于要生成的密钥或域参数的类型在生成机制中是隐式的,因此模板不需要提供密钥类型。 如果它提供了与生成机制不一致的密钥类型,那么 C_GenerateKey 将失败并返回错误代码 CKR_TEMPLATE_CONSISTENT。 以相同方式处理 CKA_CLASS 属性。

如果对 C_GenerateKey 的调用无法支持为其提供的精确模板,那么它将失败并返回而不创建对象。

通过成功调用 C_GenerateKey 创建的对象将 CKA_LOCAL 属性设置为 CK_TRUE

参数
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)(
      CK_SESSION_HANDLE hSession
      CK_MECHANISM_PTR pMechanism,
      CK_ATTRIBUTE_PTR pTemplate,
      CK_ULONG ulCount,
      CK_OBJECT_HANDLE_PTR phKey
      );
    
返回值 CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_初始化,CKR_CURVE_NOT_SUPPORTED,CKR_DEVICE_ERROR,CKRR_DEVICE_MEMORY,CKRR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKRR_HOST_MEMORY,CKRR_机械化,CKR_R_PARAM_INVALID,CKR_CR_CR_R_R_DER_R_DER_R_ CKR_TEMPLATE_CONSISTENT,CKR_TOKEN_WRITE_PROTECTED 和 CKR_USER_NOT_LOGGED_IN。

代码片段

  • Golang 代码片段

    // Setup the AES key's attributes
    keyTemplate := ep11.EP11Attributes{
        ep11.CKA_VALUE_LEN:   keyLen / 8,
        ep11.CKA_WRAP:        false,
        ep11.CKA_UNWRAP:      false,
        ep11.CKA_ENCRYPT:     true,
        ep11.CKA_DECRYPT:     true,
        ep11.CKA_EXTRACTABLE: false,
    }
    
    GenerateKeyRequest := &pb.GenerateKeyRequest{
        Mech:     &pb.Mechanism{Mechanism: ep11.CKM_AES_KEY_GEN},
        Template: util.AttributeMap(keyTemplate),
    }
    
    GenerateKeyResponse, err := cryptoClient.GenerateKey(context.Background(), GenerateKeyRequest)
    
  • JavaScript 代码片段

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

GenerateKeyPair

GenerateKeyPair 函数生成公用密钥和专用密钥对。

描述 绑定到 EP11 m_GenerateKeyPair,这是 PKCS #11 C_GenerateKeyPair 的实现。
参数
    message GenerateKeyPairRequest {
      Mechanism Mech = 1;
      map<uint64,AttributeValue> PrivKey模板 = 7;
      map<uint64,AttributeValue> PubKey模板 = 8;
      }
    message GenerateKeyPairResponse {
      字节 PrivKey字节 = 5;
      字节 PubKey字节 = 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) 必须由 Login 返回到该会话。 保留 pin NULL 将创建一个公共对象,该对象在登录会话中尚存。

将打包的专用密钥返回到 (key, klen),将公用密钥以设置了 MAC 的 ASN.1/DER 结构在 (pubkey, pklen) 中返回。

具有特殊注释的以下受支持参数组合超出 PKCS #11记录的范围:

RSA 密钥拒绝低于 17 (0x11) 的公共指数。 控制点可以进一步限制已接受的最小值。 Fergmat4 指数 (0x10001) 由特定控制点进行控制,与 FIPS 186-3(第 B.3.1 节)的公共指数限制一致。

EC 键 (CKM_EC_KEY_PAIR_GEN): 可以将曲线参数指定为 OID 或符号名称 (我们的 namedCurve 变体)。 对于 NIST 曲线,受支持的符号名称为 "P-nnn" (nnn 是受支持的主位计数,192-521),对于常规 BP 曲线,为 "BP-nnnR"。 (名称必须作为 ASCII 字符串提供,并且不能以零终止。)

DSA 密钥 (CKM_DSA_KEY_PAIR_GEN):将 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 BLOB 是从 Login 输出的。

PKCS #11 hSession 未映射到任何 EP11 参数。 (调用未与任何会话直接关联。)

PKCS #11 phPublicKey 未映射到任何 EP11 参数。 (主机库必须将公用密钥 (SPKI) 与句柄相关联。)

PKCS #11 phPrivateKey 未映射到任何 EP11 参数。 (主机库必须将专用密钥与句柄相关联。)

参数
    CK_RV m_GenerateKeyPair (
      CK_MECHANISM_PTR mech,
      CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen,
      CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen,
      const unsigned char *pin, size_t pinlen,
      Unsigned char *privKey,size_t *privKeylen
      无符号字符 *pubKey,size_t *pubKeylen,
      目标
      );
    
返回值 C_GenerateKeyPair 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_GenerateKey对 生成公用和专用密钥对,从而创建新的密钥对象。hSession 是会话的句柄; pMechanism 指向密钥生成机制; pPublicKeyTemplate 指向公用密钥的模板; ulPublicKeyAttributeCount 是公用密钥模板中的属性数; pPrivateKeyTemplate 指向专用密钥的模板; ulPrivateKeyAttributeCount 是专用密钥模板中的属性数; phPublicKey 指向接收新公用密钥句柄的位置; phPrivateKey 指向接收新专用密钥句柄的位置。

由于要生成的密钥类型隐含在密钥对生成机制中,因此模板不需要提供密钥类型。 如果其中一个模板提供了与密钥生成机制不一致的密钥类型,那么 C_GenerateKey对 将失败并返回错误代码 CKR_TEMPLATE_CONSISTENTCKA_CLASS 属性的处理方式类似。

如果对 C_GenerateKeyPair 的调用无法支持提供给它的精确模板,那么它将失败并返回而不创建任何键对象。

C_GenerateKeyPair 的调用从不只创建一个键并返回。 调用可能会失败,并且不会创建密钥; 或者可以成功,并创建匹配的公用和专用密钥对。

通过成功调用 C_GenerateKeyPair 创建的密钥对象将 CKA_LOCAL 属性设置为 CK_TRUE

请仔细注意 C_GenerateKeyPair 自变量的顺序。 最后两个自变量的顺序与原始 Cryptoki V1.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_已对,CKR_CURVE_NOT_SUPPORTED,CKR_DEVICE_ERROR,CKRR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_DOMAIN_PARAMS_INVALID,CKR_FUNCTION_CANCEL,CKR_FUNCTION_ON_FAILED,CKR_GENERAL_ERROR,CKRR_HOST_MEMORY,CKRR_R_R_R_消耗无效,CKRR_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_S,CK_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_K_K_K_K_K_K_K_K_K__K_ CKR_TEMPLATE_NOT,CKR_TEMPLATE_CONSISTENT,CKR_TOKEN_WRITE_PROTECTED 和 CKR_USER_NOT_LOGGED_IN。

代码片段

  • Golang 代码片段

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

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

DeriveKey

DeriveKey 函数用于从基本密钥派生密钥。

描述 绑定到 EP11 m_DeriveKey,这是 PKCS #11 C_DeriveKey 的实现。
参数
    message DeriveKeyRequest {
        Mechanism Mech = 1;
        bytes BaseKey = 3;
        bytes Data = 4;
        map<uint64,AttributeValue> 模板 = 8;
    }
    message DeriveKeyResponse {
        字节 NewKey字节 = 6;
        bytes CheckSum = 7;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_DeriveKey 的实现。

basekey,bklen BLOB 必须从 PKCS #11 hBaseKey 参数映射。

PKCS #11 hSession 未映射到任何 EP11 参数。 (调用未与任何会话直接关联。)

PKCS #11 phKey 未映射到任何 EP11 参数。 (主机库必须将返回的密钥绑定到句柄。)

参数
    CK_RV m_DeriveKey (
        CK_MECHANISM_PTR mech,
        CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        const unsigned char *baseKey, size_t baseKeylen,
        const unsigned char *data, size_t datalen,
        const unsigned char *pin, size_t pinlen,
        无符号字符 *newKey,size_t *newKeylen,
        Unsigned char *checkSum,size_t *checkSumlen
        目标
    );
    
返回值 C_DeriveKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_DeriveKey 从基本密钥派生密钥,从而创建新的密钥对象。hSession 是会话的句柄; pMechanism 指向用于指定密钥派生的结构; hBaseKey 是基本密钥的句柄; pTemplate 指向新密钥的模板; ulAttributeCount 是模板中的属性数; 并且 phKey 指向接收派生密钥句柄的位置。

基本键的 CKA_SENSITIVECKA_ALWAYS_SENSITIVECKA_EXTRACTABLEKA_NEVER_EXTRACTABLE 属性的值会影响这些属性可以为新派生的键保留的值。 请参阅 PKCS #11 API 规范 的 5.16.2 部分中每个特定密钥派生机制的描述,以了解此类型的任何约束。

如果对 C_DeriveKey 的调用无法支持提供给它的精确模板,那么它将失败并返回而不创建任何键对象。

成功调用 C_DeriveKey 所创建的密钥对象将 CKA_LOCAL 属性设置为 CK_FALSE

参数
    CK_DEFINE_FUNCTION(CK_RV, C_DeriveKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hBaseKey,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_已对,CKR_CURVE_NOT_SUPPORTED,CK_DEVICE_ERROR,CKRR_DEVICE_MEMORY,CKRR_DEVICE_REMOVED,CKR_DOMAIN_PARAMS_INVALID,CKR_FUNCTION_的话,CKR_GENERAL_ERROR,CKRRR_HOST_MEMORY,CKR_KEY_HANDLE_INVALID CKR_SESSION_HANDLE_INVALID,CKR_SESSION_READ_ONLY,CKR_TEMPLATE_NOT,CKR_TEMPLATE_CONSISTENT,CKR_TOKEN_WRITE_PROTECTED 和 CKR_USER_NOT_LOGGED_IN。

代码片段

  • Golang 代码片段

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

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

保护密钥

您可以保护密钥,方法是对其进行包装,然后通过调用解包功能对密钥进行解密。

WrapKey

WrapKey 函数用于打包(加密)密钥。

描述 绑定到 EP11 m_WrapKey,这是 PKCS #11 C_WrapKey 的实现。
参数
    message WrapKeyRequest {
        bytes Key = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 4;
    }
    message WrapKeyResponse {
        bytes Wrapped = 5;
    }
    
返回值 将 EP11 错误打包成 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,
        目标
    );
    
返回值 C_WrapKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_WrapKey 包装 (即,加密) 专用密钥或密钥。hSession 是会话的句柄; pMechanism 指向包装机制; hWrappingKey 是包装密钥的句柄; hKey 是要包装的密钥的句柄; pWrappedKey 指向接收包装密钥的位置; 并且 pulWrappedKeyLen 指向接收打包密钥长度的位置。

C_WrapKey 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

打包密钥的 CKA_WRAP 属性(指示密钥是否支持打包)必须为 CK_TRUE。 此外,要打包的密钥的 CKA_EXTRACTABLE 属性也必须为 CK_TRUE

如果出于某种特定于令牌的原因,尽管要打包的密钥的 CKA_EXTRACTABLE 属性设置为 CK_TRUE,也无法对该密钥打包,那么 C_WrappKey 会失败,错误代码为 CKR_KEY_NOT_WRAPABLE。 如果密钥完全由于其长度而无法使用指定的打包密钥和机制进行打包,那么 C_WrappKey 会失败,错误代码为 CKR_KEY_SIZE_RANGE

C_WrapKey 可以用于以下情境:

  • 使用支持加密和解密的公用密钥打包任何密钥。
  • 使用其他任何密钥打包任何密钥。 必须考虑密钥大小和机制强度,否则令牌可能不允许操作。
  • 使用任何密钥打包专用密钥。

标记会有所不同,哪些类型的密钥可以使用哪些机制进行打包。

要对包装键进行分区,以便它们只能包装一部分可抽取的键,可以在包装键上使用属性 CKA_WRAP_TEMPLATE 来指定可与要包装的键的属性进行比较的属性集。 如果所有属性都根据属性匹配的 C_FindObject 规则进行匹配,那么合并操作将继续执行。 此属性的值为属性模板,大小为模板中的项数乘以 CK_ATTRIBUTE 的大小。 如果未提供此属性,那么可接受任何模板。 如果属性不存在,那么不会对其进行检查。 如果尝试合并键时发生任何属性不匹配,那么该函数将返回 CKR_KEY_HANDLE_INVALID

参数
    CK_DEFINE_FUNCTION(CK_RV, C_WrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hWrappingKey,
        CK_OBJECT_HANDLE hKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG_PTR pulWrappedKeyLen
    );
    
返回值 Ckr_arguments_bad,ckr_buffer_too_small,ckr_cryptoki_not_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERsionAL_ERROR,CKR_HOST_MEMORY,CKR_KEY_HANDLE_INVALID,CKR_KEY_KEY_NOT_WRAPPABLE,CKR_KEY_SIZE_RANGE,CKR_KEY_KEY_UNEXTRACTABLE,R_SESIS_SESR_MEMORY CKR_WRAPPING_KEY_SIZE_RANGE 和 CKR_WRAPPING_KEY_TYPE_CONSISTENT。

代码片段

  • Golang 代码片段

    WrapKeyRequest := &pb.WrapKeyRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_RSA_PKCS},
        KeK:  GenerateKeyPairResponse.PubKeyBytes,
        Key:  GenerateKeyResponse.KeyBytes,
    }
    
    WrapKeyResponse, err := cryptoClient.WrapKey(context.Background(), WrapKeyRequest)
    
  • JavaScript 代码片段

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

UnwrapKey

UnwrapKey 函数用于解包(解密)密钥。

描述 绑定到 EP11 m_UnwrapKey,这是 PKCS #11 C_UnwrapKey 的实现。
参数
    message UnwrapKeyRequest {
        bytes Wrapped = 1;
        bytes KeK = 2;
        bytes MacKey = 3;
        Mechanism Mech = 5;
        map<uint64,AttributeValue> 模板 = 9;
    }
    message UnwrapKeyResponse {
        字节 UnwrappedBytes = 7;
        bytes CheckSum = 8;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_UnwrapKey 的实现。

uwmech 指定用于解密打包数据的加密机制。ptemplkey (pair) 参数列表,用于指定如何将已解包的数据变换为新密钥 (必须包含 CKA_KEY_TYPE)。

生成的对象在 (unwrapped, uwlen) 下作为 BLOB 返回。 对称密钥在 (csum, cslen) 下返回其密钥校验和(3 字节);公用密钥对象在 (csum, cslen) 中将其公用密钥作为 SPKI 返回。 这两种格式都后跟一个 4 字节的大尾数值,并对已解包密钥的位计数编码。

当 SPKI 转换为 MACed SPKI 时,必须使用 CKM_IBM_TRANSPORTKEY 作为解包机制。 此方式将原始 SPKI 作为打包的数据提供,并忽略 KEK。

UnwrapKey 生成奇偶性校验调整的 DES 密钥 (在 BLOB 中),但允许输入不正确的奇偶性校验。

参数
    CK_RV m_UnwrapKey (
        const CK_BYTE_PTR wrapped, CK_ULONG wrappedlen,
        const unsigned char *keK, size_t keKlen,
        const unsigned char *macKey, size_t macKeylen,
        const unsigned char *pin, size_t pinlen,
        const CK_MECHANISM_PTR mech,
        const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen,
        unsigned char * unwrap,size_t * unwrappedlen,
        CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen,
        目标
    );
    
返回值 C_UnwrapKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_UnwrapKey 解包 (即解密) 已打包的密钥,从而创建新的专用密钥或密钥对象。hSession 是会话的句柄; pMechanism 指向解包机制; hUnwrappingKey 是解包密钥的句柄; pWrappedKey 指向打包密钥; ulWrappedKeyLen 是打包密钥的长度; pTemplate 指向新密钥的模板; ulAttributeCount 是模板中的属性数; phKey 指向接收已恢复密钥的句柄的位置。

解包密钥的 CKA_UNWRAP 属性(指示密钥是否支持解包)必须为 CK_TRUE

新密钥将 CKA_ALWAYS_SENSITIVE 属性设置为 CK_FALSE,将 CKA_NEVER_EXTRACTABLE 属性设置为 CK_FALSE。 缺省情况下,CKA_EXTRACTABLE 属性设置为 CK_TRUE

某些机制可以修改或尝试修改。 在解包密钥的同时,pMechanism 结构的内容。

如果对 C_UnwrapKey 的调用无法支持为其提供的精确模板,那么它将失败并返回而不创建任何密钥对象。

通过成功调用 C_UnwrapKey 创建的密钥对象将其 CKA_LOCAL 属性设置为 CK_FALSE

要对解包键进行分区,以便它们只能解包一部分键,可以在解包键上使用属性 CKA_UNWRAP_TEMPLATE 来指定要解包的键的属性集。 如果属性与用户提供的属性模板不冲突,那么在 pTemplate中,将继续执行解包操作。 此属性的值为属性模板,大小为模板中的项数乘以 CK_ATTRIBUTE 的大小。 如果此属性在解包键上不存在,那么不会添加任何额外的属性。 如果尝试解包密钥时发生任何属性冲突,那么函数 SHALL 将返回 CKR_TEMPLATE_CONSISTENT

参数
    CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism,
        CK_OBJECT_HANDLE hUnwrappingKey,
        CK_BYTE_PTR pWrappedKey,
        CK_ULONG ulWrappedKeyLen,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulAttributeCount,
        CK_OBJECT_HANDLE_PTR phKey
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,CKR_CURVE_NOT_SUPPORTED,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKRR_DEVICE_REMOVED,CKR_DOMAIN_PARAMS_INVALID,CKR_FUNCTION_FAILED,CKRR_FUNCTION_RE_R_XX_ENCODE_CASE_ONE,CKR_R_R_R_ACTIVE,CK_R_R_CR_CR_DEV_DEV_DEV_C_DEV_DEV_DEV_R_DEV_DEV_DEV_DEV_CM_,C_C_C_C_C_C_CM_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C CKR_TEMPLATE_NOT,CKR_TEMPLATE_CONSISTENT,CKR_TOKEN_WRITE_PROTECTED,CKR_UNWRAPPING_KEY_HANDLE_INVALID,CKR_UNWRAPPING_KEY_SIZE_RANGE,CKR_UNWRAPPING_KEY_TYPE_CONSISTENT,CKR_USER_NOT_LOGGED_IN,CKR_WRAPPED_KEY_INVALID,CKR_PED_KEY_LEN_RANGE。

代码片段

  • Golang 代码片段

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

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

RewrapKeyBlob

RewrapKeyBlob 函数使用 HSM 中包含的新落实主密钥对生成的密钥二进制大对象 (BLOB) 进行重新加密。 只有在使用新的已落实主密钥完成 HSM 后,才能使用重新加密的密钥。

此功能是仅受 GREP11支持的特殊管理命令。 RewrapKeyBlob 没有对应的 EP11 函数或 PKCS #11 函数。

描述 在落实新的主密钥时,将当前主密钥所控制的 BLOB 的所有权转移到新的主密钥。
参数
    消息 RewrapKeyBlobRequest {
    	字节 WrappedKey = 1;
    }
    消息 RewrapKeyBlobResponse {
    	字节 RewrappedKey = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error

代码片段

  • Golang 代码片段

    RewrapKeyBlobRequest := &pb.RewrapKeyBlobRequest {
        WrappedKey: GenerateKeyResponse.KeyBytes,
    }
    
    // Rewrap an existing key blob using the HSM's new wrapping key
    RewrapKeyBlobResponse, err := cryptoClient.RewrapKeyBlob(context.Background(),  RewrapKeyBlobRequest)
    
  • JavaScript 代码片段

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

检索和修改键的属性 

生成密钥或执行密钥操作时,将属性模板定义为其中一个参数。 您可以检索特定密钥对象的属性,并在创建密钥后修改某些属性。

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 的实现。

不表示或不需要会话 (blob 的一部分),因此不使用 hSession 参数。

EP11 使用更直接的方法进行解码,例如,枚举实际值而不是更通用的值。

参数
    CK_RV m_GetAttributeValue (
        const unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        目标
    );
    
返回值 C_GetAttributeValue 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_GetAttributeValue 获取对象的一个或多个属性的值。hSession 是会话的句柄; hObject 是对象的句柄; pTemplate 指向一个模板,该模板指定要获取的属性值,并接收属性值; ulCount 是模板中的属性数。

对于模板中的每个 (type, pValue, ulValueLen) 三元组,C_GetAttributeValue 会执行以下算法:

  1. 如果由于对象敏感或不可抽取而无法显示对象的指定属性 (即类型字段指定的属性),那么将修改该三元组中的 ulValueLen 字段以保存值 CK_UNAVAILABLE_INFORMATION
  2. 或者,如果对象的指定值无效(对象不具有此类属性),那么该三元组中的 ulValueLen 字段会修改为保存值 CK_UNAVAILABLE_INFORMATION
  3. 或者,如果 pValue 字段的值为 NULL_PTR,那么 ulValueLen 字段将修改为保存对象的指定属性的精确长度。
  4. 否则,如果 ulValueLen 中指定的长度足以容纳对象的指定属性的值,那么会将该属性复制到位于 pValue的缓冲区中,并修改 ulValueLen 字段以容纳该属性的准确长度。
  5. 或者,ulValueLen 值会修改为保存值 CK_UNAVAILABLE_INFORMATION

如果案例 1 适用于任何请求的属性,那么调用需要返回值 CKR_ATTRIBUTE_SENSITIVE。 如果案例 2 适用于任何请求的属性,那么调用需要返回值 CKR_ATTRIBUTE_TYPE_INVALID。 如果案例 5 适用于任何请求的属性,那么调用需要返回值 CKR_BUFFER_TOO_SMALL。 与往常一样,如果这些错误代码中有多个适用,那么 Cryptoki 可以返回其中的任何错误代码。 仅当它们都不适用于任何请求的属性时,才会返回 CKR_OK

对于其值为属性数组的属性 (例如 CKA_WRAP_TEMPLATE) 的特殊情况,其中传递的属性 pValue 不为 NULL,那么如果数组中元素的 pValue 为 NULL_PTR,那么数组中元素的 ulValueLen 设置为所需的长度。 如果数组中元素的 pValue 不是 NULL_PTR,那么数组中属性的 ulValueLen 元素必须反映出相应的 pValue 指向的空间,如果有足够的空间,那么将填充 pValue。 因此,在调用 C_GetAttributeValue 以获取此类数组值之前,初始化缓冲区的内容很重要。 如果数组中的任何 ulValueLen 不够大,那么会将其设置为 CK_UNAVAILABLE_INFORMATION,并且该函数会返回 CKR_BUFFER_TOO_SMALL,就像在 pTemplate 自变量中的属性具有 ulValueLen 过小时一样。 属性类型的 CKF_ARRAY_ATTRIBUTE 集可识别其值为属性数组的任何属性。

错误代码 CKR_ATTRIBUTE_SENSITIVECKR_ATTRIBUTE_TYPE_INVALIDCKR_BUFFER_TOO_SMALL 不表示 C_GetAttributeValue的真实错误。 如果对 C_GetAttributeValue 的调用返回这三个值中的任何一个,那么调用必须已处理提供给 C_GetAttributeValue的模板中的每个属性。 调用 C_GetAttributeValue 可以返回其值的模板中的每个属性都由调用 C_GetAttributeValue返回。

参数
    CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
        CK_SESSION_HANDLE hSession,
        CK_OBJECT_HANDLE hObject,
        CK_ATTRIBUTE_PTR pTemplate,
        CK_ULONG ulCount
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_SENSITIVE,CKR_ATTRIBUTE_TYPE_INVALID,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OBJECT_HANDLE_INVALID,CKR_OK,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

    // Only retrieve supported EP11 attributes
    attributeList := ep11.EP11Attributes{
        ep11.CKA_DECRYPT: false, // attribute where you would like to retrieve its current value
    }
    
    GetAttributeValueRequest := &pb.GetAttributeValueRequest{
        Object:     GenerateKeyPairResponse.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    
    GetAttributeValueResponse, err := cryptoClient.GetAttributeValue(context.Background(), GetAttributeValueRequest)
    
  • JavaScript 代码片段

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

SetAttributeValue

SetAttributeValue 函数用于修改对象的属性值。

描述 绑定到 EP11 m_SetAttributeValue,这是 PKCS #11 C_SetAttributeValue 的实现。
参数
    message SetAttributeValueRequest {
        bytes Object = 1;
        map<uint64,AttributeValue> 属性 = 3;
    }
    message SetAttributeValueResponse {
        bytes Object = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_SetAttributeValue 的实现。

属性打包:请参阅 _GetAttrValue

目前,EP11 仅发送布尔值属性,其他所有属性都由主机处理(并且 EP11 不允许修改数组,例如 WRAP_TEMPLATE)。

不表示或不需要会话 (blob 的一部分),因此不使用 PKCS #11 hSession 参数。

参数
    CK_RV m_SetAttributeValue (
        unsigned char *object, size_t objectlen,
        CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen,
        目标
    );
    
返回值 C_SetAttributeValue 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_SetAttributeValue 修改对象的一个或多个属性的值。hSession 是会话的句柄; hObject 是对象的句柄; pTemplate 指向一个模板,该模板指定要修改的属性值及其新值; ulCount 是模板中的属性数。

某些对象可能未修改。 对此类对象调用 C_SetAttributeValue 会生成 CKR_ACTION_DAMAGED 错误代码。 应用程序可以查阅对象的 CKA_MODIALLOWED 属性以确定是否可以修改对象。

在只读会话期间,只能修改会话对象。

模板可以为可修改的对象的任何属性指定新值。 如果模板指定与对象的其他现有属性不兼容的属性值,那么调用将失败,返回码为 CKR_TEMPLATE_CONSISTENT

并非所有属性都可以修改; 请参阅 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_PROTECTED,CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OBJECT_HANDLE_INVALID,CKR_OK,CKRRRR_SESSION_SES_CLOSED,_CK_CK_R_CK_FAILED

代码片段

  • Golang 代码片段

    // Only set supported R/W EP11 attributes
    attributeList := ep11.EP11AttributeP{
        CKA_DECRYPT: true,
    }
    
    SetAttributeValueRequest := &pb.SetAttributeValueRequest{
        Object:     GenerateKeyPair.PrivKeyBytes,
        Attributes: util.AttributeMap(attributeList),
    }
    SetAttributeValueResponse, err := cryptoClient.SetAttributeValue(context.Background(), SetAttributeValueRequest)
    
  • JavaScript 代码片段

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

生成随机数据

您可以生成高质量的随机数据,例如初始化值 (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,
        目标
    );
    
返回值 C_GenerateRandom 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述 C_GenerateRandom 生成随机或伪随机数据。hSession 是会话句柄; pRandomData 指向接收随机数据的位置; ulRandomLen 是要生成的随机或伪随机数据的长度 (以字节计)。
参数
    CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pRandomData,
        CK_ULONG ulRandomLen
    );
    
返回值 CKR_ARGUMENTS_BAD CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED, CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY, CKR_OK,CKR_OPERATION_ACTIVE,CKR_RANDOM_NO_RNG,CKR_SESSION_CLOSED CKR_SESSION_HANDLE_INVALID,CKR_USER_NOT_LOGGED_IN。

代码片段

  • Golang 代码片段

    GenerateRandomRequest := &pb.GenerateRandomRequest {
      Len: 1024,
    }
    
    GenerateRandomResponse, err := cryptoClient.GenerateRandom(context.Background(), GenerateRandomRequest)
    
  • JavaScript 代码片段

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

对数据进行加密和解密

通过指定加密机制,可以执行对称或非对称加密和解密功能。 您可能需要调用一系列子函数来加密或解密数据。 例如,多部分数据加密操作由 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) blob 可以是公用密钥对象,也可以是密钥 blob。 密钥类型必须与 pmech 一致。

对于公用密钥机制,(key, klen) 必须包含 SPKI。 此 SPKI 通过 MAC 密钥保护其完整性,如 GenerateKeyPairUnwrappKey 返回的内容。 创建加密状态时,没有会话限制。

对于密钥机制,“加密”状态从 (key,klen)继承对象会话限制。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。

(key, klen) 必须是密钥 BLOB。

参数
    CK_RV m_EncryptInit (
        无符号字符 * 状态,size_t * 状态,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        目标
    );
    
返回值 C_EncryptInit 返回值的子集。 有关更多信息,请参阅 Enterprise 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_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_REMOVED,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKRR_HOST_MEMORY,CKR_KEY_FUNCTION_NOT_总数,CKR_KEY_KEY_HANDLE_INVALID,CKRR_KEY_SIZE_RANGE,CKR_KEY_TYPE_CONSISTENT,USER_R_机械化 ISM_INVALID,CKR_ACTIV_ACTIV_,CR_SESSION_R_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_

代码片段

  • Golang 代码片段

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

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

Encrypt

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 BLOB 必须从 PKCS #11 hSession 参数映射。

state BLOB 是从 EncryptInit 输出的。

参数
    CK_RV m_Encrypt (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        目标
    );
    
返回值 C_Encrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_Encrypt 对单部分数据进行加密。hSession 是会话的句柄; pData 指向数据; ulDataLen 是数据的长度 (以字节计); pEncryptedData 指向接收加密数据的位置; pulEncryptedDataLen 指向保存加密数据的长度 (以字节计) 的位置。

C_Encrypt 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

必须使用 C_EncryptInit初始化加密操作。 除非对 C_Encrypt 的调用返回 CKR_BUFFER_TOO_SMALL 或成功调用 (即返回 CKR_OK) 以确定保存密文所需的缓冲区长度,否则该调用始终终止活动加密操作。

C_Encrypt 不能用于终止多部分操作,并且必须在 C_EncryptInit 之后进行调用,不能介入 C_EncryptUpdate 调用之间。

对于某些加密机制,输入纯文本数据具有一定的长度约束 (因为该机制只能加密相对较短的纯文本片段,或者因为该机制的输入数据必须由整数块组成)。 如果未满足这些约束,那么 C_Encrypt 将失败,返回码为 CKR_DATA_LEN_RANGE

纯文本和密文可以位于同一位置,即,如果 pDatapEncryptedData 指向同一位置,那么正常。

对于大多数机制,C_Encrypt 等效于一系列 C_EncryptUpdate 操作后跟 C_EncryptFinal

参数
    CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pEncryptedData,
        CK_ULONG_PTR pulEncryptedDataLen
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,CKR_DATA_INVALID,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,HANDLERR_SESSION_SESSION_SESSION_

代码片段

  • Golang 代码片段

    plainText := "Encrypt this message"
    
    EncryptRequest := &pb.EncryptRequest {
        State: EncryptInitResponse.State,
        Plain: plainText,
    }
    
    EncryptResponse, err := cryptoClient.Encrypt(context.Background(), EncryptRequest)
    
  • JavaScript 代码片段

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

EncryptUpdate

EncryptUpdate 函数用于持续执行多部分加密操作。 在调用此函数之前,请确保先运行 EncryptInit

描述 绑定到 EP11 m_EncryptUpdate,这是 PKCS #11 C_EncryptUpdate 的实现。
参数
    message EncryptUpdateRequest {
        bytes State = 1;
        bytes Plain = 2;
    }
    message EncryptUpdateResponse {
        bytes State = 1;
        bytes Ciphered = 3;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_EncryptUpdate 的实现。

必须从 PKCS #11 hSession 参数映射 stateslen blob。

state BLOB 是从 EncryptInit 输出的。

参数
    CK_RV m_EncryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG plainlen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        目标
    );
    
返回值 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 以外的错误,那么该调用会终止当前加密操作。

plaintextciphertext 可以位于同一位置,即,如果 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

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

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

EncryptFinal

EncryptFinal 函数用于完成多部分加密操作。

描述 绑定到 EP11 m_EncryptFinal,这是 PKCS #11 C_EncryptFinal 的实现。
参数
    message EncryptFinalRequest {
        bytes State = 1;
    }
    message EncryptFinalResponse {
        bytes Ciphered = 2;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_EncryptFinal 的实现。

不更新 (state, slen)

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。

state BLOB 是从 EncryptInitEncryptUpdate 输出的。

参数
    CK_RV m_EncryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen,
        目标
    );
    
返回值 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

    EncryptFinalRequest := &pb.EncryptFinalRequest {
        State: EncryptUpdateResponse.State,
    }
    
    EncryptFinalResponse, err := cryptoClient.EncryptFinal(context.Background(), EncryptFinalRequest)
    
  • JavaScript 代码片段

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

EncryptSingle

EncryptSingle 函数通过一次调用在一次传递中处理数据。 它不会向主机返回任何状态,而仅返回已加密的数据。 此函数是对标准 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 BLOB 是从 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,
        目标
    );
    
返回值 C_Encrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

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

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

ReencryptSingle

通过 ReencryptSingle 功能,您可以使用原始密钥对数据进行解密,然后在云 HSM 内的单个调用中使用其他密钥对原始数据进行加密。 用于此操作的密钥类型可以相同也可以不同。 此功能是对标准 PKCS #11 规范的 IBM EP11 扩展。 此单一调用是一个可行的选项,在此选项中,需要使用不同的密钥对大量数据进行重新加密,而无需对需要重新加密的每个数据项执行 DecryptSingleEncryptSingle 函数的组合。 它不会向主机返回任何状态,而仅返回重新加密的数据。

描述 绑定到 EP11 m_ReencryptSingle
参数
    消息 ReencryptSingle请求 {
        字节 DecKey = 1;
        字节 EncKey = 2;
        机制 DecMech = 3;
        机制 EncMech = 4;
        已引信的字节数 = 5;
    }
    消息 ReencryptSingle响应 {
        接收方的字节数 = 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,
        目标
    );
    
返回值 C_EncryptC_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

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

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

DecryptInit

DecryptInit 函数用于初始化解密操作。 您需要先调用此函数以执行解密。

描述 绑定到 EP11 m_DecryptInit,这是 PKCS #11 C_DecryptInit 的实现。
参数
    message DecryptInitRequest {
        Mechanism Mech = 2;
        bytes Key = 3;
    }
    message DecryptInitResponse {
        bytes State = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述 PKCS #11 C_DecryptInit 的实现。
参数
    CK_RV m_DecryptInit (
        无符号字符 * 状态,size_t * 状态,
        CK_MECHANISM_PTR mech,
        const unsigned char *key, size_t keylen,
        目标
    );
    
返回值 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_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CK_GENERAL_ERROR,CKRR_HOST_MEMORY,CKR_KEY_FUNCTION_NOT_总数,CKR_KEY_HANDLE_INVALID,CKR_KEY_KEY_SIZE_RANGE,CKR_KEY_KEY_TYPE_CONSISTENT,CKRR_机械化,CKR_PARAM__R_的话

代码片段

  • Golang 代码片段

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

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

Decrypt

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 BLOB 是从 DecryptInit 输出的。

参数
    CK_RV m_Decrypt (const unsigned char *state, size_t slen,
        CK_BYTE_PTR cipher, CK_ULONG clen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plen,
        目标
    );
    
返回值 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 调用。

密文和纯文本可以位于同一位置,这意味着如果 pEncrypted数据和 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_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_ENCRYPTED_DATA_INVALID,CKR_ENCRYPTED_DATA_LEN_RANGE,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_USER_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_SESSION_IN

代码片段

  • Golang 代码片段

    DecryptRequest := &pb.DecryptRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext, // encrypted data from a previous encrypt operation
    }
    
    DecryptResponse, err := cryptoClient.Decrypt(context.Background(), DecryptRequest)
    
  • JavaScript 代码片段

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

DecryptUpdate

DecryptUpdate 函数用于持续执行多部分解密操作。 在调用此函数之前,请确保先运行 DecryptInit

描述 绑定到 EP11 m_DecryptUpdate,这是 PKCS #11 C_DecryptUpdate 的实现。
参数
    message DecryptUpdateRequest {
        bytes State = 1;
        bytes Ciphered = 2;
    }
    message DecryptUpdateResponse {
        bytes State = 1;
        bytes Plain = 3;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_DecryptUpdate 的实现。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。

state BLOB 是从 DecryptInit 输出的。

参数
    CK_RV m_DecryptUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR ciphered, CK_ULONG cipheredlen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        目标
    );
    
返回值 C_DecryptUpdate 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值章节。
描述

C_DecryptUpdate 继续执行多部分解密操作,处理另一个加密数据部分。hSession 是会话的句柄; pEncryptedPart 指向加密数据部分; ulEncryptedPartLen 是加密数据部分的长度; pPart 指向接收恢复数据部分的位置; pulPartLen 指向保存恢复数据部分的长度的位置。

C_DecryptUpdate 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

解密操作必须使用 C_DecryptInit进行初始化。 此函数可以连续调用任意次数。 如果调用 C_DecryptUpdate 生成除 CKR_BUFFER_TOO_SMALL 以外的错误,那么该调用会终止当前解密操作。

密文和纯文本可以位于同一位置,即,如果 pEncryptedPartpPart 指向同一位置,那么可以执行此操作。

参数
    CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pEncryptedPart,
        CK_ULONG ulEncryptedPartLen,
        CK_BYTE_PTR pPart,
        CK_ULONG_PTR pulPartLen
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CK_GENERAL_ERROR,CKRR_HOST_MEMORY,CKR_KEY_FUNCTION_NOT_总数,CKR_KEY_HANDLE_INVALID,CKR_KEY_KEY_SIZE_RANGE,CKR_KEY_KEY_TYPE_CONSISTENT,CKRR_机械化,CKR_PARAM__R_的话

代码片段

  • Golang 代码片段

    // Use DecryptUpdate if you would like to breakup
    // the decrypt operation into multiple suboperations
    DecryptUpdateRequest1 := &pb.DecryptUpdateRequest{
        State:    DecryptInitResponse.State,
        Ciphered: ciphertext[:16], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest1)
    
    plaintext := DecryptUpdateResponse.Plain[:]
    
    DecryptUpdateRequest2 := &pb.DecryptUpdateRequest{
        State:    DecryptUpdateResponse.State,
        Ciphered: ciphertext[16:], // encrypted data from a previous encrypt operation
    }
    
    DecryptUpdateResponse, err := cryptoClient.DecryptUpdate(context.Background(), DecryptUpdateRequest2)
    
    plaintext = append(plaintext, DecryptUpdateResponse.Plain...)
    
  • JavaScript 代码片段

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

DecryptFinal

DecryptFinal 函数用于完成多部分解密操作。

描述 绑定到 EP11 m_DecryptFinal,这是 PKCS #11 C_DecryptFinal 的实现。
参数
    message DecryptFinalRequest {
        bytes State = 1;
    }
    message DecryptFinalResponse {
        bytes Plain = 2;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_DecryptFinal 的实现。

不更新 (state, slen)

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。

state BLOB 是从 DecryptInitDecryptUpdate 输出的。

参数
    CK_RV m_DecryptFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR plain, CK_ULONG_PTR plainlen,
        目标
    );
    
返回值 C_DecryptFinal 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_DecryptFinal 完成多部分解密操作。hSession 是会话的句柄; pLastPart 指向接收上次恢复数据部分的位置 (如果有); pulLastPartLen 指向保存上次恢复数据部分的长度的位置。

C_DecryptFinal 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

解密操作必须使用 C_DecryptInit进行初始化。 对 C_DecryptFinal 的调用始终会终止活动解密操作,除非它返回 CKR_BUFFER_TOO_SMALL 或成功调用 (即 返回 CKR_OK) 以确定保存纯文本所需的缓冲区长度。

如果输入密文数据由于长度不正确而无法解密,那么可以返回 CKR_ENCRYPTED_DATA_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_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_ENCRYPTED_DATA_INVALID,CKR_ENCRYPTED_DATA_LEN_RANGE,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_USER_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_SESSION_IN

代码片段

  • Golang 代码片段

    DecryptFinalRequest := &pb.DecryptFinalRequest {
      State: DecrypUpdateResponse.State,
    }
    
    DecryptFinalResponse, err := cryptoClient.DecryptFinal(context.Background(), DecryptFinalRequest)
    
  • JavaScript 代码片段

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

DecryptSingle

DecryptSingle 函数通过一次调用在一次传递中处理数据。 它不会向主机返回任何状态,而仅返回已解密的数据。 此函数是对标准 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 BLOB 是从 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,
        目标
    );
    
返回值 C_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

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

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

对数据进行签名和验证

GREP11 提供了一组用于对数据进行签名并验证签名或消息认证代码 (MAC) 的函数。 您可能需要调用一系列子函数来执行签名操作。 例如,多部分数据签名操作由 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 (
        无符号字符 * 状态,size_t * 状态,
        CK_MECHANISM_PTR mech,
        const unsigned char *privKey, size_t privKeylen,
        目标
    );
    
返回值 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_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CK_GENERAL_ERROR,CKRR_HOST_MEMORY,CKR_KEY_FUNCTION_NOT_总数,CKR_KEY_HANDLE_INVALID,CKR_KEY_KEY_SIZE_RANGE,CKR_KEY_KEY_TYPE_CONSISTENT,CKRR_机械化,CKR_PARAM__R_的话

代码片段

  • Golang 代码片段

    SignInitRequest := &pb.SignInitRequest {
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
    }
    
    SignInitResponse, err := cryptoClient.SignInit(context.Background(), SignInitRequest)
    
  • JavaScript 代码片段

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

签名

Sign 函数用于对单部分数据签名。 您不需要对单部分特征符执行 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 BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 SignInit 输出的。

参数
    CK_RV m_Sign (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        目标
    );
    
返回值 C_Sign 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_Sign 对单个部件中的数据进行签名,其中签名是数据的附录。hSession 是会话的句柄; pData 指向数据; ulDataLen 是数据的长度; pSignature 指向接收签名的位置; pulSignatureLen 指向保存签名长度的位置。

C_Sign 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

必须使用 C_SignInit初始化签名操作。 除非对 C_Sign 的调用返回 CKR_BUFFER_TOO_SMALL 或成功调用 (即返回 CKR_OK的调用) 以确定保存签名所需的缓冲区长度,否则该调用始终终止活动签名操作。

C_Sign 不能用于终止多部分操作,并且必须在 C_SignInit 之后进行调用,不能介入 C_SignUpdate 调用之间。

对于大多数机制,C_Sign 等效于一系列 C_SignUpdate 操作后跟 C_SignFinal

参数
    CK_DEFINE_FUNCTION(CK_RV, C_Sign)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG_PTR pulSignatureLen
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,CKR_DATA_INVALID,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_已取消,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,HANDLERR_SESSION_SESSION_USER_

代码片段

  • Golang 代码片段

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignRequest := &pb.SignRequest{
        State: SignInitResponse.State,
        Data:  msgHash[:],
    }
    
    // Sign the data
    SignResponse, err := cryptoClient.Sign(context.Background(), SignRequest)
    
  • JavaScript 代码片段

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

SignUpdate

SignUpdate 函数用于持续执行多部分签名操作。 在调用此函数之前,请确保先运行 SignInit

描述 绑定到 EP11 m_SignUpdate,这是 PKCS #11 C_SignUpdate 的实现。
参数
    message SignUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message SignUpdateResponse {
        bytes State = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_SignUpdate 的实现。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 SignInit 输出的。

参数
    CK_RV m_SignUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        目标
    );
    
返回值 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID,CKR_USER_NOT_LOGGED_IN。

代码片段

  • Golang 代码片段

    // Use SignUpdate if you would like to breakup
    // the sign operation into multiple suboperations
    SignUpdateRequest1 := &pb.SignUpdateRequest {
        State: SignInitResponse.State,
        Data:  msgHash[:16],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest1)
    
    SignUpdateRequest2 := &pb.SignUpdateRequest {
        State: SignUpdateResponse.State,
        Data:  msgHash[16:],
    }
    
    SignUpdateResponse, err := cryptoClient.SignUpdate(context.Background(), SignUpdateRequest2)
    
  • JavaScript 代码片段

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

SignFinal

SignFinal 函数用于完成多部分签名操作。

描述 绑定到 EP11 m_SignFinal,这是 PKCS #11 C_SignFinal 的实现。
参数
    message SignFinalRequest {
        bytes State = 1;
    }
    message SignFinalResponse {
        bytes Signature = 2;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_SignFinal 的实现。

不更新 (state, slen)

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 SignInitSignUpdate 输出的。

参数
    CK_RV m_SignFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        目标
    );
    
返回值 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_GESION_SESSION_HANDLE_INVALID,CKr_XX_ENCODE_CASE_ONE,ckrr_

代码片段

  • Golang 代码片段

    SignFinalRequest := &pb.SignFinalRequest {
        State: SignUpdateResponse.State,
    }
    
    SignFinalResponse, err := cryptoClient.SignFinal(context.Background(), SignFinalRequest)
    
  • JavaScript 代码片段

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

SignSingle

SignSingle 函数通过一次调用来对数据进行一次签名或 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 等效于 SignInit 直接后跟 Sign

(key, klen) BLOB 和 pmech 机制必须能够一起传递到 SignInit

支持 HMAC 和 CMAC 签名的多数据请求 (子变体 2 和 3)。

另请参阅:SignInitSignVerifySingle

参数
    CK_RV m_SignSingle (
        const unsigned char *privKey, size_t privKeylen,
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen,
        目标
    );
    
返回值 C_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

    msgHash := sha256.Sum256([]byte("This data needs to be signed"))
    SignSingleRequest := &pb.SignSingleRequest {
        PrivKey: GenerateKeyPairResponse.PrivKeyBytes,
        Mech:    &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:    msgHash[:],
    }
    
    SignSingleResponse, err := cryptoClient.SignSingle(context.Background(), SignSingleRequest)
    
  • JavaScript 代码片段

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

VerifyInit

VerifyInit 函数用于初始化验证操作。 您需要先调用此函数以验证签名。

描述 绑定到 EP11 m_VerifyInit,这是 PKCS #11 C_VerifyInit 的实现。
参数
    message VerifyInitRequest {
        Mechanism Mech = 2;
        bytes PubKey = 3;
    }
    message VerifyInitResponse {
        bytes State = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_VerifyInit 的实现。 在给定密钥 BLOB (key, klen) 的情况下,初始化 (state, slen) 中的验证会话状态。 密钥 BLOB 可以是公用密钥对象,也可以是 HMAC 密钥字节。 密钥 BLOB 类型必须与 pmech 一致。

对于公用密钥机制,(key, klen) 必须包含 SPKI。 此 SPKI CKA_UNWRAP 可以是 MACed (例如 GenerateKeyPair先前返回的内容) 或仅 SPKI 本身 (如果从外部源 (例如证书) 获取)。

如果初始化 HMAC 操作,那么会从 HMAC 密钥继承 Verify 对象的会话限制。 由于 SPKI 未绑定到会话,因此公用密钥验证状态与会话无关。

key,klen BLOB 必须从 PKCS #11 hKey 参数映射。

: SignInitVerifyInit 是内部 与 HMAC 和其他对称性 /MAC 机制相同。

参数
    CK_RV m_VerifyInit (
        无符号字符 * 状态,size_t * 状态,
        CK_MECHANISM_PTR mech,
        const unsigned char *pubKey, size_t pubKeylen,
        目标
    );
    
返回值 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_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_FAILED,CK_GENERAL_ERROR,CKRR_HOST_MEMORY,CKR_KEY_FUNCTION_NOT_总数,CKR_KEY_HANDLE_INVALID,CKR_KEY_KEY_SIZE_RANGE,CKR_KEY_KEY_TYPE_CONSISTENT,CKRR_机械化,CKR_PARAM__R_的话

代码片段

  • Golang 代码片段

    VerifyInitRequest := &pb.VerifyInitRequest {
      Mech:   &pb.Mechanism{Mechanism: ep11.CKM_SHA1_RSA_PKCS},
      PubKey: GenerateKeyPairResponse.PubKeyBytes,
    }
    
    VerifyInitResponse, err := cryptoClient.VerifyInit(context.Background(), VerifyInitRequest)
    
  • JavaScript 代码片段

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

验证

Verify 函数用于验证单部分数据上的签名。 您不需要对单部分验证执行 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 BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 VerifyInit 输出的。

参数
    CK_RV m_Verify (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        目标
    );
    
返回值 C_Verify 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_Verify 用于验证单部分操作中的特征符,其中特征符是数据的附录。hSession 是会话的句柄; pData 指向数据; ulDataLen 是数据的长度; pSignature 指向签名; ulSignatureLen 是签名的长度。

必须使用 C_VerifyInit初始化验证操作。 调用 C_Verify 始终会终止活动验证操作。

成功调用 C_Verify 需要返回值 CKR_OK (指示提供的签名有效) 或 CKR_SIGNATURE_INVALID (指示提供的签名无效)。 如果该签名纯粹基于其长度而无效,那么需要返回 CKR_SIGNATURE_LEN_RANGE。 在上述任何情况下,都会终止活动签名操作。

C_Verify 不能用于终止多部分操作,并且必须在 C_VerifyInit 之后进行调用,不能介入 C_VerifyUpdate 调用之间。

对于大多数机制,C_Verify 等效于一系列 C_VerifyUpdate 操作后跟 C_VerifyFinal

参数
    CK_DEFINE_FUNCTION(CK_RV, C_Verify)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pSignature,
        CK_ULONG ulSignatureLen
    );
    
返回值 Ckr_arguments_bad,ckr_cryptoki_not_初始化,ckr_data_invalid,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化 CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_SIGNAT_INVALID

代码片段

  • Golang 代码片段

    VerifyRequest := &pb.VerifyRequest {
        State:     VerifyInitResponse.State,
        Data:      msgHash[:],
        Signature: SignResponse.Signature,
    }
    
    VerifyResponse, err := cryptoClient.Verify(context.Background(), VerifyRequest)
    
  • JavaScript 代码片段

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

VerifyUpdate

VerifyUpdate 函数用于持续执行多部分验证操作。 在调用此函数之前,请确保先运行 VerifyInit

描述 绑定到 EP11 m_VerifyUpdate,这是 PKCS #11 C_VerifyUpdate 的实现。
参数
    message VerifyUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message VerifyUpdateResponse {
        bytes State = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_VerifyUpdate 的实现。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 VerifyInit 输出的。

参数
    CK_RV m_VerifyUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        目标
    );
    
返回值 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

    // Use VerifyUpdate if you would like to breakup
    // the verify operation into multiple suboperations
    VerifyUpdateRequest1 := &pb.VerifyUpdateRequest {
      State: VerifyInitResponse.State,
      Data:  msgHash[:16],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest1)
    
    VerifyUpdateRequest2 := &pb.VerifyUpdateRequest {
      State: VerifyUpdateResponse.State,
      Data:  msgHash[16:],
    }
    
    VerifyUpdateResponse, err := cryptoClient.VerifyUpdate(context.Background(), VerifyUpdateRequest2)
    
  • JavaScript 代码片段

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

VerifyFinal

VerifyFinal 函数用于完成多部分验证操作。

描述 绑定到 EP11 m_VerifyFinal,这是 PKCS #11 C_VerifyFinal 的实现。
参数
    message VerifyFinalRequest {
        bytes State = 1;
        bytes Signature = 2;
    }
    message VerifyFinalResponse {
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_VerifyFinal 的实现。

不更新 (state, slen)

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 VerifyInitVerifyUpdate 输出的。

参数
    CK_RV m_VerifyFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR signature, CK_ULONG signaturelen,
        目标
    );
    
返回值 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_初始化,CKR_DATA_LEN_RANGE,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID,CKR_SIGNATURE_NAT_INVALID,R_

代码片段

  • Golang 代码片段

    VerifyFinalRequest := &pb.VerifyFinalRequest {
        State:     VerifyUpdateResponse.State,
        Signature: SignResponse.Signature,
    }
    
    VerifyFinalResponse, err := cryptoClient.VerifyFinal(context.Background(), VerifyFinalRequest)
    
  • JavaScript 代码片段

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

VerifySingle

VerifySingle 函数通过一次调用来对数据进行一次签名或 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 等效于 VerifyInit 后跟 Verify

(key, klen) BLOB 和 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,
        目标
    );
    
返回值 C_VerifySingle 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

    VerifySingleRequest := &pb.VerifySingleRequest {
        PubKey:    GenerateKeyPairResponse.PubKeyByytes,
        Mech:      &pb.Mechanism{Mechanism: ep11.CKM_SHA256_RSA_PKCS},
        Data:      msgHash[:],
        Signature: SignSingleResponse.Signature,
    }
    
    VerifySingleResponse, err := cryptoClient.VerifySingle(context.Background(), VerifySingleRequest)
    
  • JavaScript 代码片段

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

通过消息摘要保护数据完整性

GREP11 提供了一组用于创建消息摘要的函数,这些摘要旨在保护一段数据的完整性。 您可能需要调用一系列子函数来执行摘要操作。 例如,多部分摘要操作由 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 状态足够小,因此不会产生明显的传输开销。

在大小查询期间,主机直接废弃返回的状态,而报告 BLOB 大小(在 len 中)。 返回 blob 时,将根据返回的大小检查 len

state,len BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将 BLOB 绑定到会话。)

参数
    CK_RV m_DigestInit (
        unsigned char * state,size_t * len,
        const CK_MECHANISM_PTR mech,
        目标
    );
    
返回值 C_DigestInit 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_DigestInit 初始化消息摘要操作。hSession 是会话的句柄; pMechanism 指向摘要机制。

在应用程序调用 C_DigestInit之后,应用程序可以调用 C_Digest 来对单个部件中的数据进行摘要; 或者调用 C_DigestUpdate 零次或多次,后跟 C_DigestFinal来对多个部件中的数据进行摘要。 在应用程序使用对 C_DigestC_DigestFinal 的调用来获取消息摘要之前,消息摘要操作处于活动状态。 要处理额外数据 (单部分或多部分),应用程序必须再次调用 1C_DigestInit1

参数
    CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
        CK_SESSION_HANDLE hSession,
        CK_MECHANISM_PTR pMechanism
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_机械化 ISM_INVALID,CKR_机械化 ISM_PARAM_INVALID,CKR_OK,CKR_OPERATION_USER_E,ckr_pin_到期,ckr_session_closed,USER_r_session_handle_IN

代码片段

  • Golang 代码片段

    DigestInitRequest := &pb.DigestInitRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
    }
    
    DigestInitResponse, err := cryptoClient.DigestInit(context.Background(), DigestInitRequest)
    
  • JavaScript 代码片段

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

摘要

Digest 函数用于对单部分数据进行摘要。 您不需要调用 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 调用主机代码中的 cleartext 摘要对象,完全绕过 HSM 后端。 此选项可能对主机代码可视,也可能不可视,并且不会影响操作的安全性 (因为清除对象可能不会摘要敏感数据)。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 state BLOB 是从 DigestInit 输出的。

参数
    CK_RV m_Digest (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        目标
    );
    
返回值 C_Digest 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。
描述

C_Digest 对单个部件中的数据进行摘要。hSession 是会话的句柄,pData 指向数据; ulDataLen 是数据的长度; pDigest 指向接收消息摘要的位置; pulDigestLen 指向保存消息摘要长度的位置。

C_Digest 使用 PKCS #11 API 规范 的 5.2 部分中描述的关于生成输出的约定。

必须使用 C_DigestInit初始化摘要操作。 对 C_Digest 的调用始终会终止活动摘要操作,除非它返回 CKR_BUFFER_TOO_SMALL 或成功调用 (即返回 CKR_OK的调用) 以确定保存消息摘要所需的缓冲区长度。

C_Digest 不能用于终止多部分操作,并且必须在 C_DigestInit 之后进行调用,不能介入 C_DigestUpdate 调用之间。

输入数据和摘要输出可以位于同一位置,即,如果 pData 和 pDigest 指向同一位置,那么正常。

C_Digest 等效于一系列 C_DigestUpdate 操作后跟 C_DigestFinal

参数
    CK_DEFINE_FUNCTION(CK_RV, C_Digest)(
        CK_SESSION_HANDLE hSession,
        CK_BYTE_PTR pData,
        CK_ULONG ulDataLen,
        CK_BYTE_PTR pDigest,
        CK_ULONG_PTR pulDigestLen
    );
    
返回值 CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

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

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

DigestUpdate

DigestUpdate 函数用于持续执行多部分摘要操作。 在调用此函数之前,请确保先运行 DigestInit。 设置参数时,请注意不要将输入数据的长度指定为零,而将指向输入数据位置的指针指定为 NULL。

描述 绑定到 EP11 m_DigestUpdate,这是 PKCS #11 C_DigestUpdate 的实现。
参数
    message DigestUpdateRequest {
        bytes State = 1;
        bytes Data = 2;
    }
    message DigestUpdateResponse {
        bytes State = 1;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_DigestUpdate 的实现。

DigestUpdate 是多态的, 同时接受已打包或清除的摘要对象,以相同格式更新状态。

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。 (主机库必须将会话映射到存储的状态。)

state BLOB 是从 DigestInitDigestUpdateDigestKey 输出的。

另请参阅:DigestInit

参数
    CK_RV m_DigestUpdate (
        unsigned char *state, size_t statelen,
        CK_BYTE_PTR data, CK_ULONG datalen,
        目标
    );
    
返回值 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_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

    // Use DigestUpdate if you would like to breakup
    // the digest operation into multiple suboperations
    DigestUpdateRequest1 := &pb.DigestUpdateRequest {
        State: DigestInitResponse.State,
        Data:  digestData[:16],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest1)
    
    DigestUpdateRequest2 := &pb.DigestUpdateRequest {
        State: DigestUpdateResponse.State,
        Data:  digestData[16:],
    }
    
    DigestUpdateResponse, err := cryptoClient.DigestUpdate(context.Background(), DigestUpdateRequest2)
    
  • JavaScript 代码片段

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

DigestFinal

DigestFinal 函数用于完成多部分摘要操作。

描述 绑定到 EP11 m_DigestFinal,这是 PKCS #11 C_DigestFinal 的实现。
参数
    message DigestFinalRequest {
        bytes State = 1;
    }
    message DigestFinalResponse {
        bytes Digest = 2;
    }
    
返回值 将 EP11 错误打包成 message Grep11Error
描述

PKCS #11 C_DigestFinal 的实现。

DigestFinal 是多态函数,接受打包的摘要对象或明文摘要对象。

不更新 (state, slen)

state,slen BLOB 必须从 PKCS #11 hSession 参数映射。

state BLOB 是从 DigestInitDigestUpdateDigestKey 输出的。

参数
    CK_RV m_DigestFinal (
        const unsigned char *state, size_t statelen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        目标
    );
    
返回值 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_初始化,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY,CKR_DEVICE_REMOVED,CKR_FUNCTION_CANCEL,CKR_FUNCTION_FAILED,CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_OPERATION_NOT_初始化,CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID。

代码片段

  • Golang 代码片段

    DigestFinalRequest := &pb.DigestFinalRequest {
        State: DigestUpdateResponse.State,
    }
    
    DigestFinalResponse, err := cryptoClient.DigestFinal(context.Background(), DigestFinalRequest)
    
  • JavaScript 代码片段

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

DigestSingle

DigestSingle 函数通过一次调用在一次传递中对数据进行摘要,而无需构造中间摘要状态和不必要的双向传递。 此函数是对标准 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,因为此函数不会处理密钥 BLOB。

不会将任何状态返回到主机,仅返回摘要结果。 没有非 PKCS #11 参数,因为所有内容都直接通过 PKCS #11 调用来使用。

参数
    CK_RV m_DigestSingle (
        CK_MECHANISM_PTR mech,
        CK_BYTE_PTR data, CK_ULONG datalen,
        CK_BYTE_PTR digest, CK_ULONG_PTR digestlen,
        目标
    );
    
返回值 C_DigestSingle 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档返回值 章节。

代码片段

  • Golang 代码片段

    digestData := []byte("Create a digest for this string")
    DigestSingleRequest := &pb.DigestSingleRequest {
        Mech: &pb.Mechanism{Mechanism: ep11.CKM_SHA256},
        Data: digestData,
    }
    
    DigestSingleResponse, err := cryptoClient.DigestSingle(context.Background(), DigestSingleRequest)
    
  • JavaScript 代码片段

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

代码示例

GREP11 API 支持使用 gRPC 库的编程语言。 为您提供了两个样本 GitHub 存储库,用于测试 GREP11 API: