From 241bf012236188e36668765de793f5e2bbb66b33 Mon Sep 17 00:00:00 2001 From: luistarkbank Date: Mon, 4 Sep 2023 18:14:07 -0300 Subject: [PATCH 1/3] wip --- ellipticcurve/curve.js | 13 ++ ellipticcurve/math.js | 18 ++- ellipticcurve/publicKey.js | 30 ++++ test/test.js | 292 +++++++++++++++++++++---------------- 4 files changed, 226 insertions(+), 127 deletions(-) diff --git a/ellipticcurve/curve.js b/ellipticcurve/curve.js index 2817c0d..2bd718b 100644 --- a/ellipticcurve/curve.js +++ b/ellipticcurve/curve.js @@ -7,6 +7,7 @@ const BigInt = require("big-integer"); const Point = require("./point").Point; const modulo = require("./utils/integer").modulo; +const EcdsaMath = require("./math"); class CurveFp { @@ -41,6 +42,18 @@ class CurveFp { get oid() { return this._oid.slice(); } + + y(x, isEven) + { + let ySquared = (((x.value ** BigInt(3).value) % this.P.value) + this.A.value * x.value + this.B.value) % this.P.value + let y = EcdsaMath.modularSquareRoot(ySquared, this.P.value) + if (isEven != ((y % BigInt(2).value).toString() == "0")) + { + y = this.P.value - y; + } + return BigInt(y) + } + }; diff --git a/ellipticcurve/math.js b/ellipticcurve/math.js index a85fe7d..986425c 100644 --- a/ellipticcurve/math.js +++ b/ellipticcurve/math.js @@ -1,7 +1,23 @@ const Point = require("./point").Point; const modulo = require("./utils/integer").modulo; const BigInt = require("big-integer"); +const EcdsaMath = require("./math"); +const math = require("../") +var modularSquareRoot = function(value, prime){ + + let base = value + let exp = (prime + BigInt(1).value) / BigInt(4).value + let p = prime + + var result = 1n; + while (exp !== 0n) { + if (exp % 2n === 1n) result = result * base % p; + base = base * base % p; + exp >>= 1n; + } + return result; +} var multiply = function (p, n, N, A, P) { // Fast way to multily point and scalar in elliptic curves @@ -184,7 +200,7 @@ var jacobianMultiply = function (p, n, N, A, P) { throw new Error("logical failure: p: " + p + ", n: " + n + ", N: " + N + ", A: " + A + ", P: " + P); }; - +exports.modularSquareRoot = modularSquareRoot; exports.multiply = multiply; exports.add = add; exports.inv = inv; diff --git a/ellipticcurve/publicKey.js b/ellipticcurve/publicKey.js index e19f7db..b34a09d 100644 --- a/ellipticcurve/publicKey.js +++ b/ellipticcurve/publicKey.js @@ -3,6 +3,7 @@ const EcdsaCurve = require("./curve"); const Point = require("./point").Point; const der = require("./utils/der"); const Math = require("./math"); +const { PrivateKey } = require(".."); class PublicKey { @@ -21,6 +22,20 @@ class PublicKey { return xString + yString; }; + toCompressed(encoded=false) { + let baseLen = this.curve.length(); + + if ((this.point.y["value"] % BigInt("2")).toString() == "0") + { + var parityTag = "02"; + } else { + var parityTag = "03"; + } + + let xString = BinaryAscii.hexFromBinary(BinaryAscii.stringFromNumber(this.point.x, baseLen)) + return parityTag + xString + } + toDer () { let encodeEcAndOid = der.encodeSequence(der.encodeOid([1, 2, 840, 10045, 2, 1]), der.encodeOid(this.curve.oid)); @@ -102,6 +117,21 @@ class PublicKey { } return publicKey }; + + static fromCompressed(string, curve=EcdsaCurve.secp256k1) + { + let parityTag = string.slice(0, 2); + let xString = string.slice(2, string.length); + + if (!["02", "03"].includes(parityTag)) + { + throw new Error("Compressed string should start with 02 or 03"); + } + let isEven = parityTag == "02" + let x = BinaryAscii.numberFromHex(xString) + let y = curve.y(x, isEven=isEven) + return new PublicKey(new Point(x, y), curve) + }; }; diff --git a/test/test.js b/test/test.js index 0cebcdd..e44603e 100644 --- a/test/test.js +++ b/test/test.js @@ -8,65 +8,65 @@ const Signature = require("../ellipticcurve/signature").Signature; const File = require("../ellipticcurve/utils/file"); -describe("ECDSA test", function() { - describe("#testVerifyRightMessage()", function() { - it("should confirm authenticity", function() { - let privateKey = new PrivateKey(); - let publicKey = privateKey.publicKey(); - let message = "This is the right message"; - let signature = Ecdsa.sign(message, privateKey); - - assert.equal(Ecdsa.verify(message, signature, publicKey), true); - }); - }); - describe("#testVerifyWrongMessage()", function() { - it("should deny authenticity", function() { - let privateKey = new PrivateKey(); - let publicKey = privateKey.publicKey(); - let message1 = "This is the right message"; - let message2 = "This is the wrong message"; - let signature = Ecdsa.sign(message1, privateKey); - - assert.equal(Ecdsa.verify(message2, signature, publicKey), false); - }); - }); - describe("#testZeroSignature()", function() { - it("should deny authenticity", function() { - let privateKey = new PrivateKey(); - let publicKey = privateKey.publicKey(); - let message = "This is the right message"; - - assert.equal(Ecdsa.verify(message, new Signature(0, 0), publicKey), false); - }); - }); -}); -describe("openSSL test", function() { - describe("#testAssign()", function() { - it("should read and verify PEM file", function() { - // Generated by: openssl ecparam -name secp256k1 -genkey -out privateKey.pem - let privateKeyPem = File.read("test/privateKey.pem"); - let privateKey = PrivateKey.fromPem(privateKeyPem); - let message = File.read("test/message.txt"); - let signature = Ecdsa.sign(message, privateKey); - let publicKey = privateKey.publicKey(); - - assert.equal(Ecdsa.verify(message, signature, publicKey), true); - }); - }); - describe("#testVerifySignature()", function() { - it("should read and verify signature file", function() { - // openssl ec -in privateKey.pem -pubout -out publicKey.pem - let publicKeyPem = File.read("test/publicKey.pem"); - // openssl dgst -sha256 -sign privateKey.pem -out signature.binary message.txt - let signatureDer = File.read("test/signatureDer.txt", "binary"); - let message = File.read("test/message.txt"); - let publicKey = PublicKey.fromPem(publicKeyPem); - let signature = Signature.fromDer(signatureDer); - - assert.equal(Ecdsa.verify(message, signature, publicKey), true); - }); - }); -}); +// describe("ECDSA test", function() { +// describe("#testVerifyRightMessage()", function() { +// it("should confirm authenticity", function() { +// let privateKey = new PrivateKey(); +// let publicKey = privateKey.publicKey(); +// let message = "This is the right message"; +// let signature = Ecdsa.sign(message, privateKey); + +// assert.equal(Ecdsa.verify(message, signature, publicKey), true); +// }); +// }); +// describe("#testVerifyWrongMessage()", function() { +// it("should deny authenticity", function() { +// let privateKey = new PrivateKey(); +// let publicKey = privateKey.publicKey(); +// let message1 = "This is the right message"; +// let message2 = "This is the wrong message"; +// let signature = Ecdsa.sign(message1, privateKey); + +// assert.equal(Ecdsa.verify(message2, signature, publicKey), false); +// }); +// }); +// describe("#testZeroSignature()", function() { +// it("should deny authenticity", function() { +// let privateKey = new PrivateKey(); +// let publicKey = privateKey.publicKey(); +// let message = "This is the right message"; + +// assert.equal(Ecdsa.verify(message, new Signature(0, 0), publicKey), false); +// }); +// }); +// }); +// describe("openSSL test", function() { +// describe("#testAssign()", function() { +// it("should read and verify PEM file", function() { +// // Generated by: openssl ecparam -name secp256k1 -genkey -out privateKey.pem +// let privateKeyPem = File.read("test/privateKey.pem"); +// let privateKey = PrivateKey.fromPem(privateKeyPem); +// let message = File.read("test/message.txt"); +// let signature = Ecdsa.sign(message, privateKey); +// let publicKey = privateKey.publicKey(); + +// assert.equal(Ecdsa.verify(message, signature, publicKey), true); +// }); +// }); +// describe("#testVerifySignature()", function() { +// it("should read and verify signature file", function() { +// // openssl ec -in privateKey.pem -pubout -out publicKey.pem +// let publicKeyPem = File.read("test/publicKey.pem"); +// // openssl dgst -sha256 -sign privateKey.pem -out signature.binary message.txt +// let signatureDer = File.read("test/signatureDer.txt", "binary"); +// let message = File.read("test/message.txt"); +// let publicKey = PublicKey.fromPem(publicKeyPem); +// let signature = Signature.fromDer(signatureDer); + +// assert.equal(Ecdsa.verify(message, signature, publicKey), true); +// }); +// }); +// }); describe("PrivateKey test", function() { describe("#testPemConversion()", function() { it("should validate PEM generation and convertion", function() { @@ -99,81 +99,121 @@ describe("PrivateKey test", function() { }); }); }); -describe("PublicKey test", function() { - describe("#testPemConversion()", function() { - it("should validate PEM generation and convertion", function() { - let privateKey = new PrivateKey(); - let publicKey1 = privateKey.publicKey(); - let pem = publicKey1.toPem(); - let publicKey2 = PublicKey.fromPem(pem); - - assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); - assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); - assert.equal(publicKey1.curve, publicKey2.curve); - }); - }); - describe("#testDerConversion()", function() { - it("should validate DER generation and convertion", function() { - let privateKey = new PrivateKey(); - let publicKey1 = privateKey.publicKey(); - let der = publicKey1.toDer(); - let publicKey2 = PublicKey.fromDer(der); - - assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); - assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); - assert.equal(publicKey1.curve, publicKey2.curve); +// describe("PublicKey test", function() { +// describe("#testPemConversion()", function() { +// it("should validate PEM generation and convertion", function() { +// let privateKey = new PrivateKey(); +// let publicKey1 = privateKey.publicKey(); +// let pem = publicKey1.toPem(); +// let publicKey2 = PublicKey.fromPem(pem); + +// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); +// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); +// assert.equal(publicKey1.curve, publicKey2.curve); +// }); +// }); +// describe("#testDerConversion()", function() { +// it("should validate DER generation and convertion", function() { +// let privateKey = new PrivateKey(); +// let publicKey1 = privateKey.publicKey(); +// let der = publicKey1.toDer(); +// let publicKey2 = PublicKey.fromDer(der); + +// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); +// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); +// assert.equal(publicKey1.curve, publicKey2.curve); +// }); +// }); +// describe("#testStringConversion()", function() { +// it("should validate private-key-string generation and convertion", function() { +// let privateKey = new PrivateKey(); +// let publicKey1 = privateKey.publicKey(); +// let string = publicKey1.toString(); +// let publicKey2 = PublicKey.fromString(string); + +// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); +// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); +// assert.equal(publicKey1.curve, publicKey2.curve); +// }); +// }); +// }); + +describe("ComPubKeyTest", function() { + describe("#testBatch()", function() { + it("...", function() { + "something here..." }); }); - describe("#testStringConversion()", function() { - it("should validate private-key-string generation and convertion", function() { - let privateKey = new PrivateKey(); - let publicKey1 = privateKey.publicKey(); - let string = publicKey1.toString(); - let publicKey2 = PublicKey.fromString(string); - - assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); - assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); - assert.equal(publicKey1.curve, publicKey2.curve); + describe("#testFromCompressedEven()", function() { + it("...", function() { + let publicKeyCompressed = "0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2" + let publicKey = PublicKey.fromCompressed(publicKeyCompressed) + let publicKey2 = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUpclctRl0BbUxQGIe43zA+7j7WAsBWse\nsJJg36DaCrKIdC9NyX2e22/ZRrq8AC/fsG8myvEXuUBe15J1dj/bHA==\n-----END PUBLIC KEY-----\n") + assert.equal(publicKey.toPem(), publicKey2.toPem()); }); }); -}); -describe("Signature test", function() { - describe("#testDerConversion()", function() { - it("should validate DER signature generation and convertion", function() { - let privateKey = new PrivateKey(); - let message = "This is a text message"; - let signature1 = Ecdsa.sign(message, privateKey); - let der = signature1.toDer(); - let signature2 = Signature.fromDer(der); - - assert.equal(String(signature1.r), String(signature2.r)); - assert.equal(String(signature1.s), String(signature2.s)); + describe("#testFromCompressedOdd()", function() { + it("...", function() { + let publicKeyCompressed = "0318ed2e1ec629e2d3dae7be1103d4f911c24e0c80e70038f5eb5548245c475f50" + let publicKey = PublicKey.fromCompressed(publicKeyCompressed) + let publicKey2 = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGO0uHsYp4tPa574RA9T5EcJODIDnADj1\n61VIJFxHX1BMIg0B4cpBnLG6SzOTthXpndIKpr8HEHj3D9lJAI50EQ==\n-----END PUBLIC KEY-----\n") + + assert.equal(publicKey.toPem(), publicKey2.toPem()); }); }); - describe("#testBase64Conversion()", function() { - it("should validate Base64 signature generation and convertion", function() { - let privateKey = new PrivateKey(); - let message = "This is a text message"; - let signature1 = Ecdsa.sign(message, privateKey); - let base64 = signature1.toBase64(); - let signature2 = Signature.fromBase64(base64); - - assert.equal(String(signature1.r), String(signature2.r)); - assert.equal(String(signature1.s), String(signature2.s)); + describe("#testToCompressedEven()", function() { + it("...", function() { + let publicKey = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUpclctRl0BbUxQGIe43zA+7j7WAsBWse\nsJJg36DaCrKIdC9NyX2e22/ZRrq8AC/fsG8myvEXuUBe15J1dj/bHA==\n-----END PUBLIC KEY-----\n") + let publicKeyCompressed = publicKey.toCompressed() + assert.equal(publicKeyCompressed, "0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2"); }); }); - describe("#testExternalRandNum()", function () { - it("should confirm authenticity and same signature", function () { - let privateKey = new PrivateKey(); - let publicKey = privateKey.publicKey(); - let message = "This is a message"; - let signature_1 = Ecdsa.sign(message, privateKey, null, BigInt(123)); - let signature_2 = Ecdsa.sign(message, privateKey, null, BigInt(123)); - - assert.equal(Ecdsa.verify(message, signature_1, publicKey), true); - assert.equal(Ecdsa.verify(message, signature_2, publicKey), true); - assert.equal(signature_1.r.value, signature_2.r.value); - assert.equal(signature_1.s.value, signature_2.s.value); + describe("#testToCompressedOdd()", function() { + it("...", function() { + let publicKey = PublicKey.fromPem("-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGO0uHsYp4tPa574RA9T5EcJODIDnADj1\n61VIJFxHX1BMIg0B4cpBnLG6SzOTthXpndIKpr8HEHj3D9lJAI50EQ==\n-----END PUBLIC KEY-----") + let publicKeyCompressed = publicKey.toCompressed() + assert.equal(publicKeyCompressed, "0318ed2e1ec629e2d3dae7be1103d4f911c24e0c80e70038f5eb5548245c475f50"); }); }); }); + +// describe("Signature test", function() { +// describe("#testDerConversion()", function() { +// it("should validate DER signature generation and convertion", function() { +// let privateKey = new PrivateKey(); +// let message = "This is a text message"; +// let signature1 = Ecdsa.sign(message, privateKey); +// let der = signature1.toDer(); +// let signature2 = Signature.fromDer(der); + +// assert.equal(String(signature1.r), String(signature2.r)); +// assert.equal(String(signature1.s), String(signature2.s)); +// }); +// }); +// describe("#testBase64Conversion()", function() { +// it("should validate Base64 signature generation and convertion", function() { +// let privateKey = new PrivateKey(); +// let message = "This is a text message"; +// let signature1 = Ecdsa.sign(message, privateKey); +// let base64 = signature1.toBase64(); +// let signature2 = Signature.fromBase64(base64); + +// assert.equal(String(signature1.r), String(signature2.r)); +// assert.equal(String(signature1.s), String(signature2.s)); +// }); +// }); +// describe("#testExternalRandNum()", function () { +// it("should confirm authenticity and same signature", function () { +// let privateKey = new PrivateKey(); +// let publicKey = privateKey.publicKey(); +// let message = "This is a message"; +// let signature_1 = Ecdsa.sign(message, privateKey, null, BigInt(123)); +// let signature_2 = Ecdsa.sign(message, privateKey, null, BigInt(123)); + +// assert.equal(Ecdsa.verify(message, signature_1, publicKey), true); +// assert.equal(Ecdsa.verify(message, signature_2, publicKey), true); +// assert.equal(signature_1.r.value, signature_2.r.value); +// assert.equal(signature_1.s.value, signature_2.s.value); +// }); +// }); +// }); From ceb6cc489de66c9164b2f5476339f6d87fdd057b Mon Sep 17 00:00:00 2001 From: luistarkbank Date: Tue, 5 Sep 2023 15:00:38 -0300 Subject: [PATCH 2/3] ecdsa methods --- ellipticcurve/math.js | 2 -- ellipticcurve/publicKey.js | 1 - 2 files changed, 3 deletions(-) diff --git a/ellipticcurve/math.js b/ellipticcurve/math.js index 986425c..cde9c82 100644 --- a/ellipticcurve/math.js +++ b/ellipticcurve/math.js @@ -1,8 +1,6 @@ const Point = require("./point").Point; const modulo = require("./utils/integer").modulo; const BigInt = require("big-integer"); -const EcdsaMath = require("./math"); -const math = require("../") var modularSquareRoot = function(value, prime){ diff --git a/ellipticcurve/publicKey.js b/ellipticcurve/publicKey.js index b34a09d..548966f 100644 --- a/ellipticcurve/publicKey.js +++ b/ellipticcurve/publicKey.js @@ -31,7 +31,6 @@ class PublicKey { } else { var parityTag = "03"; } - let xString = BinaryAscii.hexFromBinary(BinaryAscii.stringFromNumber(this.point.x, baseLen)) return parityTag + xString } From c935e4b12632fc87c78b763bd1b903f9b1718ff6 Mon Sep 17 00:00:00 2001 From: luistarkbank Date: Tue, 5 Sep 2023 15:59:48 -0300 Subject: [PATCH 3/3] wip --- test/test.js | 298 +++++++++++++++++++++++++++------------------------ 1 file changed, 155 insertions(+), 143 deletions(-) diff --git a/test/test.js b/test/test.js index e44603e..27378d1 100644 --- a/test/test.js +++ b/test/test.js @@ -8,65 +8,65 @@ const Signature = require("../ellipticcurve/signature").Signature; const File = require("../ellipticcurve/utils/file"); -// describe("ECDSA test", function() { -// describe("#testVerifyRightMessage()", function() { -// it("should confirm authenticity", function() { -// let privateKey = new PrivateKey(); -// let publicKey = privateKey.publicKey(); -// let message = "This is the right message"; -// let signature = Ecdsa.sign(message, privateKey); - -// assert.equal(Ecdsa.verify(message, signature, publicKey), true); -// }); -// }); -// describe("#testVerifyWrongMessage()", function() { -// it("should deny authenticity", function() { -// let privateKey = new PrivateKey(); -// let publicKey = privateKey.publicKey(); -// let message1 = "This is the right message"; -// let message2 = "This is the wrong message"; -// let signature = Ecdsa.sign(message1, privateKey); - -// assert.equal(Ecdsa.verify(message2, signature, publicKey), false); -// }); -// }); -// describe("#testZeroSignature()", function() { -// it("should deny authenticity", function() { -// let privateKey = new PrivateKey(); -// let publicKey = privateKey.publicKey(); -// let message = "This is the right message"; - -// assert.equal(Ecdsa.verify(message, new Signature(0, 0), publicKey), false); -// }); -// }); -// }); -// describe("openSSL test", function() { -// describe("#testAssign()", function() { -// it("should read and verify PEM file", function() { -// // Generated by: openssl ecparam -name secp256k1 -genkey -out privateKey.pem -// let privateKeyPem = File.read("test/privateKey.pem"); -// let privateKey = PrivateKey.fromPem(privateKeyPem); -// let message = File.read("test/message.txt"); -// let signature = Ecdsa.sign(message, privateKey); -// let publicKey = privateKey.publicKey(); - -// assert.equal(Ecdsa.verify(message, signature, publicKey), true); -// }); -// }); -// describe("#testVerifySignature()", function() { -// it("should read and verify signature file", function() { -// // openssl ec -in privateKey.pem -pubout -out publicKey.pem -// let publicKeyPem = File.read("test/publicKey.pem"); -// // openssl dgst -sha256 -sign privateKey.pem -out signature.binary message.txt -// let signatureDer = File.read("test/signatureDer.txt", "binary"); -// let message = File.read("test/message.txt"); -// let publicKey = PublicKey.fromPem(publicKeyPem); -// let signature = Signature.fromDer(signatureDer); - -// assert.equal(Ecdsa.verify(message, signature, publicKey), true); -// }); -// }); -// }); +describe("ECDSA test", function() { + describe("#testVerifyRightMessage()", function() { + it("should confirm authenticity", function() { + let privateKey = new PrivateKey(); + let publicKey = privateKey.publicKey(); + let message = "This is the right message"; + let signature = Ecdsa.sign(message, privateKey); + + assert.equal(Ecdsa.verify(message, signature, publicKey), true); + }); + }); + describe("#testVerifyWrongMessage()", function() { + it("should deny authenticity", function() { + let privateKey = new PrivateKey(); + let publicKey = privateKey.publicKey(); + let message1 = "This is the right message"; + let message2 = "This is the wrong message"; + let signature = Ecdsa.sign(message1, privateKey); + + assert.equal(Ecdsa.verify(message2, signature, publicKey), false); + }); + }); + describe("#testZeroSignature()", function() { + it("should deny authenticity", function() { + let privateKey = new PrivateKey(); + let publicKey = privateKey.publicKey(); + let message = "This is the right message"; + + assert.equal(Ecdsa.verify(message, new Signature(0, 0), publicKey), false); + }); + }); +}); +describe("openSSL test", function() { + describe("#testAssign()", function() { + it("should read and verify PEM file", function() { + // Generated by: openssl ecparam -name secp256k1 -genkey -out privateKey.pem + let privateKeyPem = File.read("test/privateKey.pem"); + let privateKey = PrivateKey.fromPem(privateKeyPem); + let message = File.read("test/message.txt"); + let signature = Ecdsa.sign(message, privateKey); + let publicKey = privateKey.publicKey(); + + assert.equal(Ecdsa.verify(message, signature, publicKey), true); + }); + }); + describe("#testVerifySignature()", function() { + it("should read and verify signature file", function() { + // openssl ec -in privateKey.pem -pubout -out publicKey.pem + let publicKeyPem = File.read("test/publicKey.pem"); + // openssl dgst -sha256 -sign privateKey.pem -out signature.binary message.txt + let signatureDer = File.read("test/signatureDer.txt", "binary"); + let message = File.read("test/message.txt"); + let publicKey = PublicKey.fromPem(publicKeyPem); + let signature = Signature.fromDer(signatureDer); + + assert.equal(Ecdsa.verify(message, signature, publicKey), true); + }); + }); +}); describe("PrivateKey test", function() { describe("#testPemConversion()", function() { it("should validate PEM generation and convertion", function() { @@ -99,61 +99,71 @@ describe("PrivateKey test", function() { }); }); }); -// describe("PublicKey test", function() { -// describe("#testPemConversion()", function() { -// it("should validate PEM generation and convertion", function() { -// let privateKey = new PrivateKey(); -// let publicKey1 = privateKey.publicKey(); -// let pem = publicKey1.toPem(); -// let publicKey2 = PublicKey.fromPem(pem); - -// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); -// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); -// assert.equal(publicKey1.curve, publicKey2.curve); -// }); -// }); -// describe("#testDerConversion()", function() { -// it("should validate DER generation and convertion", function() { -// let privateKey = new PrivateKey(); -// let publicKey1 = privateKey.publicKey(); -// let der = publicKey1.toDer(); -// let publicKey2 = PublicKey.fromDer(der); - -// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); -// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); -// assert.equal(publicKey1.curve, publicKey2.curve); -// }); -// }); -// describe("#testStringConversion()", function() { -// it("should validate private-key-string generation and convertion", function() { -// let privateKey = new PrivateKey(); -// let publicKey1 = privateKey.publicKey(); -// let string = publicKey1.toString(); -// let publicKey2 = PublicKey.fromString(string); - -// assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); -// assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); -// assert.equal(publicKey1.curve, publicKey2.curve); -// }); -// }); -// }); +describe("PublicKey test", function() { + describe("#testPemConversion()", function() { + it("should validate PEM generation and convertion", function() { + let privateKey = new PrivateKey(); + let publicKey1 = privateKey.publicKey(); + let pem = publicKey1.toPem(); + let publicKey2 = PublicKey.fromPem(pem); + + assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); + assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); + assert.equal(publicKey1.curve, publicKey2.curve); + }); + }); + describe("#testDerConversion()", function() { + it("should validate DER generation and convertion", function() { + let privateKey = new PrivateKey(); + let publicKey1 = privateKey.publicKey(); + let der = publicKey1.toDer(); + let publicKey2 = PublicKey.fromDer(der); + + assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); + assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); + assert.equal(publicKey1.curve, publicKey2.curve); + }); + }); + describe("#testStringConversion()", function() { + it("should validate private-key-string generation and convertion", function() { + let privateKey = new PrivateKey(); + let publicKey1 = privateKey.publicKey(); + let string = publicKey1.toString(); + let publicKey2 = PublicKey.fromString(string); + + assert.equal(String(publicKey1.point.x), String(publicKey2.point.x)); + assert.equal(String(publicKey1.point.y), String(publicKey2.point.y)); + assert.equal(publicKey1.curve, publicKey2.curve); + }); + }); +}); describe("ComPubKeyTest", function() { describe("#testBatch()", function() { - it("...", function() { - "something here..." + it("should validate publicKey x and y points", function() { + this.timeout(10000); + for (let i = 0; i < 1000; i++) { + let privateKey = new PrivateKey() + let publicKey = privateKey.publicKey() + let publicKeyString = publicKey.toCompressed() + let recoveredPublicKey = PublicKey.fromCompressed(publicKeyString, publicKey.curve) + + assert.equal(publicKey.point.x.value, recoveredPublicKey.point.x.value) + assert.equal(publicKey.point.y.value, recoveredPublicKey.point.y.value) + } }); }); describe("#testFromCompressedEven()", function() { - it("...", function() { + it("should validate publicKey from Even compressed", function() { let publicKeyCompressed = "0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2" let publicKey = PublicKey.fromCompressed(publicKeyCompressed) let publicKey2 = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUpclctRl0BbUxQGIe43zA+7j7WAsBWse\nsJJg36DaCrKIdC9NyX2e22/ZRrq8AC/fsG8myvEXuUBe15J1dj/bHA==\n-----END PUBLIC KEY-----\n") + assert.equal(publicKey.toPem(), publicKey2.toPem()); }); }); describe("#testFromCompressedOdd()", function() { - it("...", function() { + it("should validate publicKey from Odd compressed", function() { let publicKeyCompressed = "0318ed2e1ec629e2d3dae7be1103d4f911c24e0c80e70038f5eb5548245c475f50" let publicKey = PublicKey.fromCompressed(publicKeyCompressed) let publicKey2 = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGO0uHsYp4tPa574RA9T5EcJODIDnADj1\n61VIJFxHX1BMIg0B4cpBnLG6SzOTthXpndIKpr8HEHj3D9lJAI50EQ==\n-----END PUBLIC KEY-----\n") @@ -162,58 +172,60 @@ describe("ComPubKeyTest", function() { }); }); describe("#testToCompressedEven()", function() { - it("...", function() { + it("should validate publicKey to Even compressed", function() { let publicKey = PublicKey.fromPem("\n-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUpclctRl0BbUxQGIe43zA+7j7WAsBWse\nsJJg36DaCrKIdC9NyX2e22/ZRrq8AC/fsG8myvEXuUBe15J1dj/bHA==\n-----END PUBLIC KEY-----\n") let publicKeyCompressed = publicKey.toCompressed() + assert.equal(publicKeyCompressed, "0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2"); }); }); describe("#testToCompressedOdd()", function() { - it("...", function() { + it("should validate publicKey to Odd compressed", function() { let publicKey = PublicKey.fromPem("-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGO0uHsYp4tPa574RA9T5EcJODIDnADj1\n61VIJFxHX1BMIg0B4cpBnLG6SzOTthXpndIKpr8HEHj3D9lJAI50EQ==\n-----END PUBLIC KEY-----") let publicKeyCompressed = publicKey.toCompressed() + assert.equal(publicKeyCompressed, "0318ed2e1ec629e2d3dae7be1103d4f911c24e0c80e70038f5eb5548245c475f50"); }); }); }); -// describe("Signature test", function() { -// describe("#testDerConversion()", function() { -// it("should validate DER signature generation and convertion", function() { -// let privateKey = new PrivateKey(); -// let message = "This is a text message"; -// let signature1 = Ecdsa.sign(message, privateKey); -// let der = signature1.toDer(); -// let signature2 = Signature.fromDer(der); - -// assert.equal(String(signature1.r), String(signature2.r)); -// assert.equal(String(signature1.s), String(signature2.s)); -// }); -// }); -// describe("#testBase64Conversion()", function() { -// it("should validate Base64 signature generation and convertion", function() { -// let privateKey = new PrivateKey(); -// let message = "This is a text message"; -// let signature1 = Ecdsa.sign(message, privateKey); -// let base64 = signature1.toBase64(); -// let signature2 = Signature.fromBase64(base64); - -// assert.equal(String(signature1.r), String(signature2.r)); -// assert.equal(String(signature1.s), String(signature2.s)); -// }); -// }); -// describe("#testExternalRandNum()", function () { -// it("should confirm authenticity and same signature", function () { -// let privateKey = new PrivateKey(); -// let publicKey = privateKey.publicKey(); -// let message = "This is a message"; -// let signature_1 = Ecdsa.sign(message, privateKey, null, BigInt(123)); -// let signature_2 = Ecdsa.sign(message, privateKey, null, BigInt(123)); - -// assert.equal(Ecdsa.verify(message, signature_1, publicKey), true); -// assert.equal(Ecdsa.verify(message, signature_2, publicKey), true); -// assert.equal(signature_1.r.value, signature_2.r.value); -// assert.equal(signature_1.s.value, signature_2.s.value); -// }); -// }); -// }); +describe("Signature test", function() { + describe("#testDerConversion()", function() { + it("should validate DER signature generation and convertion", function() { + let privateKey = new PrivateKey(); + let message = "This is a text message"; + let signature1 = Ecdsa.sign(message, privateKey); + let der = signature1.toDer(); + let signature2 = Signature.fromDer(der); + + assert.equal(String(signature1.r), String(signature2.r)); + assert.equal(String(signature1.s), String(signature2.s)); + }); + }); + describe("#testBase64Conversion()", function() { + it("should validate Base64 signature generation and convertion", function() { + let privateKey = new PrivateKey(); + let message = "This is a text message"; + let signature1 = Ecdsa.sign(message, privateKey); + let base64 = signature1.toBase64(); + let signature2 = Signature.fromBase64(base64); + + assert.equal(String(signature1.r), String(signature2.r)); + assert.equal(String(signature1.s), String(signature2.s)); + }); + }); + describe("#testExternalRandNum()", function () { + it("should confirm authenticity and same signature", function () { + let privateKey = new PrivateKey(); + let publicKey = privateKey.publicKey(); + let message = "This is a message"; + let signature_1 = Ecdsa.sign(message, privateKey, null, BigInt(123)); + let signature_2 = Ecdsa.sign(message, privateKey, null, BigInt(123)); + + assert.equal(Ecdsa.verify(message, signature_1, publicKey), true); + assert.equal(Ecdsa.verify(message, signature_2, publicKey), true); + assert.equal(signature_1.r.value, signature_2.r.value); + assert.equal(signature_1.s.value, signature_2.s.value); + }); + }); +});