UNPKG

924 BPlain TextView Raw
1import { x25519 } from '@noble/curves/ed25519'
2import type { ECDH } from './types.js'
3
4/**
5 * Wraps an X25519 secret key into an ECDH method that can be used to compute a shared secret with a public key.
6 * @param mySecretKey A `Uint8Array` of length 32 representing the bytes of my secret key
7 * @returns an `ECDH` method with the signature `(theirPublicKey: Uint8Array) => Promise<Uint8Array>`
8 *
9 * @throws 'invalid_argument:...' if the secret key size is wrong
10 */
11export function createX25519ECDH(mySecretKey: Uint8Array): ECDH {
12 if (mySecretKey.length !== 32) {
13 throw new Error('invalid_argument: incorrect secret key length for X25519')
14 }
15 return async (theirPublicKey: Uint8Array): Promise<Uint8Array> => {
16 if (theirPublicKey.length !== 32) {
17 throw new Error('invalid_argument: incorrect publicKey key length for X25519')
18 }
19 return x25519.getSharedSecret(mySecretKey, theirPublicKey)
20 }
21}