dcmi_get_attest_evidence接口原型
函数原型
int dcmi_get_attest_evidence(int card_id, int device_id, struct attest_ctx *ctx, unsigned char *evidence, unsigned int *evidence_len)
功能说明
获取设备启动时的度量值(PCR+Quote),以及IMA(Integrity Measurement Architecture)日志和BIOS启动日志。
参数说明
参数名称 |
输入/输出 |
类型 |
描述 |
|---|---|---|---|
card_id |
输入 |
int |
设备ID,当前实际支持的ID通过dcmi_get_card_num_list接口获取。 |
device_id |
输入 |
int |
芯片ID,通过dcmi_get_device_id_in_card接口获取。取值范围如下: NPU芯片:[0, device_id_max-1]。 |
ctx |
输入 |
struct attest_ctx * |
上下文的结构体,用于存放挑战值、挑战值的长度,以及获取指定的日志类型。 生成的挑战值将证明结果与当前会话绑定,从而有效抵御重放攻击,保证远程证明反映的是设备当前可信状态。 相关结构体定义如下: typedef enum {
EVIDENCE_TYPE_NONE = 0, //返回失败
EVIDENCE_TYPE_QUOTE = 1, //仅包含PCR+Quote
EVIDENCE_TYPE_BOOT_MEASUREMENTS = 2, //仅包含BIOS启动日志,预留字段,不支持单独获取
EVIDENCE_TYPE_BOOT_MEASUREMENTS_AND_PCR = 3,//仅包含PCR+Quote+BIOS启动日志
EVIDENCE_TYPE_RUNTIME_MEASUREMENTS = 4,//仅包含IMA日志,预留字段,不支持单独获取
EVIDENCE_TYPE_RUN_TIME_MEASUREMENTS_AND_PCR = 5, //仅包含Quote+PCR+IMA启动日志
EVIDENCE_TYPE_ALL = 7, //包含PCR+Quote+BIOS启动日志+IMA日志
} EVIDENCE_TYPE;
#define MAX_CHALLENGE_LEN 32
struct attest_ctx {
unsigned int challenge_len; //挑战值的长度
EVIDENCE_TYPE evidence_type; //指定获取证明的类型
char challenge[MAX_CHALLENGE_LEN]; //防止重放的挑战值
}
|
evidence |
输出 |
unsigned char * |
返回指定的日志类型结果。 |
evidence_len |
输入/输出 |
unsigned int * |
输入用户分配的空间大小,返回真实数据的长度。 |
返回值说明
类型 |
描述 |
|---|---|
int |
处理结果:
|
异常处理
无。
约束说明
物理机场景(裸机) |
物理机+普通容器场景 |
|
|---|---|---|
root用户 |
运行用户组(非root用户) |
root用户 |
N |
N |
N |
注:Y表示支持;N表示不支持;NA表示不涉及,当前未规划此场景。 |
||
调用示例
…
struct attest_ctx ctx = {0};
unsigned char evidence[65536] = {0}; //假设的最大证据长度
unsigned int evidence_len = sizeof(evidence); //初始化ctx结构体
ctx.challenge_len = 32;
ctx.evidence_type = 3; //假设的证据类型 支持1,3,5,7
dcmi_init();//生成随机challenge
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX_CHALLENGE_LEN; i++) {
ctx.challenge[i] = (char)(rand() % 256);
}
int ret = dcmi_get_attest_evidence(card_id, device_id, &ctx, evidence, &evidence_len);
if (ret != 0){
//记录日志
return ret;
}
…
父主题: 设备管理接口