实验一-密码引擎-加密API实现与测试

实验一-密码引擎-加密API实现与测试

1 下载并查找GMT 0018-2012密码设备应用接口规范原始文档进行学习 (5分)
2 实现GMT 0018-2012密码设备应用接口规范的接口函数,至少实现:
1)设备管理中的打开设备,关闭设备,获取设备信息,产生随机数(4分)
2)密钥管理导出 ECC 签名公钥;SDF_ExportSignPublicKey_ECC I.导出 ECC加密公钥∶SDF_ExportEncPublicKey_ECC J. 产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC
K. (6分)
3)非对称算法(至少支持SM2):外部密钥 ECC验证∶SDF_ExternalVerify_ECC ,内部密钥 ECC签名;SDF_InternalSign_ECC ,内部密钥 ECC验证∶SDF_InternalVerify_ECC 外部密钥 ECC加密∶SDF_ExternalEncrypt_ECC
(8分)
4)对称算法(至少支持SM4)∶SDF_Encrypt 对称解密∶SDF_Dccrypt 计算 MAC∶SDF_CalculateMAC(6分)
5)杂凑算法(至少支持SM3):杂凑运算初始化∶SDF_HashInit· 多包杂凑运算∶SDF_HashUpdate· 杂凑运算结束∶SDF_HashFinal(6分)

密钥管理要求(10分)
基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求; 1)设备密钥的使用不对应用系统开放; 2) 密钥必须用安全的方法产生并存储;
3) 在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外; 4) 密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取; 5) 密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。

设备状态要求(5分)
基于本标准设计、开发的密码设备在设备状态方面,应满足以下要求; 1) 密码设备应具有初始和就绪两个状态;
2) 未安装设备密钥的密码设备应处干初始状态,已安装设备密钥的密码设备应处于就绪状态; 3) 在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
4) 在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作; 5) 在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。

学习GMT 0018-2012密码设备应用接口规范原始文档

基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。
本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。

  • 设备管理类函数
    打开设备:SDF_OpenDevice
    关闭设备:SDF_CloseDevice
    创建会话:SDF_OpenSession
    关闭会话:SDF_CloseSession
    获取设备信息:SDF_GetDeviceInfo
    产生随机数:SDF_GenerateRandom
    获取私钥使用权限:SDF_GetPrivateKeyAccessRight
    释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight

  • 密钥管理类函数
    导出 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私钥解密:SDFJmportKeyWithlSKJECC
    生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
    计算会话密钥:SDF_GenerateKey WithECC
    产生协商数据并计算会话密钥:SDF_GenerateAgreementDataAndKeyWithECC
    基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
    生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
    导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
    销毁会话密钥:SDF_DestroyKey

  • 非对称算法运算类函数
    外部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
    内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
    内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
    外部密钥 ECC 验证:SDF_ExternalVerify_ECC
    内部密钥 ECC 签名:SDF_InternalSign_ECC
    内部密钥 ECC 验证:SDF_InternalVerify_ECC
    外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC

  • 对称算法运算类函数
    对称加密:SDF_Encrypt
    对称解密:SDF_Decrypt
    计算MAC:SDF_CalculateMAC

  • 杂凑运算类函数
    杂凑运算初始化:SDF_HashInit
    多包杂凑运算:SDF_HashUpdate
    杂凑运算结束:SDF_HashFinal

实现GMT 0018-2012密码设备应用接口规范的接口函数

设备管理

/*
功能:打开密码设备。返回设备句柄
参数:phDeviceHandle[out]
返回值:0 成功; 非0 失败,返回错误码
*/
int SDF_OpenDevice(void ** phDeviceHandle);

 

/*
功能:关闭密码设备,并释放相关资源
参数:hDeviceHandle[in] 已打开的设备句柄
返回值:0 成功; 非0 失败,返回错误代码
*/
int SDF_CloseDevice(void ** hDeviceHandle);

 

/*
功能:获取设备信息
参数:hSessionHandle[in] 与设备建立的会话句柄
           pstDevcenfo [our] 设备能力描述信息,内容及格式见设备信息定义成功
返回值∶0 成功;非0 失败,返回错误代码
*/
int SDF_GeitDevicelnfo(void * hSesionHandle,DEVICEINFO * pstDevicelnfo);

 

/*

功能:获取指定长度的随机数
参数:hSessionHandle[in] 与设备建立的会话句柄

           uiLength[in] 欲获取的随机数长度

           pucRandom[out] 缓冲区指针,用于存放获取的随机数
返回值:0 成功;非0 失败,返回错误代码

int SDF_GetDeviceInfo(void * hSessionHandle, DEVICEINFO * pstDeviceInfo);

*/

密钥管理

/*

功能:导出密码设备内部存储的指定索引位置的签名公钥

参数: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  ECC公钥结构

           pucPrivateKey  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公钥结构

           pucDataInput[in]  缓冲区指针,用于存放外部输入的数据

           uiInputLength[in]  输入的数据长度

           pucSignatre[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

int SDF_ExternalVerify_ECC(void * hSessionHandle, unsigned int uiAlgID, ECCrefPublicKey * pucPublicKey, unsigned char * pucDataInput, unsigned int uiInputLength, ECCSignature * pucSignatre);

*/

 

/*

功能:使用内部ECC私钥对数据进行签名运算

参数:hSessionHandle[in]  与设备建立的会话句柄

           uiISKIndex[in]  密码设备内部存储的ECC签名私钥的索引值

           pucData[in]  缓冲区指针,用于存放外部输入的数据

           uiDataLength[in]  输入的数据长度

           pucSignature[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

int SDF_InternalSign_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[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

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]  算法标识,指定MAC加密算法

           pucIV[in|out]  缓冲区指针,用于存放输入和返回的IV数据

           pucData[in]  缓冲区指针,用于存放输出的数据明文

           uiDataLength[in]  输出的数据明文长度

           pucMAC[out]  缓冲区指针,用于存放输出的MAC值

           pucMACLength[out]  输出的MAC值长度

返回值:0 成功;非0 失败,返回错误代码

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);

*/

杂凑算法

杂凑运算初始化∶SDF_HashInit
多包杂凑运算∶SDF_HashUpdate
杂凑运算结束∶SDF_HashFinal

密钥管理类函数实现

实现接口函数

  • 结构体
typedef struct DeviceInfo_st{
unsigned char IssuerName[40];
unsigned char DeviceName[16];
unsigned char DeviceSerial[16];
unsigned int DeviceVersion;
unsigned int StandardVersion;
unsigned int AsymAlgAbility[2];
unsigned int SymAlgAbility;
unsigned int HashAlgAbility;
unsigned int BufferSize;
}DEVICEINFO;
  • 打开设备
int SDF_OpenDevice(void* phDeviceHandle);
  • 关闭设备
int SDF_CloseDevice(void hDeviceHandle);
  • 获取设备信息
int SDF_GetDeviceInfo(
void hSessionHandle,
DEVICEINFO* pstDeviceInfo);
  • 产生随机数
int SDF_GenerateRandom(
void hSessionHandle,
unsigned int uiLength,
unsigned char* pucRandom);

相关代码

posted @ 2022-04-21 17:15  绒绒的欧嘛harper  Views(382)  Comments(0Edit  收藏  举报
*/