UNPKG

@scintilla-network/signatures

Version:

Enhanced signature and key exchange functions for blockchain and crypto applications, including post-quantum algorithms

72 lines (63 loc) 3.38 kB
import { describe, it, expect } from 'vitest'; import { bls12_381 as bls } from './bls12_381.js'; import { utils } from '../utils/index.js'; const TEST_VECTOR = { message: new Uint8Array([116, 101, 115, 116]), // UTF-8 encoded "test" messageString: 'test' }; describe('bls', () => { it('should sign and verify with Uint8Array message', () => { const privateKey = bls.generatePrivateKey(); const publicKey = bls.getPublicKey(privateKey); const signature = bls.sign(TEST_VECTOR.message, privateKey); expect(bls.verify(signature, TEST_VECTOR.message, publicKey)).toBe(true); }); it('should sign and verify with string message', () => { const privateKey = bls.generatePrivateKey(); const publicKey = bls.getPublicKey(privateKey); const signature = bls.sign(utils.formatMessage(TEST_VECTOR.messageString), privateKey); expect(bls.verify(signature, utils.formatMessage(TEST_VECTOR.messageString), publicKey)).toBe(true); }); it('should validate key generation input', () => { expect(() => bls.generatePrivateKey('invalid')) .toThrow('seed must be a Uint8Array'); expect(() => bls.generatePrivateKey(new Uint8Array(31))) .toThrow('seed must be 32 bytes'); }); it('should validate signing input', () => { const privateKey = bls.generatePrivateKey(); expect(() => bls.sign({}, privateKey)) .toThrow('message must be a Uint8Array, use utils.formatMessage() for automatic conversion'); expect(() => bls.sign(TEST_VECTOR.message, 'invalid')) .toThrow('privateKey must be a Uint8Array'); }); it('should validate verification input', () => { const publicKey = bls.getPublicKey(bls.generatePrivateKey()); const signature = new Uint8Array(96); // expect(() => bls.verify('invalid', TEST_VECTOR.message, publicKey)) // .toThrow('signature must be a Uint8Array'); expect(() => bls.verify(signature, {}, publicKey)) .toThrow('message must be a Uint8Array, use utils.formatMessage() for automatic conversion'); expect(() => bls.verify(signature, TEST_VECTOR.message, 'invalid')) .toThrow('publicKey must be a Uint8Array'); }); it('should aggregate signatures and public keys', () => { const keys1 = bls.generateKeyPair(); const keys2 = bls.generateKeyPair(); const sig1 = bls.sign(TEST_VECTOR.message, keys1.privateKey); const sig2 = bls.sign(TEST_VECTOR.message, keys2.privateKey); const aggSig = bls.aggregateSignatures([sig1, sig2]); const aggPub = bls.aggregatePublicKeys([keys1.publicKey, keys2.publicKey]); expect(bls.verify(aggSig, TEST_VECTOR.message, aggPub)).toBe(true); }); it('should validate aggregation input', () => { expect(() => bls.aggregateSignatures('invalid')) .toThrow('signatures must be an array'); // expect(() => bls.aggregateSignatures([new Uint8Array(96), 'invalid'])) // .toThrow('all signatures must be Uint8Array'); expect(() => bls.aggregatePublicKeys('invalid')) .toThrow('publicKeys must be an array'); expect(() => bls.aggregatePublicKeys([new Uint8Array(48), 'invalid'])) .toThrow('all public keys must be Uint8Array'); }); });