UNPKG

ecdsa-node-ts

Version:

TypeScript implementation of the Elliptic Curve Digital Signature Algorithm (ECDSA)

203 lines (202 loc) 10.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const assert_1 = require("assert"); const big_integer_1 = __importDefault(require("big-integer")); const Ecdsa = __importStar(require("../ellipticcurve/ecdsa")); const privateKey_1 = require("../ellipticcurve/privateKey"); const publicKey_1 = require("../ellipticcurve/publicKey"); const signature_1 = require("../ellipticcurve/signature"); const File = __importStar(require("../ellipticcurve/utils/file")); const path = __importStar(require("path")); const TEST_DIR = path.join(__dirname, ".."); describe("ECDSA test", function () { describe("#testVerifyRightMessage()", function () { it("should confirm authenticity", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey = privateKey.publicKey(); let message = "This is the right message"; let signature = Ecdsa.sign(message, privateKey); assert_1.strict.equal(Ecdsa.verify(message, signature, publicKey), true); }); }); describe("#testVerifyWrongMessage()", function () { it("should deny authenticity", function () { let privateKey = new privateKey_1.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_1.strict.equal(Ecdsa.verify(message2, signature, publicKey), false); }); }); describe("#testZeroSignature()", function () { it("should deny authenticity", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey = privateKey.publicKey(); let message = "This is the right message"; assert_1.strict.equal(Ecdsa.verify(message, new signature_1.Signature((0, big_integer_1.default)(0), (0, big_integer_1.default)(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(path.join(TEST_DIR, "test", "privateKey.pem")); let privateKey = privateKey_1.PrivateKey.fromPem(privateKeyPem); let message = File.read(path.join(TEST_DIR, "test", "message.txt")); let signature = Ecdsa.sign(message, privateKey); let publicKey = privateKey.publicKey(); assert_1.strict.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(path.join(TEST_DIR, "test", "publicKey.pem")); // openssl dgst -sha256 -sign privateKey.pem -out signature.binary message.txt let signatureDer = File.read(path.join(TEST_DIR, "test", "signatureDer.txt"), "binary"); let message = File.read(path.join(TEST_DIR, "test", "message.txt")); let publicKey = publicKey_1.PublicKey.fromPem(publicKeyPem); let signature = signature_1.Signature.fromDer(signatureDer); assert_1.strict.equal(Ecdsa.verify(message, signature, publicKey), true); }); }); }); describe("PrivateKey test", function () { describe("#testPemConversion()", function () { it("should validate PEM generation and convertion", function () { let privateKey1 = new privateKey_1.PrivateKey(); let pem = privateKey1.toPem(); let privateKey2 = privateKey_1.PrivateKey.fromPem(pem); assert_1.strict.equal(String(privateKey1.secret), String(privateKey2.secret)); assert_1.strict.equal(String(privateKey1.curve), String(privateKey2.curve)); }); }); describe("#testDerConversion()", function () { it("should validate DER generation and convertion", function () { let privateKey1 = new privateKey_1.PrivateKey(); let der = privateKey1.toDer(); let privateKey2 = privateKey_1.PrivateKey.fromDer(der); assert_1.strict.equal(String(privateKey1.secret), String(privateKey2.secret)); assert_1.strict.equal(String(privateKey1.curve), String(privateKey2.curve)); }); }); describe("#testStringConversion()", function () { it("should validate private-key-string generation and convertion", function () { let privateKey1 = new privateKey_1.PrivateKey(); let string = privateKey1.toString(); let privateKey2 = privateKey_1.PrivateKey.fromString(string); assert_1.strict.equal(String(privateKey1.secret), String(privateKey2.secret)); assert_1.strict.equal(String(privateKey1.curve), String(privateKey2.curve)); }); }); }); describe("PublicKey test", function () { describe("#testPemConversion()", function () { it("should validate PEM generation and convertion", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey1 = privateKey.publicKey(); let pem = publicKey1.toPem(); let publicKey2 = publicKey_1.PublicKey.fromPem(pem); assert_1.strict.equal(String(publicKey1.point.x), String(publicKey2.point.x)); assert_1.strict.equal(String(publicKey1.point.y), String(publicKey2.point.y)); assert_1.strict.equal(publicKey1.curve, publicKey2.curve); }); }); describe("#testDerConversion()", function () { it("should validate DER generation and convertion", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey1 = privateKey.publicKey(); let der = publicKey1.toDer(); let publicKey2 = publicKey_1.PublicKey.fromDer(der); assert_1.strict.equal(String(publicKey1.point.x), String(publicKey2.point.x)); assert_1.strict.equal(String(publicKey1.point.y), String(publicKey2.point.y)); assert_1.strict.equal(publicKey1.curve, publicKey2.curve); }); }); describe("#testStringConversion()", function () { it("should validate private-key-string generation and convertion", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey1 = privateKey.publicKey(); let string = publicKey1.toString(); let publicKey2 = publicKey_1.PublicKey.fromString(string); assert_1.strict.equal(String(publicKey1.point.x), String(publicKey2.point.x)); assert_1.strict.equal(String(publicKey1.point.y), String(publicKey2.point.y)); assert_1.strict.equal(publicKey1.curve, publicKey2.curve); }); }); }); describe("Signature test", function () { describe("#testDerConversion()", function () { it("should validate DER signature generation and convertion", function () { let privateKey = new privateKey_1.PrivateKey(); let message = "This is a text message"; let signature1 = Ecdsa.sign(message, privateKey); let der = signature1.toDer(); let signature2 = signature_1.Signature.fromDer(der); assert_1.strict.equal(String(signature1.r), String(signature2.r)); assert_1.strict.equal(String(signature1.s), String(signature2.s)); }); }); describe("#testBase64Conversion()", function () { it("should validate Base64 signature generation and convertion", function () { let privateKey = new privateKey_1.PrivateKey(); let message = "This is a text message"; let signature1 = Ecdsa.sign(message, privateKey); let base64 = signature1.toBase64(); let signature2 = signature_1.Signature.fromBase64(base64); assert_1.strict.equal(String(signature1.r), String(signature2.r)); assert_1.strict.equal(String(signature1.s), String(signature2.s)); }); }); describe("#testExternalRandNum()", function () { it("should confirm authenticity and same signature", function () { let privateKey = new privateKey_1.PrivateKey(); let publicKey = privateKey.publicKey(); let message = "This is a message"; let signature1 = Ecdsa.sign(message, privateKey, undefined, (0, big_integer_1.default)(123)); let signature2 = Ecdsa.sign(message, privateKey, undefined, (0, big_integer_1.default)(123)); assert_1.strict.equal(Ecdsa.verify(message, signature1, publicKey), true); assert_1.strict.equal(Ecdsa.verify(message, signature2, publicKey), true); assert_1.strict.equal(signature1.r.toString(), signature2.r.toString()); assert_1.strict.equal(signature1.s.toString(), signature2.s.toString()); }); }); });