diff --git a/src/crypto/public_key/elliptic/curves.js b/src/crypto/public_key/elliptic/curves.js index f19f6662..2186ea9c 100644 --- a/src/crypto/public_key/elliptic/curves.js +++ b/src/crypto/public_key/elliptic/curves.js @@ -177,7 +177,14 @@ Curve.prototype.keyFromSecret = function (secret) { // Only for ed25519 }; Curve.prototype.keyFromPublic = function (pub) { - return new KeyPair(this, { pub: pub }); + const keyPair = new KeyPair(this, { pub: pub }); + if ( + this.keyType === enums.publicKey.ecdsa && + keyPair.keyPair.validate().result !== true + ) { + throw new Error('Invalid elliptic public key'); + } + return keyPair; }; Curve.prototype.genKeyPair = async function () { diff --git a/test/crypto/elliptic.js b/test/crypto/elliptic.js index 9e1b72c8..f4852b89 100644 --- a/test/crypto/elliptic.js +++ b/test/crypto/elliptic.js @@ -223,7 +223,17 @@ describe('Elliptic Curve Cryptography', async function () { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]); - const secp256k1_dummy_point = new Uint8Array([ + const secp256k1_point = new Uint8Array([ + 0x04, + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, + 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, + 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, + 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, + 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8]); + const secp256k1_invalid_point = new Uint8Array([ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -233,7 +243,7 @@ describe('Elliptic Curve Cryptography', async function () { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); - const secp256k1_invalid_point = new Uint8Array([ + const secp256k1_invalid_point_format = new Uint8Array([ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -255,13 +265,18 @@ describe('Elliptic Curve Cryptography', async function () { 'secp256k1', 8, [], [], [], [] )).to.be.rejectedWith(Error, /Unknown point format/), expect(verify_signature( - 'secp256k1', 8, [], [], [], secp256k1_invalid_point + 'secp256k1', 8, [], [], [], secp256k1_invalid_point_format )).to.be.rejectedWith(Error, /Unknown point format/) ]); }); + it('Invalid point', function (done) { + expect(verify_signature( + 'secp256k1', 8, [], [], [], secp256k1_invalid_point + )).to.be.rejectedWith(Error, /Invalid elliptic public key/).notify(done); + }); it('Invalid signature', function (done) { expect(verify_signature( - 'secp256k1', 8, [], [], [], secp256k1_dummy_point + 'secp256k1', 8, [], [], [], secp256k1_point )).to.eventually.be.false.notify(done); }); @@ -331,11 +346,21 @@ describe('Elliptic Curve Cryptography', async function () { ]); const secp256k1_point = new Uint8Array([ 0x04, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, + 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, + 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, + 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, + 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8]); + const secp256k1_invalid_point = new Uint8Array([ + 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); @@ -354,6 +379,11 @@ describe('Elliptic Curve Cryptography', async function () { 'secp256k1', 2, 7, [], [], [], [] )).to.be.rejectedWith(Error, /Unknown point format/).notify(done); }); + it('Invalid elliptic public key', function (done) { + expect(decrypt_message( + 'secp256k1', 2, 7, secp256k1_value, secp256k1_invalid_point, secp256k1_data, [] + )).to.be.rejectedWith(Error, /Invalid elliptic public key/).notify(done); + }); it('Invalid key data integrity', function (done) { expect(decrypt_message( 'secp256k1', 2, 7, secp256k1_value, secp256k1_point, secp256k1_data, []