Skip to content

Commit

Permalink
refactor(node): dry node version checks
Browse files Browse the repository at this point in the history
  • Loading branch information
panva committed Dec 24, 2022
1 parent 688ab7f commit aff2f7c
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 39 deletions.
7 changes: 7 additions & 0 deletions 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)
5 changes: 3 additions & 2 deletions 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')
}

Expand Down
10 changes: 2 additions & 8 deletions src/runtime/node/jwk_to_key.ts
Expand Up @@ -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 })
Expand Down
10 changes: 2 additions & 8 deletions src/runtime/node/key_to_jwk.ts
Expand Up @@ -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
Expand All @@ -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!)
Expand Down
9 changes: 1 addition & 8 deletions src/runtime/node/node_key.ts
Expand Up @@ -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,
Expand Down
10 changes: 2 additions & 8 deletions src/runtime/node/verify.ts
Expand Up @@ -6,21 +6,15 @@ 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,
data: Uint8Array,
key: ReturnType<typeof nodeKey>,
signature: Uint8Array,
) => Promise<boolean> | boolean
if (crypto.verify.length > 4 && oneShotCallbackSupported) {
if (crypto.verify.length > 4 && oneShotCallback) {
oneShotVerify = promisify(crypto.verify)
} else {
oneShotVerify = crypto.verify
Expand Down
6 changes: 1 addition & 5 deletions test/jws/rsa-pss.test.mjs
Expand Up @@ -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')
Expand Down

0 comments on commit aff2f7c

Please sign in to comment.