本地生成许可接口(d2c API)#
Virbox LM许可支持远程升级。本地运行时中的许可制作API可以将许可的生成流程集成到自己的工具中,方便统一的维护与管理。包括远程添加、更新、删除、锁定、解锁许可, 增加、删除、改写锁内文件,修正锁内虚拟时钟, 签发动态代码包等功能。
使用流程:
调用master_open
打开开发锁,用于签发d2c包
- 签发许可
第一步,调用d2c_lic_new
创建d2c句柄
第二步,调用d2c_add_lic
添加许可条款
第三步,调用d2c_add_developer_cert
向D2C中添加设备证书链
第四步,调用d2c_get
获取最终的d2c信息,可将结果直接通过ss_lm_update
提供的接口升级到锁内,或者保存为*.d2c的文件异步方式升级到锁内。 - 签发文件
第一步,调用d2c_file_seed_new
创建d2c句柄
第二步,调用d2c_add_pkg
添加文件内容
第三步,调用d2c_add_developer_cert
向D2C中添加设备证书链
第四步,调用d2c_get
获取最终的d2c信息,可将结果直接通过ss_lm_update
提供的接口升级到锁内,或者保存为*.d2c的文件异步方式升级到锁内。
最后,调用 d2c_delete
释放句柄,调用master_close
关闭开发锁.
可以在工具盒-> API -> C -> Samples
目录下找到相关的调用示例。
头文件:
d2c.h
动态库:
libd2c.dll (如果是windows平台,还需要libx509.dll)
静态库:
ss_lm_runtime_api.lib (如果是windows平台,还需要libx509.lib)
结构、自定义类型#
enum SIGN_TYPE#
typedef enum _SIGN_TYPE { /** D2C由证书签发*/ SIGN_TYPE_CERT = 1, /** D2C由种子码签发(暂不支持签发许可)*/ SIGN_TYPE_SEED = 2, } SIGN_TYPE;
D2C_HASH_ALGO#
/* * D2C包的签名哈希类型 */ typedef enum _D2C_HASH_ALGO { /** 哈希算法为:SHA-1 */ D2C_HASH_ALGO_SHA1 = 1, /** 哈希算法为:SHA-256 */ D2C_HASH_ALGO_SHA256 = 2, } D2C_HASH_ALGO;
ACCOUNT_TYPE#
/* * 账户类型,指定给特定的签发对象 */ typedef enum _ACCOUNT_TYPE { /** 签给非账户(硬件锁锁设备)*/ ACCOUNT_TYPE_NONE = 0, /** 签给在线账户(硬件锁锁号作为匿名账户) */ ACCOUNT_TYPE_USB = 1, /** 签给邮箱账户(暂不支持) */ ACCOUNT_TYPE_EMAIL = 2, /** 签给手机账户(暂不支持) */ ACCOUNT_TYPE_PHONE = 3, } ACCOUNT_TYPE;
_D2C_HANDLE_INTERNAL/_MASTER_HANDLE_INTERNAL#
/** D2C Developer2Customer的句柄*/ typedef struct _D2C_HANDLE_INTERNAL* D2C_HANDLE; typedef struct _MASTER_HANDLE_INTERNAL* MASTER_HANDLE;
宏定义#
锁内文件权限定义#
/** 锁内文件权限定义*/ /** 文件开发者可读*/ #define ACCESS_READ 0x01 /** 文件开发者可修改删除*/ #define ACCESS_WRITE_DELETE 0x02 /** 文件开发者可使用(针对密钥文件)*/ #define ACCESS_USE 0x04 /** 文件开发者可远程升级*/ #define ACCESS_WRITE_DELETE_RU 0x08 /** 文件Entry可读*/ #define ACCESS_ENTRY_READ 0x10 /** 文件Entry可修改删除*/ #define ACCESS_ENTRY_WRITE_DELETE 0x20 /** 文件Entry可使用(针对密钥文件)*/ #define ACCESS_ENTRY_USE 0x40 /** 文件深思可远程升级*/ #define ACCESS_ENTRY_WRITE_DELETE_RU 0x80
锁内CA/证书类型#
/** 锁内CA/证书类型(使用频率不高)*/ /** 系统级别CA */ #define PKI_CA_TYPE_SYSTEM 0 /** 开发者CA */ #define PKI_CA_TYPE_DEVELOPER 1 /** 硬件设备CA */ #define PKI_CA_TYPE_DEVICE 2 /** 账户证书 */ #define PKI_CA_TYPE_ACCOUNT 3 /** 根证书 */ #define PKI_CA_TYPE_ROOT 0x80
PIN码#
/** 开发锁PIN码最小长度 */ #define CTRL_PIN_MIN_SIZE 8 /** 开发锁PIN码最大长度 */ #define CTRL_PIN_MAX_SIZE 255
其它#
/** 签发给账户许可的账户名最大长度 */ #define MAX_ACCOUNT_NAME_LENGTH 64 /** 账户GUID的长度 */ #define D2C_GUID_LENGTH 37 /** 修复时钟的随机数长度*/ #define FIXTIME_RAND_LENGTH 8 /** 碎片代码种子大小*/ #define SNIPPET_SEED_LENGTH 32
API函数#
master_open
#
SS_UINT32 SSAPI master_open(OUT MASTER_HANDLE* device_handle);
描述 :
打开签发设备(开发锁)
参数 :
- [out] device_handle 开发锁设备句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
一切的签发功能都离不开开发锁,若不打开开发锁,所有许可分发的操作将不能进行
参见 :
master_close
#
SS_UINT32 SSAPI master_close(IN MASTER_HANDLE device_handle);
描述 :
关闭签发设备(开发锁)
参数 :
- [in] device_handle 开发锁设备句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_get_developer_id
#
SS_UINT32 SSAPI master_get_developer_id( IN MASTER_HANDLE device_handle, OUT SS_BYTE *developer_id);
描述 :
获取开发锁开发者ID
参数 :
- [in] device_handle 开发锁设备句柄
- [out] developer_id 开发者ID
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
开发者ID是每个开发者唯一的一个标识号,每个开发者独立,通过获取开发锁的开发者ID,可判断此开发锁是否为本人所有。最常使用的区别方式是区别Demo开发锁和正式开发锁。
{ MASTER_HANDLE master_handle ; SS_BYTE developer_id[8] = {0}; SS_UINT32 status = SS_OK; status = master_open(&master_handle); if(status != SS_OK) return status; status = master_get_developer_id(master_handle, developer_id); if(status == SS_OK) { // todo // HEXTOSTRING(developer_id); // 将十六进制转换为字符串 } master_close(master_handle); }
master_get_root_count
#
SS_UINT32 SSAPI master_get_root_count( IN MASTER_HANDLE device_handle, OUT SS_UINT32 *count);
描述 :
获取开发者锁内所有的根证书数量
参数 :
- [in] device_handle 开发锁设备句柄
- [out] count 根证书数量
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
自2018年1月1日起,深思对开发锁和用户锁进行安全升级,开发锁将支持多根证书,新用户锁将使用新的根证书。为兼容之前版本的用户锁,开发锁中将拥有多个根证书
master_get_ca_cert
#
SS_UINT32 SSAPI master_get_ca_cert( IN MASTER_HANDLE device_handle, IN SS_BYTE ca_type, OUT SS_BYTE *ca_cert, IN SS_UINT32 cert_bufsize, OUT SS_UINT32 *cert_size);
描述 :
通过证书类型,获取开发锁CA证书
参数 :
- [in] device_handle 开发锁设备句柄
- [in] ca_type 证书类型,详见PKI_CA_TYPE_XXXX
- [out] ca_cert 存放锁CA证书的缓冲区
- [in] cert_bufsize 缓冲区大小
- [out] cert_size CA证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
签发许可需要带上开发者证书链,因此获取开发锁的证书、CA将是不可或缺的接口。
{ SS_UINT32 status = SS_OK; MASTER_HANDLE master_handle; // 证书或者CA的大小一般不会超过1.5k,这里缓冲区使用2k足够大了 SS_BYTE ca[2048] = { 0 }; SS_UINT32 ca_size = 0; master_open(&master_handle); status = master_get_ca_cert(master_handle, PKI_CA_TYPE_DEVELOPER, ca, sizeof(ca), &ca_size); if(status == SS_OK) { // save ca to file } master_close(master_handle); }
master_get_ca_cert_ex
#
SS_UINT32 SSAPI master_get_ca_cert_ex( IN MASTER_HANDLE device_handle, IN SS_BYTE ca_type, IN SS_UINT32 root_index, OUT SS_BYTE *ca_cert, IN SS_UINT32 cert_bufsize, OUT SS_UINT32 *cert_size);
描述 :
通过证书类型,获取开发锁CA证书
参数 :
- [in] device_handle 开发锁设备句柄
- [in] ca_type 证书类型,详见PKI_CA_TYPE_XXXX
- [in] root_index 根证书索引序号
- [out] ca_cert 存放锁CA证书的缓冲区
- [in] cert_bufsize 缓冲区大小
- [out] cert_size CA证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
签发许可需要带上开发者证书链,因此获取开发锁的证书、CA将是不可或缺的接口。
参见 :
master_get_root_ca
#
SS_UINT32 SSAPI master_get_root_ca( IN MASTER_HANDLE device_handle, OUT SS_BYTE *root_ca, IN SS_UINT32 root_bufsize, OUT SS_UINT32 *root_size);
描述 :
获取开发锁RootCA证书
参数 :
- [in] device_handle 设备句柄
- [out] root_ca 存放开发锁Root CA 证书的缓冲区
- [in] root_bufsize 缓冲区大小
- [out] root_size 开发锁Root CA 证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_open
master_get_ca_cert
master_get_device_ca
#
SS_UINT32 SSAPI master_get_device_ca( IN MASTER_HANDLE device_handle, OUT SS_BYTE *device_ca, IN SS_UINT32 device_bufsize, OUT SS_UINT32 *device_size);
描述 :
获取开发锁设备CA证书
参数 :
- [in] device_handle 设备句柄
- [out] device_ca 存放设备CA证书的缓冲区
- [in] device_bufsize 缓冲区大小
- [out] device_size 设备CA证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_open
master_get_ca_cert
master_get_developer_ca
#
SS_UINT32 SSAPI master_get_developer_ca( IN MASTER_HANDLE device_handle, OUT SS_BYTE *developer_ca, IN SS_UINT32 ca_bufsize, OUT SS_UINT32 *ca_size);
描述 :
获取开发锁开发者CA证书
参数 :
- [in] device_handle 设备句柄
- [out] developer_ca 存放开发者CA证书的缓冲区
- [in] ca_bufsize 缓冲区大小
- [out] ca_size 开发者CA证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_open
master_get_ca_cert
master_get_developer_cert
#
SS_UINT32 SSAPI master_get_developer_cert( IN MASTER_HANDLE device_handle, OUT SS_BYTE *developer_cert, IN SS_UINT32 cert_bufsize, OUT SS_UINT32 *cert_size);
描述 :
获取开发锁开发者证书
参数 :
- [in] device_handle 设备句柄
- [out] developer_cert 存放开发者证书的缓冲区
- [in] cert_bufsize 缓冲区大小
- [out] cert_size 开发者证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_open
master_get_ca_cert
master_get_developer_cert_ex
#
SS_UINT32 SSAPI master_get_developer_cert_ex( IN MASTER_HANDLE device_handle, IN SS_UINT32 root_index, OUT SS_BYTE* developer_cert, IN SS_UINT32 cert_bufsize, OUT SS_UINT32* cert_size);
描述 :
根据根证书索引,获取开发锁开发者证书(扩展接口)
参数 :
- [in] device_handle 设备句柄
- [in] root_index 根证书索引序号
- [out] developer_cert 存放开发者证书的缓冲区
- [in] cert_bufsize 缓冲区大小
- [out] cert_size 开发者证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
参见 :
master_open
master_get_ca_cert
master_verify_ca
#
SS_UINT32 SSAPI master_verify_ca( IN MASTER_HANDLE device_handle, IN SS_BOOL store, IN SS_BYTE ca_type, IN SS_BYTE *ca_cert, IN SS_UINT32 ca_len);
描述 :
验证开发锁CA证书
参数 :
- [in] device_handle 设备句柄
- [in] store 验证时,是否将证书存储在锁内。TRUE,存储;FALSE,不存储。
- [in] ca_type 证书类型,详见PKI_CA_TYPE_XXXX
- [in] ca_cert 证书缓冲区
- [in] ca_len 证书长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
{ SS_UINT32 status = SS_OK; MASTER_HANDLE master_handle; SS_BYTE ca[2048] = { 0 }; // 证书或者CA的大小一般不会超过1.5k,这里缓冲区使用2k足够大了 SS_UINT32 ca_size = 0; master_open(&master_handle); // 通过master_get_ca_cert、master_get_developer_ca获取到开发者ca,或者加载外部存储的开发者ca // ... ... status = master_verify_ca(master_handle, FALSE, PKI_CA_TYPE_DEVELOPER, ca, ca_size); if(status == SS_OK) { // save ca to file } master_close(master_handle); }
master_verify_ca_ex
#
SS_UINT32 SSAPI master_verify_ca_ex( IN MASTER_HANDLE device_handle, IN SS_BOOL store, IN SS_BYTE ca_type, IN SS_UINT32 root_index, IN SS_BYTE *ca_cert, IN SS_UINT32 ca_len);
描述 :
验证开发锁CA证书(扩展接口)
参数 :
- [in] device_handle 设备句柄
- [in] store 验证时,是否将证书存储在锁内。TRUE,存储;FALSE,不存储。
- [in] ca_type 证书类型,详见PKI_CA_TYPE_XXXX
- [in] root_index 根证书序号
- [in] ca_cert 证书缓冲区
- [in] ca_len 证书长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
此接口仅对PKI_CA_TYPE_DEVELOPER CA 验证有效
master_get_seedkey
#
SS_UINT32 SSAPI master_get_seedkey( IN MASTER_HANDLE device_handle, OUT SS_BYTE* key, IN SS_UINT32 max_key_len, OUT SS_UINT32* key_len );
描述 :
获取签发设备的种子码密钥(种子码公钥)
参数 :
- [in] device_handle 签发设备的句柄
- [out] key 缓冲区
- [in] max_key_len 缓冲区长度
- [out] key_len 证书的长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
master_get_info
#
SS_UINT32 SSAPI master_get_info( IN MASTER_HANDLE device_handle, IN SS_BYTE type, OUT char **info);
描述 :
获取开发锁设备信息
参数 :
- [in] device_handle 签发设备的句柄
- [in] type 获取信息类型,当前只能 = 1
- [out] info 获取到的信息,json结构
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
info需要调用 master_heap_free 释放
- info 的json结构 { "support_pin":true, "enable_pin":true, "developer_id":"0300000000000009", "lock_firmware_version":"3.1.16", "lm_firmware_version":"1.2.1.0", (PIN码验证通过后获取信息是才有此字段) "sn":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
master_heap_free
#
SS_UINT32 SSAPI master_heap_free(IN void *buf);
描述 :
释放内存
参数 :
- [in] buf D2C内部分配的内存
返回值 :
永远返回 SS_OK
master_pin_change
#
SS_UINT32 SSAPI master_pin_change( IN MASTER_HANDLE device_handle, IN SS_BYTE pin_index, IN SS_BYTE *old_pin, IN SS_UINT32 old_pin_len, IN SS_BYTE *new_pin, IN SS_UINT32 new_pin_len, IN SS_BYTE *hash );
描述 :
修改开发者开发锁PIN码
参数 :
- [in] device_handle 签发设备的句柄
- [in] pin_index PIN码所在的索引位置,目前只支持 1 个PIN码,当前为0
- [in] old_pin 当前使用中的PIN码
- [in] old_pin_len 当前使用的PIN码长度
- [in] new_pin 新PIN码
- [in] new_pin_len 新PIN码长度
- [in] hash 新PIN码的sha256 hash结果,用于内部校验
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
PIN码遵循以下格式:
- 长度不得低于8个字符,不得大于255个字符
- 不得使用汉字,全角字符等
- 不得出现二级制0等会影响真实长度的字符
- 初始PIN码必须修改,否则初始PIN码无法通过验证,初始PIN码从深思开发者中心获取(https://developer.lm.virbox.com/home.html)
master_pin_verify
#
SS_UINT32 SSAPI master_pin_verify( IN MASTER_HANDLE device_handle, IN SS_BYTE pin_index, IN SS_BYTE *pin, IN SS_UINT32 pin_len );
描述 :
验证开发锁PIN码
参数 :
- [in] device_handle 签发设备的句柄
- [in] pin_index PIN码所在的索引位置,目前只支持 1 个PIN码,当前为0
- [in] pin 当前使用中的PIN码
- [in] pin_len 当前使用的PIN码长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
PIN验证遵循以下规则:
- 初始PIN码不能通过验证
- 必须通过PIN码验证才能签发升级包
master_pin_is_verified
#
SS_UINT32 SSAPI master_pin_is_verified(MASTER_HANDLE device_handle);
描述 :
确认PIN码是否验证通过
参数 :
- [in] device_handle 签发设备的句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
如果返回 SS_ERROR_MASTER_OUTDATED_VERSION ,表示控制锁版本太低,必须更换控制锁;如果返回0x0100000D,标明没有进行PIN码验证。
master_pin_enable
#
SS_UINT32 SSAPI master_pin_enable(MASTER_HANDLE device_handle);
描述 :
启用开发锁PIN码
参数 :
- [in] device_handle 签发设备的句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
启用开发锁 PIN 功能
master_pin_disable
#
SS_UINT32 SSAPI master_pin_disable(MASTER_HANDLE device_handle);
描述 :
禁用开发锁PIN码
参数 :
- [in] device_handle 签发设备的句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
禁用当前开发锁的PIN 功能,需先调用 master_pin_verify
master_pin_deauth
#
SS_UINT32 SSAPI master_pin_deauth(MASTER_HANDLE device_handle);
描述 :
清除PIN权限
参数 :
- [in] device_handle 签发设备的句柄
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
清除当前PIN权限后,下次签发许可时,需要重新调用 master_pin_verify
d2c_lic_new
#
SS_UINT32 SSAPI d2c_lic_new( IN MASTER_HANDLE device_handle, OUT D2C_HANDLE* d2c_handle, IN ACCOUNT_TYPE account_type, IN SS_BYTE* account_id, IN SS_UINT32 account_size, IN SS_BYTE* cert, IN SS_UINT32 cert_size );
描述 :
创建D2C句柄,用于签发许可
参数 :
- [in] device_handle 签发设备的句柄
- [out] d2c_handle 返回D2C的句柄
- [in] account_type 账号类型 @see ACCOUNT_TYPE
- [in] account_id 账户名(字符串)或锁号(16字节锁号)
- [in] account_size 账户名长度
- [in] cert 证书,如果是account type为ACCOUNT_TYPE_NONE,填入硬件锁设备证书链,账户许可填入云开发者证书链
- [in] cert_size 证书长度
返回值 :
成功返回SS_OK,失败返回相应的错误码,SS_ERROR_PARSE_CERT 表示解析设备证书失败。
备注 :
创建D2C句柄,生成D2C包的初始化工作。
参见 :
d2c_delete
d2c_add_developer_cert
d2c_add_pkg
d2c_get
d2c_file_new
#
SS_UINT32 SSAPI d2c_file_new( IN MASTER_HANDLE device_handle, OUT D2C_HANDLE* d2c_handle, IN SIGN_TYPE sign_type, IN SS_BYTE* param, IN SS_UINT32 param_size );
描述 :
创建D2C句柄,用于签发非许可类型升级包,例如签发文件
参数 :
- [in] device_handle 签发设备的句柄
- [out] d2c_handle 返回D2C的句柄
- [in] sign_type 签包类型,参考 SIGN_TYPE_XXX
- [in] param 如果是设备证书,则传入设备证书链,种子码签发填入深思根证书
- [in] param_size 证书链的大小或种签子码签发填深思根证书大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
自2018年1月1日起,深思对开发锁和用户锁进行安全升级,开发锁将支持多根证书,新用户锁将使用新的根证书,为保证新旧版本用户锁在签发文件操作上的兼容性,原来的 d2c_file_seed_new 将废弃,变更为当前的d2c_file_new。 主要变更有
- 在使用种子码签发文件时,param 参数由原来的传空,变成传入深思根证书。
深思根证书可以通过 master_get_ca_cert_ex、master_get_root_count 获取。 最为正确的证书获取方法是做法是:
- 开发者从固件版本号 3.1.20 以下版本的用户锁中,获取到深思旧版本根证书传值;
- 开发者从固件版本号 3.1.20 以上(含 3.1.20 )版本的用户锁中,获取深思新版本根证书传值;
- 开发者从深思生产提供的 设备证书链中获取对应根证书。
由于根证书都是一样的,只是新用户锁使用新版本根证书,因此两种证书只需要取一次保存即可。
d2c_add_developer_cert
#
SS_UINT32 SSAPI d2c_add_developer_cert( D2C_HANDLE d2c_handle, SS_BYTE* cert, SS_UINT32 cert_len);
描述 :
增加开发者证书链(不需要再使用了)
参数 :
- [in] d2c_handle D2C句柄
- [in] cert 开发者证书链
- [in] cert_len 证书大小
返回值:
成功返回SS_OK,失败返回相应的错误码
备注:
D2C在生成时将自动添加开发者证书链到D2C包中,不必再调用此接口传入证书链。
gen_dynamic_code
#
SS_UINT32 SSAPI gen_dynamic_code( IN MASTER_HANDLE device_handle, IN SIGN_TYPE sign_type, IN SS_BYTE* param, IN SS_UINT32 param_size, IN SS_BYTE* exec_code, IN SS_UINT32 code_size, IN SS_UINT32* bound_info, IN SS_UINT32 bound_size, OUT SS_BYTE* pkg, IN SS_UINT32 max_pkg_len, OUT SS_UINT32* pkg_len );
描述:
签发动态代码
参数:
- [in] device_handle 设备句柄
- [in] sign_type 签发类型:(D2C_TYPE_XXX)
- [in] param 设备证书 (种子码签发方式填NULL)
- [in] param_size 证书长度 (种子码签发方式填0)
- [in] exec_code 动态代码
- [in] code_size 代码大小(最大支持2048字节大小的动态代码)
- [in] bound_info 绑定信息(许可ID数组,许可ID为4个字节)
- [in] bound_size 绑定信息的长度(字节)
- [out] pkg 存放升级包的用户缓冲区
- [in] max_pkg_len 缓冲区的长度
- [out] pkg_len 签得的代码长
返回值:
成功返回SS_OK,失败返回相应的错误码
d2c_add_pkg
#
SS_UINT32 SSAPI d2c_add_pkg( IN D2C_HANDLE h_d2c, IN SS_CHAR* param, IN SS_CHAR* opr_desc );
描述:
根据描述,生成升级包,并添加升级包到D2C,针对非许可项内容的升级
参数:
- [in] h_d2c D2C句柄(由d2c_lic_new函数得到)
- [in] param 升级包json串
- [in] opr_desc 包描述字符串
返回值:
成功返回SS_OK,失败返回相应的错误码
异常 :
没有异常
备注 :
- 升级规则:
- 更新文件时,执行文件的offset必须为0
- 种子码方式,不能签发许可
- 重置锁注意事项:
- 加密锁升级时必须保持与签包服务器时间相同,否则会出现重置锁失败的情况。
- 锁时间戳小于重置锁限定开始时间,调整计算机本地时间与服务器相同后升级数据包。
- 锁时间戳大于重置锁限定结束时间,重新签发重置锁升级包。
JSON 参数说明: 文件操作: { // 文件操作类型,依次为:添加 | 更新 |删除 "op": "addfile" | "updatefile" | "delfile" // 文件名,长度需小于16字节 "filename": "file_name.xxx", // 文件类型,依次为:可执行文件 | 数据文件 | 密钥文件。 (删除文件时不需要填写类型) "filetype": "evx" | "evd" | "key" // ACCESS_XXX_XXX宏 "access": number // 文件的生成时间(用于抗重放),如果JSON中没有此项,则使用当前时间生成一个时间戳 "timestamp": number(0 ~ 0xFFFFFFFF) // 文件内容HEX16字符串(删除文件时不需要填写此项) "filebuffer": "0123456789ABCDEF" // 文件偏移,默认为0(删除文件时不需要) "fileoffset": number (可选) // 可执行文件绑定的许可,仅文件类型为evx(可执行程序)时有效 "bind_lic": [1,2,3,4] } 重置锁: { "op": "reset" 操作类型:重置锁 "not_before": UTC时间(有效开始时间) "not_after": UTC时间(有效终止时间),升级包在起止时间范围内(包含起止的那一秒)可重复使用。 } 修订时钟: { "op" : "fixtime", 操作类型:修复时钟 "lock_time": number, 用户锁的时间 "rand": "0102030405060708" 8个字节HEX16字符串 "diff": number, 时间差(pc_time - lock_time) }
参见 :
d2c_lic_new
d2c_add_developer_cert
d2c_add_lic
#
SS_UINT32 SSAPI d2c_add_lic( IN D2C_HANDLE h_d2c, IN SS_CHAR* param, IN SS_CHAR* opr_desc, OUT SS_CHAR guid[D2C_GUID_LENGTH] );
描述 :
根据描述,生成升级包,并添加升级包到D2C,针对许可项内容的升级
参数 :
- [in] h_d2c D2C句柄(由d2c_lic_new函数得到)
- [in] param 升级包json串
- [in] opr_desc 包操作描述字符串,开发者自定义
- [out] guid 许可GUID
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
- 升级规则: -# 更新文件时,执行文件的offset必须为0 -# 种子码方式,不能签发许可
- JSON 参数说明:
参数名称 参数类型 必选字段 参数值 参数描述 "op" string 是 "installlic" 安装许可 "addlic" 添加许可 "activelic" 激活许可 "updatelic" 更新许可 "dellic" 删除许可 "lockalllic" 锁定所有许可(0号许可专用) "unlockalllic" 解锁所有许可(0号许可专用) "delalllic" 删除所有许可(0号许可专用) "version" string 否 "op number" 许可版本号(数字,范围从 1 ~ 0xFFFFFFFF) op: '+' | '-' | '=' eg. "=123" "license_id" number 是(视op) -- 许可ID(数字,范围从 1 ~ 0xFFFFFFFF)(lockalllic, delalllic, unlockalllic不需要) "force" bool 否 true/false 是否强制升级,若为true,则升级的策略为: [addlic]无则添加,有则覆盖 [dellic]有则删除,无则成功 "start_time" string 否 "op number" 起始时间(UTC秒) op: '+' | '-' | '=' eg. "=123456" "end_time" string 否 "op number" 终止时间,不设置标明是永久许可(UTC秒) op: '+' | '-' | '=' eg. "+456789" "counter" string 否 "op number" 使用次数 op : '+' | '-' | '=' eg. "-123" "span" string 否 "op number" 时间跨度(UTC秒) op : '+' | '-' | '=' eg. "=987654" "concurrent" string 否 "op number" 最大并发数(0~65535) op : '+' | '-' | '=' eg. "=654" "concurrent_type" string 否 "process" 以进程限制并发 "win_user_session", 以 Windows 会话限制并发数 "module": json_array 否 [1,2,3,4,5,...,64] 模块区,json整数数组结构,数组里可以表示模块,范围从1到64 "timestamp": number 否 -- 许可的签发时间戳,用于防重放,如果JSON中没有此项,则使用当前时间生成一个时间戳 "serial": number 否 -- 许可的签发流水号,用于防重放,如果JSON中没有此项,则与时间戳配合,生成一个流水号 "rom": json 否 -- 只读数据区 { "data":"HEX字符串", 数据区内容 "offset":number, 写入数据区的偏移,默认为0 "resize":number 如果存在此字段,表示重置数据区大小,值即为新的大小 } "raw": json 否 {"data":"HEX字符串", "offset":number,"resize":number} 读写数据区,内容参考只读取描述 "pub": json 否 {"data":"HEX字符串", "offset":number,"resize":number} 公开数据区,内容参考只读取描述 注: 除"lockalllic", "unlockalllic", "delalllic"外,其它操作均需要设置"license_id"字段
参见 :
d2c_lic_new
d2c_add_developer_cert
d2c_get
#
SS_UINT32 SSAPI d2c_get( IN D2C_HANDLE h_d2c, OUT SS_CHAR* d2c_buf, IN SS_UINT32 max_buf_len, OUT SS_UINT32* out_len );
描述 :
从D2C句柄中获取D2C流,可保存为 .d2c 文件用于升级
参数 :
- [in] h_d2c D2C句柄(由d2c_lic_new函数得到)
-
[out] d2c_buf 得到的D2C数据流,该数据流为字符串格式如果为0,则out_len返回需要的长度
-
[in] max_buf_len d2c_buf的缓冲区大小
- [out] out_len 得到的D2C数据流长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
通过此接口获取到最终的D2C包内容,可直接将数据写入锁内,也可保存为.d2c文件,异步写入锁内。
{ ["pkg_type":"type", "pkg_data":"base64", "pkg_desc":"desc"] ["pkg_type":"type", "pkg_data":"base64", "pkg_desc":"desc"] }
参见 :
d2c_lic_new
d2c_add_developer_cert
d2c_get_pkg_desc
#
const SS_CHAR* d2c_get_pkg_desc( IN D2C_HANDLE h_d2c, IN SS_UINT32 index);
描述 :
获得开发者自定义的D2C操作描述,opr_desc
参数 :
- [in] h_d2c D2C句柄(由d2c_lic_new函数得到)
- [in] index pkg的索引,从1开始
返回值 :
字符串,返回值不需要释放,否则会出错
d2c_delete
#
SS_UINT32 SSAPI d2c_delete( IN D2C_HANDLE h_d2c );
描述 :
删除D2C句柄
参数 :
- [in] h_d2c 删除D2C句柄
返回值 :
总是返回SS_OK
参见 :
d2c_sign
#
SS_UINT32 SSAPI d2c_sign( IN MASTER_HANDLE master_handle, D2C_HASH_ALGO hash_algo, IN SS_UINT32 root_index, IN SS_BYTE* data_in, IN SS_UINT32 data_len, OUT SS_BYTE* sign, IN SS_UINT32 max_sign_len, OUT SS_UINT32* sign_len);
描述 :
D2C签名(开发者不必关心)
参数 :
- [in] master_handle 开发锁句柄
- [in] hash_algo 哈希算法类型,参考D2C_HASH_ALGO
- [in] root_index 根证书序号
- [in] data_in 要签名的数据
- [in] data_len 要签名数据的长度
- [out] sign 签名后的数据
- [in] max_sign_len 签名缓冲区长度,至少为 256 + 64 字节
- [out] sign_len 签名数据长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
备注 :
sign 包含 256字节的开发锁签名结果,和 64字节的开发者信息结果。前256字节为签名,后64字节为开发者信息。
d2c_encrypt
#
SS_UINT32 SSAPI d2c_encrypt( IN SS_BYTE* certs, IN SS_UINT32 certs_len, IN const SS_BYTE* plain, IN SS_UINT32 plain_len, OUT SS_BYTE* cipher, IN SS_UINT32 max_cipher_len, OUT SS_UINT32* cipher_len);
描述 :
D2C加密(开发者不必关心)
参数 :
- [in] certs 证书链
- [in] certs_len 链书链长度
- [in] plain 明文
- [in] plain_len 明文长度
- [out] cipher 密文
- [in] max_cipher_len 缓冲区大小
- [out] cipher_len 密文长度
返回值 :
成功返回SS_OK,失败返回相应的错误码
get_snippet_seed
#
SS_UINT32 SSAPI get_snippet_seed( IN MASTER_HANDLE master, IN SS_UINT32 license_id, OUT SS_BYTE snippet_seed[SNIPPET_SEED_LENGTH]);
描述 :
获取碎片代码种子(开发者不必关心)
参数 :
- [in] master 开发锁句柄
- [in] license_id 许可ID
- [out] snippet_seed 碎片代码种子(32字节)
返回值 :
成功返回SS_OK,失败返回相应的错误码
gen_snippet_code
#
SS_UINT32 SSAPI gen_snippet_code( IN MASTER_HANDLE master, IN SS_UINT32 license_id, IN const SS_BYTE* evx_code, IN SS_UINT32 evx_size, OUT SS_BYTE* snippet_code, IN SS_UINT32 snippet_buf_size, OUT SS_UINT32* snippet_size);
描述 :
生成碎片代码(开发者不必关心)
参数 :
- [in] master 开发锁句柄
- [in] license_id 绑定的许可ID
- [in] evx_code 执行的原始文件
- [in] evx_size 执行文件的大小
- [out] snippet_code 存放生成的碎片代码的缓冲区
- [in] snippet_buf_size 缓冲区 snippet_code 的大小
- [out] snippet_size 生成的碎片代码的大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
gen_snippet_code_with_key
#
SS_UINT32 SSAPI gen_snippet_code_with_key( IN const SNIPPET_CODE_CONTEXT* sc_ctx, IN const SS_BYTE* evx, IN SS_UINT32 evx_size, OUT SS_BYTE* snippet_code, IN SS_UINT32 snippet_bufsize, OUT SS_UINT32* snippet_size);
描述 :
获取生成碎片代码请求(开发者不必关心)
参数 :
- [in] sc_ctx 碎片代码上下文
- [in] evx 执行代码原文
- [in] evx_size 执行代码原文大小
- [out] snippet_code 碎片代码缓冲区
- [in] snippet_bufsize 碎片代码缓冲区大小
- [out] snippet_size 碎片代码大小
返回值 :
成功返回SS_OK,失败返回相应的错误码
license_encrypt
#
SS_UINT32 SSAPI license_encrypt( IN MASTER_HANDLE master, IN SS_UINT32 license_id, IN const SS_BYTE* plain, IN SS_UINT32 len, OUT SS_BYTE* cipher);
描述 :
使用开发锁进行许可加密(开发者不必关心)
参数 :
- [in] master 开发锁句柄
- [in] license_id 许可ID
- [in] plain 明文
- [in] len 加密长度(必须是16的倍数)
- [out] cipher 密文
返回值 :
成功返回SS_OK,失败则返回相应的错误码