Home Reference Source Test

test/specs/generic/consensus/base/primitive/PublicKey.spec.js

describe('PublicKey', () => {

    it('is serializable and unserializable', () => {
        const pubKey1 = KeyPair.generate().publicKey;
        const pubKey2 = PublicKey.unserialize(pubKey1.serialize());

        expect(pubKey1.equals(pubKey2)).toEqual(true);
        expect(pubKey1.serialize().byteLength).toEqual(pubKey1.serializedSize);
        expect(pubKey2.serialize().byteLength).toEqual(pubKey2.serializedSize);
    });

    it('has an equals method', () => {
        const pubKey1 = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey1));
        const pubKey2 = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey2));
        const pubKey3 = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey2));

        expect(pubKey1.equals(1)).toEqual(false);
        expect(pubKey1.equals(null)).toEqual(false);
        expect(pubKey1.equals(pubKey1)).toEqual(true);
        expect(pubKey1.equals(pubKey2)).toEqual(false);
        expect(pubKey2.equals(pubKey3)).toEqual(true);
    });

    it('can sum up public keys', () => {
        const pubKey1 = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey1));
        const pubKey2 = PublicKey.unserialize(BufferUtils.fromBase64(Dummy.publicKey2));
        const pubKey3 = PublicKey.unserialize(BufferUtils.fromBase64('gJIjyS65kczX3eYvkw+Gd1bH7OQGBYvRJc2cx0pJd2k='));

        expect(PublicKey.sum([pubKey1, pubKey2]).equals(pubKey3)).toEqual(true);
        expect(PublicKey.sum([pubKey2, pubKey1]).equals(pubKey3)).toEqual(true);
    });

    it('correctly derives the public key', (done) => {
        (async function () {
            for (const testCase of Dummy.partialSignatureTestVectors) {
                for (let i = 0; i < testCase.pubKeys.length; ++i) {
                    const pubKey = PublicKey._publicKeyDerive(testCase.privKeys[i]);
                    expect(BufferUtils.equals(pubKey, testCase.pubKeys[i])).toBe(true);
                }
            }
        })().then(done, done.fail);
    });

    it('correctly computes public keys hash', (done) => {
        (async function () {
            for (const testCase of Dummy.partialSignatureTestVectors) {
                const publicKeysHash = PublicKey._publicKeysHash(testCase.pubKeys);
                expect(BufferUtils.equals(publicKeysHash, testCase.pubKeysHash)).toBe(true);
            }
        })().then(done, done.fail);
    });

    it('correctly derives the delinearized public key', (done) => {
        (async function () {
            for (const testCase of Dummy.partialSignatureTestVectors) {
                for (let i = 0; i < testCase.pubKeys.length; ++i) {
                    const publicKeysHash = PublicKey._publicKeysHash(testCase.pubKeys);
                    const delinearizedPubKey = PublicKey._publicKeyDelinearize(testCase.pubKeys[i], publicKeysHash);
                    expect(BufferUtils.equals(delinearizedPubKey, testCase.delinearizedPubKeys[i])).toBe(true);
                }
            }
        })().then(done, done.fail);
    });

    it('correctly aggregates and delinearizes public keys', (done) => {
        (async function () {
            for (const testCase of Dummy.partialSignatureTestVectors) {
                const publicKeysHash = PublicKey._publicKeysHash(testCase.pubKeys);
                const delinearizedPubKeys = [];
                for (let i = 0; i < testCase.pubKeys.length; ++i) { // TODO why is this even computed
                    const delinearizedPubKey = PublicKey._publicKeyDelinearize(testCase.pubKeys[i], publicKeysHash);
                    delinearizedPubKeys.push(delinearizedPubKey);
                }
                const aggregatePubKey = PublicKey._publicKeysDelinearizeAndAggregate(testCase.pubKeys, publicKeysHash);
                expect(BufferUtils.equals(aggregatePubKey, testCase.aggPubKey)).toBe(true);
            }
        })().then(done, done.fail);
    });
});