feat: generateSync

This commit is contained in:
Filip Skokan 2019-02-08 20:56:34 +01:00
parent bf72a5e52e
commit 9ab3016d76
8 changed files with 51 additions and 8 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -91,6 +91,8 @@ class Key {
thumbprintMaterial () {
throw new TODO('not implemented')
}
// TODO: more must implement methods like thumbprintMaterial
}
module.exports = Key

View file

@ -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

View file

@ -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')
}

View file

@ -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