From 9ab3016d7657033a612b388f72cb98d491d90d02 Mon Sep 17 00:00:00 2001 From: Filip Skokan Date: Fri, 8 Feb 2019 20:56:34 +0100 Subject: [PATCH] feat: generateSync --- lib/jwa/ecdh/dir.js | 3 +-- lib/jwa/ecdh/kw.js | 3 +-- lib/jwk/generate.js | 18 +++++++++++++++++- lib/jwk/index.js | 5 ++++- lib/jwk/key/base.js | 2 ++ lib/jwk/key/ec.js | 10 +++++++++- lib/jwk/key/oct.js | 4 ++++ lib/jwk/key/rsa.js | 14 +++++++++++++- 8 files changed, 51 insertions(+), 8 deletions(-) diff --git a/lib/jwa/ecdh/dir.js b/lib/jwa/ecdh/dir.js index 6952613d..4b200a95 100644 --- a/lib/jwa/ecdh/dir.js +++ b/lib/jwa/ecdh/dir.js @@ -1,12 +1,11 @@ const { strict: assert } = require('assert') -const { generateKeyPairSync } = require('crypto') const KEYLENGTHS = require('../../help/key_lengths') const ECKey = require('../../jwk/key/ec') const derive = require('./derive') const wrapKey = (key, payload, { alg, enc }) => { - const epk = new ECKey(generateKeyPairSync('ec', { namedCurve: key.crv }).privateKey) + const epk = ECKey.generateSync(key.crv) const derivedKey = derive(enc, KEYLENGTHS[enc], epk, key) diff --git a/lib/jwa/ecdh/kw.js b/lib/jwa/ecdh/kw.js index 52306f9c..a5801994 100644 --- a/lib/jwa/ecdh/kw.js +++ b/lib/jwa/ecdh/kw.js @@ -1,11 +1,10 @@ const { strict: assert } = require('assert') -const { generateKeyPairSync } = require('crypto') const ECKey = require('../../jwk/key/ec') const derive = require('./derive') const wrapKey = (kw, derive, key, payload) => { - const epk = new ECKey(generateKeyPairSync('ec', { namedCurve: key.crv }).privateKey) + const epk = ECKey.generateSync(key.crv) const derivedKey = derive(epk, key) diff --git a/lib/jwk/generate.js b/lib/jwk/generate.js index c11810b6..6709113c 100644 --- a/lib/jwk/generate.js +++ b/lib/jwk/generate.js @@ -17,4 +17,20 @@ function generate (kty, ...args) { } } -module.exports = generate +function generateSync (kty, ...args) { + switch (kty) { + case 'rsa': + case 'RSA': + return RSAKey.generateSync(...args) + case 'ec': + case 'EC': + return ECKey.generateSync(...args) + case 'oct': + return OctKey.generateSync(...args) + default: + throw new TypeError('invalid key type') + } +} + +module.exports.generate = generate +module.exports.generateSync = generateSync diff --git a/lib/jwk/index.js b/lib/jwk/index.js index 14d82ce4..b8b5b737 100644 --- a/lib/jwk/index.js +++ b/lib/jwk/index.js @@ -1,2 +1,5 @@ +const { generate, generateSync } = require('./generate') + module.exports.importKey = require('./import') -module.exports.generate = require('./generate') +module.exports.generate = generate +module.exports.generateSync = generateSync diff --git a/lib/jwk/key/base.js b/lib/jwk/key/base.js index c7c12eda..bfd461a3 100644 --- a/lib/jwk/key/base.js +++ b/lib/jwk/key/base.js @@ -91,6 +91,8 @@ class Key { thumbprintMaterial () { throw new TODO('not implemented') } + + // TODO: more must implement methods like thumbprintMaterial } module.exports = Key diff --git a/lib/jwk/key/ec.js b/lib/jwk/key/ec.js index fb626bf4..45069d47 100644 --- a/lib/jwk/key/ec.js +++ b/lib/jwk/key/ec.js @@ -1,5 +1,7 @@ const { promisify } = require('util') -const generateKeyPair = promisify(require('crypto').generateKeyPair) +const { generateKeyPairSync, generateKeyPair: async } = require('crypto') + +const generateKeyPair = promisify(async) const Key = require('./base') @@ -82,6 +84,12 @@ class ECKey extends Key { return new ECKey(privat ? privateKey : publicKey, opts) } + + static generateSync (crv = 'P-256', opts, privat = true) { + const { privateKey, publicKey } = generateKeyPairSync('ec', { namedCurve: crv }) + + return new ECKey(privat ? privateKey : publicKey, opts) + } } module.exports = ECKey diff --git a/lib/jwk/key/oct.js b/lib/jwk/key/oct.js index db5d96cb..79cdabbf 100644 --- a/lib/jwk/key/oct.js +++ b/lib/jwk/key/oct.js @@ -104,6 +104,10 @@ class OctKey extends Key { } static async generate (len = 256, opts) { + return this.generateSync(len, opts) + } + + static generateSync (len = 256, opts) { if (!Number.isSafeInteger(len) || !len || len % 8 !== 0) { throw new TypeError('invalid bit length') } diff --git a/lib/jwk/key/rsa.js b/lib/jwk/key/rsa.js index be0153e9..8c6b4ad8 100644 --- a/lib/jwk/key/rsa.js +++ b/lib/jwk/key/rsa.js @@ -1,5 +1,7 @@ const { promisify } = require('util') -const generateKeyPair = promisify(require('crypto').generateKeyPair) +const { generateKeyPairSync, generateKeyPair: async } = require('crypto') + +const generateKeyPair = promisify(async) const Key = require('./base') @@ -93,6 +95,16 @@ class RSAKey extends Key { return new RSAKey(privat ? privateKey : publicKey, opts) } + + static generateSync (len = 2048, opts, privat = true) { + if (!Number.isSafeInteger(len) || len < 512 || len % 8 !== 0) { + throw new TypeError('invalid bit length') + } + + const { privateKey, publicKey } = generateKeyPairSync('rsa', { modulusLength: len }) + + return new RSAKey(privat ? privateKey : publicKey, opts) + } } module.exports = RSAKey