UNPKG

@tanglelabs/resolver-did-key

Version:

Fork of Sphereon did:key resolver with BBS+/BLS and EBSI support.

66 lines (62 loc) 2.44 kB
import { decode } from 'varint' import { base58btc } from 'multiformats/bases/base58' import ed25519 from './drivers/ed25519' import bls12381g2 from './drivers/bls12381g2' import secp256k1 from './drivers/secp256k1' import secp256r1 from './drivers/secp256r1' import secp384r1 from './drivers/secp384r1' import secp521r1 from './drivers/secp521r1' import { DIDResolutionResult, ParsedDID, Resolvable, ResolverRegistry } from 'did-resolver' import jwkJcs from './drivers/jwk.jcs' import { DID_JSON, DID_LD_JSON, DIDKeyResolutionOptions, KeyToDidDocArgs } from './types' export * from './types' const prefixToDriverMap: any = { 0xe7: secp256k1, 0xed: ed25519, 0x1200: secp256r1, 0x1201: secp384r1, 0x1202: secp521r1, 0xeb: bls12381g2, 0xeb51: jwkJcs, } export const getResolver = (): ResolverRegistry => { return { key: async (did: string, parsed: ParsedDID, r: Resolvable, options: DIDKeyResolutionOptions) => { const contentType = options.accept || DID_LD_JSON const response: DIDResolutionResult = { didResolutionMetadata: { contentType }, didDocument: null, didDocumentMetadata: {}, } try { const multicodecPubKey = base58btc.decode(parsed.id) const keyType = decode(multicodecPubKey) const pubKeyBytes = multicodecPubKey.slice(decode.bytes) const args: KeyToDidDocArgs = { pubKeyBytes, fingerprint: parsed.id, contentType, options } const doc = await prefixToDriverMap[keyType].keyToDidDoc(args) if (contentType === DID_LD_JSON) { if (!doc['@context']) { doc['@context'] = 'https://w3id.org/did/v1' } else if ( Array.isArray(doc['@context']) && !doc['@context'].includes('https://w3id.org/did/v1') && !doc['@context'].includes('https://www.w3.org/ns/did/v1') ) { doc['@context'].push('https://w3id.org/did/v1') } response.didDocument = doc } else if (contentType === DID_JSON) { response.didDocument = doc } else { delete response.didResolutionMetadata.contentType response.didResolutionMetadata.error = 'representationNotSupported' } } catch (e: any) { response.didResolutionMetadata.error = 'invalidDid' response.didResolutionMetadata.message = e.toString() } return response }, } } export default { getResolver }