// @pdsjs/core/kem - the account's `#atproto_kem` key. // // A P-256 key published in the DID document beside `#atproto`. A space syncer // derives a per-request shared secret against it, and the repo host proves a // response with a MAC under that secret. The key never signs. import { derivePublicKey, generateKeyPair } from './crypto.js'; import { publicKeyToDidKey } from './plc.js'; export const KEM_KEY_ID = 'atproto_kem'; /** * A fresh KEM key. * @returns {Promise<{privateKey: Uint8Array, didKey: string}>} the 32-byte * P-256 scalar, and its public key as a did:key */ export async function generateKemKey() { const { privateKey, publicKey } = await generateKeyPair(); return { privateKey, didKey: publicKeyToDidKey(publicKey, 'p256') }; } /** * The did:key of a stored KEM key. * @param {Uint8Array} privateKey - 32-byte P-256 scalar * @returns {Promise} */ export async function kemDidKey(privateKey) { if (privateKey.length !== 32) { throw new Error(`A KEM key is 32 bytes, got ${privateKey.length}`); } const { publicKey } = await derivePublicKey(privateKey); return publicKeyToDidKey(publicKey, 'p256'); }