signingKey

tcmts.atproto.signingKey · #2qepf2ln · term · runs on the server

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 };
}

uses

used by