---
title: 使能镜像密钥封印
description: "机密虚拟机内提供镜像密钥封印（Image Key），每台服务器在出厂前会预置唯一、随机根密钥，在不同的机器上即使相同的派生参数其派生密钥结果会不相同。本章节主要介绍如何使能镜像密钥封印功能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/cVMcont/kunpengtee_16_0030.html
sourcePath: /source/zh/kunpengcctrustzone/tee/cVMcont/kunpengtee_16_0030.html
indexId: 15ab2002fd2b36aa3454235a86d9d74c4a262f95a45b224ba29559cb9779906365
---
# 使能镜像密钥封印

机密虚拟机内提供镜像密钥封印（Image Key），每台服务器在出厂前会预置唯一、随机根密钥，在不同的机器上即使相同的派生参数其派生密钥结果会不相同。本章节主要介绍如何使能镜像密钥封印功能。

本功能仅在cVM虚拟机内使能，Host侧不开放此功能。


1. 部署image key组件。
安装前请根据编译环境要求章节配置openEuler 24.03 LTS SP3的yum源。

  a. 安装动态库和头文件。

```
yum install -y virtCCA_sdk-devel
```


  b. 安装内核态驱动，并刷新内核模块依赖关系。

```
yum install -y virtCCA_driver
depmod
```


  c. 加载内核态驱动，并检查驱动是否成功加载。

```
modprobe image_key
lsmod | grep image_key
```


    - 若depmod刷新依赖关系失败，或modprobe无法自动加载image_key。可通过手动执行insmod的方法加载。执行下方命令查看image_key.ko的安装位置后再手动执行insmod进行加载。

```
rpm -ql virtCCA_driver
insmod /path/to/image_key.ko
```


    - yum源需与当前虚拟机内核版本匹配，否则驱动将插入失败。若找不到匹配的源，可下载驱动源码基于当前内核编译。

```
git clone -b master https://gitcode.com/openeuler/virtCCA_driver.git
cd virtCCA_driver/image_key/src
make KERNEL_DIR=/path/to/kernel
```


2. 在应用中通过如下接口获取Image Key。

```
int get_image_key(IMAGE_KEY_ALG alg, uint8_t* user_param, uint32_t user_param_len, uint8_t* image_key, uint32_t key_len);
```


**表1 参数说明**

| 参数名称 | 说明 |
| --- | --- |
| alg | 入参，指定派生key时的算法。 当前版本仅支持HMAC\_SHA256。 |
| user\_param | 入参，缓冲区指针，用于存放用户参数，传入不同值，可派生不同密钥。 支持NULL值，表示用户不传参。 |
| user\_param\_len | 入参，用户参数的长度。 当前版本仅支持64字节长度或0。 |
| image\_key | 出参，缓冲区指针，用于存放派生结果image key，长度需不小于32字节。 当前版本派生的长度仅支持32。 |
| key\_len | 入参，指定image\_key的长度。 |


  参考代码示例如下。

```
#include <stdint.h>
#include <stdio.h>
#include "image_key.h"
int main(int argc, char *argv[])
{
uint8_t image_key[IMAGE_KEY_LEN] = {0};
uint8_t user_param[64] = {0};
if (get_image_key(HMAC_SHA256, user_param, 64, image_key, IMAGE_KEY_LEN) != 0) {
printf("failed to get image key\n");
return -1;
}
for (int i = 0; i < IMAGE_KEY_LEN; i++) {
printf("%02x ", image_key[i]);
}
printf("\n");
return 0;
}
```


3. 编译Demo代码，并执行。

```
gcc demo.c -o demo -limagekey
./demo
```
