Skip to main content

示例

应用示例

以下为一个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开发库的示例就搞定了。