/ identity / src / signing.ts
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  }