signing.ts
1 import * as ed25519 from '@noble/ed25519'; 2 import { sha512 } from '@noble/hashes/sha512'; 3 import { 4 messageSchema, 5 secretKeySchema, 6 publicKeySchema, 7 signatureSchema, 8 type Message, 9 type SecretKey, 10 type PublicKey, 11 type Signature 12 } from './schemas.js'; 13 14 // Set up SHA-512 for ed25519 15 ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m)); 16 17 /** 18 * Sign a message with ed25519 19 */ 20 export async function sign( 21 message: Message, 22 secretKey: SecretKey 23 ): Promise<Signature> { 24 // Validate inputs 25 messageSchema.parse(message); 26 secretKeySchema.parse(secretKey); 27 28 const signature = await ed25519.sign(message, secretKey); 29 30 // Validate output 31 return signatureSchema.parse(signature); 32 } 33 34 /** 35 * Verify an ed25519 signature 36 */ 37 export async function verify( 38 message: Message, 39 signature: Signature, 40 publicKey: PublicKey 41 ): Promise<boolean> { 42 // Validate inputs 43 messageSchema.parse(message); 44 signatureSchema.parse(signature); 45 publicKeySchema.parse(publicKey); 46 47 return await ed25519.verify(signature, message, publicKey); 48 }