From fd8bf0960893009cda357624fbfd461ad9790e75 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Wed, 2 Feb 2022 18:22:05 -0500 Subject: [PATCH] test: move test-crypto-engine to addon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: https://github.com/nodejs/node/issues/41633 Fixes: https://github.com/nodejs/node/issues/40958 - move test-crypto-engine so that dummy engine is only built if tests are run Signed-off-by: Michael Dawson PR-URL: https://github.com/nodejs/node/pull/41830 Reviewed-By: Tobias Nießen Reviewed-By: Darshan Sen Reviewed-By: James M Snell Reviewed-By: Richard Lau --- node.gyp | 26 -------- test/addons/openssl-test-engine/binding.gyp | 37 +++++++++++ test/addons/openssl-test-engine/test.js | 60 ++++++++++++++++++ .../openssl-test-engine/testsetengine.cc | 44 +++++++++++++ test/fixtures/test_crypto_engine.c | 20 ------ test/parallel/test-crypto-engine.js | 63 ------------------- tools/run-worker.js | 4 +- 7 files changed, 143 insertions(+), 111 deletions(-) create mode 100644 test/addons/openssl-test-engine/binding.gyp create mode 100644 test/addons/openssl-test-engine/test.js create mode 100644 test/addons/openssl-test-engine/testsetengine.cc delete mode 100644 test/fixtures/test_crypto_engine.c delete mode 100644 test/parallel/test-crypto-engine.js diff --git a/node.gyp b/node.gyp index be0dd6eeaa1d18..74e9f9cc2e33e1 100644 --- a/node.gyp +++ b/node.gyp @@ -1393,31 +1393,5 @@ }, ] }], # end aix section - # TODO(RaisinTen): Enable this to build on other platforms as well. - ['(OS=="mac" or (OS=="linux" and target_arch=="x64")) and \ - node_use_openssl=="true"', { - 'targets': [ - { - 'target_name': 'test_crypto_engine', - 'type': 'shared_library', - 'include_dirs': ['deps/openssl/openssl/include'], - 'sources': ['test/fixtures/test_crypto_engine.c'], - 'conditions': [ - ['OS=="mac"', { - 'dependencies': ['deps/openssl/openssl.gyp:openssl'], - 'xcode_settings': { - 'OTHER_CFLAGS': ['-Wno-deprecated-declarations'], - }, - }], - ['OS=="linux" and target_arch=="x64"', { - 'cflags': [ - '-Wno-deprecated-declarations', - '-fPIC', - ], - }], - ], - }, # test_crypto_engine - ], # end targets - }], # end node_use_openssl section ], # end conditions block } diff --git a/test/addons/openssl-test-engine/binding.gyp b/test/addons/openssl-test-engine/binding.gyp new file mode 100644 index 00000000000000..132f39e621c316 --- /dev/null +++ b/test/addons/openssl-test-engine/binding.gyp @@ -0,0 +1,37 @@ +{ + 'targets': [ + { + 'target_name': 'testsetengine', + 'type': 'none', + 'includes': ['../common.gypi'], + 'conditions': [ + ['(OS=="mac" or OS=="linux") and ' + 'node_use_openssl=="true" and ' + 'node_shared=="false" and ' + 'node_shared_openssl=="false"', { + 'type': 'shared_library', + 'sources': [ 'testsetengine.cc' ], + 'product_extension': 'engine', + 'include_dirs': ['../../../deps/openssl/openssl/include'], + 'conditions': [ + ['OS=="mac"', { + 'xcode_settings': { + 'OTHER_CFLAGS': ['-Wno-deprecated-declarations'], + }, + 'link_settings': { + 'libraries': [ + '../../../../out/<(PRODUCT_DIR)/<(openssl_product)' + ] + }, + }], + ['OS=="linux"', { + 'cflags': [ + '-Wno-deprecated-declarations', + ], + }], + ], + }], + ], + } + ] +} diff --git a/test/addons/openssl-test-engine/test.js b/test/addons/openssl-test-engine/test.js new file mode 100644 index 00000000000000..fb531dcd75491a --- /dev/null +++ b/test/addons/openssl-test-engine/test.js @@ -0,0 +1,60 @@ +'use strict'; +const common = require('../../common'); + +// This tests crypto.setEngine(). + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const crypto = require('crypto'); +const fs = require('fs'); +const path = require('path'); + + +assert.throws(() => crypto.setEngine(true), /ERR_INVALID_ARG_TYPE/); +assert.throws(() => crypto.setEngine('/path/to/engine', 'notANumber'), + /ERR_INVALID_ARG_TYPE/); + +{ + const invalidEngineName = 'xxx'; + assert.throws(() => crypto.setEngine(invalidEngineName), + /ERR_CRYPTO_ENGINE_UNKNOWN/); + assert.throws(() => crypto.setEngine(invalidEngineName, + crypto.constants.ENGINE_METHOD_RSA), + /ERR_CRYPTO_ENGINE_UNKNOWN/); +} + +crypto.setEngine('dynamic'); +crypto.setEngine('dynamic'); + +crypto.setEngine('dynamic', crypto.constants.ENGINE_METHOD_RSA); +crypto.setEngine('dynamic', crypto.constants.ENGINE_METHOD_RSA); + +const engine = path.join(__dirname, + `/build/${common.buildType}/testsetengine.engine`); + +if (!fs.existsSync(engine)) + common.skip('no engine'); + +{ + const engineId = path.parse(engine).name; + const execDir = path.parse(engine).dir; + + crypto.setEngine(engine); + // OpenSSL 3.0.1 and 1.1.1m now throw errors if an engine is loaded again + // with a duplicate absolute path. + // TODO(richardlau): figure out why this fails on macOS but not Linux. + // crypto.setEngine(engine); + + // crypto.setEngine(engine, crypto.constants.ENGINE_METHOD_RSA); + // crypto.setEngine(engine, crypto.constants.ENGINE_METHOD_RSA); + + process.env.OPENSSL_ENGINES = execDir; + + crypto.setEngine(engineId); + crypto.setEngine(engineId); + + crypto.setEngine(engineId, crypto.constants.ENGINE_METHOD_RSA); + crypto.setEngine(engineId, crypto.constants.ENGINE_METHOD_RSA); +} diff --git a/test/addons/openssl-test-engine/testsetengine.cc b/test/addons/openssl-test-engine/testsetengine.cc new file mode 100644 index 00000000000000..04f57ec4ba6642 --- /dev/null +++ b/test/addons/openssl-test-engine/testsetengine.cc @@ -0,0 +1,44 @@ +#include + +#ifndef ENGINE_CMD_BASE +# error did not get engine.h +#endif + +#define TEST_ENGINE_ID "testsetengine" +#define TEST_ENGINE_NAME "dummy test engine" + +#ifdef _WIN32 +# define DEFAULT_VISIBILITY __declspec(dllexport) +#else +# define DEFAULT_VISIBILITY __attribute__((visibility("default"))) +#endif + +namespace { + +int EngineInit(ENGINE* engine) { + return 1; +} + +int EngineFinish(ENGINE* engine) { + return 1; +} + +int EngineDestroy(ENGINE* engine) { + return 1; +} + +int bind_fn(ENGINE* engine, const char* id) { + ENGINE_set_id(engine, TEST_ENGINE_ID); + ENGINE_set_name(engine, TEST_ENGINE_NAME); + ENGINE_set_init_function(engine, EngineInit); + ENGINE_set_finish_function(engine, EngineFinish); + ENGINE_set_destroy_function(engine, EngineDestroy); + return 1; +} + +extern "C" { + DEFAULT_VISIBILITY IMPLEMENT_DYNAMIC_CHECK_FN(); + DEFAULT_VISIBILITY IMPLEMENT_DYNAMIC_BIND_FN(bind_fn); +} + +} // anonymous namespace diff --git a/test/fixtures/test_crypto_engine.c b/test/fixtures/test_crypto_engine.c deleted file mode 100644 index 1715196bf5bb03..00000000000000 --- a/test/fixtures/test_crypto_engine.c +++ /dev/null @@ -1,20 +0,0 @@ -#include - -#include - -int bind(ENGINE* e, const char* id) { - if (ENGINE_set_id(e, "libtest_crypto_engine") == 0) { - fprintf(stderr, "ENGINE_set_id() failed.\n"); - return 0; - } - - if (ENGINE_set_name(e, "A test crypto engine") == 0) { - fprintf(stderr, "ENGINE_set_name() failed.\n"); - return 0; - } - - return 1; -} - -IMPLEMENT_DYNAMIC_BIND_FN(bind) -IMPLEMENT_DYNAMIC_CHECK_FN() diff --git a/test/parallel/test-crypto-engine.js b/test/parallel/test-crypto-engine.js deleted file mode 100644 index ca2e4793683788..00000000000000 --- a/test/parallel/test-crypto-engine.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; -const common = require('../common'); -if (!common.hasCrypto) common.skip('missing crypto'); - -// This tests crypto.setEngine(). - -const assert = require('assert'); -const crypto = require('crypto'); -const fs = require('fs'); -const path = require('path'); - -assert.throws(() => crypto.setEngine(true), /ERR_INVALID_ARG_TYPE/); -assert.throws(() => crypto.setEngine('/path/to/engine', 'notANumber'), - /ERR_INVALID_ARG_TYPE/); - -{ - const invalidEngineName = 'xxx'; - assert.throws(() => crypto.setEngine(invalidEngineName), - /ERR_CRYPTO_ENGINE_UNKNOWN/); - assert.throws(() => crypto.setEngine(invalidEngineName, - crypto.constants.ENGINE_METHOD_RSA), - /ERR_CRYPTO_ENGINE_UNKNOWN/); -} - -crypto.setEngine('dynamic'); -crypto.setEngine('dynamic'); - -crypto.setEngine('dynamic', crypto.constants.ENGINE_METHOD_RSA); -crypto.setEngine('dynamic', crypto.constants.ENGINE_METHOD_RSA); - -{ - const engineName = 'test_crypto_engine'; - let engineLib; - if (common.isOSX) - engineLib = `lib${engineName}.dylib`; - else if (common.isLinux && process.arch === 'x64') - engineLib = `lib${engineName}.so`; - - if (engineLib !== undefined) { - const execDir = path.dirname(process.execPath); - const enginePath = path.join(execDir, engineLib); - const engineId = path.parse(engineLib).name; - - fs.accessSync(enginePath); - - crypto.setEngine(enginePath); - // OpenSSL 3.0.1 and 1.1.1m now throw errors if an engine is loaded again - // with a duplicate absolute path. - // TODO(richardlau): figure out why this fails on macOS but not Linux. - // crypto.setEngine(enginePath); - - // crypto.setEngine(enginePath, crypto.constants.ENGINE_METHOD_RSA); - // crypto.setEngine(enginePath, crypto.constants.ENGINE_METHOD_RSA); - - process.env.OPENSSL_ENGINES = execDir; - - crypto.setEngine(engineId); - crypto.setEngine(engineId); - - crypto.setEngine(engineId, crypto.constants.ENGINE_METHOD_RSA); - crypto.setEngine(engineId, crypto.constants.ENGINE_METHOD_RSA); - } -} diff --git a/tools/run-worker.js b/tools/run-worker.js index bfacc48320136e..7590e460a404ae 100644 --- a/tools/run-worker.js +++ b/tools/run-worker.js @@ -5,7 +5,7 @@ if (typeof require === 'undefined') { } const path = require('path'); -const { Worker, SHARE_ENV } = require('worker_threads'); +const { Worker } = require('worker_threads'); -new Worker(path.resolve(process.cwd(), process.argv[2]), { env: SHARE_ENV }) +new Worker(path.resolve(process.cwd(), process.argv[2])) .on('exit', (code) => process.exitCode = code);