C++代码:
#ifndef EM_PORT_API
# if defined(__EMSCRIPTEN__)
# include <emscripten.h>
# if defined(__cplusplus)
# define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
# else
# define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
# endif
# else
# if defined(__cplusplus)
# define EM_PORT_API(rettype) extern "C" rettype
# else
# define EM_PORT_API(rettype) rettype
# endif
# endif
#endif
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/err.h>
EM_PORT_API (int) generateKeypair()
{
RSA* rsa = RSA_new();
BIGNUM *bn = BN_new();
RSA* _keypair = NULL;
int setRet = BN_set_word(bn, RSA_F4);
int rsaRet = RSA_generate_key_ex(rsa, 1024, bn, NULL);
printf("setRet = %d n", setRet);
printf("rsaRet = %d n", rsaRet);
if (setRet && rsaRet) {
_keypair = rsa;
printf("_keypair create success!! n");
}
if (bn) {
BN_free(bn);
}
if (rsa && _keypair==NULL) {
RSA_free(rsa);
}
return 1;
}
apiTest.html代码
<html>
<head>
<meta charset="utf-8">
<title>Emscripten:Export1</title>
</head>
<body>
<script>
Module = {};
Module.onRuntimeInitialized = function() {
var ret = Module._generateKeypair();
}
</script>
<script src="api.js"></script>
</body>
</html>
在Mac上编译openSSL到WebAssembly
版本为openssl-1.1.1.1d,可从https://www.openssl.org/source/old/1.1.1/openssl-1.1.1d.tar.gz编译步骤:
* make clean
* emConfigure ./Configure darwin64-x86_64-cc -no-asm --api=1.1.0
* Modify the MakeFile file:
* CROSS_COMPILE=/Users/emsdk/upstream/emscripten/em -> CROSS_COMPILE=
* CNF_CFLAGS=-arch x86_64 -> CNF_CFLAGS=
* CFLAGS=-O3 -Wall -> CFLAGS=-O3 -Wall -s USE_PTHREADS -sSIDE_MODULE
* emmake make -j 12 build_generated libssl.a libcrypto.a
通过emcc制作api.js
emcc -sLLD_REPORT_UNDEFINED --no-entry -std=c++11 -s USE_PTHREADS -sMAIN_MODULE -I./ api.cpp openssl/libcrypto.a openssl/libssl.a -o api.js
运行演示时,函数RSA_generate_key_ex(RSA,1024,bn,NULL(返回0。我不知道哪一步错了,帮帮我!!!
在此处输入图像描述
我最近遇到了小问题,并通过以下配置命令解决了问题:
emconfigure ./Configure linux-x32 -no-asm -static -no-sock -no-afalgeng -DOPENSSL_SYS_NETWARE -DSIG_DFL=0 -DSIG_IGN=0 -DHAVE_FORK=0 -DOPENSSL_NO_AFALGENG=1 -DOPENSSL_NO_SPEED=1
我想这可能是因为一些系统API在WebAssembly中不可用,所以这个configure命令禁用了一些编译选项。