1'use strict'; 2 3const common = require('../../common'); 4if (!common.hasCrypto) 5 common.skip('missing crypto'); 6 7if (!common.hasOpenSSL3) 8 common.skip('this test requires OpenSSL 3.x'); 9const assert = require('node:assert'); 10const { createHash, getCiphers, getHashes } = require('node:crypto'); 11const { debuglog } = require('node:util'); 12const { getProviders } = require(`./build/${common.buildType}/binding`); 13 14// For the providers defined here, the expectation is that the listed ciphers 15// and hash algorithms are only provided by the named provider. These are for 16// basic checks and are not intended to list evey cipher or hash algorithm 17// supported by the provider. 18const providers = { 19 'default': { 20 ciphers: ['des3-wrap'], 21 hashes: ['sha512-256'], 22 }, 23 'legacy': { 24 ciphers: ['blowfish', 'idea'], 25 hashes: ['md4', 'whirlpool'], 26 }, 27}; 28 29const debug = debuglog('test'); 30 31module.exports = { 32 getCurrentProviders: getProviders, 33 testProviderPresent, 34 testProviderAbsent, 35}; 36 37function assertArrayDoesNotInclude(array, item, desc) { 38 assert(!array.includes(item), 39 `${desc} [${array}] unexpectedly includes "${item}"`); 40} 41 42function assertArrayIncludes(array, item, desc) { 43 assert(array.includes(item), 44 `${desc} [${array}] does not include "${item}"`); 45} 46 47function testProviderPresent(provider) { 48 debug(`Checking '${provider}' is present`); 49 assertArrayIncludes(getProviders(), provider, 'Loaded providers'); 50 for (const cipher of providers[provider].ciphers || []) { 51 debug(`Checking '${cipher}' cipher is available`); 52 assertArrayIncludes(getCiphers(), cipher, 'Available ciphers'); 53 } 54 for (const hash of providers[provider].hashes || []) { 55 debug(`Checking '${hash}' hash is available`); 56 assertArrayIncludes(getHashes(), hash, 'Available hashes'); 57 createHash(hash); 58 } 59} 60 61function testProviderAbsent(provider) { 62 debug(`Checking '${provider}' is absent`); 63 assertArrayDoesNotInclude(getProviders(), provider, 'Loaded providers'); 64 for (const cipher of providers[provider].ciphers || []) { 65 debug(`Checking '${cipher}' cipher is unavailable`); 66 assertArrayDoesNotInclude(getCiphers(), cipher, 'Available ciphers'); 67 } 68 for (const hash of providers[provider].hashes || []) { 69 debug(`Checking '${hash}' hash is unavailable`); 70 assertArrayDoesNotInclude(getHashes(), hash, 'Available hashes'); 71 assert.throws(() => { createHash(hash); }, { code: 'ERR_OSSL_EVP_UNSUPPORTED' }); 72 } 73} 74