加密操作: 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实现。 其他函数未实现。
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 函数类别的关系。
函数组 | 支持的机制 |
---|---|
加密和解密 | 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 函数 (例如 EncryptUpdate
,DecryptUpdate
和 DigestUpdate
) 的单部分操作。
2: 此机制仅可用于 GREP11 SignSingle
和 VerifySingle
操作。
3: 此机制不受 IBM 4768 加密卡支持,并且不可用于 SignUpdate
和 VerifyUpdate
操作。
4: 此机制支持单部分 (SignInit
,Sign
,VerifyInit
,Verify
),SignSingle
和 VerifySingle
操作。
受支持的属性和密钥类型
GREP11 属性定义用于设置如何使用和访问对象的对象特征。 下表显示了受支持的属性及其与各种受支持密钥类型的关系。
属性 | 描述 | 受支持的密钥类型 |
---|---|---|
CKA_CHECK_VALUE | 密钥的校验和 | AES 密钥,DES 密钥 |
CKA_COPYABLE | 如果设置为 CKA_TRUE,那么可以使用 PKCS#11 C_CopyObject 函数复制对象 | EC 专用密钥,EC 公用密钥,RSA 专用密钥,RSA 公用密钥,DH 专用密钥,DH 公用密钥,DSA 专用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥 |
CKA_DECRYPT | 如果密钥支持解密,那么值为 CK_TRUE。 | EC 专用密钥,RSA 专用密钥,DH 专用密钥,DSA 专用密钥,AES 密钥,DES 密钥,通用密钥 |
CKA_DERIVE | 如果密钥支持密钥派生 (可以从此密钥派生其他密钥),那么值为 CK_TRUE。 缺省值为 CK_FALSE。 | EC 专用密钥,EC 公用密钥,RSA 专用密钥,RSA 公用密钥,DH 专用密钥,DH 公用密钥,DSA 专用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥 |
CKA_EC_PARAMS (CKA_ECDSA_PARAMS) | ANSI X9.62 参数值的 DER 编码。 | EC 专用密钥,EC 公用密钥 |
CKA_ENCRYPT | 如果密钥支持加密,那么值为 CK_TRUE。 | EC 公用密钥,RSA 公用密钥,DH 公用密钥,DSA 公用密钥,AES 密钥,DES 密钥,通用密钥 |
CKA_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_GenerateKey 或 C_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。
GREP11 机制 | 支持的曲线类型 | 受支持的曲线名称 |
---|---|---|
CKM_EC_KEY_PAIR_GEN | 美国国家标准技术学会(NIST)曲线 |
|
CKM_EC_KEY_PAIR_GEN | 常规脑池(BP)曲线 |
|
CKM_EC_KEY_PAIR_GEN | 扭曲的脑池(BP)曲线 |
|
CKM_EC_KEY_PAIR_GEN | 高效密码术(SEC)曲线标准 |
|
CKM_EC_KEY_PAIR_GEN | Edwards 曲线 |
|
用于加密数字资产和生成签名的受支持曲线
与数字资产和数字签名相关的机制支持以下曲线。
标准和方案 | GREP11 机制 | 支持的曲线类型 | 受支持的曲线名称 |
---|---|---|---|
BIP32/BIP44 | CKM_IBM_BTC_DERIVE | 高效密码术(SEC)曲线标准 |
|
SLIP10 | CKM_IBM_BTC_DERIVE | 美国国家标准技术学会(NIST)曲线 |
|
SLIP10 | CKM_IBM_BTC_DERIVE | 高效密码术(SEC)曲线标准 |
|
SLIP10 | CKM_IBM_BTC_DERIVE | Edwards 曲线 |
|
EdDSA | CKM_IBM_ED25519_SHA512 | Edwards 曲线 |
|
施诺尔 | CKM_IBM_ECDSA_OTHER | 高效密码术(SEC)曲线标准 |
|
施诺尔 | CKM_IBM_ECDSA_OTHER | 美国国家标准技术学会(NIST)曲线 |
|
施诺尔 | CKM_IBM_ECDSA_OTHER | 常规脑池(BP)曲线 |
|
施诺尔 | CKM_IBM_ECDSA_OTHER | 扭曲的脑池(BP)曲线 |
|
施诺尔 | ECSG_IBM_ECSDSA_S256 |
|
|
施诺尔-齐利卡 | ECSG_IBM_ECSDSA_COMPR_MULTI |
|
使用 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) 库结构文档的 返回值 章节。 |
描述 |
有两种方法可供应用程序调用
由于 |
---|---|
参数 |
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) 库结构文档的 返回值 章节。 |
描述 |
|
---|---|
参数 |
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 TDES 密钥是使用正确的奇偶性校验生成的,主机无法观察到该奇偶性校验。 但是需要它才能实现正确的互操作性: 其他 PKCS #11 实现需要拒绝具有奇偶性校验问题的 DES 密钥。 如果对象与会话绑定,那么
仅当机制需要键长度 (即 DSA 和 DH 参数生成会忽略 DSA,DH 参数 (
PKCS #11 |
---|---|
参数 |
CK_RV m_GenerateKey ( CK_MECHANISM_PTR mech, CK_ATTRIBUTE_PTR template, CK_ULONG templatelen, const unsigned char *pin, size_t pinlen, Unsigned char * key,size_t * keylen, Unsigned char *checkSum,size_t *checkSumlen 目标 ); |
返回值 | C_GenerateKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
如果生成机制用于域参数生成,那么 由于要生成的密钥或域参数的类型在生成机制中是隐式的,因此模板不需要提供密钥类型。 如果它提供了与生成机制不一致的密钥类型,那么 如果对 通过成功调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)( CK_SESSION_HANDLE hSession CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_初始化,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 密钥对参数是从 在 FIPS 方式下,仅支持 1024 + 256 公用密钥格式化为标准 SPKI (主题公用密钥信息),可由大多数库读取。 它由特定于传输密钥的 MAC 进行完整性保护,该 MAC 并不属于 SPKI 本身。 DSA 参数生成在公用密钥字段中返回非 SPKI 结构。 如果将对象与会话绑定,那么 将打包的专用密钥返回到 具有特殊注释的以下受支持参数组合超出 PKCS #11记录的范围: RSA 密钥拒绝低于 17 (0x11) 的公共指数。 控制点可以进一步限制已接受的最小值。 Fergmat4 指数 (0x10001) 由特定控制点进行控制,与 FIPS 186-3(第 B.3.1 节)的公共指数限制一致。 EC 键 ( DSA 密钥 ( DH 密钥 ( 使用会话 (登录) 状态将替换会话的标准使用。 映射在库作用域之外。
PKCS #11 PKCS #11 PKCS #11 |
---|---|
参数 |
CK_RV m_GenerateKeyPair ( CK_MECHANISM_PTR mech, CK_ATTRIBUTE_PTR pubKeyTemplate, CK_ULONG pubKeyTemplatelen, CK_ATTRIBUTE_PTR privKeyTemplate, CK_ULONG privKeyTemplatelen, const unsigned char *pin, size_t pinlen, Unsigned char *privKey,size_t *privKeylen 无符号字符 *pubKey,size_t *pubKeylen, 目标 ); |
返回值 | C_GenerateKeyPair 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
由于要生成的密钥类型隐含在密钥对生成机制中,因此模板不需要提供密钥类型。 如果其中一个模板提供了与密钥生成机制不一致的密钥类型,那么 如果对 对 通过成功调用 请仔细注意 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKeyPair)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_已对,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
PKCS #11 PKCS #11 |
---|---|
参数 |
CK_RV m_DeriveKey ( CK_MECHANISM_PTR mech, CK_ATTRIBUTE_PTR template, CK_ULONG templatelen, const unsigned char *baseKey, size_t baseKeylen, const unsigned char *data, size_t datalen, const unsigned char *pin, size_t pinlen, 无符号字符 *newKey,size_t *newKeylen, Unsigned char *checkSum,size_t *checkSumlen 目标 ); |
返回值 | C_DeriveKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
基本键的 如果对 成功调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_DeriveKey)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_CRYPTOKI_NOT_已对,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) 库结构文档的 返回值 章节。 |
描述 |
打包密钥的 如果出于某种特定于令牌的原因,尽管要打包的密钥的
标记会有所不同,哪些类型的密钥可以使用哪些机制进行打包。 要对包装键进行分区,以便它们只能包装一部分可抽取的键,可以在包装键上使用属性 |
---|---|
参数 |
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
生成的对象在 当 SPKI 转换为 MACed SPKI 时,必须使用 CKM_IBM_TRANSPORTKEY 作为解包机制。 此方式将原始 SPKI 作为打包的数据提供,并忽略 KEK。
|
---|---|
参数 |
CK_RV m_UnwrapKey ( const CK_BYTE_PTR wrapped, CK_ULONG wrappedlen, const unsigned char *keK, size_t keKlen, const unsigned char *macKey, size_t macKeylen, const unsigned char *pin, size_t pinlen, const CK_MECHANISM_PTR mech, const CK_ATTRIBUTE_PTR template, CK_ULONG templatelen, unsigned char * unwrap,size_t * unwrappedlen, CK_BYTE_PTR checkSum, CK_ULONG *checkSumlen, 目标 ); |
返回值 | C_UnwrapKey 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
解包密钥的 新密钥将 某些机制可以修改或尝试修改。 在解包密钥的同时, 如果对 通过成功调用 要对解包键进行分区,以便它们只能解包一部分键,可以在解包键上使用属性 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY,CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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 不表示或不需要会话 (blob 的一部分),因此不使用 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) 库结构文档的 返回值 章节。 |
描述 |
对于模板中的每个 (
如果案例 1 适用于任何请求的属性,那么调用需要返回值 对于其值为属性数组的属性 (例如 错误代码 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)( CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_SENSITIVE,CKR_ATTRIBUTE_TYPE_INVALID,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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 属性打包:请参阅 _GetAttrValue 目前,EP11 仅发送布尔值属性,其他所有属性都由主机处理(并且 EP11 不允许修改数组,例如 WRAP_TEMPLATE)。 不表示或不需要会话 (blob 的一部分),因此不使用 PKCS #11 |
---|---|
参数 |
CK_RV m_SetAttributeValue ( unsigned char *object, size_t objectlen, CK_ATTRIBUTE_PTR attributes, CK_ULONG attributeslen, 目标 ); |
返回值 | C_SetAttributeValue 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
某些对象可能未修改。 对此类对象调用 在只读会话期间,只能修改会话对象。 模板可以为可修改的对象的任何属性指定新值。 如果模板指定与对象的其他现有属性不兼容的属性值,那么调用将失败,返回码为 并非所有属性都可以修改; 请参阅 PKCS #11 API 规范 的 4.1.2 部分以获取更多信息。 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)( CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount ); |
返回值 | CKR_ACTION_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
如果主机上有适用的功能可用,那么主机库可以生成随机数,而不分派给后端。 在当前实现中不会这样做。 此函数不支持大小查询。 |
---|---|
参数 |
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); });
对数据进行加密和解密
通过指定加密机制,可以执行对称或非对称加密和解密功能。 您可能需要调用一系列子函数来加密或解密数据。 例如,多部分数据加密操作由 EncryptInit
,EncryptUpdate
和 EncryptFinal
子操作组成。
EncryptInit
EncryptInit
函数用于初始化加密操作。 您需要先调用此函数以执行加密。
描述 | 绑定到 EP11 m_EncryptInit ,这是 PKCS #11 C_EncryptInit 的实现。 |
|
---|---|---|
参数 |
message EncryptInitRequest { Mechanism Mech = 2; bytes Key = 3; } message EncryptInitResponse { bytes State = 1; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11
对于公用密钥机制, 对于密钥机制,“加密”状态从
|
---|---|
参数 |
CK_RV m_EncryptInit ( 无符号字符 * 状态,size_t * 状态, CK_MECHANISM_PTR mech, const unsigned char *key, size_t keylen, 目标 ); |
返回值 | C_EncryptInit 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 一章。 |
描述 |
加密密钥的 在应用程序调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey ); |
返回值 | CKR_CRYPTOKI_NOT_初始化,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
函数用于加密单部分数据。 您无需对单部分加密执行 EncryptUpdate
和 EncryptFinal
子操作。 在调用此函数之前,请确保先运行 EncryptInit
。
描述 | 绑定到 EP11 m_Encrypt ,这是 PKCS #11 C_Encrypt 的实现。 |
|
---|---|---|
参数 |
message EncryptRequest { bytes State = 1; bytes Plain = 2; } message EncryptResponse { bytes Ciphered = 3; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 不更新
|
---|---|
参数 |
CK_RV m_Encrypt ( const unsigned char *state, size_t statelen, CK_BYTE_PTR plain, CK_ULONG plainlen, CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen, 目标 ); |
返回值 | C_Encrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用
对于某些加密机制,输入纯文本数据具有一定的长度约束 (因为该机制只能加密相对较短的纯文本片段,或者因为该机制的输入数据必须由整数块组成)。 如果未满足这些约束,那么 纯文本和密文可以位于同一位置,即,如果 对于大多数机制, |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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 必须从 PKCS #11
|
---|---|
参数 |
CK_RV m_EncryptUpdate ( unsigned char *state, size_t statelen, CK_BYTE_PTR plain, CK_ULONG plainlen, CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen, 目标 ); |
返回值 | C_EncryptUpdate 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用
|
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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 不更新
|
---|---|
参数 |
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) 库结构文档的 返回值 章节。 |
描述 |
必须使用 对于某些多部分加密机制,输入纯文本数据具有一定的长度约束,因为该机制的输入数据必须由整数块组成。 如果未满足这些约束,那么 |
---|---|
参数 |
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 扩展,并且是 EncryptInit
和 Encrypt
函数的组合。 它使您能够使用单个调用而不是一系列调用来完成加密操作。
描述 | 绑定到 EP11 m_EncryptSingle |
|
---|---|---|
参数 |
message EncryptSingleRequest { bytes Key = 1; Mechanism Mech = 2; bytes Plain = 3; } message EncryptSingleResponse { bytes Ciphered = 4; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
这是一次性加密 XCP 感知应用程序的数据的首选方法。 在功能上,它等同于 如果后端支持常驻密钥,那么该密钥也可以是常驻密钥句柄。 另请参阅:
|
---|---|
参数 |
CK_RV m_EncryptSingle ( const unsigned char *key, size_t keylen, CK_MECHANISM_PTR mech, CK_BYTE_PTR plain, CK_ULONG plainlen, CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen, 目标 ); |
返回值 | 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 扩展。 此单一调用是一个可行的选项,在此选项中,需要使用不同的密钥对大量数据进行重新加密,而无需对需要重新加密的每个数据项执行 DecryptSingle
和 EncryptSingle
函数的组合。 它不会向主机返回任何状态,而仅返回重新加密的数据。
描述 | 绑定到 EP11 m_ReencryptSingle 。 |
|
---|---|---|
参数 |
消息 ReencryptSingle请求 { 字节 DecKey = 1; 字节 EncKey = 2; 机制 DecMech = 3; 机制 EncMech = 4; 已引信的字节数 = 5; } 消息 ReencryptSingle响应 { 接收方的字节数 = 6; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
使用原始密钥对数据进行解密,然后使用云 HSM 中的其他密钥对原始数据进行加密。 |
---|---|
参数 |
CK_RV m_ReencryptSingle ( const unsigned char * dkey,size_t dkeylen, const unsigned char * ekey,size_t ekeylen, CK_MECHANISM_PTR decmech, CK_MECHANISM_PTR encmech, CK_BYTE_PTR in,CK_ULONG inlen, CK_BYTE_PTR ciphered, CK_ULONG_PTR cipheredlen, 目标 ); |
返回值 | C_Encrypt 和 C_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
代码片段
-
Golang 代码片段
var msg = []byte("Data to encrypt") EncryptKey1Request := &pb.EncryptSingleRequest{ Key: GenerateKey1Response.KeyBytes, Mech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)}, Plain: msg, } EncryptKey1Response, err := cryptoClient.EncryptSingle(context.Background(), EncryptKey1Request) if err != nil { return nil, fmt.Errorf("Encrypt error: %s", err) } ReencryptSingleRequest := &pb.ReencryptSingleRequest{ DecKey: GenerateKey1Response.KeyBytes, // original key EncKey: GenerateKey2Response.KeyBytes, // new key DecMech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)}, EncMech: &pb.Mechanism{Mechanism: ep11.CKM_AES_CBC_PAD, Parameter: util.SetMechParm(iv)}, Ciphered: RencryptKey1Response.Ciphered, } ReencryptSingleResponse, err := cryptoClient.ReencryptSingle(context.Background(), ReencryptSingleRequest)
-
JavaScript 代码片段
client.ReencryptSingle({ Decmech: { Mechanism: mech1, ParameterB: iv }, Encmech: { Mechanism: mech2, ParameterB: iv }, In: encipherState.Ciphered, DKey: keyBlob1, Ekey: keyBlob2, }, (err, response) => { callback(err, response); });
DecryptInit
DecryptInit
函数用于初始化解密操作。 您需要先调用此函数以执行解密。
描述 | 绑定到 EP11 m_DecryptInit ,这是 PKCS #11 C_DecryptInit 的实现。 |
|
---|---|---|
参数 |
message DecryptInitRequest { Mechanism Mech = 2; bytes Key = 3; } message DecryptInitResponse { bytes State = 1; } |
|
返回值 | 将 EP11 错误打包成 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) 库结构文档的 返回值 章节。 |
描述 |
解密密钥的 在应用程序调用 |
---|---|
参数 |
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
函数对单个部件中的数据进行解密。 您不需要对单部分解密执行 DecryptUpdate
和 DecryptFinal
子操作。 在调用此函数之前,请确保先运行 DecryptInit
。
描述 | 绑定到 EP11 m_Decrypt ,这是 PKCS #11 C_Decrypt 的实现。 |
|
---|---|---|
参数 |
message DecryptRequest { bytes State = 1; bytes Ciphered = 2; } message DecryptResponse { bytes Plain = 3; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 state, slen 二进制大对象 (BLOB) 必须从 PKCS #11 |
---|---|
参数 |
CK_RV m_Decrypt (const unsigned char *state, size_t slen, CK_BYTE_PTR cipher, CK_ULONG clen, CK_BYTE_PTR plain, CK_ULONG_PTR plen, 目标 ); |
返回值 | C_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
需要使用
密文和纯文本可以位于同一位置,这意味着如果 pEncrypted数据和 pData 指向同一位置,那么可以接受该密文和纯文本。 如果输入密文数据由于长度不正确而无法解密,那么可能会返回 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_Decrypt)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen ); |
返回值 | Ckr_arguments_bad,ckr_buffer_too_small,ckr_cryptoki_not_初始化,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
|
---|---|
参数 |
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) 库结构文档的 返回值章节。 |
描述 |
解密操作必须使用 密文和纯文本可以位于同一位置,即,如果 |
---|---|
参数 |
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 不更新
|
---|---|
参数 |
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) 库结构文档的 返回值 章节。 |
描述 |
解密操作必须使用 如果输入密文数据由于长度不正确而无法解密,那么可以返回 |
---|---|
参数 |
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 扩展,并且是 DecryptInit
和 Decrypt
函数的组合。 它使您能够通过单个调用而不是一系列调用来完成解密操作。
描述 | 绑定到 EP11 m_DecryptSingle 。 |
|
---|---|---|
参数 |
message DecryptSingleRequest { bytes Key = 1; Mechanism Mech = 2; bytes Ciphered = 3; } message DecryptSingleResponse { bytes Plain = 4; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
这是一次性加密 XCP 感知应用程序的数据的首选方法。 在功能上,它相当于 如果后端支持常驻密钥,那么该密钥也可以是常驻密钥句柄。 另请参阅:
|
---|---|
参数 |
CK_RV m_DecryptSingle ( const unsigned char *key, size_t keylen, CK_MECHANISM_PTR mech, CK_BYTE_PTR ciphered, CK_ULONG cipheredlen, CK_BYTE_PTR plain, CK_ULONG_PTR plainlen, 目标 ); |
返回值 | 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) 的函数。 您可能需要调用一系列子函数来执行签名操作。 例如,多部分数据签名操作由 SignInit
,SignUpdate
和 SignFinal
子操作组成。
SignInit
SignInit
函数用于初始化签名操作。 您需要先调用此函数以执行签名操作。
描述 | 绑定到 EP11 m_SignInit ,这是 PKCS #11 C_SignInit 的实现。 |
|
---|---|---|
参数 |
message SignInitRequest { Mechanism Mech = 2; bytes PrivKey = 3; } message SignInitResponse { bytes State = 1; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 | PKCS #11 C_SignInit 的实现。
|
---|---|
参数 |
CK_RV m_SignInit ( 无符号字符 * 状态,size_t * 状态, CK_MECHANISM_PTR mech, const unsigned char *privKey, size_t privKeylen, 目标 ); |
返回值 | C_Decrypt 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
签名密钥的 在应用程序调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_SignInit)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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
函数用于对单部分数据签名。 您不需要对单部分特征符执行 SignUpdate
和 SignFinal
子操作。 在调用此函数之前,请确保先运行 SignInit
。
描述 | 绑定到 EP11 m_Sign ,这是 PKCS #11 C_Sign 的实现。 |
|
---|---|---|
参数 |
message SignRequest { bytes State = 1; bytes Data = 2; } message SignResponse { bytes Signature = 3; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 不更新
|
---|---|
参数 |
CK_RV m_Sign ( const unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen, 目标 ); |
返回值 | C_Sign 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用
对于大多数机制, |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_Sign)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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 的实现。
|
---|---|
参数 |
CK_RV m_SignUpdate ( unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, 目标 ); |
返回值 | C_SignUpdate 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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 不更新
|
---|---|
参数 |
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) 库结构文档的 返回值 章节。 |
描述 |
必须使用 |
---|---|
参数 |
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 扩展,并且是 SignInit
和 Sign
函数的组合。 它使您能够使用单个调用而不是一系列调用来完成签名操作。
描述 | 绑定到 EP11 m_SignSingle 。 |
|
---|---|---|
参数 |
message SignSingleRequest { bytes PrivKey = 1; Mechanism Mech = 2; bytes Data = 3; } message SignSingleResponse { bytes Signature = 4; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
非标准扩展, 这是首选的签名方式,无需额外的双向传递,加密和解密。 在功能上,
支持 HMAC 和 CMAC 签名的多数据请求 (子变体 2 和 3)。 另请参阅: |
---|---|
参数 |
CK_RV m_SignSingle ( const unsigned char *privKey, size_t privKeylen, CK_MECHANISM_PTR mech, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR signature, CK_ULONG_PTR signaturelen, 目标 ); |
返回值 | 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 对于公用密钥机制, 如果初始化 HMAC 操作,那么会从 HMAC 密钥继承
注: |
---|---|
参数 |
CK_RV m_VerifyInit ( 无符号字符 * 状态,size_t * 状态, CK_MECHANISM_PTR mech, const unsigned char *pubKey, size_t pubKeylen, 目标 ); |
返回值 | C_VerifyInit 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
验证密钥的 在应用程序调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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
函数用于验证单部分数据上的签名。 您不需要对单部分验证执行 VerifyUpdate
和 VerifyFinal
子操作。 在调用此函数之前,请确保先运行 VerifyInit
。
描述 | 绑定到 EP11 m_Verify ,这是 PKCS #11 C_Verify 的实现。 |
|
---|---|---|
参数 |
message VerifyRequest { bytes State = 1; bytes Data = 2; bytes Signature = 3; } message VerifyResponse { } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 不更新 数据和签名的相对顺序相反 到
|
---|---|
参数 |
CK_RV m_Verify ( const unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR signature, CK_ULONG signaturelen, 目标 ); |
返回值 | C_Verify 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用 成功调用
对于大多数机制, |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_Verify)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen ); |
返回值 | Ckr_arguments_bad,ckr_cryptoki_not_初始化,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
|
---|---|
参数 |
CK_RV m_VerifyUpdate ( unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, 目标 ); |
返回值 | C_VerifyUpdate 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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 不更新
|
---|---|
参数 |
CK_RV m_VerifyFinal ( const unsigned char *state, size_t statelen, CK_BYTE_PTR signature, CK_ULONG signaturelen, 目标 ); |
返回值 | C_VerifyFinal 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用 成功调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_VerifyFinal)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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 扩展,并且是 VerifyInit
和 Verify
函数的组合。 它使您能够使用单个调用而不是一系列调用来完成验证操作。
描述 | 绑定到 EP11 m_VerifySingle 。 |
|
---|---|---|
参数 |
message VerifySingleRequest { bytes PubKey = 1; Mechanism Mech = 2; bytes Data = 3; bytes Signature = 4; } message VerifySingleResponse { } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
非标准扩展, 这是验证签名的首选方法,无需额外的双向传递,加密和解密。 在功能上,
对于公用密钥机制, 另请参阅: |
---|---|
参数 |
CK_RV m_VerifySingle ( const unsigned char *pubKey, size_t pubKeylen, CK_MECHANISM_PTR mech, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR signature, CK_ULONG signaturelen, 目标 ); |
返回值 | 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 提供了一组用于创建消息摘要的函数,这些摘要旨在保护一段数据的完整性。 您可能需要调用一系列子函数来执行摘要操作。 例如,多部分摘要操作由 DigestInit
,DigestUpdate
和 DigestFinal
子操作组成。
DigestInit
DigestInit
函数用于初始化消息摘要操作。 您需要先运行此函数以执行摘要操作。
描述 | 绑定到 EP11 m_DigestInit ,这是 PKCS #11 C_DigestInit 的实现。 |
|
---|---|---|
参数 |
message DigestInitRequest { Mechanism Mech = 2; } message DigestInitResponse { bytes State = 1; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 创建打包的摘要状态。 注:支持大小查询,但是打包的状态始终由后端返回,这与大多数大小查询不同(后者返回输出大小,而不是实际输出)。 在大小查询期间,主机直接废弃返回的状态,而报告 BLOB 大小(在
|
---|---|
参数 |
CK_RV m_DigestInit ( unsigned char * state,size_t * len, const CK_MECHANISM_PTR mech, 目标 ); |
返回值 | C_DigestInit 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
在应用程序调用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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
函数用于对单部分数据进行摘要。 您不需要调用 DigestUpdate
和 DigestFinal
函数来消化单部分数据。 在调用此函数之前,请确保先运行 DigestInit
。 设置参数时,请注意不要将输入数据的长度指定为零,而将指向输入数据位置的指针指定为 NULL。
描述 | 绑定到 EP11 m_Digest ,这是 PKCS #11 C_Digest 的实现。 |
|
---|---|---|
参数 |
message DigestRequest { bytes State = 1; bytes Data = 2; } message DigestResponse { bytes Digest = 3; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
PKCS #11 如果摘要对象在创建后正好具有附加到它的 0 (零) 字节,那么在零字节传输的任何组合中,它仍可以执行单次摘要,即使需要被严格实现拒绝也是如此。 不更新 实现可能执行
|
---|---|
参数 |
CK_RV m_Digest ( const unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR digest, CK_ULONG_PTR digestlen, 目标 ); |
返回值 | C_Digest 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用
输入数据和摘要输出可以位于同一位置,即,如果 pData 和 pDigest 指向同一位置,那么正常。
|
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_Digest)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_BUFFER_TOO_SMALL,CKR_CRYPTOKI_NOT_初始化,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
另请参阅: |
---|---|
参数 |
CK_RV m_DigestUpdate ( unsigned char *state, size_t statelen, CK_BYTE_PTR data, CK_ULONG datalen, 目标 ); |
返回值 | C_DigestUpdate 返回值的子集。 有关更多信息,请参阅 Enterprise PKCS #11 (EP11) 库结构文档的 返回值 章节。 |
描述 |
必须使用 |
---|---|
参数 |
CK_DEFINE_FUNCTION(CK_RV, C_DigestUpdate)( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen ); |
返回值 | CKR_ARGUMENTS_BAD,CKR_CRYPTOKI_NOT_初始化,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
不更新
|
---|---|
参数 |
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) 库结构文档的 返回值 章节。 |
描述 |
必须使用 |
---|---|
参数 |
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 扩展,并且是 DigestInit
和 Digest
函数的组合。 它使您能够使用单个调用而不是一系列调用来完成摘要操作。
描述 | 绑定到 EP11 m_DigestSingle 。 |
|
---|---|---|
参数 |
message DigestSingleRequest { Mechanism Mech = 1; bytes Data = 2; } message DigestSingleResponse { bytes Digest = 3; } |
|
返回值 | 将 EP11 错误打包成 message Grep11Error 。 |
描述 |
非标准扩展, 这是对 XCP 感知应用程序的明文进行摘要的首选方法。 在功能上, 如果需要对密钥进行摘要,那么必须使用 不会将任何状态返回到主机,仅返回摘要结果。 没有非 PKCS #11 参数,因为所有内容都直接通过 PKCS #11 调用来使用。 |
---|---|
参数 |
CK_RV m_DigestSingle ( CK_MECHANISM_PTR mech, CK_BYTE_PTR data, CK_ULONG datalen, CK_BYTE_PTR digest, CK_ULONG_PTR digestlen, 目标 ); |
返回值 | 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: