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后运行成功

image-20210330194418614

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";

image-20210330195827546

更改后通过编译并返回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)

image-20210330200731931

运行后监听20000s后结束程序

image-20210330201208260

我判断此处应该插入eKey,但不能识别USB

image-20210330201331630

尝试用wsl运行程序,但会报段错误

image-20210330201514938

设断点判断是在此函数处出错,但是未能解决

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++的桌面开发,再安装即可

image-20210330204606910

可能是有些模块已经不支持了,文件打开可能会报错然后提供解决方案,别慌

image-20210330210150619

EncryptData

image-20210330204835162

直接跑了,但请注意这里的头文件格式#include "../../include/skfapi.h"

Signature

运行直接报找不到skfapi.h文件,把头文件改成#include "../../include/skfapi.h"

修改后报函数传参格式不对

image-20210330205540633

原本是ECCPUBLICKEYBLOB格式,但传参格式是(BYTE*)

image-20210330205607128

参考上下文,将&ecc_pub改为(BYTE*)&ecc_pub

image-20210330205829380

成功运行

DevAuth

image-20210330210022302

直接运行,但插入eKey后也没反应

RemoteUnblock

image-20210330210233687

直接运行

posted @ 2021-03-29 21:47  一个李长兴  阅读(699)  评论(2编辑  收藏  举报