From f778fa230ba544d2605d2fbb6ef94ed8bf887770 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Sat, 16 Oct 2021 14:46:48 +0530 Subject: [PATCH] test: test `crypto.setEngine()` using an actual engine Signed-off-by: Darshan Sen PR-URL: https://github.com/nodejs/node/pull/40481 Reviewed-By: James M Snell --- Makefile | 1 + node.gyp | 26 +++++++++ test/fixtures/test_crypto_engine.c | 20 +++++++ test/parallel/test-crypto-engine.js | 91 +++++++++++++++++------------ tools/run-worker.js | 4 +- 5 files changed, 103 insertions(+), 39 deletions(-) create mode 100644 test/fixtures/test_crypto_engine.c diff --git a/Makefile b/Makefile index e55bd8d70242ac..7671bb804fa6a4 100644 --- a/Makefile +++ b/Makefile @@ -1327,6 +1327,7 @@ LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ test/cctest/*.h \ test/embedding/*.cc \ test/embedding/*.h \ + test/fixtures/*.c \ test/js-native-api/*/*.cc \ test/js-native-api/*/*.h \ test/node-api/*/*.cc \ diff --git a/node.gyp b/node.gyp index faf50d86bcad64..2052917d7ee338 100644 --- a/node.gyp +++ b/node.gyp @@ -1391,5 +1391,31 @@ }, ] }], # 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/fixtures/test_crypto_engine.c b/test/fixtures/test_crypto_engine.c new file mode 100644 index 00000000000000..1715196bf5bb03 --- /dev/null +++ b/test/fixtures/test_crypto_engine.c @@ -0,0 +1,20 @@ +#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 index 8b33285b454eef..399745f0f6463e 100644 --- a/test/parallel/test-crypto-engine.js +++ b/test/parallel/test-crypto-engine.js @@ -1,43 +1,60 @@ 'use strict'; const common = require('../common'); +if (!common.hasCrypto) common.skip('missing crypto'); -if (!common.hasCrypto) - common.skip('missing crypto'); +// This tests crypto.setEngine(). const assert = require('assert'); const crypto = require('crypto'); -const invalidEngineName = 'xxx'; - -assert.throws( - () => crypto.setEngine(true), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "id" argument must be of type string. Received type boolean' + - ' (true)' - }); - -assert.throws( - () => crypto.setEngine('/path/to/engine', 'notANumber'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "flags" argument must be of type number. Received type' + - " string ('notANumber')" - }); - -assert.throws( - () => crypto.setEngine(invalidEngineName), - { - code: 'ERR_CRYPTO_ENGINE_UNKNOWN', - name: 'Error', - message: `Engine "${invalidEngineName}" was not found` - }); - -assert.throws( - () => crypto.setEngine(invalidEngineName, crypto.constants.ENGINE_METHOD_RSA), - { - code: 'ERR_CRYPTO_ENGINE_UNKNOWN', - name: 'Error', - message: `Engine "${invalidEngineName}" was not found` - }); +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); + 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 7590e460a404ae..bfacc48320136e 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 } = require('worker_threads'); +const { Worker, SHARE_ENV } = require('worker_threads'); -new Worker(path.resolve(process.cwd(), process.argv[2])) +new Worker(path.resolve(process.cwd(), process.argv[2]), { env: SHARE_ENV }) .on('exit', (code) => process.exitCode = code);