/*
中华人民共和国密码行业标准
GM/T 0016-2012
----------------------------------
智能密码钥匙密码应用接口规范
----------------------------------
@filename:gmt0016error.h
@author: heliang
@date: 2024-08-12
@brief: 错误代码定义和说明
*/
#ifndef __GMT_0016_ERROR_H__
#define __GMT_0016_ERROR_H__
const int SAR_OK = 0x00000000; //成功
const int SAR_FAIL = 0xA0000001; //失败
const int SAR_UNKNOWNERR = 0xA0000002; //异常错误
const int SAR_NOTSUPPORTYETERR = 0xA0000003; //不支持的服务
const int SAR_FILEERR = 0xA0000004; //文件错误
const int SAR_INVALIDHANDLEERR = 0xA0000005; //无效句柄
const int SAR_INVALIDPARAMERR = 0xA0000006; //无效参数
const int SAR_READFILEERR = 0xA0000007; //读取文件错误
const int SAR_WRITEFILEERR = 0xA0000008; //写入文件错误
const int SAR_NAMELENERR = 0xA0000009;//名称长度错误
const int SAR_KEYUSAGEERR = 0xA000000A;//秘钥用途错误
const int SAR_MODULUSLENERR = 0xA000000B;//模的长度错误
const int SAR_NOTINITIALIZEERR = 0xA000000C;//未初始化
const int SAR_OBJERR = 0xA000000D;//对象错误
const int SAR_MEMORYERR = 0xA000000E;//内存错误
const int SAR_TIMEOUTERR = 0xA000000F;//超时
const int SAR_INDATALENERR = 0xA0000010;//输入数据长度错误
const int SAR_INDATAERR = 0xA0000011;//输入数据错误
const int SAR_GENRANDERR = 0xA0000012;//生成随机数错误
const int SAR_HASHOBJERR = 0xA0000013;//HASH 对象错误
const int SAR_HASHERR = 0xA0000014;//HASH 运算错误
const int SAR_GENRSAKEYERR = 0xA0000015;//产生 RSA 秘钥错误
const int SAR_RSAMODULUSLENERR = 0xA0000016;//RSA 秘钥模的长度错误
const int SAR_CSPIMPRTPUBKEYERR = 0xA0000017;//CSP服务导入公钥错误
const int SAR_RSAENCERR = 0xA0000018;//RSA 加密错误
const int SAR_RSADECERR = 0xA0000019;//RSA 解密错误
const int SAR_HASHNOTEQUALERR = 0xA000001A;//HASH 不相等错误
const int SAR_KEYNOTFOUNTERR = 0xA000001B;//秘钥未找到错误
const int SAR_CERTNOTFOUNDERR = 0xA000001C;//证书未找到错误
const int SAR_NOTEXPORTERR = 0xA000001D; //对象未导出
const int SAR_DECRYPTPADERR = 0xA000001E;//解密时做补丁错误
const int SAR_MACLENERR = 0xA000001F;//MAC 长度错误
const int SAR_BUFFER_TOO_SMALL = 0xA0000020;//缓冲区不足
const int SAR_KEYINFOTYPEERR = 0xA0000021;//秘钥类型错误
const int SAR_NOT_EVENTERR = 0xA0000022;//无事件错误
const int SAR_DEVICE_REMOVED = 0xA0000023;//设备已移除
const int SAR_PIN_INCORRECT = 0xA0000024;//PIN 不正确
const int SAR_PIN_LOCKED = 0xA0000025;//PIN 被锁死
const int SAR_PIN_INVALID = 0xA0000026;//PIN 无效
const int SAR_PIN_LEN_RANGE = 0xA0000027;//PIN 长度错误
const int SAR_USER_ALREADY_LOGGED_IN = 0xA0000028;//用户已经登录
const int SAR_USER_PIN_NOT_INITIALIZED = 0xA0000029;//没有初始化用户口令
const int SAR_USER_TYPE_INVALID = 0xA000002A;//PIN 类型错误
const int SAR_APPLICATION_NAME_INVALID = 0xA000002B;//应用名称错误
const int SAR_APPLICATION_EXIST = 0xA000002C;//应用已经存在
const int SAR_USER_NOT_LGGED_IN = 0xA000002D;//用户没有登录
const int SAR_APPLICATION_NOT_EXIST = 0xA000002E;//应用不存在
const int SAR_FILE_ALREADY_EXIST = 0xA000002F;//文件已经存在
const int SAR_NO_ROOM = 0xA0000030;//空间不足
const int SAR_FILE_NOT_EXIST = 0xA0000031;//文件不存在
const int SAR_REACH_MAX_CONTAINER_COUNT = 0xA0000032;//已达到最大可管理容器数
#endif
/*
中华人民共和国密码行业标准
GM/T 0016-2012
----------------------------------
智能密码钥匙密码应用接口规范
----------------------------------
@filename:gmt0016basestruct.h
@author: heliang
@date: 2024-08-12
@brief: 复合数据类型 定义
*/
#ifndef __GMT_0016_BASE_STRUCT_H__
#define __GMT_0016_BASE_STRUCT_H__
#include "gmt0016basetype.h"
/*
版本
主版本号和次版本号以"."分隔,
例如 Version 1.0,主版本号为 1,此版本号为 0;
Version 2.10,主版本号为 2,此版本号为 10;
*/
typedef struct Struct_Version{
BYTE major; //主版本号
BYTE minor; //次版本号
}VERSION;
/*
设备信息
*/
typedef struct Struct_DEVINFO{
VERSION Version; //版本号。数据结构版本号,本结构的版本号为1.0
CHAR Manufacturer[64]; //设备厂商信息。以 "\0" 为结束符的 ASCII 字符串
CHAR Issuer[64]; //发行厂商信息。以 "\0" 为结束符的 ASCII 字符串
CHAR Label[32]; //设备标签信息。以 "\0" 为结束符的 ASCII 字符串
CHAR SerialNumber[32]; //设备序列号。以 "\0" 为结束符的 ASCII 字符串
VERSION HWVersion; //设备硬件版本
VERSION FirmwareVersion; //设备固件版本
ULONG AlgSymCap; //分组密码算法标识
ULONG AlgAsymCap; //非对称密码算法标识
ULONG AlgHashCap; //密码杂凑算法标识
ULONG DevAuthAlgId; //设备认证使用的分组密码算法标识
ULONG TotalSpace; //设备总空间大小
ULONG FreeSpace; //用户可用空间大小
ULONG MaxECCBufferSize; //能够处理的 ECC 加密数据大小
ULONG MAXBufferSize; //能够处理的分组运算和杂凑运算的数据大小
BYTE Reserved[64]; //保留扩展
}DEVINFO, *PDEVINFO;
/*
RAS公钥数据结构
*/
typedef struct Struct_RSAPUBLICKEYBLOB{
ULONG AlgID; //算法标识号
ULONG BitLen; //模数的实际位长度,必须是 8 的倍数
BYTE Modulus[MAX_RSA_MODULUS_LEN]; //模数
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公钥秘钥,一般为 00010001
}RSAPUBLICKEYBLOB, *PRSAPUBLICKEYBLOB;
/*
RSA 私钥数据结构
*/
typedef struct Struct_RSAPRIVATEKEYBLOB{
ULONG AlgID; //算法标识号
ULONG BitLen; //模数的实际位长度,必须是 8 的倍数
BYTE Modulus[MAX_RSA_MODULUS_LEN]; // 模数 n = p * q,实际长度为 Bitlen/8 字节
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公钥秘钥e,一般为 00010001
BYTE PrivateExponent[MAX_RSA_MODULUS_LEN]; // 私钥秘钥d,实际长度为 Bitlen/8 字节
BYTE Prime1[MAX_RSA_MODULUS_LEN/2]; // 素数p,实际长度为 Bitlen/16 字节
BYTE Prime2[MAX_RSA_MODULUS_LEN/2]; // 素数q,实际长度为 Bitlen/16 字节
BYTE Prime1Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模数模p的逆元,实际长度为 Bitlen/16 字节
BYTE Prime2Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模数模q的逆元,实际长度为 Bitlen/16 字节
BYTE Coefficient[MAX_RSA_MODULUS_LEN/2]; // q模p 的乘法逆元,实际长度为 Bitlen/16 字节
}RSAPRIVATEKEYBLOB, *PRSAPRIVATEKEYBLOB;
/*
ECC 公钥数据结构
*/
typedef struct Struct_ECCPUBLICKEYBLOB{
ULONG BitLen; //模数的实际位长度,必须是 8 的倍数
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //曲线上点的 X 坐标(64位)
BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //曲线上点的 y 坐标(64位)
}ECCPUBLICKEYBLOB, *PECCPUBLICKEYBLOB;
/*
ECC 私钥数据结构
*/
typedef struct Struct_ECCPRIVATEKEYBLOB{
ULONG BitLen; //模数的实际位长度,必须是 8 的倍数
BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN / 8]; //私有秘钥(64位)
}ECCPRIVATEKEYBLOB, *PECCPRIVATEKEYBLOB;
/*
ECC 密文数据结构
*/
typedef struct Struct_ECCCIPHERBLOB{
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //与y组成椭圆 曲线上的点(x,y)
BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //与x组成椭圆 曲线上的点(x,y)
BYTE HASH[32]; //明文的杂凑值
ULONG CipherLen; //密文数据长度
BYTE Cipher[1]; //密文数据, 实际长度为 CipherLen 字节...这种变长,最不好处理了.
}ECCCIPHERBLOB, *PECCCIPHERBLOB;
/*
ECC签名数据结构
*/
typedef struct Struct_ECCSIGNATUREBLOB{
BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //签名结果的 r 部分 (64 Byte)
BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //签名结果的 s 部分 (64 Byte)
}ECCSIGNATUREBLOB, *PECCSIGNATUREBLOB;
/*
分组密码参数
*/
typedef struct Struct_BLOCKCIPHERPARAM{
BYTE IV[MAX_IV_LEN]; //初始向量
ULONG IVLen; //初始向量实际长度(按字节计算)
ULONG PaddingType; //填充方式,0表示不填充,1表示按照 PSCK#5 方式进行填充
ULONG FreeBitLen; //反馈值的位长度(按位计算),只针对 OFB, CFB 模式
}BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM;
/*
ECC加密秘钥对 保护结构
*/
typedef struct SKF_ENVELOPEDKEYBLOB{
ULONG Version; //当前版本为1
ULONG ulSymmAlgID; //对称算法标识,限定 ECB模式
ULONG ulBits; //加密秘钥对的秘钥位长度
BYTE cbEncryptedPriKey[64]; //加密秘钥对私钥的密文
ECCPUBLICKEYBLOB PubKey; //加密秘钥对的公钥
ECCCIPHERBLOB EccCipherBlob; //用保护公钥加密的对称秘钥密文
}ENVELOPEDKEYBLOB, *PENVELOPEDKEYBLOB;
/*
文件属性
*/
typedef struct Struct_FILEATTRIBUTE{
CHAR FileName[32]; // 文件名。以 "\0" 结束的 ASCII 字符串,最大长度是32
ULONG FileSize; //文件大小。创建文件时定义的文件大小
ULONG ReadRights; //读取权限。读取文件需要的权限
ULONG WriteRights; //写入权限。写入文件需要的权限
}FILEATTRIBUTE, *PFILEATTRIBUTE;
#endif
/*
中华人民共和国密码行业标准
GM/T 0016-2012
----------------------------------
智能密码钥匙密码应用接口规范
----------------------------------
@filename:gmt0016basetype.h
@author: heliang
@date: 2024-08-12
@brief: 基本数据类型 定义
*/
#ifndef __GMT_0016_BASE_TYPE_H__
#define __GMT_0016_BASE_TYPE_H__
#include <cstdint>
// 基本数据类型
//todo 要注意,编译器只是支持C++11,如果不支持,就需要用这样的方法重新定义 INT8
#ifndef INT8_MAX
typedef signed char INT8;
#else
typedef int8_t INT8; //有符号8位整数
#endif
#ifndef INT16_MAX
typedef signed short INT16;
#else
typedef int16_t INT16;
#endif
#ifndef INT32_MAX
typedef signed int INT32;
#else
typedef int32_t INT32;
#endif
#ifndef UINT8_MAX
typedef unsigned char UINT8;
#else
typedef uint8_t UINT8;
#endif
#ifndef UINT16_MAX
typedef unsigned short UINT16;
#else
typedef uint16_t UINT16;
#endif
#ifndef UINT32_MAX
typedef unsigned int UINT32;
#else
typedef uint32_t UINT32;
#endif
#ifndef BOOL // 检查 BOOL 是否已经定义
#ifdef _WIN32 // 检测是否在 Windows 平台上
#include <windows.h> // Windows 会定义 BOOL 类型
#else
typedef bool BOOL; // 非 Windows 平台,定义 BOOL 为标准的 bool 类型
#endif
#endif
typedef UINT8 BYTE; //字符类型,无符号8位整数
typedef UINT8 CHAR; //字符类型,无符号8位整数
typedef INT16 SHORT; //短整型,有符号16位整数
typedef UINT16 USHORT; //短整型,无符号16位整数
typedef INT32 LONG; //长整型,有符号32位整数
typedef UINT32 ULONG; //长整形,无符号32位整数
typedef UINT32 UINT; //无符号 32位整数
typedef UINT16 WORD; //字类型,16位无符号整数
typedef UINT32 DWORD; //双字类型,32位无符号整数
typedef UINT32 FLAGS; //标志类型,32位无符号整数
typedef CHAR* LPSTR; //8位字符串指针,按照UTF8格式存储及交换
typedef void* HANDLE; //句柄,指向任意数据对象的起始地址
typedef HANDLE DEVHANDLE; //设备句柄
typedef HANDLE HAPPLICATION; //应用句柄
typedef HANDLE HCONTAINER; //容器句柄
// 常量定义
const int TRUE = 0x00000001; //布尔值为真
const int FALSE = 0x00000000; //布尔值为假
//__stdcall函数调用方式
#define DEVAPI __stdcall
// 算法模数的最大长度
const int MAX_RSA_MODULUS_LEN = 256;
// 算法指数的最大长度
const int MAX_RSA_EXPONENT_LEN = 4;
// ECC算法 X 坐标的最大长度
const int ECC_MAX_XCOORDINATE_BITS_LEN = 512;
// ECC算法 Y 坐标的最大长度
const int ECC_MAX_YCOORDINATE_BITS_LEN = 512;
// ECC算法 模数的最大长度
const int ECC_MAX_MODULUS_BITS_LEN = 512;
// 初始向量的最大长度
const int MAX_IV_LEN = 32;
// 权限类型
const int SECURE_NEVER_ACCOUNT = 0x00000000; //不允许
const int SECURE_ADM_ACCOUNT = 0x00000001; //管理员权限
const int SECURE_USER_ACCOUNT = 0x00000010; //用户权限
const int SECURE_ANYONE_ACCOUNT = 0x000000FF; //任何人
// 设备状态
const int DEV_ABSENT_STATE = 0x00000000; //设备不存在
const int DEV_PRESENT_STATE = 0x00000001; //设备存在
const int DEV_UNKNOWN_STATE = 0x00000002; //设备状态未知
#endif