示例
应用示例
以下为一个C++应用示例hsmc_exmaple
,该示例目录结构如下:
hsmc_example % tree
.
├── CMakeLists.txt
├── hsm-emu-config.yaml
├── hsmc-config.yaml
└── main.cpp
1 directory, 4 files
接下来,将对示例中的每个文件进行说明。
示例配置
该示例依赖密码机软件模拟器
对数据加密,首先须对hsmc
开发库进行配置。
hsmc
开发库配置,内容如下:
hsmc-config.yaml
backends:
hsm:
- emu:
# 密码机软件模拟器动态库路径,在安装hsmc时该库将默认安装在/usr/local/lib目录下
connector: /usr/local/lib/libhsm-emu.so
nodes:
# 模拟器计算节点配置,包含名称和配置选项
- name: example
# 该计算节点的配置文件路径,请根据实际需要调整该路径
config: /home/hsmc_example/hsm-emu-config.yaml
note
有关hsmc
库配置的详细说明,请参考配置
密码机模拟器
开发库配置,内容如下:
hsm-emu-config.yaml
kek:
# 索引为1的kek密钥base64编码
1: uJi4i7XLFdhF+Zb0FaZYuQ==
# 索引为2的kek密钥base64编码
2: CmhoMd57cuG6ewnPd4UU2A==
# 索引为3的kek密钥base64编码
3: z3Y9rtErZVl7lYN9p/ZCyA==
note
有关如何生成该配置文件,请参考密码机模拟器配置
文档。
示例代码
示例代码如下:
main.cpp
#include <iostream>
#include <hsmc/hsmc.h>
int main(int argc, char **argv) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " [configure file]" << std::endl;
return -1;
}
// 生成factory对象,并加载配置文件
hsmc::SessionFactory factory;
factory.init(argv[1]);
// 生成pool对象,并从会话池中获取可用session对象
hsmc::SessionPool pool(factory);
auto session = pool.get();
int kekIndex = 1;
unsigned char dek[32] = {0};
unsigned int deklen = 32;
void *keyHandle = nullptr;
// 生成dek并使用kek加密保护,返回dek为密文
session.SDF_GenerateKeyWithKEK(128, SGD_SM4_ECB, kekIndex, dek,
&deklen, &keyHandle);
unsigned char plaintext[16] = "hello world!";
unsigned char ciphertext[32] = {0};
unsigned int ciphertextlen = sizeof(ciphertext);
// 使用dek加密明文
session.SDF_Encrypt(keyHandle, SGD_SM4_ECB, nullptr, plaintext,
sizeof(plaintext), ciphertext, &ciphertextlen);
// 销毁dek
session.SDF_DestroyKey(keyHandle);
keyHandle = nullptr;
// 导入dek密文,重新获取dek句柄
session.SDF_ImportKeyWithKEK(SGD_SM4_ECB, kekIndex, dek,
deklen, &keyHandle);
unsigned char decrypttext[16] = {0};
unsigned int decrypttextlen = sizeof(decrypttext);
// 使用dek解密密文
session.SDF_Decrypt(keyHandle, SGD_SM4_ECB, nullptr, ciphertext,
ciphertextlen, decrypttext, &decrypttextlen);
if (memcmp(plaintext, decrypttext, sizeof(plaintext)) == 0) {
std::cout << "SM4 ECB encrypt/decrypt success" << std::endl;
} else {
std::cout << "SM4 ECB encrypt/decrypt failed" << std::endl;
}
return 0;
}
示例编译
该示例使用cmake编写,需要首先编写CMakeLists.txt
文件,内容如下:
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
# 工程名称
project(hsmc_example)
set(CMAKE_CXX_STANDARD 14)
# 查找hsmc库
find_package(hsmc REQUIRED)
message(STATUS "using hsmc version: ${hsmc_VERSION}")
# 示例可执行文件hsmc_example
add_executable(hsmc_example main.cpp)
# 示例应用链接hsmc::hsmc库
target_link_libraries(hsmc_example hsmc::hsmc)
在hsmc_example目录下,执行:
mkdir build
cd build
cmake ..
make -j
编译通过后,将在build目录生成可执行文件hsmc_example
示例运行
在hsmc_example/build目录下,执行:
./hsmc_example ../hsmc-config.yaml
SM4 ECB encrypt/decrypt success
至此,在C++应用中集成HSMC开发库的示例就搞定了。