最近有个任务需要实现一个算法的nodejs版本,因为这是个签名算法,比较复杂,而且一般情况下,考虑到安全性和效率,都不会使用自己写的签名算法。为了解决这个问题,找了一些资料,可以通过FFI(foreign function interface)来调用c语言的动态链接库。
1.安装
npm install -g node-gyp
npm intall ffi
npm install ref
通过以上命令安装所需要的模块。
2. 代码示范
c语言的动态链接库给出的接口函数:
unsigned char * input(unsigned char * str);
unsigned char * output(unsigned char * str, unsigned char * str1);
c语言中的返回值是 unsigned char * 或者 signed char*时,返回的文本是变化的,与预期不合。 末尾存在大量0x00,因此这里需要人为的截断。
这里弄了好久也没弄好,最后选择的方式修改动态链接库的接口函数,添加一个参数,以确定传入数组的长度。
unsigned char * output(unsigned char * str, unsigned char * str1,int len);
var ffi = require("ffi");
var ref = require("ref");
const refArray = require('ref-array')
const sk = refArray(ref.types.uchar,2604);
const pk = refArray(ref.types.uchar,2065);
var libhel = ffi.Library('./libhelloworld.so',{
'output':['uchar*',['uchar*','string','int']],
'input':['uchar*',['string']]
});
var str = "Whatever is worth doing is worth doing well";
var csk = new sk();
var cpk = new pk();
csk = libhel.input(str);
cpk = libhel.output(csk,str,2604);
var libhel = ffi.Library('./libhelloworld.so',{ 'output':['uchar*',['uchar*','string','int']],});
libhelloworld是c工程的动态链接库, output是c工程定义的函数,第一个uchar* 表示函数的返回值,之后的参数表示函数传入参数的类型。
ffi中存在一些内置简写
ref.types.int => 'int'
ref.refType('int') => 'int*'
char* => 'string'
这里将unsigned char简写成uchar.
这里就简单写,这里就当给自己的一个笔记库,写的很粗略,请见谅。如果有问题,请大家指正。