---
title: 数据结构
description: "本小节主要描述了与密码设备相关的各类数据结构和字段定义，为开发人员提供统一的数据结构规范，以便于开发、调试和对接密码设备。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/cca/devg/Kunpeng_ommercialcryptography_16_0018.html
sourcePath: /source/zh/kunpengcctrustzone/cca/devg/Kunpeng_ommercialcryptography_16_0018.html
indexId: c66a1c3ffe0bdb03bf82ae345cad211ea2d7f41a5802ba34039d08b0d58c8fce81
---
# 数据结构

本小节主要描述了与密码设备相关的各类数据结构和字段定义，为开发人员提供统一的数据结构规范，以便于开发、调试和对接密码设备。

#### 设备信息定义

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| IssuerName | 40 | 设备生产厂商名称。 |
| DeviceName | 16 | 设备型号。 |
| DeviceSerial | 16 | 设备编号，包含：日期（8字符）、批次号（3字符）、流水号（5字符）。 |
| DeviceVersion | 4 | 密码设备内部软件的版本号。 |
| StandardVersion | 4 | 密码设备支持的接口规范版本号。 |
| AsymAlgAbility | 8 | 前4字节标识支持的算法，标识方法为非对称算法标识按位或的结果；后4字节标识算法的最大模长，标识方法为支持的最大模长按位或的结果。 |
| SymAlgAbility | 4 | 所有支持的对称算法，表示方法为对称算法标识按位或的结果。 |
| HashAlgAbility | 4 | 所有支持的杂凑算法，表示方法为杂凑算法标识按位或运算结果。 |
| BufferSize | 4 | 支持的最大文件存储空间（单位字节）。 |


数据结构定义。

```
typedef struct {
unsigned char IssuerName[40];
unsigned char DeviceName[16];
unsigned char DeviceSerial[16];
unsigned int DeviceVersion;
unsigned int StandardVersion;
unsigned int AsymAlgAbility[2];
unsigned int SymAlgAbility;
unsigned int HashAlgAbility;
unsigned int BufferSize;
} DEVICEINFO;
```


#### 密钥分类及存储定义

- 设备密钥与内部用户密钥。

  - 设备密钥只能在设备初始化时生成或安装，内部用户密钥通过密码设备管理工具生成或安装。
  - 设备密钥和内部用户密钥存放于密钥存储区，索引号从0开始检索，每个索引号对应一个签名密钥对和一个加密密钥对。其中，索引号为0表示设备密钥。索引号从1开始表示用户密钥。| 密钥对索引号 | 公钥 | 私钥 |
| --- | --- | --- |
| 0x00 | 设备签名公钥 | 设备签名私钥 |
| 0x00 | 设备加密公钥 | 设备加密私钥 |
| 0x01 | 用户签名公钥 | 用户签名私钥 |
| 0x01 | 用户加密公钥 | 用户加密私钥 |
| …… | …… | …… |
| …… | …… | …… |


- 密钥加密密钥。
  密钥加密密钥通过密码设备管理工具生成或安装，密钥长度为128位，存放于密钥存储区，使用索引号从1开始。
| 密钥索引号 | 密钥加密密钥 |
| --- | --- |
| 0x01 | 密钥加密密钥001 |
| …… | …… |


#### 会话密钥

会话密钥使用设备接口函数生成或导入，会话密钥使用句柄检索。


#### ECC密钥数据结构定义

密钥结构存储时顺序为从高到低，即密钥存放时从密钥结构数组的最高位开始，最高字节填在最高位，不足位填充0。


**表1 公钥数据结构定义**

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| bits | 4 | 密钥位长 |
| x | ECCref\_MAX\_LEN | 公钥x坐标 |
| y | ECCref\_MAX\_LEN | 公钥y坐标 |


**表2 私钥数据结构定义**

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| bits | 4 | 密钥位长 |
| K | ECCref\_MAX\_LEN | 私钥 |


实际数据结构定义。

```
#define ECCref_MAX_BITS 512
#define ECCref_MAX_LEN ((ECCref_MAX_BITS+7) / 8)
typedef struct ECCrefPublicKey_st {
unsigned int bits;
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
} ECCrefPublicKey;
typedef struct ECCrefPrivateKey_st {
unsigned int bits;
unsigned char K[ECCref_MAX_LEN];
} ECCrefPrivateKey;
```


#### ECC加密数据结构定义


**表3 加密数据结构定义**

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| x | ECCref\_MAX\_LEN | X分量 |
| y | ECCref\_MAX\_LEN | Y分量 |
| M | 32 | 明文的杂凑值 |
| L | 4 | 密文数据长度 |
| C | L | 密文数据 |


实际的数据结构定义。

```
typedef struct ECCCipher_st {
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
unsigned char M[32];
unsigned int L;
unsigned char C[];
} ECCCipher;
```


#### ECC签名数据结构定义


**表4 签名数据结构定义**

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| r | ECCref\_MAX\_LEN | 签名的r部分 |
| s | ECCref\_MAX\_LEN | 签名的s部分 |


实际数据结构定义。

```
typedef struct ECCSignature_st {
unsigned char r[ECCref_MAX_LEN];
unsigned char s[ECCref_MAX_LEN];
} ECCSignature;
```

数字信封数据结构定义。

```
typedef struct EnvelopedKey_st {
unsigned int Version;
unsigned int ulSymmAlgID;
unsigned int ulBits;
unsigned char cbEncryptedKey[ECCref_MAX_LEN];
ECCrefPublicKey PubKey;
ECCCipher ECCCipherBlob;
} ECCEnvelopedKey;
```


**表5 数字信封数据结构各字段数据长度与含义**

| 字段名称 | 数据长度（字节） | 含义 |
| --- | --- | --- |
| Version | 4 | 数字信封版本号 |
| ulSymmAlgID | 4 | 数字信封对称算法标识（规范要求ECB格式） |
| ulBits | 4 | 密钥位长 |
| cbEncryptedKey | ECCref\_MAX\_LEN | 对称算法加密后的私钥或对称密钥密文 |
| PubKey | 2 \* ECCref\_MAX\_LEN + 4 | ECC密钥对公钥 |
| ECCCipherBlob | 2 \* ECCref\_MAX\_LEN + M\_LENGTH + L | 用公钥加密对称密钥的密文结果结构体 |
