diff --git a/src/crypto/public_key/elliptic/oid_curves.js b/src/crypto/public_key/elliptic/oid_curves.js index f3cf9b55..a3b98a09 100644 --- a/src/crypto/public_key/elliptic/oid_curves.js +++ b/src/crypto/public_key/elliptic/oid_curves.js @@ -49,52 +49,52 @@ const nodeCurves = nodeCrypto ? { } : {}; const curves = { - nistP256: { + [enums.curve.nistP256]: { oid: [0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha256, cipher: enums.symmetric.aes128, - node: nodeCurves.nistP256, - web: webCurves.nistP256, + node: nodeCurves[enums.curve.nistP256], + web: webCurves[enums.curve.nistP256], payloadSize: 32, sharedSize: 256 }, - nistP384: { + [enums.curve.nistP384]: { oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha384, cipher: enums.symmetric.aes192, - node: nodeCurves.nistP384, - web: webCurves.nistP384, + node: nodeCurves[enums.curve.nistP384], + web: webCurves[enums.curve.nistP384], payloadSize: 48, sharedSize: 384 }, - nistP521: { + [enums.curve.nistP521]: { oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha512, cipher: enums.symmetric.aes256, - node: nodeCurves.nistP521, - web: webCurves.nistP521, + node: nodeCurves[enums.curve.nistP521], + web: webCurves[enums.curve.nistP521], payloadSize: 66, sharedSize: 528 }, - secp256k1: { + [enums.curve.secp256k1]: { oid: [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x0A], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha256, cipher: enums.symmetric.aes128, - node: nodeCurves.secp256k1, + node: nodeCurves[enums.curve.secp256k1], payloadSize: 32 }, - ed25519Legacy: { + [enums.curve.ed25519Legacy]: { oid: [0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01], keyType: enums.publicKey.eddsaLegacy, hash: enums.hash.sha512, node: false, // nodeCurves.ed25519 TODO payloadSize: 32 }, - curve25519Legacy: { + [enums.curve.curve25519Legacy]: { oid: [0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01], keyType: enums.publicKey.ecdh, hash: enums.hash.sha256, @@ -102,28 +102,28 @@ const curves = { node: false, // nodeCurves.curve25519 TODO payloadSize: 32 }, - brainpoolP256r1: { + [enums.curve.brainpoolP256r1]: { oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha256, cipher: enums.symmetric.aes128, - node: nodeCurves.brainpoolP256r1, + node: nodeCurves[enums.curve.brainpoolP256r1], payloadSize: 32 }, - brainpoolP384r1: { + [enums.curve.brainpoolP384r1]: { oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha384, cipher: enums.symmetric.aes192, - node: nodeCurves.brainpoolP384r1, + node: nodeCurves[enums.curve.brainpoolP384r1], payloadSize: 48 }, - brainpoolP512r1: { + [enums.curve.brainpoolP512r1]: { oid: [0x06, 0x09, 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D], keyType: enums.publicKey.ecdsa, hash: enums.hash.sha512, cipher: enums.symmetric.aes256, - node: nodeCurves.brainpoolP512r1, + node: nodeCurves[enums.curve.brainpoolP512r1], payloadSize: 64 } }; @@ -217,7 +217,7 @@ async function generate(curveName) { * @returns {enums.hash} hash algorithm */ function getPreferredHashAlgo(oid) { - return curves[enums.write(enums.curve, oid.toHex())].hash; + return curves[oid.getName()].hash; } /** @@ -232,14 +232,14 @@ function getPreferredHashAlgo(oid) { */ async function validateStandardParams(algo, oid, Q, d) { const supportedCurves = { - nistP256: true, - nistP384: true, - nistP521: true, - secp256k1: true, - curve25519Legacy: algo === enums.publicKey.ecdh, - brainpoolP256r1: true, - brainpoolP384r1: true, - brainpoolP512r1: true + [enums.curve.nistP256]: true, + [enums.curve.nistP384]: true, + [enums.curve.nistP521]: true, + [enums.curve.secp256k1]: true, + [enums.curve.curve25519Legacy]: algo === enums.publicKey.ecdh, + [enums.curve.brainpoolP256r1]: true, + [enums.curve.brainpoolP384r1]: true, + [enums.curve.brainpoolP512r1]: true }; // Check whether the given curve is supported @@ -262,7 +262,7 @@ async function validateStandardParams(algo, oid, Q, d) { return true; } - const nobleCurve = await util.getNobleCurve(enums.publicKey.ecdsa, enums.write(enums.curve, oid.toHex())); // excluding curve25519Legacy, ecdh and ecdsa use the same curves + const nobleCurve = await util.getNobleCurve(enums.publicKey.ecdsa, curveName); // excluding curve25519Legacy, ecdh and ecdsa use the same curves /* * Re-derive public point Q' = dG from private key * Expect Q == Q' diff --git a/src/enums.js b/src/enums.js index 0e61774f..b9ea1e2b 100644 --- a/src/enums.js +++ b/src/enums.js @@ -16,46 +16,37 @@ export default { 'nistP256': 'nistP256', /** @deprecated use `nistP256` instead */ 'p256': 'nistP256', - '2a8648ce3d030107': 'nistP256', /** NIST P-384 Curve */ 'nistP384': 'nistP384', /** @deprecated use `nistP384` instead */ 'p384': 'nistP384', - '2b81040022': 'nistP384', /** NIST P-521 Curve */ 'nistP521': 'nistP521', /** @deprecated use `nistP521` instead */ 'p521': 'nistP521', - '2b81040023': 'nistP521', /** SECG SECP256k1 Curve */ 'secp256k1': 'secp256k1', - '2b8104000a': 'secp256k1', /** Ed25519 - deprecated by crypto-refresh (replaced by standaone Ed25519 algo) */ 'ed25519Legacy': 'ed25519Legacy', /** @deprecated use `ed25519Legacy` instead */ 'ed25519': 'ed25519Legacy', - '2b06010401da470f01': 'ed25519Legacy', /** Curve25519 - deprecated by crypto-refresh (replaced by standaone X25519 algo) */ 'curve25519Legacy': 'curve25519Legacy', /** @deprecated use `curve25519Legacy` instead */ 'curve25519': 'curve25519Legacy', - '2b060104019755010501': 'curve25519Legacy', /** BrainpoolP256r1 Curve */ 'brainpoolP256r1': 'brainpoolP256r1', - '2b2403030208010107': 'brainpoolP256r1', /** BrainpoolP384r1 Curve */ 'brainpoolP384r1': 'brainpoolP384r1', - '2b240303020801010b': 'brainpoolP384r1', /** BrainpoolP512r1 Curve */ - '2b240303020801010d': 'brainpoolP512r1', 'brainpoolP512r1': 'brainpoolP512r1' }, diff --git a/src/type/oid.js b/src/type/oid.js index 370f583a..bd45672b 100644 --- a/src/type/oid.js +++ b/src/type/oid.js @@ -35,6 +35,18 @@ import util from '../util'; import enums from '../enums'; +const knownOIDs = { + '2a8648ce3d030107': enums.curve.nistP256, + '2b81040022': enums.curve.nistP384, + '2b81040023': enums.curve.nistP521, + '2b8104000a': enums.curve.secp256k1, + '2b06010401da470f01': enums.curve.ed25519Legacy, + '2b060104019755010501': enums.curve.curve25519Legacy, + '2b2403030208010107': enums.curve.brainpoolP256r1, + '2b240303020801010b': enums.curve.brainpoolP384r1, + '2b240303020801010d': enums.curve.brainpoolP512r1 +}; + class OID { constructor(oid) { if (oid instanceof OID) { @@ -88,15 +100,16 @@ class OID { /** * If a known curve object identifier, return the canonical name of the curve - * @returns {string} String with the canonical name of the curve. + * @returns {enums.curve} String with the canonical name of the curve + * @throws if unknown */ getName() { - const hex = this.toHex(); - if (enums.curve[hex]) { - return enums.write(enums.curve, hex); - } else { + const name = knownOIDs[this.toHex()]; + if (!name) { throw new Error('Unknown curve object identifier.'); } + + return name; } }