ecdsa-node-ts
Version:
TypeScript implementation of the Elliptic Curve Digital Signature Algorithm (ECDSA)
203 lines (202 loc) • 10.6 kB
JavaScript
;
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());
});
});
});