UNPKG

did-provider-quick

Version:

Veramo plugin that can enable creation and control of did:quick identifiers.

108 lines 4.08 kB
import { AbstractIdentifierProvider } from '@veramo/did-manager'; // import { EthrDID } from 'ethr-did' import { bytesToMultibase, hexToBytes } from '@veramo/utils'; const keyMapping = { Secp256k1: 'EcdsaSecp256k1VerificationKey2019', Secp256r1: 'EcdsaSecp256r1VerificationKey2019', Ed25519: 'Ed25519VerificationKey2018', X25519: 'X25519KeyAgreementKey2019', Bls12381G1: 'Bls12381G1Key2020', Bls12381G2: 'Bls12381G2Key2020', }; /** * {@link @veramo/did-manager#DIDManager} identifier provider for `did:quick` identifiers * @public */ export class QuickDIDProvider extends AbstractIdentifierProvider { defaultKms; relayerUrl; constructor(options) { super(); this.defaultKms = options.defaultKms; this.relayerUrl = options.relayerUrl; } async createIdentifier({ kms, options }, context) { const rootIdentifier = await context.agent.didManagerCreate({ provider: 'did:key', kms: this.defaultKms, }); const identifier = { did: 'did:quick:' + rootIdentifier.did, controllerKeyId: rootIdentifier.keys[0].kid, keys: [...(rootIdentifier.keys || [])], services: [], }; return identifier; } async updateIdentifier(args, context) { throw new Error('QuickDIDProvider updateIdentifier not supported yet.'); } async deleteIdentifier(identifier, context) { for (const { kid } of identifier.keys) { // FIXME: keys might be used by multiple DIDs or even independent await context.agent.keyManagerDelete({ kid }); } return true; } async addKey({ identifier, key, options }, context) { const rootDid = identifier.did.replace('did:quick:', ''); if (!rootDid.startsWith('did:key:')) { throw Error('root DID not of type did:key'); } const rootIdentifier = await context.agent.didManagerGet({ did: rootDid }); const proofFormats = await context.agent.listUsableProofFormats(rootIdentifier); const vm = { id: identifier.did + '#' + key.kid, type: "Multikey", controller: identifier.did }; switch (key.type) { case 'Ed25519': vm.publicKeyMultibase = bytesToMultibase(hexToBytes(key.publicKeyHex), 'base58btc', 'ed25519-pub'); break; case 'Secp256k1': vm.publicKeyMultibase = bytesToMultibase(hexToBytes(key.publicKeyHex), 'base58btc', 'secp256k1-pub'); break; } if (!vm.publicKeyMultibase) { throw new Error('Unsupported key type'); } const addKeyCred = await context.agent.createVerifiableCredential({ credential: { '@context': ['https://www.w3.org/2018/credentials/v1'], type: ['VerifiableCredential', 'DIDQuickUpdate', 'DIDQuickAddKey'], issuer: rootDid, issuanceDate: new Date().toISOString(), credentialSubject: { ...vm }, }, proofFormat: proofFormats[0], }); const res = await fetch(`${this.relayerUrl}/add-did-quick-update`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ type: 'did-quick-update', media_type: 'credential+ld+json', data: addKeyCred }) }); if (res.ok) { return true; } throw new Error(`Failed to add key: ${res.statusText}`); } async addService({ identifier, service, options, }, context) { throw new Error('Method not implemented.'); } async removeKey(args, context) { throw new Error('Method not implemented.'); } async removeService(args, context) { throw new Error('Method not implemented.'); } } //# sourceMappingURL=quick-did-provider.js.map