package sdf import ( "xdx.jelly/xgcl/rsa" "xdx.jelly/xgcl/sm/sm2" ) // Sdfable is the golang style of SDF interface(GB/T 36322-2018). The interface is // to minimum the upper applications' burden to use. // // The implement itself should be a sessionhandle. // So there are no need of sessionhandle in function params. // When New a impl. instants, it should include the device infos - IP, // port, connection timeout e.t. // // Its the impl's responsible to check connections to hardware // crypto-services. // // The params' name are keep the same with 0018/36322 for reference, though // the "puc" are not means "pointer to unsigned char". type Sdfable interface { StdSdfable // 标准0018接口 ExtSdfable // 扩展接口 SdfManager // 管理接口 } // 标准sdf接口 type StdSdfable interface { // 实际上应该是OpenDevice返回一个Sdfable接口对象。实现时可以以包函数的方式实现。 // SDF_OpenDevice() error // SDF_CloseDevice() error // 一个Sdfable接口对象即是一个session SDF_OpenSession() error SDF_CloseSession() error SDF_GetDeviceInfo() (*DeviceInfo, error) SDF_GetPrivateKeyAccessRight(keyIndex uint32, password []byte) error SDF_ReleasePrivateKeyAccessRight(keyIndex uint32) error // 以随机数填充buffer。返回实际获取字节和错误。 SDF_GenerateRandom(buffer []byte) (n uint32, err error) // 6.3.1 导出RSA签名公钥 // 描述: 导出密码设备内部存储的指定索引位置的签名公钥。 // 备注:返回公钥只可读。不可进行更改。 SDF_ExportSignPublicKey_RSA(uiKeyIndex uint32) (*rsa.PublicKey, error) // 6.3.2 导出RSA加密公钥 // 描述: 导出密码设备内部存储的指定索引位置的加密公钥。 // 备注:返回公钥只可读。不可进行更改。 SDF_ExportEncPublicKey_RSA(uiKeyIndex uint32) (*rsa.PublicKey, error) // 6.3.3 产生RSA密钥对并输出 SDF_GenerateKeyPair_RSA(uiKeyBits uint32) (*rsa.PublicKey, *rsa.PrivateKey, error) // 6.3.4 生成会话密钥并用内部RSA公钥加密输出 // 描述: 生成会话密钥并用指定索引的内部加密公钥加密输出, 同时返回密钥句柄。 // 备注: 公钥加密数据时填充方式按照PKCS#1 v1.5的要求进行。 SDF_GenerateKeyWithIPK_RSA(uiIPKIndex uint32, uiKeyBits uint32) (pucKey []byte, phKeyHandle interface{}, err error) // 6.3.5 生成会话密钥并用外部RSA公钥加密输出 // 描述: 生成会话密钥并用外部公钥加密输出, 同时返回密钥句柄。 // 备注: 公钥加密数据时填充方式按照PKCS#1 v1.5的要求进行。 SDF_GenerateKeyWithEPK_RSA(uiKeyBits uint32, pucPublicKey *rsa.PublicKey) (Key []byte, phKeyHandle interface{}, err error) // 6.3.6 导入会话密钥并用内部RSA私钥解密 // 描述: 导入会话密钥并用内部私钥解密, 同时返回密钥句柄。 // 注:填充方式与公钥加密时相同。 SDF_ImportKeyWithISK_RSA(uiISKIndex uint32, pucKey []byte) (phKeyHandle interface{}, err error) // 6.3.7 基于RSA算法的数字信封转换 // 描述: 将由内部加密公钥加密的会话密钥转换为由外部指定的公钥加密, 可用于数字信封转换。 SDF_ExchangeDigitEnvelopeBaseOnRSA(uiKeyIndex uint32, pucPublicKey *rsa.PublicKey, pucDEInput []byte) (pucDEOutput []byte, err error) // 6.3.8 导出ECC签名公钥 SDF_ExportSignPublicKey_ECC(uiKeyIndex uint32) (*sm2.PublicKey, error) // 6.3.9 导出ECC加密公钥 // 描述: 导出密码设备内部存储的指定索引位置的加密公钥。 SDF_ExportEncPublicKey_ECC(uiKeyIndex uint32) (*sm2.PublicKey, error) // 6.3.10 产生ECC密钥对并输出 // 描述: 请求密码设备产生指定类型和模长的ECC密钥对。 SDF_GenerateKeyPair_ECC(uiAlgID uint32, uiKeyBits uint32) (*sm2.PublicKey, *sm2.PrivateKey, error) // 6.3.11 生成会话密钥并用内部ECC公钥加密输出 // 描述: 生成会话密钥并用指定索引的内部ECC加密公钥加密输出, 同时返回密钥句柄。 SDF_GenerateKeyWithIPK_ECC(uiIPKIndex uint32, uiKeyBits uint32) (pucKey *sm2.Cipher, phKeyHandle interface{}, err error) // 6.3.12 生成会话密钥并用外部ECC公钥加密输出 // 描述: 生成会话密钥并用外部ECC公钥加密输出, 同时返回密钥句柄。 SDF_GenerateKeyWithEPK_ECC(uiKeyBits uint32, uiAlgID uint32, pucPublicKey *sm2.PublicKey) (pucKey *sm2.Cipher, phKeyHandle interface{}, err error) // 6.3.13 导入会话密钥并用内部ECC私钥解密 // 描述: 导入会话密钥并用内部ECC加密私钥解密, 同时返回密钥句柄。 SDF_ImportKeyWithISK_ECC(uiISKIndex uint32, pucKey *sm2.Cipher) (phKeyHandle interface{}, err error) // 6.3.14 生成密钥协商参数并输出 // 描述: 使用ECC密钥协商算法, 为计算会话密钥而产生协商参数, 同时返回指定索引位置的ECC公钥、临时ECC密钥对的公钥及协商句柄。 SDF_GenerateAgreementDataWithECC(uiISKIndex uint32, uiKeyBits uint32, pucSponsorID []byte) (pucSponsorPublicKey *sm2.PublicKey, pucSponsorTmpPublicKey *sm2.PublicKey, phAgreementHandle interface{}, err error) // 6.3.15 计算会话密钥 // 描述: 使用ECC密钥协商算法, 使用自身协商句柄和响应方的协商参数计算会话密钥, 同时返回会话密钥句柄。 // 备注: 协商的发起方获得响应方的协商参数后调用本函数, 计算会话密钥。使用SM2算法计算会话密钥的过程见GM/T 0009。 SDF_GenerateKeyWithECC(pucResponseID []byte, pucResponsePublicKey *sm2.PublicKey, pucResponseTmpPublicKey *sm2.PublicKey, hAgreementHandle interface{}) (phKeyHandle interface{}, err error) // 6.3.16 产生协商数据并计算会话密钥 // 描述: 使用ECC密钥协商算法, 产生协商参数并计算会话密钥, 同时返回产生的协商参数和密钥句柄。 SDF_GenerateAgreementDataAndKeyWithECC(uiISKIndex uint32, uiKeyBits uint32, pucResponseID []byte, pucSponsorID []byte, pucSponsorPublicKey, pucSponsorTmpPublicKey *sm2.PublicKey) (pucResponsePublicKey *sm2.PublicKey, pucResponseTmpPublicKey *sm2.PublicKey, phKeyHandle interface{}, err error) // 6.3.17 基于ECC算法的数字信封转换 // 描述: 将由内部加密公钥加密的会话密钥转换为由外部指定的公钥加密, 可用于数字信封转换。 SDF_ExchangeDigitEnvelopeBaseOnECC(uiKeyIndex uint32, uiAlgID uint32, pucPublicKey *sm2.PublicKey, pucEncDataIn *sm2.Cipher) (pucEncDataOut *sm2.Cipher, err error) // 6.3.18 生成会话密钥并用密钥加密密钥加密输出 // 描述: 生成会话密钥并用密钥加密密钥加密输出, 同时返回密钥句柄。 // 备注: 加密模式使用ECB模式。 SDF_GenerateKeyWithKEK(uiKeyBits uint32, uiAlgID uint32, uiKEKIndex uint32) (pucKey []byte, phKeyHandle interface{}, err error) // 6.3.19 导入会话密钥并用密钥加密密钥解密 // 描述: 导入会话密钥并用密钥加密密钥解密, 同时返回会话密钥句柄。 // 备注: 加密模式使用ECB模式。 SDF_ImportKeyWithKEK(uiAlgID uint32, uiKEKIndex uint32, pucKey []byte) (phKeyHandle interface{}, err error) // 6.3.20 计算IKE工作密钥 // 描述: 使用IKE一阶段(主模式)交换得到的密钥计算参数计算IKE会话密钥, 同时返回会话密钥句柄。 // 备注: IKE一阶段(主模式)消息3和消息4交互完成后, 参与通信的双方调用本函数, // 计算后续会话密钥SKEYID_d, SKEYID_a, SKEYID_e。IKE一阶段(主模式)计算IKE会话密钥的过程见GM/T 0022。 // 输入的密钥参数按顺序为Ni_b, Nr_b, CKY_I, CKY_R,返回的密钥句柄按顺序为SKEYID_d,SKEYID_a,SKEYID_e SDF_GenerateKeywithIKE(pucSponsorNonce []byte, pucResponseNonce []byte, pucSponsorCookie []byte, pucResponseCookie []byte, uiPrfAlgID uint32, uiKeyBitsD, uiKeyBitsA, uiKeyBitsE uint32) (phKeyHandleD interface{}, phKeyHandleA interface{}, phKeyHandleE interface{}, err error) // 6.3.22 计算IKE工作密钥并用外部ECC公钥加密输出 // 描述: 使用IKE一阶段(主模式)交换得到的密钥计算参数计算IKE工作密钥,并用外部 // ECC公钥加密输出,同时返回工作密钥句柄。 // 备注: IKE一阶段(主模式)消息3和消息4交互完成后, 参与通信的双方调用本函数, // 计算后续会话密钥SKEYID_d, SKEYID_a, SKEYID_e。IKE一阶段(主模式)计算IKE会话密钥的过程见GM/T 0022。 // 输入的密钥参数按顺序为Ni_b, Nr_b, CKY_I, CKY_R,返回的密钥句柄按顺序为SKEYID_d,SKEYID_a,SKEYID_e SDF_GenerateKeywithEPK_IKE(pucSponsorNonce []byte, pucResponseNonce []byte, pucSponsorCookie []byte, pucResponseCookie []byte, uiPrfAlgID, uiEccAlgID uint32, pucPublicKey sm2.PublicKey, uiKeyBitsD, uiKeyBitsA, uiKeyBitsE uint32) (pucKeyD *sm2.Cipher, phKeyHandleD interface{}, pucKeyA *sm2.Cipher, phKeyHandleA interface{}, pucKeyE *sm2.Cipher, phKeyHandleE interface{}, err error) // 6.3.23 计算IPSEC会话密钥 // 描述: 使用IKE二阶段(快速模式)交换得到的密钥计算参数计算IPSEC会话密钥, 同时返回会话密钥句柄。 // 备注: IKE二阶段(快速模式)消息交互完成后, 参与通信的双方调用本函数, 计算IPSEC会话密钥, 包括用于加密的会话密钥和用于完整性校验的会话密钥。IKE二阶段(快速模式)计算IPSEC会话密钥的过程见GM/T 0022。本函数需在6.3.20计算IKE会话密钥函数调用之后调用, 并将该函数返回的密钥句柄之一(SKEYID_d)作为输入。 SDF_GenerateKeywithIPSEC( pucProtocolID []byte, pucSpi []byte, pucSponsorNonce []byte, pucResponseNonce []byte, hKeyHandle interface{}, uiPrfAlgID uint32, uiKeyBitsEnc, uiKeyBitsMac uint32, ) (phKeyHandleEnc interface{}, phKeyHandleMac interface{}, err error) // 6.3.24 计算IPSEC会话密钥并用外部ECC公钥加密输出 // 注:IKE 二阶段(快速模式)消息交互完成后,本函数由参与通信的双方各自调用,计算IPSEC 会话密钥,包括用于 // 加密的会话密钥和用于完整性校验的会话密钥。IKE 二阶段(快速模式)计算IPSEC 会话密钥的过程参见 // GM/T0022,输入的密钥参数按顺序为protocol、SPI、Ni_b、Nr_b,返回的密钥密文和密钥句柄按顺序为加密密 // 钥和杂凑密钥(用于完整性校验)。本函数在6.3.21计算IKE 工作密钥函数调用之后调用,该函数返回的密钥 // 句柄之一(SKEYID_d)作为本函数输入。 SDF_GenerateKeywithEPK_IPSEC( pucProtocolID []byte, pucSpi []byte, pucSponsorNonce []byte, pucResponseNonce []byte, hKeyHandle interface{}, uiPrfAlgID uint32, uiEccAlgID uint32, pucPublicKey *sm2.PublicKey, uiKeyBitsEnc, uiKeyBitsMac uint32, ) (pucKeyEnc *sm2.Cipher, phKeyHandleEnc interface{}, pucKeyMac *sm2.Cipher, phKeyHandleMac interface{}, err error) // 6.3.25 计算SSL工作密钥 // 描述: 使用SSL握手协议得到的密钥计算参数计算SSL会话密钥, 同时返回会话密钥句柄。 // 备注: // SSL握手协议消息交互完成后, 参与通信的双方调用本函数, 计算SSL记录层协议的会话密钥client_write_MAC_secret, server_write_MAC_secret, client_write_ key, server_write_key。SSL计算会话密钥的过程见GM/T 0024。 // 备注:与标准有不同,这里增加了返回pucClientIV, pucServerIV SDF_GenerateKeywithSSL( pucKeyPremaster, pucClientRandom, pucServerRandom []byte, uiPrfAlgID uint32, uiKeyBitsClientMac, uiKeyBitsServerMac, uiKeyBitsClientEnc, uiKeyBitsServerEnc uint32, ) (phKeyHandleClientMac, phKeyHandleServerMac, phKeyHandleClientEnc, phKeyHandleServerEnc interface{}, pucClientIV, pucServerIV []byte, err error) // 6.3.26 计算SSL工作密钥并用外部ECC公钥加密输出 SDF_GenerateKeywithEPK_SSL(pucKeyPremaster, pucClientRandom, pucServerRandom []byte, uiPrfAlgID uint32, uiEccAlgID uint32, pucPublicKey *sm2.PublicKey, uiKeyBitsClientMac, uiKeyBitsServerMac, uiKeyBitsClientEnc, uiKeyBitsServerEnc uint32) (pucKeyClientMac *sm2.Cipher, phKeyHandleClientMac interface{}, pucKeyServerMac *sm2.Cipher, phKeyHandleServerMac interface{}, pucKeyClientEnc *sm2.Cipher, phKeyHandleClientEnc interface{}, pucKeyServerEnc *sm2.Cipher, phKeyHandleServerEnc interface{}, pucClientIV, pucServerIV []byte, err error) // 6.3.27 计算SSL工作密钥(ECDHE) // 描述: 使用SSL握手协议得到的密钥计算参数计算SSL工作密钥,同时返回工作密钥句柄。 // 备注:这里的预主密钥为SM2密钥交换得到的密钥句柄。 SDF_GenerateKeywithECDHE_SSL( phKeyHandlePremaster interface{}, pucClientRandom, pucServerRandom []byte, uiPrfAlgID uint32, uiKeyBitsClientMac, uiKeyBitsServerMac, uiKeyBitsClientEnc, uiKeyBitsServerEnc uint32, ) (phKeyHandleClientMac, phKeyHandleServerMac, phKeyHandleClientEnc, phKeyHandleServerEnc interface{}, pucClientIV, pucServerIV []byte, err error) // 6.3.28 计算SSL工作密钥并用外部ECC公钥加密输出 // 描述: 使用SSL握手协议得到的密钥计算参数计算SSL工作密钥,同时返回工作密钥句柄。 // 备注:这里的预主密钥为SM2密钥交换得到的密钥句柄。 SDF_GenerateKeywithEPK_ECDHE_SSL(phKeyHandlePremaster interface{}, pucClientRandom, pucServerRandom []byte, uiPrfAlgID uint32, uiEccAlgID uint32, pucPublicKey *sm2.PublicKey, uiKeyBitsClientMac, uiKeyBitsServerMac, uiKeyBitsClientEnc, uiKeyBitsServerEnc uint32) (pucKeyClientMac *sm2.Cipher, phKeyHandleClientMac interface{}, pucKeyServerMac *sm2.Cipher, phKeyHandleServerMac interface{}, pucKeyClientEnc *sm2.Cipher, phKeyHandleClientEnc interface{}, pucKeyServerEnc *sm2.Cipher, phKeyHandleServerEnc interface{}, pucClientIV, pucServerIV []byte, err error) // 6.3.29 销毁会话密钥 // 描述: 销毁会话密钥, 并释放为密钥句柄分配的内存等资源。 // 备注: 在对称算法运算完成后, 应调用本函数销毁会话密钥。 SDF_DestroyKey(hKeyHandle interface{}) error // 6.4 非对称算法运算类函数 // 6.4.2 外部公钥RSA运算 // 描述: 指定使用外部公钥对数据进行运算。 // 备注1: 数据格式由应用层封装。 // 备注2:一般非对称运算加密密钥,因此输出为内部分配内存。 SDF_ExternalPublicKeyOperation_RSA(pucPublicKey *rsa.PublicKey, pucDataInput []byte) (pucDataOutput []byte, err error) // 6.4.3 内部公钥RSA运算 // 描述: 使用内部指定索引的公钥对数据进行运算。 // 备注: 索引范围仅限于内部签名密钥对, 数据格式由应用层封装。 SDF_DecryptPublicKeyOperation_RSA(uiKeyIndex uint32, pucDataInput []byte) (pucDataOutput []byte, err error) // 6.4.4 内部私钥RSA运算 // 描述: 使用内部指定索引的私钥对数据进行运算。 // 备注: 索引范围仅限于内部签名密钥对, 数据格式由应用层封装。 SDF_InternalPrivateKeyOperation_RSA( uiKeyIndex uint32, pucDataInput []byte) (pucDataOutput []byte, err error) // 6.4.5 外部密钥ECC验证 // 描述: 使用外部ECC公钥对ECC签名值进行验证运算。 // 备注: 输入数据为待签数据的杂凑值。当使用SM2算法时, 该输入数据为待签数据经过SM2签名预处理的结果, 预处理过程见GM/T 0009。 SDF_ExternalVerify_ECC( uiAlgID uint32, pucPublicKey *sm2.PublicKey, pucDataInput []byte, pucSignature *sm2.Signature) (err error) // GMT 0018-2012 有,但36322没有 SDF_ExternalSign_ECC(uiAlgID uint32, pucPrivateKey *sm2.PrivateKey, pucData []byte) (*sm2.Signature, error) // 6.4.6 内部密钥ECC签名 // 描述: 使用内部ECC私钥对数据进行签名运算。 // 备注: 输入数据为待签数据的杂凑值。当使用SM2算法时, 该输入数据为待签数据经过SM2签名预处理的结果, 预处理过程见GM/T 0009。 SDF_InternalSign_ECC(uiISKIndex uint32, pucData []byte) (pucSignature *sm2.Signature, err error) // 6.4.7 内部密钥ECC验证 // 描述: 使用内部ECC公钥对ECC签名值进行验证运算。 // 备注: 输入数据为待签数据的杂凑值。当使用SM2算法时, 该输入数据为待签数据经过SM2签名预处理的结果, 预处理过程见GM/T 0009。 SDF_InternalVerify_ECC( uiISKIndex uint32, pucData []byte, pucSignature *sm2.Signature) (err error) // 6.4.8 外部密钥ECC公钥加密 // 描述: 使用外部ECC公钥对数据进行加密运算。 SDF_ExternalEncrypt_ECC( uiAlgID uint32, pucPublicKey *sm2.PublicKey, pucData []byte) (pucEncData *sm2.Cipher, err error) // 外部ECC私钥解密,GMT0018有,36322没有。 SDF_ExternalDecrypt_ECC(uiAlgID uint32, pucPrivateKey *sm2.PrivateKey, pucEncData *sm2.Cipher) (pucData []byte, err error) // 6.5 对称算法运算类函数 // 对称算法运算类函数包括以下具体函数, 各函数返回值见附录A函数返回代码定义: // a) 对称加密:Encrypt // b) 对称解密:Decrypt // c) 计算MAC:CalculateMAC // 6.5.1 对称加密 // 描述: 使用指定的密钥句柄和IV对数据进行对称加密运算 // 备注1: 此函数不对数据进行填充处理, 输入的数据必须是指定算法分组长度的整数倍。 // 备注2: 为避免内存分配,pucEncData提前分配好足够的空间。pucEncData如果空间不够,会重分配内存 // 备注3: pucIV-输入输出 SDF_Encrypt(hKeyHandle interface{}, uiAlgID uint32, pucIV []byte, pucData []byte, pucEncData *[]byte) (err error) // 6.5.2 对称解密 // 描述: 使用指定句柄和IV对数据进行对称解密运算。 // 备注1: 此函数不对数据进行填充处理, 输入的数据必须是指定算法分组长度的整数倍。 // 备注2: pucIV和pucData同对称加密 SDF_Decrypt(hKeyHandle interface{}, uiAlgID uint32, pucIV []byte, pucEncData []byte, pucData *[]byte) (err error) // 6.5.3 计算MAC // 描述: 使用指定的密钥句柄和IV对数据进行MAC运算。 // uiAlgID的取值为: // - identifier.SGD_SM3, 计算HMAC_SM3, 忽略pucIV // - identifier.SGD_SM1_MAC, 计算SM1_CBCMAC // - identifier.SGD_SM4_MAC, 计算SM4_CBCMAC // 备注:CBCMac不对数据进行分包处理, 多包数据MAC运算由IV控制最后的MAC值。 SDF_CalculateMAC(hKeyHandle interface{}, uiAlgID uint32, pucIV []byte, pucData []byte) (pucMAC []byte, err error) // 6.6 杂凑运算类函数 // 备注:0018中杂凑运算与hSessionHandle相关联。 // 6.6.2 杂凑运算初始化 // 描述: 三步式数据杂凑运算第一步。 // 备注: uiIDLength非零且uiAlgID为SGD_SM3时, 函数执行SM2的预处理操作。计算过程见GM/T 0009。 SDF_HashInit(uiAlgID uint32, pucPublicKey *sm2.PublicKey, pucID []byte) (err error) // 6.6.3 多包杂凑运算 // 描述: 三步式运算第二步, 对输入的明文进行杂凑运算。 SDF_HashUpdate(pucData []byte) (err error) // 6.6.4 杂凑运算结束 SDF_HashFinal() (pucHash []byte, err error) // 6.7 用户文件操作类函数 // 用户文件操作类函数包括以下具体函数, 各函数返回值见附录A函数返回代码定义: // a) 创建文件 CreateFile // b) 读取文件:ReadFile // c) 写文件:WriteFile // d) 删除文件:DeleteFile // 6.7.2 创建文件 // 描述: 在密码设备内部创建用于存储用户数据的文件。 SDF_CreateFile(pucFileName string, uiFileSize uint32) error // 6.7.3 读取文件 // 描述: 读取在密码设备内部存储用户数据的文件的内容。 // 备注: 读取文件内容至pucBuffer,返回读取字节数。 // 当err != nil时,有可能n>0. 例如err = io.EOF时,仍可能读取到一定字节数。 SDF_ReadFile(pucFileName string, uiOffset uint32, pucBuffer []byte) (n uint32, err error) // 6.7.3 写文件 // 描述: 向密码设备内部存储用户数据的文件中写入内容。 SDF_WriteFile(pucFileName string, uiOffset uint32, pucBuffer []byte) error // 6.7.4 删除文件 // 描述: 删除指定文件名的密码设备内部存储用户数据的文件。 SDF_DeleteFile(pucFileName string) error } // sdf 的扩展接口 type ExtSdfable interface { // 内部sm2私钥解密 SDFEXT_InternalDecryptECC(uiKeyIndex uint32, pucEncData *sm2.Cipher) (pucData []byte, err error) // 6.3.14 生成密钥协商参数并输出-这个与标准接口一致 // 描述: 使用ECC密钥协商算法, 为计算会话密钥而产生协商参数, 同时返回指定索引位置的ECC公钥、临时ECC密钥对的公钥及协商句柄。 SDFEXT_GenerateAgreementDataWithECC(uiISKIndex uint32, uiKeyBits uint32, pucSponsorID []byte) (pucSponsorPublicKey *sm2.PublicKey, pucSponsorTmpPublicKey *sm2.PublicKey, phAgreementHandle interface{}, err error) // 6.3.15 计算会话密钥变体 // 描述: 使用ECC密钥协商算法, 使用自身协商句柄和响应方的协商参数计算会话密钥, 同时返回会话密钥。 // 备注: 协商的发起方获得响应方的协商参数后调用本函数, 计算会话密钥。使用SM2算法计算会话密钥的过程见GM/T 0009。 SDFEXT_GenerateKeyWithECC(pucResponseID []byte, pucResponsePublicKey *sm2.PublicKey, pucResponseTmpPublicKey *sm2.PublicKey, hAgreementHandle interface{}) (agreementKey []byte, err error) // 6.3.16 产生协商数据并计算会话密钥 // 描述: 使用ECC密钥协商算法, 产生协商参数并计算会话密钥, 同时返回产生的协商参数和密钥。 SDFEXT_GenerateAgreementDataAndKeyWithECC(uiISKIndex uint32, uiKeyBits uint32, pucResponseID []byte, pucSponsorID []byte, pucSponsorPublicKey, pucSponsorTmpPublicKey *sm2.PublicKey) (pucResponsePublicKey *sm2.PublicKey, pucResponseTmpPublicKey *sm2.PublicKey, agreementKey []byte, err error) } type SdfManager interface { }