signingKey
uses tcmts.atproto.pdsOf, which uses tcmts.atproto.localNetwork, which uses process
A DID's repository signing key, from its DID document (#atproto): a Multikey, or a legacy
EcdsaSecp256k1VerificationKey2019 / EcdsaSecp256r1VerificationKey2019, whose key is written uncompressed (as
a PLC directory still serves some, and did:web documents may), compressed for importing.
import { compressedKey, didDocument, pdsOf } from "#codebase/tcmts/atproto"; import { getPublicKeyFromDidController, P256PublicKey, Secp256k1PublicKey } from "@atcute/crypto"; import type { PublicKey } from "@atcute/crypto"; export async function signingKey(did: string): Promise<{ pds: string; key: PublicKey }> { const doc = (await didDocument(did)) as Awaited<ReturnType<typeof didDocument>> & { verificationMethod?: { id: string; type: string; publicKeyMultibase?: string }[]; }; const pds = pdsOf(doc, did); const vm = doc.verificationMethod?.find((v) => v.id === "#atproto" || v.id === `${did}#atproto`); if (!vm?.publicKeyMultibase) throw new Error(`${did}'s DID document has no #atproto key`); const found = getPublicKeyFromDidController({ type: vm.type, publicKeyMultibase: vm.publicKeyMultibase, }); const raw = compressedKey(found.publicKeyBytes); const key = found.type === "p256" ? await P256PublicKey.importRaw(raw) : await Secp256k1PublicKey.importRaw(raw); return { pds, key }; }