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)

	// ６.3.24　计算IPSEC会话密钥并用外部ECC公钥加密输出
	// 注：ＩＫＥ 二阶段（快速模式）消息交互完成后，本函数由参与通信的双方各自调用，计算ＩＰＳＥＣ 会话密钥，包括用于
	// 加密的会话密钥和用于完整性校验的会话密钥。ＩＫＥ 二阶段（快速模式）计算ＩＰＳＥＣ 会话密钥的过程参见
	// ＧＭ／Ｔ００２２，输入的密钥参数按顺序为ｐｒｏｔｏｃｏｌ、ＳＰＩ、Ｎｉ＿ｂ、Ｎｒ＿ｂ，返回的密钥密文和密钥句柄按顺序为加密密
	// 钥和杂凑密钥（用于完整性校验）。本函数在６．３．２１计算ＩＫＥ 工作密钥函数调用之后调用，该函数返回的密钥
	// 句柄之一（ＳＫＥＹＩＤ＿ｄ）作为本函数输入。
	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

	// ６.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 {
}
