在Mac上编译openSSL到WebAssembly,函数RSA_generate_key_ex(RSA,1024,bn



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命令禁用了一些编译选项。