lmgm算法使用
lmgm算法使用
mToken-GM3000目录结构
├─setup --------------------------------------------------- GM3000中间件安装包,CSP,PKCS11,SKF中间件安装程序
│
├─help --------------------------------------------------- GM3000相关文档
│
├─skf --------------------------------------------------- 国密应用相关中间件
│ │
│ ├─api --------------------------------------------------- 各个操作系统下符合国密应用规范的接口
│ │ ├─linux
│ │ ├─mac
│ │ └─windows
│ └──samples --------------------------------------------------- 各个操作系统下国密应用相关例程
│ ├─linux_mac
│ └─windows
│
├─pkcs11 ----------------------------------------------------PKCS11中间件相关接口和例程
│ │
│ ├─linux
│ ├─mac
│ └─windows
│
├─Tools ---------------------------------------------------GM3000工具集
│
├─GM3000Admin ---------------------------------------------------GM3000管理员工具
│ └─Languages
│
└─mTokenGMInit ---------------------------------------------------GM3000初始化工具
Linux例程运行
在
mToken-GM3000\skf\samples\readme.txt
中得知相关例程功能,接下来修改其main文件或makefile文件使其能够编译通过并运行
DevAuth --------------设备认证例程
直接make编译,显示报错
main.cpp:21:23: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
21 | char *dev_auth_key = "1234567812345678";
参考warning: ISO C++ forbids converting a string constant to ‘char*解决方法,将char *dev_auth_key
改成char const *dev_auth_key
即可
再次make后运行成功
Signature --- 签名验证例程
同样先make,不过报了三个错,vim查看后应该是直接用数字字符初始化的都会报错
main.cpp: In function ‘int main()’:
main.cpp:24:19: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
24 | char *pUserPin = "123456";
| ^~~~~~~~
main.cpp:36:16: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
36 | char *pubid = "1234567812345678";
| ^~~~~~~~~~~~~~~~~~
main.cpp:38:19: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
38 | char *psrcdata = "1234567812345678";
再次利用更换char const
的方式make,但报了错
┌──(root💀lcx20181214)-[~/…/skf/samples/linux_mac/signature]
└─# make
g++ -c -o main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:61:42: error: invalid conversion from ‘const char*’ to ‘LPSTR’ {aka ‘char*’} [-fpermissive]
61 | ulRslt = SKF_VerifyPIN(happ, USER_TYPE, pUserPin, &ulRetryCount);
| ^~~~~~~~
| |
| const char*
In file included from main.cpp:1:
../include/skfapi.h:409:80: note: initializing argument 3 of ‘ULONG SKF_VerifyPIN(HAPPLICATION, ULONG, LPSTR, ULONG*)’
409 | ULONG DEVAPI SKF_VerifyPIN (HAPPLICATION hApplication, ULONG ulPINType, LPSTR szPIN, ULONG *pulRetryCount);
| ~~~~~~^~~~~
make: *** [makefile:43:main.o] 错误 1
虽然刚刚的方式可以通过编译,但实际上是改变了数据类型
参考linux 环境下:warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings],得知还可将char* p = "abc";
替换成char* p = (char*)"abc";
更改后通过编译并返回1
EncryptData --------------数据加解密例程
和上文相同方式,添加`(char*)后即可
monitordev-------------监听设备
报makefile错误
/usr/bin/ld: main.o: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [makefile:30:monitordev] 错误 1
根据王浩博同学的方法,原makefile中出现了两个LINKFLAGS变量,只要将其中一个重命名并加入图中最下面一行即可(图中为改为LINKFLAG)
运行后监听20000s后结束程序
我判断此处应该插入eKey,但不能识别USB
尝试用wsl运行程序,但会报段错误
设断点判断是在此函数处出错,但是未能解决
ulRslt = SKF_WaitForDevEvent(szDevName, &ulDevNameLen, &ulEvent);
[Switching to Thread 0x7ffffef30700 (LWP 46)]
__opendir (name=0x0) at ../sysdeps/posix/opendir.c:89
89 ../sysdeps/posix/opendir.c: No such file or directory.
Windows例程运行
文档中有sln文件和vcxproj文件,所以用VS2019打开,如果没安C++环境的可以点工具—>获取工具和功能—>使用C++的桌面开发,再安装即可
可能是有些模块已经不支持了,文件打开可能会报错然后提供解决方案,别慌
EncryptData
直接跑了,但请注意这里的头文件格式#include "../../include/skfapi.h"
Signature
运行直接报找不到skfapi.h文件,把头文件改成#include "../../include/skfapi.h"
修改后报函数传参格式不对
原本是ECCPUBLICKEYBLOB
格式,但传参格式是(BYTE*)
参考上下文,将&ecc_pub改为(BYTE*)&ecc_pub
成功运行
DevAuth
直接运行,但插入eKey后也没反应
RemoteUnblock
直接运行