From 99eeb43d0e1d3f366d2fae5d6ecaa42fa502e322 Mon Sep 17 00:00:00 2001 From: Filip Skokan Date: Fri, 29 Nov 2019 10:56:36 +0100 Subject: [PATCH] refactor: use dsaEncoding for ECDSA when supported --- lib/help/runtime_support.js | 3 ++- lib/jwa/ecdsa.js | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/help/runtime_support.js b/lib/help/runtime_support.js index 5087780a..ce7535b6 100644 --- a/lib/help/runtime_support.js +++ b/lib/help/runtime_support.js @@ -5,5 +5,6 @@ const [major, minor] = process.version.substr(1).split('.').map(x => parseInt(x, module.exports = { oaepHashSupported: major > 12 || (major === 12 && minor >= 9), keyObjectSupported: !!KeyObject && major >= 12, - edDSASupported: !!sign && !!verify + edDSASupported: !!sign && !!verify, + dsaEncodingSupported: major > 13 || (major === 13 && minor >= 2) } diff --git a/lib/jwa/ecdsa.js b/lib/jwa/ecdsa.js index 57311aff..db7ba2e3 100644 --- a/lib/jwa/ecdsa.js +++ b/lib/jwa/ecdsa.js @@ -5,10 +5,15 @@ const { derToJose, joseToDer } = require('../help/ecdsa_signatures') const { KEYOBJECT } = require('../help/consts') const resolveNodeAlg = require('../help/node_alg') const { asInput } = require('../help/key_object') +const { dsaEncodingSupported } = require('../help/runtime_support') let sign, verify -if (signOneShot) { +if (dsaEncodingSupported) { // >= 13.2.0 + sign = (jwaAlg, nodeAlg, { [KEYOBJECT]: keyObject }, payload) => { + return signOneShot(nodeAlg, payload, { key: asInput(keyObject, false), dsaEncoding: 'ieee-p1363' }) + } +} else if (signOneShot) { // >= 12.0.0 sign = (jwaAlg, nodeAlg, { [KEYOBJECT]: keyObject }, payload) => { return derToJose(signOneShot(nodeAlg, payload, asInput(keyObject, false)), jwaAlg) } @@ -18,7 +23,15 @@ if (signOneShot) { } } -if (verifyOneShot) { +if (dsaEncodingSupported) { // >= 13.2.0 + verify = (jwaAlg, nodeAlg, { [KEYOBJECT]: keyObject }, payload, signature) => { + try { + return verifyOneShot(nodeAlg, payload, { key: asInput(keyObject, true), dsaEncoding: 'ieee-p1363' }, signature) + } catch (err) { + return false + } + } +} else if (verifyOneShot) { // >= 12.0.0 verify = (jwaAlg, nodeAlg, { [KEYOBJECT]: keyObject }, payload, signature) => { try { return verifyOneShot(nodeAlg, payload, asInput(keyObject, true), joseToDer(signature, jwaAlg))