想利用WebAssembly来调用OpenSSL里面的MD5加密库,采用如下命令进行编译:
1 | ~ emcc md5.c -I /usr/local/Cellar/openssl@1.1/1.1.1d/include -L /usr/local/Cellar/openssl@1.1/1.1.1d/lib -lcrypto -s EXTRA_EXPORTED_RUNTIME_METHODS='["cwrap", "ccall"]' -o md5.js |
编译时发现了如下问题:
1 | shared:WARNING: object /var/folders/gk/_j9gq7sn6d19820tz77q5k600000gn/T/emscripten_temp_0ybodbu3_archive_contents/x86_64cpuid.o is not a valid object file for emscripten, cannot link |
Google和StackOverflow下才发现,Mac系统自带的OpenSSL在WebAssembly中是没法直接是用的;因为WebAssembly和操作系统无关,不能直接使用和操作系统相关的库文件,我们需要利用Emscripten
重新编译下。
编译openSSL
首先下载最新的OpenSSL,这里我下载的是 https://github.com/openssl/openssl/releases/tag/OpenSSL_1_1_1d,现在后解压,进入openssl-OpenSSL_1_1_1d
文件夹。
1 | emcmake ./Configure darwin64-x86_64-cc -no-asm --api=1.1.0 |
修改生成的Makefile文件
- 将
CROSS_COMPILE=/usr/local/Cellar/emscripten/1.38.44/libexec/em
改为CROSS_COMPILE=
- 将
CNF_CFLAGS=-arch x86_64
改为CNF_CFLAGS=
这步非常重要,如果不修改,容易出现编译错误!!!
编译
1 | emmake make -j 12 build_generated libssl.a libcrypto.a |
编译成功后,文件夹下会出现libssl.a
和libcrypto.a
两个文件,后续编译会需要这两个文件
样例
1 | // md5.c |
编译wsm
1 | emcc md5.c -I ~/Downloads/openssl/include -L ~/Downloads/openssl/libs -lcrypto -s EXTRA_EXPORTED_RUNTIME_METHODS='["cwrap", "ccall"]' -o md5.js |
编译成功后,会生成md5.js
和md5.wasm
两个文件。
Node.js 调用wasm
1 | const m = require('./md5.js') |
编译后的文件
为了方便大家使用,我已经编译好了针对WebAssembly的openSSL,点击下载。
本文涉及到的样例位于https://github.com/flyingzl/webAssembly-openssl,请自行查阅。