somefile--智能密码钥匙密码应用接口规范
/* 中华人民共和国密码行业标准 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