数据结构
本小节主要描述了与密码设备相关的各类数据结构和字段定义,为开发人员提供统一的数据结构规范,以便于开发、调试和对接密码设备。
设备信息定义
字段名称 |
数据长度(字节) |
含义 |
|---|---|---|
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
设备签名公钥
设备签名私钥
设备加密公钥
设备加密私钥
0x01
用户签名公钥
用户签名私钥
用户加密公钥
用户加密私钥
……
……
……
……
……
- 密钥加密密钥
密钥加密密钥通过密码设备管理工具生成或安装,密钥长度为128位,存放于密钥存储区,使用索引号从1开始。
密钥索引号
密钥加密密钥
0x01
密钥加密密钥001
……
……
会话密钥
会话密钥使用设备接口函数生成或导入,会话密钥使用句柄检索。
ECC密钥数据结构定义
密钥结构存储时顺序为从高到低,即密钥存放时从密钥结构数组的最高位开始,最高字节填在最高位,不足位填充数据0。
字段名称 |
数据长度(字节) |
含义 |
|---|---|---|
bits |
4 |
密钥位长 |
x |
ECCref_MAX_LEN |
公钥x坐标 |
y |
ECCref_MAX_LEN |
公钥y坐标 |
字段名称 |
数据长度(字节) |
含义 |
|---|---|---|
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加密数据结构定义
字段名称 |
数据长度(字节) |
含义 |
|---|---|---|
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签名数据结构定义
字段名称 |
数据长度(字节) |
含义 |
|---|---|---|
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;