mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
test: move test-crypto-engine to addon
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 <mdawson@devrus.com> PR-URL: https://github.com/nodejs/node/pull/41830 Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
This commit is contained in:
parent
af7caf8d47
commit
5f348b4572
7 changed files with 143 additions and 111 deletions
26
node.gyp
26
node.gyp
|
@ -1475,31 +1475,5 @@
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}], # end aix section
|
}], # 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
|
], # end conditions block
|
||||||
}
|
}
|
||||||
|
|
37
test/addons/openssl-test-engine/binding.gyp
Normal file
37
test/addons/openssl-test-engine/binding.gyp
Normal file
|
@ -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',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
60
test/addons/openssl-test-engine/test.js
Normal file
60
test/addons/openssl-test-engine/test.js
Normal file
|
@ -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);
|
||||||
|
}
|
44
test/addons/openssl-test-engine/testsetengine.cc
Normal file
44
test/addons/openssl-test-engine/testsetengine.cc
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include <openssl/engine.h>
|
||||||
|
|
||||||
|
#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
|
20
test/fixtures/test_crypto_engine.c
vendored
20
test/fixtures/test_crypto_engine.c
vendored
|
@ -1,20 +0,0 @@
|
||||||
#include <openssl/engine.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
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()
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ if (typeof require === 'undefined') {
|
||||||
}
|
}
|
||||||
|
|
||||||
const path = require('path');
|
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);
|
.on('exit', (code) => process.exitCode = code);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue