采用 SM3 密码算法为应用和数据层的数据传输提供完整性保护和消息鉴别功能
// 服务器密码机已定义 SM3 密码算法带密钥的杂凑运算函数
int SDF_HMACInit(void *hSessionHandle, unsigned int uiAlgID, HANDLE hKeyHandle);
int SDF_HMACUpdate(void *hSessionHandle, unsigned char *pucData, unsigned int uiDataLength);
int SDF_HMACFinal(void *hSessionHandle, unsigned char *pucHMAC, unsigned int *puiHMACLength);
// 用于数据传输完整性保护
void protect_data_integrity(unsigned char *data, size_t data_len, unsigned char *wrap_key, size_t wrap_key_len, int kek_index, unsigned char *hmac) {
int result = 0;
HANDLE hDeviceHandle = NULL;
HANDLE hSessionHandle = NULL;
HANDLE hKeyHandle = NULL;
unsigned char full_hmac[SM3_MAC_LEN]; // SM3算法默认输出长度
// 打开设备(异常处理省略)
result = SDF_OpenDevice(&hDeviceHandle);
// 开启一个会话(异常处理省略)
result = SDF_OpenSession(hDeviceHandle, &hSessionHandle);
// 导入 KEK 保护的密文密钥(异常处理省略)
result = SDF_ImportKeyWithKEK(hSessionHandle, SGD_SM4_ECB, kek_index, wrap_key, wrap_key_len, &hKeyHandle);
// 使用带密钥的杂凑计算(异常处理省略)
result = SDF_HMACInit(hSessionHandle, SGD_SM3, hKeyHandle);
// 假定单次 SDF_HMACUpdate 调用满足应用需求(异常处理省略)
result = SDF_HMACUpdate(hSessionHandle, data, data_len);
// 输出杂凑值(异常处理省略)
result = SDF_HMACFinal(hSessionHandle, full_hmac, &full_hmac_len);
// 截取杂凑值的 2 个字节
memcpy(hmac, full_hmac, 2);
// 将明文数据和截取后的杂凑值发送给接收方(异常处理省略)
result = send_encrypted_data(data, hmac, data_len + 2);
// 关闭会话和设备,其他处理省略
SDF_DestroyKey(hSessionHandle, hKeyHandle);
SDF_CloseSession(hSessionHandle);
SDF_CloseDevice(hDeviceHandle);
}
原文始发于微信公众号(利刃信安):【商密测评】采用 SM3 密码算法为应用和数据层的数据传输提供完整性保护和消息鉴别功能
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论