Files
envi-code/SourceCode/Code2026/inc/Dongle_API.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

988 lines
51 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
ARM 加密锁 API 接口库
*/
#ifndef __DONGLE_HEADER_H
#define __DONGLE_HEADER_H
#include "winscard.h"
#pragma comment (lib, "winscard.lib")
#ifdef __cplusplus
extern "C" {
#endif
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
/************************************************************************/
/* 定义 */
/************************************************************************/
//加密锁句柄定义
typedef void * DONGLE_HANDLE;
//默认的PIN码重试次数为无限制
//根据种子码初始化锁时会同时初始化PID和ADMINPIN (PID不可更改, ADMINPIN可更改)
#define CONST_PID 0xFFFFFFFF //出厂时默认的PID
#define CONST_USERPIN "12345678" //出厂时默认的USERPIN
#define CONST_ADMINPIN "FFFFFFFFFFFFFFFF" //出厂时默认的ADMINPIN
//通讯协议类型定义
#define PROTOCOL_HID 0 //hid协议
#define PROTOCOL_CCID 1 //ccid协议
//文件类型定义
#define FILE_DATA 1 //普通数据文件
#define FILE_PRIKEY_RSA 2 //RSA私钥文件
#define FILE_PRIKEY_ECCSM2 3 //ECC或者SM2私钥文件(SM2私钥文件和ECC私钥文件结构相同,属相同文件类型)
#define FILE_KEY 4 //SM4和3DES密钥文件
#define FILE_EXE 5 //可执行文件
//LED灯状态定义
#define LED_OFF 0 //灯灭
#define LED_ON 1 //灯亮
#define LED_BLINK 2 //灯闪
//PIN码类型
#define FLAG_USERPIN 0 //用户PIN
#define FLAG_ADMINPIN 1 //开发商PIN
//加解密标志
#define FLAG_ENCODE 0 //加密
#define FLAG_DECODE 1 //解密
//HASH算法类型
#define FLAG_HASH_MD5 0 //MD5 运算结果16字节
#define FLAG_HASH_SHA1 1 //SHA1 运算结果20字节
#define FLAG_HASH_SM3 2 //SM3 运算结果32字节
//远程升级的功能号
#define UPDATE_FUNC_CreateFile 1 //创建文件
#define UPDATE_FUNC_WriteFile 2 //写文件
#define UPDATE_FUNC_DeleteFile 3 //删除文件
#define UPDATE_FUNC_FileLic 4 //设置文件授权
#define UPDATE_FUNC_SeedCount 5 //设置种子码可运算次数
#define UPDATE_FUNC_DownloadExe 6 //升级可执行文件
#define UPDATE_FUNC_UnlockUserPin 7 //解锁用户PIN
#define UPDATE_FUNC_Deadline 8 //时钟锁升级使用期限
/************************************************************************/
/* 结构 */
/************************************************************************/
//RSA公钥格式(兼容1024,2048)
typedef struct {
unsigned int bits; // length in bits of modulus
unsigned int modulus; // modulus
unsigned char exponent[256]; // public exponent
} RSA_PUBLIC_KEY;
//RSA私钥格式(兼容1024,2048)
typedef struct {
unsigned int bits; // length in bits of modulus
unsigned int modulus; // modulus
unsigned char publicExponent[256]; // public exponent
unsigned char exponent[256]; // private exponent
} RSA_PRIVATE_KEY;
//外部ECCSM2公钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)公钥格式
typedef struct{
unsigned int bits; // length in bits of modulus
unsigned int XCoordinate[8]; // 曲线上点的X坐标
unsigned int YCoordinate[8]; // 曲线上点的Y坐标
} ECCSM2_PUBLIC_KEY;
//外部ECCSM2私钥格式 ECC(支持bits为192或256)和SM2的(bits为固定值0x8100)私钥格式
typedef struct{
unsigned int bits; // length in bits of modulus
unsigned int PrivateKey[8]; // 私钥
} ECCSM2_PRIVATE_KEY;
//加密锁信息
typedef struct
{
unsigned short m_Ver; //COS版本,比如:0x0201,表示2.01版
unsigned short m_Type; //产品类型: 0xFF表示标准版, 0x00为标准时钟锁,0x02为标准U盘锁
unsigned char m_BirthDay[8]; //出厂日期
unsigned long m_Agent; //代理商编号,比如:默认的0xFFFFFFFF
unsigned long m_PID; //产品ID
unsigned long m_UserID; //用户ID
unsigned char m_HID[8]; //8字节的硬件ID
unsigned long m_IsMother; //母锁标志: 0x01表示是母锁, 0x00表示不是母锁
unsigned long m_DevType; //设备类型(PROTOCOL_HID或者PROTOCOL_CCID)
} DONGLE_INFO;
/**
* 锁内文件说明
* 1.RSA私钥文件允许创建的最大数量为8个
* 2.ECCSM2私钥文件允许创建的最大数量为16个
* 3.3DES/SM4密钥文件允许创建的最大数量为32个
* 4.可执行文件允许创建的最大数量为64个,总大小不能超过64K
* 5.数据文件创建个数受锁内空间大小和文件系统其他因素的影响,最大个数不超过54个。
* 6.文件ID取值范围为0x0000~0xFFFF之间,其中ID:0x0000、0xFFFF、0x3F00被锁内系统占用,用户不能使用。
*/
/*************************文件授权结构***********************************/
//数据文件授权结构
typedef struct
{
unsigned short m_Read_Priv; //读权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
unsigned short m_Write_Priv; //写权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
} DATA_LIC;
//私钥文件授权结构
typedef struct
{
long m_Count; //可调次数: 0xFFFFFFFF表示不限制, 递减到0表示已不可调用
unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
unsigned char m_IsDecOnRAM; //是否是在内存中递减: 1为在内存中递减,0为在FLASH中递减
unsigned char m_IsReset; //用户态调用后是否自动回到匿名态: TRUE为调后回到匿名态 (开发商态不受此限制)
unsigned char m_Reserve; //保留,用于4字节对齐
} PRIKEY_LIC;
//对称加密算法(SM4/TDES)密钥文件授权结构
typedef struct
{
unsigned long m_Priv_Enc; //加密时的调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
} KEY_LIC;
//可执行文件授权结构
typedef struct
{
unsigned short m_Priv_Exe; //运行的权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
} EXE_LIC;
/****************************文件属性结构********************************/
//数据文件属性数据结构
typedef struct
{
unsigned long m_Size; //数据文件长度,该值最大为4096
DATA_LIC m_Lic; //授权
} DATA_FILE_ATTR;
//ECCSM2/RSA私钥文件属性数据结构
typedef struct
{
unsigned short m_Type; //数据类型:ECCSM2私钥 或 RSA私钥
unsigned short m_Size; //数据长度:RSA该值为1024或2048, ECC该值为192或256, SM2该值为0x8100
PRIKEY_LIC m_Lic; //授权
} PRIKEY_FILE_ATTR;
//对称加密算法(SM4/TDES)密钥文件属性数据结构
typedef struct
{
unsigned long m_Size; //密钥数据长度=16
KEY_LIC m_Lic; //授权
} KEY_FILE_ATTR;
//可执行文件属性数据结构
typedef struct
{
EXE_LIC m_Lic; //授权
unsigned short m_Len; //文件长度
} EXE_FILE_ATTR;
/*************************文件列表结构***********************************/
//获取私钥文件列表时返回的数据结构
typedef struct
{
unsigned short m_FILEID; //文件ID
unsigned short m_Reserve; //保留,用于4字节对齐
PRIKEY_FILE_ATTR m_attr; //文件属性
}PRIKEY_FILE_LIST;
//获取SM4及TDES密钥文件列表时返回的数据结构
typedef struct
{
unsigned short m_FILEID; //文件ID
unsigned short m_Reserve; //保留,用于4字节对齐
KEY_FILE_ATTR m_attr; //文件属性
}KEY_FILE_LIST;
//获取数据文件列表时返回的数据结构
typedef struct
{
unsigned short m_FILEID; //文件ID
unsigned short m_Reserve; //保留,用于4字节对齐
DATA_FILE_ATTR m_attr; //文件属性
}DATA_FILE_LIST;
//获取可执行文件列表时返回的数据结构
typedef struct
{
unsigned short m_FILEID; //文件ID
EXE_FILE_ATTR m_attr;
unsigned short m_Reserve; //保留,用于4字节对齐
}EXE_FILE_LIST;
//下载和列可执行文件时填充的数据结构
typedef struct
{
unsigned short m_dwSize; //可执行文件大小
unsigned short m_wFileID; //可执行文件ID
unsigned char m_Priv; //调用权限: 0为最小匿名权限,1为最小用户权限,2为最小开发商权限
unsigned char *m_pData; //可执行文件数据
}EXE_FILE_INFO;
//需要发给空锁的初始化数据
typedef struct
{
int m_SeedLen; //种子码长度
BYTE m_SeedForPID[256]; //产生产品ID和开发商密码的种子码 (最长250个字节)
char m_UserPIN[18]; //用户密码(16个字符的0终止字符串)
BYTE m_UserTryCount; //用户密码允许的最大错误重试次数
BYTE m_AdminTryCount; //开发商密码允许的最大错误重试次数
RSA_PRIVATE_KEY m_UpdatePriKey; //远程升级私钥
DWORD m_UserID_Start; //起始用户ID
} SON_DATA;
//母锁数据
typedef struct
{
SON_DATA m_Son; //子锁初始化数据
long m_Count; //可产生子锁初始化数据的次数 (-1表示不限制次数, 递减到0时会受限)
} MOTHER_DATA;
/**************************************************************************/
/* API */
/**************************************************************************/
/**
* @brief 枚举加密锁。本函数最多会枚举出32个hid设备和32个ccid设备。
*
* @param pDongleInfo [out] 设备信息的数组。当此参数为NULL时, pCount返回找到的设备的数目。
* @param pCount [out] 设备数目。该函数最多可以同时枚举出32个HID设备和32个CCID设备。
*
* @return DONGLE_SUCCESS 执行成功。
*/
DWORD WINAPI Dongle_Enum(DONGLE_INFO * pDongleInfo, int * pCount);
/**
* @brief 打开指定的加密锁。
*
* @param phDongle [out] 句柄指针。如果打开成功,会被填充。
* @param nIndex [in] 基于0的索引值。指示打开找到的第几把加密锁。
*
* @return DONGLE_SUCCESS 打开成功。
*/
DWORD WINAPI Dongle_Open(DONGLE_HANDLE * phDongle, int nIndex);
/**
* @brief 清除PIN码验证状态。将加密锁状态变为匿名。
*
* @param hDongle [in] 打开的加密锁句柄。
*
* @return DONGLE_SUCCESS 执行成功。
*/
DWORD WINAPI Dongle_ResetState(DONGLE_HANDLE hDongle);
/**
* @brief 关闭打开的加密锁。
*
* @param hDongle [in] 打开的加密锁句柄。
*
* @return DONGLE_SUCCESS 关闭成功。
*/
DWORD WINAPI Dongle_Close(DONGLE_HANDLE hDongle);
/**
* @brief 产生随机数。匿名权限即可操作。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nLen [in] 要产生的随机数的长度。nLen的取值范围为 1~128。
* @param pRandom [out] 随机数缓冲区。
*
* @return DONGLE_SUCCESS 获取随机数成功。
*/
DWORD WINAPI Dongle_GenRandom(DONGLE_HANDLE hDongle, int nLen, BYTE * pRandom);
/**
* @brief LED灯的控制操作。匿名权限即可操作。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlag [in] 控制类型。例如:nFlag = LED_ON,表示控制LED为亮的状态;
* nFlag = LED_OFF,表示控制LED为灭的状态;nFlag = LED_BLINK,
* 表示控制LED为闪烁的状态。
*
* @return DONGLE_SUCCESS 命令执行成功。
*/
DWORD WINAPI Dongle_LEDControl(DONGLE_HANDLE hDongle, int nFlag);
/**
* @brief 切换通讯协议。调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操作会返回
* 0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作必须要验证开发商PIN码之
* 后方可使用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlag [in] 协议类型。例如:nFlag值为PROTOCOL_HID,表示将加密锁切换为HID设备;
* nFlag值为PROTOCOL_CCID,表示将加密锁切换为CCID设备
*
* @return DONGLE_SUCCESS 执行成功。
*/
DWORD WINAPI Dongle_SwitchProtocol(DONGLE_HANDLE hDongle, int nFlag);
/**
* @brief 一键恢复。即返回出厂状态,加密锁的PID、用户PIN码、开发商PIN码等,全部恢复到出厂状态所有写入的
* 数据都将被清空。另外,调用执行成功后加密锁会自动重启,打开的句柄hDongle会无效,接下来执行关闭操
* 做会返回0xF0000002的错误码,这属正常。如需继续操作,请重新枚举并打开锁。该操作需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
*
* @return DONGLE_SUCCESS 执行成功。
*/
DWORD WINAPI Dongle_RFS(DONGLE_HANDLE hDongle);
/**
* @brief 创建文件。该函数不支持可执行文件的创建。该操作需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFileType [in] 文件类型。
* nFileType = FILE_DATA,表示创建数据文件;对数据文件有以下说明:
* 1.文件大小设为252字节时,最多可创建54个文件,即占用空间13608字节
* 2.文件大小设为1024字节时,最多可创建31个文件,即占用空间31744字节
* 3.文件大小设为4096字节时,最多可创建9个文件,即占用空间36864字节
* nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
* nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
* nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
* 不支持nFileType = FILE_EXE的文件类型。
* @param wFileID [in] 文件ID。
* @param pFileAttr [in] 文件的属性。参数的结构为:DATA_FILE_ATTR、PRIKEY_FILE_ATTR或KEY_FILE_ATTR。
*
* @return DONGLE_SUCCESS 创建文件成功。
*/
DWORD WINAPI Dongle_CreateFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, void * pFileAttr);
/**
* @brief 写文件。该函数不支持可执行文件的写入操作,且该操作需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFileType [in] 文件类型。例如,
* nFileType = FILE_DATA,表示创建数据文件;
* nFileType = FILE_PRIKEY_RSA,表示创建RSA私钥文件;
* nFileType = FILE_PRIKEY_ECCSM2,表示创建ECCSM2私钥文件;
* nFileType = FILE_KEY,表示创建SM4和3DES密钥文件;
* 不支持nFileType = FILE_EXE的文件类型。
* @param wFileID [in] 文件ID。
* @param wOffset [in] 文件偏移。文件写入的起始偏移量。
* @param pInData [in] 准备写入的数据。
* @param nDataLen [in] 参数pInData的大小。
*
* @return DONGLE_SUCCESS 写入文件成功。
*/
DWORD WINAPI Dongle_WriteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID, WORD wOffset, BYTE * pInData, int nDataLen);
/**
* @brief 读取加密锁内的数据文件。数据文件的读取权限取决于创建时的设定。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wFileID [in] 文件ID。
* @param wOffset [in] 文件偏移量。
* @param pOutData [in] 数据缓冲区。
* @param nDataLen [out] 参数pOutData的长度。
*
* @return DONGLE_SUCCESS 读取数据文件成功
*/
DWORD WINAPI Dongle_ReadFile(DONGLE_HANDLE hDongle, WORD wFileID, WORD wOffset, BYTE * pOutData, int nDataLen);
/**
* @brief 批量下载可执行文件。锁内可执行文件的数量不能超过64个,可执行文件的总大小不能超过64K,
* 该操作需要验证管理员权限
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pExeFileInfo [in] 可执行文件信息的数组。
* @param nCount [in] 即可执行文件的数量。
*
* @return DONGLE_SUCCESS 批量下载可执行文件成功。
*/
DWORD WINAPI Dongle_DownloadExeFile(DONGLE_HANDLE hDongle, EXE_FILE_INFO * pExeFileInfo, int nCount);
/**
* @brief 运行指定的锁内可执行程序。运行可执行文件的权限,取决于批量下载时,每个可执行文件的设置,
* 即,EXE_FILE_INFO中的m_Priv参数。输入输出数据的最大长度不能超过1024字节,输入输出数据缓
* 冲区pInOutBuf对应锁内的InOutBuf。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wFileID [in] 可执行文件的文件ID。
* @param pInOutBuf [in,out] 输入输出数据缓冲区。
* @param wInOutBufLen [in] 输入输出数据缓冲区pInOutBuf的大小。
* @param pMainRet [out] 锁内可执行程序main函数的返回值,可以为NULL。
*
* @return DONGLE_SUCCESS 运行指定的可执行文件成功。
*/
DWORD WINAPI Dongle_RunExeFile(DONGLE_HANDLE hDongle, WORD wFileID, BYTE * pInOutBuf, WORD wInOutBufLen, int * pMainRet);
/**
* @brief 删除文件。需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFileType [in] 文件类型。
* @param wFileID [in] 文件ID。
*
* @return DONGLE_SUCCESS 删除文件成功
*/
DWORD WINAPI Dongle_DeleteFile(DONGLE_HANDLE hDongle, int nFileType, WORD wFileID);
/**
* @brief 列文件。需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFileType [in] 指示文件类型。例如,FILE_DATA等。
* @param pFileList [in] pList:输出文件的列表 (此参数为NULL时, pLen中返回所需的缓冲区长度)
* 当nFileType = FILE_DATA时, pFileList指向DATA_FILE_LIST结构;
* 当nFileType = FILE_PRIKEY_RSA时, pFileList指向PRIKEY_FILE_LIST结构;
* 当nFileType = FILE_PRIKEY_ECCSM2时, pFileList指向PRIKEY_FILE_LIST结构
* 当nFileType = FILE_KEY时, pFileList指向KEY_FILE_LIST结构;
* 当nFileType = FILE_EXE时, pFileList指向EXE_FILE_LIST结构。
* @param pDataLen [in,out] 参数pFileList的输入长度,执行成功返回pFileList的字节长度。
*
* @return DONGLE_SUCCESS 列文件成功。
*/
DWORD WINAPI Dongle_ListFile(DONGLE_HANDLE hDongle, int nFileType, void* pFileList, int * pDataLen);
/**
* @brief 唯一化锁。输入种子码产生PID和开发商PIN码,需要开发商权限,执行成功后加密锁自动回到匿名态。
* 产生开发商PIN码的目的是为了使密码肯定不是弱密码,产生的开发商PIN可以借助Dongle_ChangePIN
* 进行更改。另外,种子码一定要牢记,否则任何人永远无法得知开发商PIN码。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nSeedLen [in] 参数pSeed的缓冲区长度。
* @param pSeed [in] 种子码的缓冲区。
* @param pPIDStr [out] 函数执行成功返回PID。该缓冲区大小至少应该为8字节,返回一个
* 8字节的以0终止的ansi字符串。
* @param pAdminPINstr [out] 函数执行成功返回开发商PIN码。该缓冲区大小至少应该为16字节,
* 返回字符串长度为16字节的以0终止的ansi字符串。
*
* @return DONGLE_SUCCESS 唯一化锁成功。
*/
DWORD WINAPI Dongle_GenUniqueKey(DONGLE_HANDLE hDongle,int nSeedLen, BYTE * pSeed, char * pPIDstr, char * pAdminPINstr);
/**
* @brief 校验密码
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
* @param pPIN [in] PIN码,0终止的ansi字符串。
* @param pRemainCount [out] 剩余重试次数。返回0表示已锁死;1~253表示剩余次数;255表示不限制重试次数。
*
* @return DONGLE_SUCCESS 校验成功。如果校验失败,函数的返回值中也含有剩余的重试次数,
* (错误码 & 0xFFFFFF00) == DONGLE_INCORRECT_PIN,即后两位表示剩余次数。
*/
DWORD WINAPI Dongle_VerifyPIN(DONGLE_HANDLE hDongle, int nFlags, char * pPIN, int * pRemainCount);
/**
* @brief 更改密码
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlags [in] PIN码类型。参数取值为FLAG_USERPIN或者FLAG_ADMINPIN。
* @param pOldPIN [in] 旧的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串,且可以是中文。
* @param pNewPIN [in] 新的PIN码缓冲区。必须是一个字符串长度为16字节的0终止的ansi字符串。
* @param nTryCount [in] 重试次数。该参数的取值范围为1~255,其中255表示不限制重试次数。
*
* @return DONGLE_SUCCESS 修改密码成功。
*/
DWORD WINAPI Dongle_ChangePIN(DONGLE_HANDLE hDongle, int nFlags, char * pOldPIN, char * pNewPIN, int nTryCount);
/**
* @brief 重置用户PIN码。空锁(即PID=FFFFFFFF)不能重置密码。执行成功后用户密码恢复为出厂默认 CONST_USERPIN
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pAdminPIN [in] 开发商PIN码缓冲区。长度为16字节的0终止的ansi字符串
*
* @return DONGLE_SUCCESS 重置用户PIN码成功。
*/
DWORD WINAPI Dongle_ResetUserPIN(DONGLE_HANDLE hDongle, char * pAdminPIN);
/**
* @brief 设置用户ID。需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param dwUserID [in] 用户ID。
*
* @return DONGLE_SUCCESS 重置用户PIN码成功。
*/
DWORD WINAPI Dongle_SetUserID(DONGLE_HANDLE hDongle, DWORD dwUserID);
/**
* @brief 获取加密锁到期时间。匿名权限获取。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pdwTime [out] 获取的到期UTC时间值。
* 若*pdwTime = 0XFFFFFFFF,表示不限制到期时间
* 若(*pdwTime & 0XFFFF0000) == 0,值表示还剩余几小时
* 若(*pdwTime & 0XFFFF0000) != 0,值表示到期的UTC的时间,可以通过gmtime等将该值进行转换。
*
* @return DONGLE_SUCCESS 获取加密锁到期时间成功。
*/
DWORD WINAPI Dongle_GetDeadline(DONGLE_HANDLE hDongle, DWORD * pdwTime);
/**
* @brief 设置加密锁的到期时间。该操作需要管理员权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param dwTime [in] 时间值。说明:
* 1.设置可用小时数,范围在1~65535,例如dwTime = 24。这种情况在校验了用户PIN码后开始计时。
* 2.设置到期的年与日时分秒。可通过函数time或者mktime 取得即时的utc时间值(utc值都大于65535);
* 3.取消到期时间限制,此时dwTime的值只能为0xFFFFFFFF。
*
* @return DONGLE_SUCCESS 设置加密锁到期时间成功。
*/
DWORD WINAPI Dongle_SetDeadline(DONGLE_HANDLE hDongle, DWORD dwTime);
/**
* @brief 获取加密锁的UTC时间。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pdwUTCTime [out] UTC时间值指针。
*
* @return DONGLE_SUCCESS 设置加密锁到期时间成功。
*/
DWORD WINAPI Dongle_GetUTCTime(DONGLE_HANDLE hDongle, DWORD * pdwUTCTime);
/**
* @brief 读取锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
* 但是只有开发商权限可写。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nOffset [in] 起始偏移。范围在0~8191
* @param pData [out] 读取的数据缓冲区。
* @param nDataLen [in] 参数pData的缓冲区大小。
*
* @return DONGLE_SUCCESS 读取数据区数据成功。
*/
DWORD WINAPI Dongle_ReadData(DONGLE_HANDLE hDongle, int nOffset, BYTE* pData, int nDataLen);
/**
* @brief 写入锁内数据区数据。数据区大小共8k,前4k(0~4095)的读写没有权限限制,后4k(4096~8191)任意权限可读,
* 但是只有开发商权限可写。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nOffset [in] 起始偏移。范围在0~8191
* @param pData [in] 写入的数据缓冲区。
* @param nDataLen [in] 参数pData的缓冲区大小。
*
* @return DONGLE_SUCCESS 写入数据区数据成功。
*/
DWORD WINAPI Dongle_WriteData(DONGLE_HANDLE hDongle, int nOffset, BYTE * pData, int nDataLen);
/**
* @brief 获取共享内存数据。共享内存总大小为32字节。没有权限限制,掉电后数据自动擦除。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pData [out] 输出的数据。输出共享内存的数据,固定为32个字节。
*
* @return DONGLE_SUCCESS 获取共享内存数据成功。
*/
DWORD WINAPI Dongle_ReadShareMemory(DONGLE_HANDLE hDongle, BYTE * pData);
/**
* @brief 设置共享内存数据。没有权限限制,掉电后数据自动擦除。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pData [in] 输入数据。
* @param nDataLen [in] 参数pData的缓冲区大小。长度不能超过32。
*
* @return DONGLE_SUCCESS 设置共享内存数据成功。
*/
DWORD WINAPI Dongle_WriteShareMemory(DONGLE_HANDLE hDongle, BYTE * pData, int nDataLen);
/**
* @brief 产生RSA公钥和私钥。使用该函数之前需要先创建一个RSA私钥文件。需要开发商权限。成功后注意保存RSA公私钥数据。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] RSA私钥文件ID。
* @param pPubBakup [out] RSA公钥数据。
* @param pPriBakup [out] RSA私钥数据。
*
* @return DONGLE_SUCCESS 产生RSA公私钥成功。
*/
DWORD WINAPI Dongle_RsaGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, RSA_PUBLIC_KEY * pPubBakup, RSA_PRIVATE_KEY * pPriBakup);
/**
* @brief RSA私钥运算。函数的使用权限取决于锁内RSA私钥文件的权限,在RSA私钥文件创建时设定。说明:
* 1.对于加密运算,输入数据长度必须小于私钥ID为wPriFileID的密钥长度除以8再减去11,以便在函数内部进行padding
* 2.对于解密运算,输入数据长度必须与wPriFileID中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
* 3.加密时内部padding方式为:PKCS1_TYPE_1 (即第二个字节为0x01,空数据填充0XFF)
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] RSA私钥文件ID。
* @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
* @param pInData [in] 输入数据。
* @param nInDataLen [in] 参数pInData的大小
* @param pOutData [out] 输出数据缓冲区。
* @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
*
* @return DONGLE_SUCCESS RSA私钥运算成功。
*/
DWORD WINAPI Dongle_RsaPri(DONGLE_HANDLE hDongle, WORD wPriFileID, int nFlag, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
/**
* @brief RSA公钥运算。匿名权限可调用。说明:
* 1.对于加密运算,输入数据长度必须小于pPubKey中指示的密钥长度除以8再减去11,以便在函数内部进行padding
* 2.对于解密运算,输入数据长度必须与pPubKey中指示的密钥长度相一致(比如1024位密钥时为128,2048时为256)
* 3.加密时内部padding方式为:PKCS1_TYPE_2 (即第二个字节为0x02,空数据填充随机数)
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
* @param pPubKey [in] RSA公钥数据。该数据来源于生成RSA公私钥时的公钥数据。
* @param pInData [in] 输入数据。
* @param nInDataLen [in] 参数pInData的大小。
* @param pOutData [out] 输出数据缓冲区。
* @param pOutDataLen [in,out] 参数pOutData的大小和返回的数据大小。
*
* @return DONGLE_SUCCESS RSA公钥运算成功。
*/
DWORD WINAPI Dongle_RsaPub(DONGLE_HANDLE hDongle, int nFlag, RSA_PUBLIC_KEY * pPubKey, BYTE * pInData, int nInDataLen, BYTE * pOutData, int * pOutDataLen);
/**
* @brief 产生ECC公钥和私钥。使用该函数之前需要先创建一个ECC私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] ECC私钥文件ID。
* @param pPubBakup [out] ECC公钥数据。
* @param pPriBakup [out] ECC私钥数据。
*
* @return DONGLE_SUCCESS 产生ECC公私钥成功。
*/
DWORD WINAPI Dongle_EccGenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
/**
* @brief ECC私钥签名。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
* 1.锁内签名算法为: ECDSA_Sign
* 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
* (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
* 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] ECC私钥文件ID。
* @param pHashData [in] Hash数据。
* @param nHashDataLen [in] 参数pHashData的大小。
* @param pOutData [out] 签名数据。大小固定为64字节(256位ECC时是正好,192位ECC时的位会补0)
*
* @return DONGLE_SUCCESS 表示签名成功。
*/
DWORD WINAPI Dongle_EccSign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
/**
* @brief ECC公钥验签。函数的使用权限取决于锁内ECC私钥文件的权限,在ECC私钥文件创建时设定。说明:
* 1.锁内签名算法为: ECDSA_Verify
* 2.输入的Hash值的长度与ECC私钥的密钥长度有关(如果密钥是192位的,则hash值长度不能超过24(192/8 = 24)字节)
* (如果密钥是256位的,则hash值长度不能超过32(256/8 = 32)字节)
* 3.曲线参数为:EC_NIST_PRIME_192及EC_NIST_PRIME_256
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pPubKey [in] ECC公钥数据。
* @param pHashData [in] Hash数据。
* @param nHashDataLen [in] 参数pHashData的大小。
* @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
*
* @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
*/
DWORD WINAPI Dongle_EccVerify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
/**
* @brief 产生SM2公钥和私钥。使用该函数之前需要先创建一个SM2私钥文件。需要开发商权限。成功后注意保存ECC公私钥数据。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] SM2私钥文件ID。
* @param pPubBakup [out] SM2公钥数据。
* @param pPriBakup [out] SM2私钥数据。
*
* @return DONGLE_SUCCESS 产生ECC公私钥成功。
*/
DWORD WINAPI Dongle_SM2GenPubPriKey(DONGLE_HANDLE hDongle, WORD wPriFileID, ECCSM2_PUBLIC_KEY * pPubBakup, ECCSM2_PRIVATE_KEY * pPriBakup);
/**
* @brief SM2私钥签名。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] SM2私钥文件ID。
* @param pHashData [in] Hash数据。
* @param nHashDataLen [in] 参数pHashData的大小。数据长度必须小于32个字节。
* @param pOutData [out] 签名数据。大小固定为64字节。
*
* @return DONGLE_SUCCESS 表示签名成功。
*/
DWORD WINAPI Dongle_SM2Sign(DONGLE_HANDLE hDongle, WORD wPriFileID, BYTE * pHashData, int nHashDataLen, BYTE * pOutData);
/**
* @brief SM2公钥验签。函数的使用权限取决于锁内SM2私钥文件的权限,在SM2私钥文件创建时设定。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wPriFileID [in] SM2公钥数据。
* @param pHashData [in] Hash数据。
* @param nHashDataLen [in] 参数pHashData的大小。
* @param pSign [in] 签名数据。大小固定为64字节,为Dongle_EccSign函数返回的pOutData数据。
*
* @return DONGLE_SUCCESS 表示验签成功,否则表示验签失败。
*/
DWORD WINAPI Dongle_SM2Verify(DONGLE_HANDLE hDongle, ECCSM2_PUBLIC_KEY * pPubKey, BYTE * pHashData, int nHashDataLen, BYTE * pSign);
/**
* @brief 3DES加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wKeyFileID [in] 密钥文件ID。
* @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
* @param pInData [in] 输入数据缓冲区。
* @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
* @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
*
* @return DONGLE_SUCCESS 3DES加密或解密运算成功。
*/
DWORD WINAPI Dongle_TDES(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
/**
* @brief SM4加解密。解密运算匿名权限即可, 加密运算的权限取决于密钥文件的权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param wKeyFileID [in] 密钥文件ID。
* @param nFlag [in] 运算类型。例如,FLAG_ENCODE表示加密运算;FLAG_DECODE表示解密运算。
* @param pInData [in] 输入数据缓冲区。
* @param pOutData [out] 输出数据缓冲区。大小至少要和输入数据缓冲区相同,输入和输出数据缓冲区可以为同一个。
* @param nDataLen [in] 参数pInData的数据大小。数据长度必须是16的整数倍,允许的最大值是1024。
*
* @return DONGLE_SUCCESS SM4加密或解密运算成功。
*/
DWORD WINAPI Dongle_SM4(DONGLE_HANDLE hDongle, WORD wKeyFileID, int nFlag, BYTE * pInData, BYTE * pOutData, int nDataLen);
/**
* @brief HASH运算。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nFlag [in] Hash运算算法类型。
* nFlag = FLAG_HASH_MD5,表示MD5运算,此时pHash的缓冲区大小为16字节。
* nFlag = FLAG_HASH_SHA1,表示SHA1运算,此时pHash的缓冲区大小为20字节。
* nFlag = FLAG_HASH_SM3,表示国密SM3运算,此时pHash的缓冲区大小为32字节。
* @param pInData [in] 输入数据缓冲区。
* @param nDataLen [in] 参数pInData的数据大小。SHA1、MD5为锁外运算,长度不限制;SM3为锁内运算,
* 最大不超过1024字节。
* @param pHash [out] 输出的Hash值。
*
* @return DONGLE_SUCCESS HASH运算成功。
*/
DWORD WINAPI Dongle_HASH(DONGLE_HANDLE hDongle, int nFlag, BYTE * pInData, int nDataLen, BYTE * pHash);
/**
* @brief 种子码算法。匿名权限可使用, 开发商可设置可运算次数。
* 1.种子码算法与PID有关,空锁(即PID=FFFFFFFF)不能进行种子码运算。
* 2.如果内部种子码可运算次数不为-1,当其递减到0后此函数将不能使用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pSeed [in] 输入的种子码数据。
* @param nSeedLen [in] 种子码长度。取值范围为1~250字节。
* @param pOutData [out] 输出数据缓冲区。输出的大小固定为16字节。
*
* @return DONGLE_SUCCESS 种子码运算成功。
*/
DWORD WINAPI Dongle_Seed(DONGLE_HANDLE hDongle, BYTE * pSeed, int nSeedLen, BYTE * pOutData);
/**
* @brief 设置种子码算法可运算次数。需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param nCount [in] 可运算次数。如果此值设置为-1,表示不限制运算次数。
*
* @return DONGLE_SUCCESS 设置成功。
*/
DWORD WINAPI Dongle_LimitSeedCount(DONGLE_HANDLE hDongle, int nCount);
/**
* @brief 制作一把母锁。子母锁的方式是是一种可选的初始化锁方式,安全又快速,推荐使用。需要开发商权限。
* 1.空锁(即PID=FFFFFFFF)不能写入母锁数据。
* 2.出于安全考虑,MOTHER_DATA中的远程升级私钥不允许和母锁自身的远程升级私钥相同,否则会操作失败。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pInData [in] 输入数据。用于初始化母锁的结构为MOTHER_DATA的数据。
*
* @return DONGLE_SUCCESS 制作母锁成功。
*/
DWORD WINAPI Dongle_GenMotherKey(DONGLE_HANDLE hDongle, MOTHER_DATA * pInData);
/**
* @brief 从空锁获取生产请求。此函数只对PID为FFFFFFFF的空锁有效。需要开发商权限。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pRequest [out] 输出数据。返回该数据的有效长度为16字节,因此需要至少16字节的空间。
*
* @return DONGLE_SUCCESS 获取生产请求数据成功。
*/
DWORD WINAPI Dongle_RequestInit(DONGLE_HANDLE hDongle, BYTE * pRequest);
/**
* @brief 从母锁获取用于初始化子锁的数据,该函数只对母锁有效。匿名权限可使用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pRequest [in] 请求数据。通过Dongle_RequestInit获取的请求数据。
* @param pInitData [out] 输出数据。函数执行成功返回用于初始化子锁的数据。
* @param pDataLen [int,out] 参数pInitData的有效长度。表示pInitData的缓冲区长度,函数执行成功
* 返回pInitData的有效长度。
*
* @return DONGLE_SUCCESS 从母锁获取生产数据成功。
*/
DWORD WINAPI Dongle_GetInitDataFromMother(DONGLE_HANDLE hDongle, BYTE * pRequest, BYTE * pInitData, int * pDataLen);
/*
* @brief 生产子锁。用子母锁的方式制作子锁,匿名权限即可调用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pInitData [in] 输入数据。函数Dongle_GetInitDataFromMother返回的用于初始化子锁的数据。
* @param nDataLen [in] 参数pInitData数据缓冲区的有效长度。
*
* @return DONGLE_SUCCESS 生产子锁成功。
*/
DWORD WINAPI Dongle_InitSon(DONGLE_HANDLE hDongle, BYTE * pInitData, int nDataLen);
/**
* @brief 向锁内设置远程升级私钥。私钥长度为1024的RSA私钥。需要开发商权限。
* 出于安全考虑,如果锁是母锁的话,远程升级私钥不允许和母锁数据区中的子锁远程升级私钥相同,否则会操作失败。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pPriKey [in] RSA私钥。
*
* @return DONGLE_SUCCESS 设置远程升级私钥成功。
*/
DWORD WINAPI Dongle_SetUpdatePriKey(DONGLE_HANDLE hDongle, RSA_PRIVATE_KEY * pPriKey);
/**
* @brief 制作远程升级数据包。匿名权限即可调用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
* @param nFunc [in] 升级包类型。
* nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
* nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
* nFunc = UPDATE_FUNC_DeleteFile,删除文件。
* nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
* nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
* nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
* nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
* 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
* nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
*
* @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
* @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
* 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
* @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
* @param pBuffer [in] 输入数据。
* 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
* 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
* 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
* 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
* 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
* 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
* @param nBufferLen [in] 参数pBuffer的缓冲区大小。
* @param pUPubKey [in] 制作升级包的RSA公钥。与设置到锁内的远程升级私钥相对应。该值无论何种升级类型都必须填写。
* @param pOutData [out] 输出数据。制作的升级包数据。
* @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
*
* @return DONGLE_SUCCESS 制作升级包成功。
*/
DWORD WINAPI Dongle_MakeUpdatePacket(DONGLE_HANDLE hDongle, char * pHID, int nFunc, int nFileType, WORD wFileID, int nOffset, BYTE * pBuffer, int nBufferLen, RSA_PUBLIC_KEY * pUPubKey, BYTE * pOutData, int * pOutDataLen);
/**
* @brief 制作远程升级数据包。该函数采用母锁方式制作,与Dongle_MakeUpdatePacket相比少了远程升级公钥,其他相同。匿名权限即可调用。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pHID [in] 硬件序列号。如果不需要绑定该参数可以为NULL。
* @param nFunc [in] 升级包类型。
* nFunc = UPDATE_FUNC_CreateFile,表示创建文件。
* nFunc = UPDATE_FUNC_WriteFile,写文件。只有锁内已有的文件才可升级写文件操作。
* nFunc = UPDATE_FUNC_DeleteFile,删除文件。
* nFunc = UPDATE_FUNC_FileLic,设置文件授权,不支持可执行文件授权升级。
* nFunc = UPDATE_FUNC_SeedCount,设置种子码可运算次数。
* nFunc = UPDATE_FUNC_DownloadExe,升级可执行文件。
* nFunc = UPDATE_FUNC_UnlockUserPin,解锁用户PIN。出于安全考虑解锁用户PIN码必须绑定HID,
* 即pHID不能为空,只有这样才能升级成功。升级成功后用户PIN码恢复为"12345678"。
* nFunc = UPDATE_FUNC_Deadline,时钟锁升级使用期限。
*
* @param nFileType [in] 文件类型。升级有关文件操作时的文件类型。其他升级类型该参数无效。
* @param wFileID [in] 文件ID。升级有关文件操作时的文件ID。其他升级类型该参数无效。
* 当wFileID=0xFFFF时,表示升级锁内数据区的数据。
* @param nOffset [in] 偏移量。升级有关文件操作时的文件偏移量。其他升级类型该参数无效。
* @param pBuffer [in] 输入数据。
* 当nFunc = UPDATE_FUNC_CreateFile时, pBuffer指向要文件的属性结构,例如KEY_FILE_ATTR。
* 当nFunc = UPDATE_FUNC_WriteFile时, pBuffer指向要写入的数据。
* 当nFunc = UPDATE_FUNC_FileLic时, pBuffer指向文件权限的数据结构,例如:DATA_LIC。
* 当nFunc = UPDATE_FUNC_SeedCount时, pBuffer指向long值,表示种子码可运算次数。
* 当nFunc = UPDATE_FUNC_DownloadExe时, pBuffer指向EXE_FILE_INFO结构,与Dongle_DownloadExeFile函数用法类似。
* 当nFunc = UPDATE_FUNC_Deadline时, pBuffer指向DWORD值,表示到期的时间。
* @param nBufferLen [in] 参数pBuffer的缓冲区大小。
* @param pOutData [out] 输出数据。制作的升级包数据。
* @param pOutDataLen [in,out] 参数pOutData输入大小,返回升级包的有效长度。
*
* @return DONGLE_SUCCESS 制作升级包成功。
*/
DWORD WINAPI Dongle_MakeUpdatePacketFromMother(DONGLE_HANDLE hDongle, char * pHID, int nFunc, int nFileType, WORD wFileID, int nOffset, BYTE * pBuffer, int nBufferLen, BYTE * pOutData, int * pOutDataLen);
/**
* @brief 远程升级子锁中的数据。匿名权限即可。升级数据pUpdateData对一把锁只能使用一次。
* 1.本函数内部是按1024字节的分块机制发送,如遇返回值不是DONGLE_SUCCESS会立即中断发送并返回。
* 2.如果需要进行流程控制,可由调用方来分块(每块1024字节)发送,并保证数据块的顺序不被打乱,根据返回的错误码来控制流程。
*
* @param hDongle [in] 打开的加密锁句柄。
* @param pUpdateData [in] 输入数据。升级数据,由Dongle_MakeUpdatePacket或者Dongle_MakeUpdatePacketFromMother产生
* @param nDataLen [in] 参数pUpdateData的大小。必须为1024的整数倍。
*
* @return DONGLE_SUCCESS 升级成功。
*/
DWORD WINAPI Dongle_Update(DONGLE_HANDLE hDongle, BYTE * pUpdateData, int nDataLen);
//错误码
#define DONGLE_SUCCESS 0x00000000 // 操作成功
#define DONGLE_NOT_FOUND 0xF0000001 // 未找到指定的设备
#define DONGLE_INVALID_HANDLE 0xF0000002 // 无效的句柄
#define DONGLE_INVALID_PARAMETER 0xF0000003 // 参数错误
#define DONGLE_COMM_ERROR 0xF0000004 // 通讯错误
#define DONGLE_INSUFFICIENT_BUFFER 0xF0000005 // 缓冲区空间不足
#define DONGLE_NOT_INITIALIZED 0xF0000006 // 产品尚未初始化 (即没设置PID)
#define DONGLE_ALREADY_INITIALIZED 0xF0000007 // 产品已经初始化 (即已设置PID)
#define DONGLE_ADMINPIN_NOT_CHECK 0xF0000008 // 开发商密码没有验证
#define DONGLE_USERPIN_NOT_CHECK 0xF0000009 // 用户密码没有验证
#define DONGLE_INCORRECT_PIN 0xF000FF00 // 密码不正确 (后2位指示剩余次数)
#define DONGLE_PIN_BLOCKED 0xF000000A // PIN码已锁死
#define DONGLE_ACCESS_DENIED 0xF000000B // 访问被拒绝
#define DONGLE_FILE_EXIST 0xF000000E // 文件已存在
#define DONGLE_FILE_NOT_FOUND 0xF000000F // 未找到指定的文件
#define DONGLE_READ_ERROR 0xF0000010 // 读取数据错误
#define DONGLE_WRITE_ERROR 0xF0000011 // 写入数据错误
#define DONGLE_FILE_CREATE_ERROR 0xF0000012 // 创建文件错误
#define DONGLE_FILE_READ_ERROR 0xF0000013 // 读取文件错误
#define DONGLE_FILE_WRITE_ERROR 0xF0000014 // 写入文件错误
#define DONGLE_FILE_DEL_ERROR 0xF0000015 // 删除文件错误
#define DONGLE_FAILED 0xF0000016 // 操作失败
#define DONGLE_CLOCK_EXPIRE 0xF0000017 // 加密锁时钟到期
#define DONGLE_ERROR_UNKNOWN 0xFFFFFFFF // 未知的错误
#ifdef __cplusplus
}
#endif
#endif