diff --git a/src/signature.ts b/src/signature.ts index e2abae2..50a73b5 100644 --- a/src/signature.ts +++ b/src/signature.ts @@ -7,8 +7,13 @@ export async function gen_privkey() : Promise { log.trace("generate keypair") return ed.utils.randomPrivateKey() } +export async function gen_keypair() : Promise<[Uint8Array, Uint8Array]> { + const privkey = await gen_privkey() + const pubkey = await get_pubkey(privkey) + return [privkey, pubkey] +} export async function get_pubkey(privkey: Uint8Array) : Promise { - log.trace("derive pubky") + log.trace("derive pubkey") return ed.getPublicKeyAsync(privkey) } export async function sign(message: Uint8Array, privkey: Uint8Array) : Promise { diff --git a/test/signature.test.ts b/test/signature.test.ts new file mode 100644 index 0000000..47209a0 --- /dev/null +++ b/test/signature.test.ts @@ -0,0 +1,55 @@ +import {test, expect} from 'bun:test' + +import {signature} from '../index' +import {gen_keypair} from "../src/signature"; + +test('base case', async () => { + const keypair = await gen_keypair() + const data = new TextEncoder().encode("Message 123 !") + + const sig = await signature.sign(data, keypair[0]) + const verification = await signature.verify(data, keypair[1], sig) + + expect(verification).toBe(true) +}) + +test('inverted keys', async () => { + const keypair = await signature.gen_keypair() + const data = new TextEncoder().encode("Message 123 !") + + expect(async () => await signature.sign(keypair[1], data)).toThrow() +}) + +test('tampered message', async () => { + const keypair = await signature.gen_keypair() + const data1 = new TextEncoder().encode("Message 123 !") + const data2 = new TextEncoder().encode("Message 321 !") + expect(data1).not.toEqual(data2) + + const sig = await signature.sign(data1, keypair[0]) + const verification = await signature.verify(data2, keypair[1], sig) + + expect(verification).toBe(false) +}) + +test('different keypair', async () => { + const keypair = await signature.gen_keypair() + const keypair2 = await signature.gen_keypair() + const data = new TextEncoder().encode("Message 123 !") + + const sig = await signature.sign(data, keypair[0]) + const verification = await signature.verify(data, keypair2[1], sig) + + expect(verification).toBe(false) +}) + +test('tampered signature', async () => { + const keypair = await signature.gen_keypair() + const data = new TextEncoder().encode("Message 123 !") + + const sig = await signature.sign(data, keypair[0]) + sig[0] ^= 1 + const verification = await signature.verify(data, keypair[1], sig) + + expect(verification).toBe(false) +})