加密API实现与测试
加密API实现与测试
1 接口文档学习
- 基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。
- 本标准采用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
2 安全要求
- 基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求:
- 设备密钥的使用不对应用系统开放;
- 密钥必须用安全的方法产生并存储;
在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外; - 密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取;
- 密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。
- 密码服务要求:
- 使用的密码算法应得到国家密码主管部门的批准;
- 使用国家密码主管部门认可的密码算法芯片;
- 本标准所列的所有接口函数均应能被应用系统任意调用。
- 设备状态要求:
- 密码设备应具有初始和就绪两个状态;
- 未安装设备密钥的密码设备应处于初始状态,已安装设备密钥的密码设备应处于就绪状态;
- 在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
- 在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作;
- 在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。
- 其他要求:
密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份.恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现。
3 实现与测试
3.1 实现GMT 0018-2012密码设备应用接口规范的接口函数
-
设备管理中的打开设备,关闭设备,获取设备信息,产生随机数
#ifndef__SDF_H #define sDG_ H typedef struct DeviceInfo_st { unsigned char IssuerName [40]; //设备生产厂商名称 unsigned char DeviceName [16]; unsigned char Deviceserial[16]; unsigned int Deviceversion ; unsigned int standardversion ; unsigned int As ymAlgAbility[2]; unsigned int symAlgAbility; unsigned int HashAlgAbility; unsigned int Buffersize; }DEVICEINFO;
-
密钥管理导出 ECC 签名公钥;SDF_ExportSignPublicKey_ECC I.导出 ECC加密公钥∶SDF_ExportEncPublicKey_ECC J. 产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC K.
// 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_IEN]; unsigned char y[ECCref_MAX_LEN]; unsigned char M[32]; unsigned int L; unsigned char C[1]; }Eccipher; // Ecc签名数据结构定义 typedef struct ECcsignature_st { unsigned char r[EcCref_MAX_LEN]; unsigned char s[EcCref_MAX_LEN]; }Eccsignature;
-
非对称算法(至少支持SM2):外部密钥 ECC验证∶SDF_ExternalVerify_ECC ,内部密钥 ECC签名;SDF_InternalSign_ECC ,内部密钥 ECC验证∶SDF_InternalVerify_ECC 外部密钥 ECC加密∶SDF_ExternalEncrypt_ECC
typedef struct SDF_ENVELOPEDKEYBLOB { unsigned long ulAsymmAlgID; unsigned long ulsymmAlgID; ECCCIPHERBLOB ECccipherBlob; ECCPUBLICKEYBLOB PubKey; unsigned char cbEncryptedPriKey [64]; }ENVELOPEDKEYBLOB,*PENVELOPEDKEYBLOB; #define SDR_OK 0x0 /l操作成功
-
对称算法(至少支持SM4)∶SDF_Encrypt 对称解密∶SDF_Dccrypt 计算 MAC∶SDF_CalculateMAC(6分)
/*此函数不对数据进行填充处理,输入的数据必须是指定算法分组长度的整数倍*/ int SDF_Encrypt ( void *hsessionHandle, void *hKeyHandle, unsigned int uiAlglD, unsigned char *puclv, unsigned char *pucData,
-
杂凑算法(至少支持SM3):· 杂凑运算初始化∶SDF_HashInit· 多包杂凑运算∶SDF_HashUpdate· 杂凑运算结束∶SDF_HashFinal
int SDF_HashInit( void *hsessionHandle, unsigned int uiAlgID, EccrefPublicKey *pucPublicKey, unsigned char *puclD, unsigned int uilDLength);
代码运行截图:
3.2 密钥管理要求
int SDF_ReadFile (
void *hsessionHandle,
unsigned char *pucFileName,
unsigned int uiNameLen,
unsigned int uioffset,
unsigned int *puiFileLength ,
unsigned char *puCBuffer);