This repository has been archived on 2023-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
chainsafe-bls/test/unit/index.test.ts

269 lines
8.6 KiB
TypeScript
Raw Normal View History

2020-11-04 17:40:36 +00:00
import bls, {
aggregatePubkeys,
aggregateSignatures,
initBLS,
Keypair,
verify,
verifyMultiple,
} from "../../src";
2020-02-20 20:26:26 +00:00
import SHA256 from "@chainsafe/as-sha256";
2020-11-04 17:40:36 +00:00
import { expect } from "chai";
import { destroy } from "../../src/context";
import { padLeft } from "../../src/helpers/utils";
2019-08-05 15:48:26 +00:00
2019-09-17 20:03:24 +00:00
describe("test bls", function () {
2020-11-04 17:40:36 +00:00
before(async function () {
2019-12-02 12:44:45 +00:00
await initBLS();
2019-11-27 20:58:41 +00:00
});
after(function () {
destroy();
});
2019-09-17 20:03:24 +00:00
describe("aggregate pubkey", function () {
it("should aggregate empty array", function () {
2019-08-05 15:48:26 +00:00
expect(bls.aggregatePubkeys([])).to.not.throw;
});
});
2020-11-04 17:40:36 +00:00
describe("verify", function () {
2019-09-17 20:03:24 +00:00
it("should verify signature", () => {
2019-08-05 15:48:26 +00:00
const keypair = Keypair.generate();
2020-02-20 20:26:26 +00:00
const messageHash = Buffer.from(SHA256.digest(Buffer.from("Test")));
2020-11-04 17:40:36 +00:00
const signature = keypair.privateKey.signMessage(messageHash);
2019-11-27 20:58:41 +00:00
const result = verify(
2019-08-05 15:48:26 +00:00
keypair.publicKey.toBytesCompressed(),
messageHash,
2020-11-04 17:40:36 +00:00
signature.toBytesCompressed()
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.true;
});
2019-09-17 20:03:24 +00:00
it("should not modify original pubkey when verifying", () => {
2019-08-05 15:48:26 +00:00
const keypair = Keypair.generate();
2020-02-20 20:26:26 +00:00
const messageHash = Buffer.from(SHA256.digest(Buffer.from("Test")));
2020-11-04 17:40:36 +00:00
const signature = keypair.privateKey.signMessage(messageHash);
2019-08-05 15:48:26 +00:00
const pubKey = keypair.publicKey.toBytesCompressed();
2020-11-04 17:40:36 +00:00
verify(pubKey, messageHash, signature.toBytesCompressed());
expect("0x" + pubKey.toString("hex")).to.be.equal(
keypair.publicKey.toHexString()
2019-08-05 15:48:26 +00:00
);
});
2019-09-17 20:03:24 +00:00
it("should fail verify empty signature", () => {
2019-08-05 15:48:26 +00:00
const keypair = Keypair.generate();
2020-11-04 17:40:36 +00:00
const messageHash2 = Buffer.from(
SHA256.digest(Buffer.from("Test message2"))
);
2019-08-05 15:48:26 +00:00
const signature = Buffer.alloc(96);
2019-11-27 20:58:41 +00:00
const result = verify(
2019-08-05 15:48:26 +00:00
keypair.publicKey.toBytesCompressed(),
messageHash2,
2020-11-04 17:40:36 +00:00
signature
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.false;
});
2019-09-17 20:03:24 +00:00
it("should fail verify signature of different message", () => {
2019-08-05 15:48:26 +00:00
const keypair = Keypair.generate();
2020-11-04 17:40:36 +00:00
const messageHash = Buffer.from(
SHA256.digest(Buffer.from("Test message"))
2019-08-05 15:48:26 +00:00
);
2020-11-04 17:40:36 +00:00
const messageHash2 = Buffer.from(
SHA256.digest(Buffer.from("Test message2"))
);
const signature = keypair.privateKey.signMessage(messageHash);
2019-11-27 20:58:41 +00:00
const result = verify(
2019-08-05 15:48:26 +00:00
keypair.publicKey.toBytesCompressed(),
messageHash2,
2020-11-04 17:40:36 +00:00
signature.toBytesCompressed()
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.false;
});
2019-09-17 20:03:24 +00:00
it("should fail verify signature signed by different key", () => {
2019-08-05 15:48:26 +00:00
const keypair = Keypair.generate();
const keypair2 = Keypair.generate();
2020-11-04 17:40:36 +00:00
const messageHash = Buffer.from(
SHA256.digest(Buffer.from("Test message"))
2019-08-05 15:48:26 +00:00
);
2020-11-04 17:40:36 +00:00
const signature = keypair.privateKey.signMessage(messageHash);
2019-11-27 20:58:41 +00:00
const result = verify(
2019-08-05 15:48:26 +00:00
keypair2.publicKey.toBytesCompressed(),
messageHash,
2020-11-04 17:40:36 +00:00
signature.toBytesCompressed()
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.false;
});
});
2020-11-04 17:40:36 +00:00
describe("verify multiple", function () {
2019-09-17 20:03:24 +00:00
it("should verify aggregated signatures", function () {
2019-08-28 13:57:26 +00:00
this.timeout(5000);
2019-08-05 15:48:26 +00:00
const keypair1 = Keypair.generate();
const keypair2 = Keypair.generate();
const keypair3 = Keypair.generate();
const keypair4 = Keypair.generate();
2020-02-20 20:26:26 +00:00
const message1 = Buffer.from(SHA256.digest(Buffer.from("Test1")));
const message2 = Buffer.from(SHA256.digest(Buffer.from("Test2")));
2019-08-05 15:48:26 +00:00
2020-02-24 22:46:13 +00:00
const signature1 = keypair1.privateKey.signMessage(message1);
const signature2 = keypair2.privateKey.signMessage(message1);
const signature3 = keypair3.privateKey.signMessage(message2);
const signature4 = keypair4.privateKey.signMessage(message2);
2019-08-05 15:48:26 +00:00
2019-11-27 20:58:41 +00:00
const aggregatePubKey12 = aggregatePubkeys([
2019-08-05 15:48:26 +00:00
keypair1.publicKey.toBytesCompressed(),
keypair2.publicKey.toBytesCompressed(),
]);
2019-11-27 20:58:41 +00:00
const aggregatePubKey34 = aggregatePubkeys([
2019-08-05 15:48:26 +00:00
keypair3.publicKey.toBytesCompressed(),
keypair4.publicKey.toBytesCompressed(),
]);
2019-11-27 20:58:41 +00:00
const aggregateSignature = aggregateSignatures([
2019-08-05 15:48:26 +00:00
signature1.toBytesCompressed(),
signature2.toBytesCompressed(),
signature3.toBytesCompressed(),
signature4.toBytesCompressed(),
]);
2019-11-27 20:58:41 +00:00
const result = verifyMultiple(
2019-08-05 15:48:26 +00:00
[aggregatePubKey12, aggregatePubKey34],
[message1, message2],
2020-11-04 17:40:36 +00:00
aggregateSignature
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.true;
});
2019-09-17 20:03:24 +00:00
it("should verify aggregated signatures - same message", function () {
2019-08-28 13:57:26 +00:00
this.timeout(5000);
const keypair1 = Keypair.generate();
const keypair2 = Keypair.generate();
const keypair3 = Keypair.generate();
const keypair4 = Keypair.generate();
2020-02-20 20:26:26 +00:00
const message = Buffer.from(SHA256.digest(Buffer.from("Test1")));
2019-08-28 13:57:26 +00:00
2020-02-24 22:46:13 +00:00
const signature1 = keypair1.privateKey.signMessage(message);
const signature2 = keypair2.privateKey.signMessage(message);
const signature3 = keypair3.privateKey.signMessage(message);
const signature4 = keypair4.privateKey.signMessage(message);
2019-08-28 13:57:26 +00:00
2019-11-27 20:58:41 +00:00
const aggregateSignature = aggregateSignatures([
2019-08-28 13:57:26 +00:00
signature1.toBytesCompressed(),
signature2.toBytesCompressed(),
signature3.toBytesCompressed(),
signature4.toBytesCompressed(),
]);
2019-11-27 20:58:41 +00:00
const result = verifyMultiple(
2019-08-28 13:57:26 +00:00
[
keypair1.publicKey.toBytesCompressed(),
keypair2.publicKey.toBytesCompressed(),
keypair3.publicKey.toBytesCompressed(),
2020-11-04 17:40:36 +00:00
keypair4.publicKey.toBytesCompressed(),
2019-08-28 13:57:26 +00:00
],
[message, message, message, message],
aggregateSignature,
2020-11-04 17:40:36 +00:00
true
2019-08-28 13:57:26 +00:00
);
expect(result).to.be.true;
});
2019-09-17 20:03:24 +00:00
it("should fail to verify aggregated signatures - swapped messages", function () {
2019-08-28 13:57:26 +00:00
this.timeout(5000);
2019-08-05 15:48:26 +00:00
const keypair1 = Keypair.generate();
const keypair2 = Keypair.generate();
const keypair3 = Keypair.generate();
const keypair4 = Keypair.generate();
2020-02-20 20:26:26 +00:00
const message1 = Buffer.from(SHA256.digest(Buffer.from("Test1")));
const message2 = Buffer.from(SHA256.digest(Buffer.from("Test2")));
2019-08-05 15:48:26 +00:00
2020-02-24 22:46:13 +00:00
const signature1 = keypair1.privateKey.signMessage(message1);
const signature2 = keypair2.privateKey.signMessage(message1);
const signature3 = keypair3.privateKey.signMessage(message2);
const signature4 = keypair4.privateKey.signMessage(message2);
2019-08-05 15:48:26 +00:00
const aggregatePubKey12 = bls.aggregatePubkeys([
keypair1.publicKey.toBytesCompressed(),
keypair2.publicKey.toBytesCompressed(),
]);
const aggregatePubKey34 = bls.aggregatePubkeys([
keypair3.publicKey.toBytesCompressed(),
keypair4.publicKey.toBytesCompressed(),
]);
const aggregateSignature = bls.aggregateSignatures([
signature1.toBytesCompressed(),
signature2.toBytesCompressed(),
signature3.toBytesCompressed(),
signature4.toBytesCompressed(),
]);
const result = bls.verifyMultiple(
[aggregatePubKey12, aggregatePubKey34],
[message2, message1],
2020-11-04 17:40:36 +00:00
aggregateSignature
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.false;
});
2019-09-17 20:03:24 +00:00
it("should fail to verify aggregated signatures - different pubkeys and messsages", () => {
2019-08-05 15:48:26 +00:00
const keypair1 = Keypair.generate();
const keypair2 = Keypair.generate();
const keypair3 = Keypair.generate();
const keypair4 = Keypair.generate();
2020-02-20 20:26:26 +00:00
const message1 = Buffer.from(SHA256.digest(Buffer.from("Test1")));
const message2 = Buffer.from(SHA256.digest(Buffer.from("Test2")));
2019-08-05 15:48:26 +00:00
2020-02-24 22:46:13 +00:00
const signature1 = keypair1.privateKey.signMessage(message1);
const signature2 = keypair2.privateKey.signMessage(message1);
const signature3 = keypair3.privateKey.signMessage(message2);
const signature4 = keypair4.privateKey.signMessage(message2);
2019-08-05 15:48:26 +00:00
const aggregatePubKey12 = bls.aggregatePubkeys([
keypair1.publicKey.toBytesCompressed(),
keypair2.publicKey.toBytesCompressed(),
]);
const aggregateSignature = bls.aggregateSignatures([
signature1.toBytesCompressed(),
signature2.toBytesCompressed(),
signature3.toBytesCompressed(),
signature4.toBytesCompressed(),
]);
const result = bls.verifyMultiple(
[aggregatePubKey12],
[message2, message1],
2020-11-04 17:40:36 +00:00
aggregateSignature
2019-08-05 15:48:26 +00:00
);
expect(result).to.be.false;
});
2019-09-17 20:03:24 +00:00
it("should fail to verify aggregated signatures - no public keys", () => {
2019-08-05 15:48:26 +00:00
const signature = Buffer.alloc(96);
2020-02-20 20:26:26 +00:00
const message1 = Buffer.from(SHA256.digest(Buffer.from("Test1")));
const message2 = Buffer.from(SHA256.digest(Buffer.from("Test2")));
2019-08-05 15:48:26 +00:00
2020-11-04 17:40:36 +00:00
const result = bls.verifyMultiple([], [message2, message1], signature);
2019-08-05 15:48:26 +00:00
expect(result).to.be.false;
});
});
});