diff --git a/src/runtime/node/flags.ts b/src/runtime/node/flags.ts new file mode 100644 index 0000000000..4e013a0193 --- /dev/null +++ b/src/runtime/node/flags.ts @@ -0,0 +1,7 @@ +const [major, minor] = process.versions.node.split('.').map((str) => parseInt(str, 10)) + +export const oneShotCallback = major >= 16 || (major === 15 && minor >= 13) +export const rsaPssParams = + !('electron' in process.versions) && (major >= 17 || (major === 16 && minor >= 9)) +export const jwkExport = major >= 16 || (major === 15 && minor >= 9) +export const jwkImport = major >= 16 || (major === 15 && minor >= 12) diff --git a/src/runtime/node/is_key_like.ts b/src/runtime/node/is_key_like.ts index 2454a01dd7..9e76ef596b 100644 --- a/src/runtime/node/is_key_like.ts +++ b/src/runtime/node/is_key_like.ts @@ -1,12 +1,13 @@ import type { KeyLike } from '../../types.d' -import { isCryptoKey } from './webcrypto.js' +import webcrypto, { isCryptoKey } from './webcrypto.js' import isKeyObject from './is_key_object.js' export default (key: unknown): key is KeyLike => isKeyObject(key) || isCryptoKey(key) const types = ['KeyObject'] -if (parseInt(process.versions.node) >= 16) { +// @ts-ignore +if (globalThis.CryptoKey || webcrypto?.CryptoKey) { types.push('CryptoKey') } diff --git a/src/runtime/node/jwk_to_key.ts b/src/runtime/node/jwk_to_key.ts index bbdd4842db..3f51286163 100644 --- a/src/runtime/node/jwk_to_key.ts +++ b/src/runtime/node/jwk_to_key.ts @@ -9,16 +9,10 @@ import { setCurve } from './get_named_curve.js' import { setModulusLength } from './check_modulus_length.js' import Asn1SequenceEncoder from './asn1_sequence_encoder.js' import type { JWK } from '../../types.d' - -const [major, minor] = process.version - .slice(1) - .split('.') - .map((str) => parseInt(str, 10)) - -const jwkImportSupported = major >= 16 || (major === 15 && minor >= 12) +import { jwkImport } from './flags.js' const parse: JWKImportFunction = (jwk: JWK): KeyObject => { - if (jwkImportSupported && jwk.kty !== 'oct') { + if (jwkImport && jwk.kty !== 'oct') { return jwk.d ? createPrivateKey({ format: 'jwk', key: jwk }) : createPublicKey({ format: 'jwk', key: jwk }) diff --git a/src/runtime/node/key_to_jwk.ts b/src/runtime/node/key_to_jwk.ts index fe5ee7ae56..c0c9e28f04 100644 --- a/src/runtime/node/key_to_jwk.ts +++ b/src/runtime/node/key_to_jwk.ts @@ -9,13 +9,7 @@ import { isCryptoKey } from './webcrypto.js' import isKeyObject from './is_key_object.js' import invalidKeyInput from '../../lib/invalid_key_input.js' import { types } from './is_key_like.js' - -const [major, minor] = process.version - .slice(1) - .split('.') - .map((str) => parseInt(str, 10)) - -const jwkExportSupported = major >= 16 || (major === 15 && minor >= 9) +import { jwkExport } from './flags.js' const keyToJWK: JWKExportFunction = (key: unknown): JWK => { let keyObject: KeyObject @@ -35,7 +29,7 @@ const keyToJWK: JWKExportFunction = (key: unknown): JWK => { throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array')) } - if (jwkExportSupported) { + if (jwkExport) { if ( keyObject.type !== 'secret' && !['rsa', 'ec', 'ed25519', 'x25519', 'ed448', 'x448'].includes(keyObject.asymmetricKeyType!) diff --git a/src/runtime/node/node_key.ts b/src/runtime/node/node_key.ts index 58078e7193..831b8338e7 100644 --- a/src/runtime/node/node_key.ts +++ b/src/runtime/node/node_key.ts @@ -4,14 +4,7 @@ import type { KeyObject, SignKeyObjectInput } from 'crypto' import getNamedCurve from './get_named_curve.js' import { JOSENotSupported } from '../../util/errors.js' import checkModulusLength from './check_modulus_length.js' - -const [major, minor] = process.version - .slice(1) - .split('.') - .map((str) => parseInt(str, 10)) - -const electron = 'electron' in process.versions -const rsaPssParams = !electron && (major >= 17 || (major === 16 && minor >= 9)) +import { rsaPssParams } from './flags.js' const PSS = { padding: constants.RSA_PKCS1_PSS_PADDING, diff --git a/src/runtime/node/verify.ts b/src/runtime/node/verify.ts index d7872d0d7b..74be7823cf 100644 --- a/src/runtime/node/verify.ts +++ b/src/runtime/node/verify.ts @@ -6,13 +6,7 @@ import nodeDigest from './dsa_digest.js' import nodeKey from './node_key.js' import sign from './sign.js' import getVerifyKey from './get_sign_verify_key.js' - -const [major, minor] = process.version - .slice(1) - .split('.') - .map((str) => parseInt(str, 10)) - -const oneShotCallbackSupported = major >= 16 || (major === 15 && minor >= 13) +import { oneShotCallback } from './flags.js' let oneShotVerify: ( alg: string | undefined, @@ -20,7 +14,7 @@ let oneShotVerify: ( key: ReturnType, signature: Uint8Array, ) => Promise | boolean -if (crypto.verify.length > 4 && oneShotCallbackSupported) { +if (crypto.verify.length > 4 && oneShotCallback) { oneShotVerify = promisify(crypto.verify) } else { oneShotVerify = crypto.verify diff --git a/test/jws/rsa-pss.test.mjs b/test/jws/rsa-pss.test.mjs index a8d34e2018..8704c36486 100644 --- a/test/jws/rsa-pss.test.mjs +++ b/test/jws/rsa-pss.test.mjs @@ -4,11 +4,7 @@ import { promisify } from 'util' const generateKeyPair = promisify(crypto.generateKeyPair) -const [major, minor] = process.version - .slice(1) - .split('.') - .map((str) => parseInt(str, 10)) - +const [major, minor] = process.versions.node.split('.').map((str) => parseInt(str, 10)) const rsaPssParams = major >= 17 || (major === 16 && minor >= 9) const { FlattenedSign, flattenedVerify } = await import('#dist')