实验一-密码引擎-3-加密API研究
研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
1 总结这些API在编程中的使用方式(5分)
2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)
基本加密函数
用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。
用于生成和存储加密密钥的密钥生成函数。 完全支持更改 链接模式、 初始化向量和其他加密功能。 有关详细信息,请参阅密钥生成和Exchange函数。
用于交换或传输密钥的密钥交换函数。 有关详细信息,请参阅加密密钥存储和Exchange以及密钥生成和Exchange函数。
证书编码/解码函数
用于加密或解密数据的函数。 还支持 哈希 数据。 有关详细信息,请参阅数据加密和解密函数和数据加密和解密。
证书Microsoft Store函数
用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。
简化的消息函数
用于加密和解密消息和数据的函数。
用于对消息和数据进行签名的函数。
用于验证已接收消息和相关数据的签名的真实性的函数。
低级别消息函数
用于执行简化消息函数执行的所有任务的函数。 低级别消息函数比简化的消息函数更灵活,但需要更多的函数调用。 有关详细信息,请参阅 低级别消息 和 低级别消息函数。
使用方式
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
信息隐藏
信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文。
数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。
加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。
身份鉴别
安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。
身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。
因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。
数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。
数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。
证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。
完整性检验
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。
常用函数
BOOLEAN CRYPTFUNC CryptAcquireContext( HCRYPTPROV* phProv, CSP句柄 LPCTSTR pszContainer, 密钥容器名称,指向密钥容器的字符串指针 LPCTSTR pszProvider, 指向CSP名称的字符串指针,如果为NULL,则使用默认的CSP DWORD dwProvType, CSP类型 DWORD dwFlags 标志 );
这个函数是为了获得CSP句柄,函数通过phProv参数返回获得的CSP句柄。在CryptoAPI加密服务相关的所有操作都在CSP实现,CSP真正实行加密相关服务的独立模块,当应用程序需要加密相关服务时,比如:加解密操作、密钥产生于管理等,必须先获取某个CSP句柄。这时一般CryptoAPI编程的第一步。
BOOL CRYPTFUNC CryptGenKey(
HCRYPTPROV hProv, //CSP句柄
ALG_ID Algid, //算法标志ID值。创建会话密钥时,它指定具体的加解密算法。指定算法时应注意具体的
` // CSP是否支持此算法。创建公/私密钥对时,参数应为AT_KEYEXCHANGE(交换密钥对)`
//或AT_SIGNATURE(签名密钥对)。
DWORD dwFlags, //说明创建密钥的长度及其它属性。
HCRYPTKEY* phKey //新创建密钥句柄,函数通过这个参数返回创建密钥句柄。
);
在CryptoAPI中,构造密钥一般有两种方法,一通过哈希值,而通过随机数构造。上面这种就是通过随机数创建的。下面介绍利用哈希值创建的函数。
BOOL CRYPTFUNC CryptDeriveKey( HCRYPTPROV hProv, ALG_ID Algid, //要产生密钥的对称加密算法 HCRYPTHASH hBaseData, //哈希句柄,函数根据这个哈希句柄创建密钥。 DWORD dwFlags, //指定密钥的类型。 HCRYPTKEY* phKey //密钥句柄,函数通过这个参数返回创建的密钥句柄。 );
API函数
服务提供者函数:
/i/l/?n=23&i=blog/2166412/202303/2166412-20230329082709184-771536714.png
密钥的产生和交换函数:
数据加密/解密函数:
哈希和数字签名函数:
维护函数:
简化消息函数:
OID支持函数
(二)RAS公司的PKCS#11标准
研究学习
PKCS#11
PKCS11密码令牌接口标准中文版
OASIS PKCS 11 TC
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
PKCS密码中间件位于上层应用和底层安全设备之间,应用基于 PKCS#11 标准接口开发各类应用程序。主要包括2个库
主API库:提供给应用的PKCS11接口。
tokenDLL库:由主 API 库调用,完成从上向下到指定设备的套接。
安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。
PKCS #11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限,而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象,PKCS #11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
PKCS#11创建和支持下列对象:
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。
PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:一类是公开对象,这类对象是任何用户都可以访问的;另一类是私有对象,这一类对象只有身份被验证的用户才有权访问。决定对象的访问限制类型的模板属性是CKA_PRIVATE。
(四)GMT 0018-2012密码设备应用接口规范
GMT 0018-2012
接口标准
GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。
其中还包括了对部分术语的规定:
使用方式
API函数
设备管理类函数包括以下具体函数:
A.打开设备:SDF_OpenDevice
B.关闭设备:SDF_CloseDevice
C.创建会话:SDF_OpenSession
D.关闭会话:SDF_CloseSession
E.获取设备信息:SDF_GetDeviceInfo
F.产生随机数:SDF_GenerateRandom
G.获取私钥使用权限:SDF_GetPrivateKeyAccessRight
H.释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
密钥管理类函数
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
- SKF接口
2. Crypto API
龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln
导出 RSA 签名公钥∶SDF_ExportSignPublicKey_RSA
导出 RSA 加密公钥∶SDF_ExportEncPublicKey_RSA
产生 RSA非对称密钥对并输出∶SDF_GenerateKeyPair_RSA
生成会话密钥并用内部 RSA公钥加密输出∶SDF_GenerateKeyWithIPK_RSA
生成会话密钥并用外部 RSA公钥加密输出∶SDF_GenerateKeyWithEPK_RSA
导入会话密钥并用内部 RSA私钥解密∶SDF_ImportKeyWithISK_RSA
基于 RSA 算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnRSA
导出 ECC签名公钥∶SDF_ExportSignPublicKey_ECC
导出 ECC 加密公钥∶SDF_ExportEncPublicKey_ECC
产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC
生成会话密钥并用内部 ECC公钥加密输出∶SDF_GenerateKeyWithIPK_ECC
生成会话密钥并用外部 ECC公钥加密输出:SDF_GenerateKeyWithEPK ECC
导入会话密钥并用内部 ECC私钥解密∶SDF_ImportKeyWithISK_ECC
生成密钥协商参数并输出;SDF_GenerateAgreementDataWithECC
计算会话密钥∶SDF_GenerateKeyWiuhECC
产生协商数据并计算会话密钥∶SDF_GenerateAgreementDataAndKeyWithECC
基于 ECC算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出∶SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密∶SDF_ImportKeyWithKEK
销毁会话密钥∶SDF_DestroyKey
2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts\EnumCerts.sln
3.龙脉密码钥匙驱动实例工具等
des:
rc2:
rc4:
rsa:
龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln
代码
sdf.h:
ifndef __SDF_H
define __SDF_H
//定义设备信息结构
typedef struct DeviceInfo_st
{
unsigned char IssuerName[40]; //设备生产厂商
unsigned char DeviceName[16]; //设备型号
unsigned char DeviceSerial[16]; //设备编号,包含:日期(8字符)、批次号(3字符)、流水号(5字符)
unsigned int DeviceVersion; //密码设备软件的版本号
unsigned int StandardVersion; //密码设备支持的接口规范版本号
unsigned int AsymAlgAbility[2]; //前4字节表示支持的算法,表示方法为非对称算法标识按位或的结果;后4字节表示算法的最大模长,表示方法为支持的模长按位或的结果
unsigned int SymAlgAbility; //所有支持的对称算法,表示方法为对称算法标识按位或运算结果
unsigned int HashAlgAbility; //所有支持的杂凑算法,表示方法为杂凑算法标识按位或运算结果
unsigned int BufferSize; //支持的最大文件存储空间(单位字节)
} DEVICEINFO;
//定义RSA密钥数据结构
define RSAref_MAX_BITS 2048
define RSAref_MAX_LEN ((RSAref_MAX_BITS + 7) / 8)
define RSAref_MAX_PBITS ((RSAref_MAX_BITS + 1) / 2)
define RSAref_MAX_PLEN ((RSAref_MAX_PBITS + 7) / 8)
typedef struct RSArefPublicKey_st
{
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
} RSArefPublicKey;
typedef struct RSArefPrivateKey_st
{
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
unsigned char d[RSAref_MAX_LEN];
unsigned char prime[2][RSAref_MAX_PLEN];
unsigned char pexp[2][RSAref_MAX_PLEN];
unsigned char coef[RSAref_MAX_PLEN];
} RSArefPrivateKey;
//定义ECC密钥数据结构
define ECCref_MAX_BITS 512
define ECCref_MAX_LEN ((ECCref_MAX_BITS+ 7 ) / 8)
typedef struct ECCrefPublicKey_st
{
unsigned int bits;
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
} ECCrefPublicKey;
typedef struct ECCrefPrivateKey_st
{
unsigned int bits;
unsigned char K[ECCref_MAX_LEN];
} ECCrefPrivateKey;
//定义ECC加密数据结构
typedef struct ECCCipher_st
{
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
unsigned char M[32];
unsigned int L;
unsigned char C[1];
} ECCCipher;
//定义ECC签名数据结构
typedef struct ECCSignature_st
{
unsigned char r[ECCref_MAX_LEN];
unsigned char s[ECCref_MAX_LEN];
} ECCSignature;
typedef UINT8;
typedef UINT32;
typedef UINT32 ULONG;
typedef UINT8 BYTE;
//定义ECC公钥数据结构
define ECC_MAX_XCOORDINATE_BITS_LEN 512
define ECC_MAX_YCOORDINATE_BITS_LEN 512
typedef struct Struct_ECCPUBLICKEYBLOB{
ULONG BitLen;
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN/8];
}ECCPUBLICKEYBLOB, * PECCPUBLICKEYBLOB;
//定义ECC密文数据结构
typedef struct Struct_ECCCIPHERBLOB{
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE HASH[32];
ULONG CipherLen;
BYTE Cipher[1];
}ECCCIPHERBLOB, * PECCCIPHERBLOB;
//定义ECC加密密钥对保护结构
typedef struct SDF_ENVELOPEDKEYBLOB
{
unsigned long ulAsymmAlgID;
unsigned long ulSymmAlgID;
ECCCIPHERBLOB ECCCipherBlob;
ECCPUBLICKEYBLOB PubKey;
unsigned char cbEncryptedPriKey[64];
} ENVELOPEDKEYBLOB, * PENVELOPEDKEYBLOB;
//Error Code
define SDR_OK 0x0 //操作成功
define SDR_BASE 0x01000000 //错误码基础值
define SDR_UNKNOWERR SDR_BASE + 0x00000001 //未知错误
define SDR_NOTSUPPORT SDR_BASE + 0x00000002 //不支持的接口调用
define SDR_COMMFAIL SDR_BASE + 0x00000003 //与设备通信失败
define SDR_HARDFAIL SDR_BASE + 0x00000004 //运算模块无响应
define SDR_OPENDEVICE SDR_BASE + 0x00000005 //打开设备失败
define SDR_OPENSESSION SDR_BASE + 0x00000006 //创建会话失败
define SDR_PARDENY SDR_BASE + 0x00000007 //无私钥使用权限
define SDR_KEYNOTEXIST SDR_BASE + 0x00000008 //不存在的密钥调用
define SDR_ALGNOTSUPPORT SDR_BASE + 0x00000009 //不支持的算法调用
define SDR_ALGMODNOTSUPPORT SDR_BASE + 0x0000000A //不支持的算法模式调用
define SDR_PKOPERR SDR_BASE + 0x0000000B //公钥运算失败
define SDR_SKOPERR SDR_BASE + 0x0000000C //私钥运算失败
define SDR_SIGNERR SDR_BASE + 0x0000000D //签名运算失败
define SDR_VERIFYERR SDR_BASE + 0x0000000E //验证签名失败
define SDR_SYMOPERR SDR_BASE + 0x0000000F //对称算法运算失败
define SDR_STEPERR SDR_BASE + 0x00000010 //多步运算步骤错误
define SDR_FILESIZEERR SDR_BASE + 0x00000011 //文件长度超出限制
define SDR_FILENOEXIST SDR_BASE + 0x00000012 //指定的文件不存在
define SDR_FILEOFSERR SDR_BASE + 0x00000013 //文件起始位置错误
define SDR_KEYTYPEERR SDR_BASE + 0x00000014 //密钥类型错误
define SDR_KEYERR SDR BASE + 0x00000015 //密钥错误
define SDR_ENCDATAERR SDR_BASE + 0x00000016 //ECC加密数据错误
define SDR_RANDERR SDR_BASE + 0x00000017 //随机数产生失败
define SDR_PRKRERR SDR_BASE + 0x00000018 //私钥使用权限获取失败
define SDR_MACERR SDR_BASE + 0x00000019 //MAC运算失败
define SDR_FILEEXISTS SDR_BASE + 0x0000001A //指定文件已存在
define SDR_FILEWERR SDR_BASE + 0x0000001B //文件写入失败
define SDR_NOBUFFER SDR_BASE + 0x0000001C //存储空间不足
define SDR_INARGERR SDR_BASE + 0x0000001D //输入参数错误
define SDR_OUTARGERR SDR_BASE + 0x0000001E //输出参数错误
//SDR_BASE + 0x0000001F至SDR_BASE + 0x00FFFFFF 预留
//*********************************
//设备管理
//*********************************
/*
功能:打开密码设备
参数:phDeviceHandle[out] 返回设备句柄
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_OpenDevice(void ** phDeviceHandle);
/*
功能:关闭密码设备,并释放相关资源
参数:hDeviceHandle[in] 已打开的设备句柄
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_CloseDevice(void * hDeviceHandle);
/*
功能:获取设备信息
参数:hSessionHandle[in] 与设备建立的会话句柄
pstDeviceInfo[out] 设备能力描述信息,内容及格式见设备信息定义
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo);
/*
功能:获取指定长度的随机数
参数:hSessionHandle[in] 与设备建立的会话句柄
uiLength[in] 欲获取的随机数长度
pucRandom[out] 缓冲区指针,用于存放获取的随机数
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_GenerateRandom (void * hSessionHandle, unsigned int uiLength,unsigned char * pucRandom);
/*
功能:导出密码设备内部存储的指定索引位置的签名公钥
参数:hSessionHandle[in] 与设备建立的会话句柄
uiKeyIndex[in] 密码设备存储的ECC密钥对索引值
pucPublicKey[out] ECC公钥结构
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_ExportSignPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey);
/*
功能:导出密码设备内部存储的指定索引位置的加密公钥
参数:hSessionHandle[in] 与设备建立的会话句柄
uiKeyIndex[in] 密码设备存储的ECC密钥对索引值
pucPublicKey[out] ECC公钥结构
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_ExportEncPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey);
/*
功能:请求密码设备产生指定类型和模长的ECC密钥对
参数:hSessionHandle[in] 与设备建立的会话句柄
uiAlgID[in] 指定算法标识
uiKeyBits[in] 指定密钥长度
pucPublicKey[out] ECC公钥结构
pucPrivateKey[out] ECC私钥结构
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_GenerateKeyPair_ECC( void * hSessionHandle,unsigned int uiAlgID,unsigned int uiKeyBits, ECCrefPublicKey * pucPublicKey,ECCrefPrivateKey * pucPrivateKey);
/*
功能:使用外部ECC公钥对ECC签名值进行验证运算
参数:hSessionHandle[in] 与设备建立的会话句柄
uiAlgID[in] 算法标识,指定使用的ECC算法
pucPublicKey[in] 外部ECC公钥结构
pucData[in] 缓冲区指针,用于存放外部输入的数据
uiDataLength[in] 输入的数据长度
pucSignature[in] 缓冲区指针,用于存放输入的签名值数据
返回值:0 成功
非0 失败,返回错误代码
备注:输入数据为待签数据的杂凑值。当使用SM2算法时,该输入数据为待签数据经过SM2签名预处理的结果,预处理过程见GM/T 0009。
*/
int SDF_ExternalVerify_ECC(void * hSessionHandle,unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucDataInput, unsigned int uiInputLength, ECCSignature * pucSignature);
/*
功能:使用内部ECC私钥对数据进行签名运算
参数:hSessionHandle[in] 与设备建立的会话句柄
uiISKIndex[in] 密码设备内部存储的ECC签名私钥的索引值
pucData[in] 缓冲区指针,用于存放外部输入的数据
uiDataLength[in] 输入的数据长度
pucSignature[out] 缓冲区指针,用于存放输入的签名值数据
返回值:0 成功
非0 失败,返回错误代码
备注:输入数据为待签数据的杂凑值。当使用SM2算法时,该输入数据为待签数据经过SM2签名预处理的结果,预处理过程见GM/T 0009。
*/
int SDFInternalSign_ECC(void * hSessionHandle, unsigned int uiISKIndex, unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature);
/*
功能:使用内部ECC公钥对ECC签名值进行验证运算
参数:hSessionHandle[in] 与设备建立的会话句柄
uiISKIndex[in] 密码设备内部存储的ECC签名私钥的索引值
pucData[in] 缓冲区指针,用于存放外部输入的数据
uiDataLength[in] 输入的数据长度
pucSignature[out] 缓冲区指针,用于存放输入的签名值数据
返回值:0 成功
非0 失败,返回错误代码
备注:输入数据为待签数据的杂凑值。当使用SM2算法时,该输入数据为待签数据经过SM2签名预处理的结果,预处理过程见GM/T 0009。
*/
int SDF_InternalVerify_ECC(void * hSessionHandle,unsigned int uiISKIndex,unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature);
/*
功能:使用外部ECC公钥对数据进行加密运算
参数:hSessionHandle[in] 与设备建立的会话句柄
uiAlgID[in] 算法标识,指定使用的ECC算法
pucPublicKey[in] 外部ECC公钥结构
pucData[in] 缓冲区指针,用于存放外部输入的数据
uiDataLength[in] 输入的数据长度
pucEncData[out] 缓冲区指针,用于存放输出的数据密文
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_ExternalEncrypt_ECC(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucData, unsigned int uiDataLength, ECCCipher * pucEncData);
/*
功能:使用指定的密钥句柄和IV对数据进行对称加密运算
参数:hSessionHandle[in] 与设备建立的会话句柄
hKeyHandle[in] 指定的密钥句柄
uiAlgID[in] 算法标识,指定对称加密算法
pucIV[in|out] 缓冲区指针,用于存放输入和返回的IV数据
pucData[in] 缓冲区指针,用于存放输入的数据明文
uiDataLength[in] 输入的数据明文长度
pucEncData[out] 缓冲区指针,用于存放输出的数据密文
puiEncDataLength[out] 输出的数据密文长度
返回值:0 成功
非0 失败,返回错误代码
备注:此函数不对数据进行填充处理,输入的数据必须是指定算法分组长度的整数倍
*/
int SDF_Encrypt(void * hSessionHandle,void * hKeyHandle,unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength , unsigned char * pucEncData,unsigned int * puiEncDataLength);
/*
功能:使用指定的密钥句柄和IV对数据进行对称解密运算
参数:hSessionHandle[in] 与设备建立的会话句柄
hKeyHandle[in] 指定的密钥句柄
uiAlgID[in] 算法标识,指定对称加密算法
pucIV[in|out] 缓冲区指针,用于存放输入和返回的IV数据
pucEncData[in] 缓冲区指针,用于存放输入的数据明文
uiEncDataLength[in] 输入的数据明文长度
pucData[out] 缓冲区指针,用于存放输出的数据密文
puiDataLength[out] 输出的数据密文长度
返回值:0 成功
非0 失败,返回错误代码
备注:此函数不对数据进行填充处理,输入的数据必须是指定算法分组长度的整数倍
*/
int SDF_Decrypt (void * hSessionHandle, void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV,unsigned char * pucEncData, unsigned int uiEncDataLength, unsigned char * pucData, unsigned int * puiDataLength);
/*
功能:使用指定的密钥句柄和IV对数据进行MAC运算
参数:hSessionHandle[in] 与设备建立的会话句柄
hKeyHandle[in] 指定的密钥句柄
uiAlgID[in] 算法标识,指定对称加密算法
pucIV[in|out] 缓冲区指针,用于存放输入和返回的IV数据
pucData[in] 缓冲区指针,用于存放输出的数据明文
uiDataLength[in] 输入的数据明文长度
pucMAC[out] 缓冲区指针,用于存放输出的MAC值
puiMACLength[out] 输出的MAC值长度
返回值:0 成功
非0 失败,返回错误代码
备注:此函数不对数据进行分包处理,多包数据MAC运算由IV控制最后的MAC值
*/
int SDF_CalculateMAC(void * hSessionHandle,void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength ,unsigned char * pucMAC, unsigned int * puiMACLength);
/*
功能:三步式数据杂凑运算第一步,杂凑运算初始化
参数:hSessionHandle[in] 与设备建立的会话句柄
uiAlgID[in] 指定杂凑算法标识
pucPublicKey[in] 签名者公钥。当uiAlgID为SGD_SM3时有效。
pucID[in] 签名者的ID值,当uiAlgID为SGD_SM3时有效。
uiIDLength[in] 签名者ID的长度,当uiAlgID为SGD.SM3时有效。
返回值:0 成功
非0 失败,返回错误代码
备注:uiIDLength非零且uiAlgID为SGD_SM3时,函数执行SM2的预处理1操作。计算过程见GM/T 0009。
*/
int SDF_HashInit(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey,unsigned char * pucID, unsigned int uiIDLength);
/*
功能:三步式数据杂凑运算第二步,对输入的明文进行杂凑运算
参数:hSessionHandle[in] 与设备建立的会话句柄
pucData[in] 缓冲区指针,用于存放输入的数据明文
uiDataLength[in] 输入的数据明文长度
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_HashUpdate(void * hSessionHandle,unsigned char * pucData,unsigned int uiDataLength);
/*
功能:三步式数据杂凑运算第三步,杂凑运算结束返回杂凑数据并清除中间数据
参数:hSessionHandle[in] 与设备建立的会话句柄
pucHash[out] 缓冲区指针,用于存放输出的杂凑数据
puiHashLength[out] 返回的杂凑数据长度
返回值:0 成功
非0 失败,返回错误代码
*/
int SDF_HashFinal (void * hSessionHandle,unsigned char * pucHash,unsigned int * puiHashLength);