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 

 

posted @ 2024-08-11 22:07  He_LiangLiang  阅读(1)  评论(0编辑  收藏  举报