Fork of github.com/did-method-plc/did-method-plc
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iterated DID document formatting

Uses new-ish "Multikey"[0] verificationMethod format, along with
compact multicode-prefixed multibase encoding (which matches did:key
encoding).

Also prefixes the verificationMethod 'id' field with the full DID URL
(instead of just "#atproto" fragment), to comply with DID Core
specification.

[0]: https://www.w3.org/TR/2023/WD-vc-data-integrity-20230810/

+17 -15
+10 -7
packages/lib/src/document.ts
··· 5 5 import { ParsedDidKey } from '@atproto/crypto' 6 6 7 7 export const formatDidDoc = (data: t.DocumentData): t.DidDocument => { 8 - const context = ['https://www.w3.org/ns/did/v1'] 8 + const context = [ 9 + 'https://www.w3.org/ns/did/v1', 10 + 'https://w3id.org/security/multikey/v1', 11 + ] 9 12 10 13 const verificationMethods: VerificationMethod[] = [] 11 14 for (const [keyid, key] of Object.entries(data.verificationMethods)) { ··· 14 17 context.push(info.context) 15 18 } 16 19 verificationMethods.push({ 17 - id: `#${keyid}`, 20 + id: `${data.did}#${keyid}`, 18 21 type: info.type, 19 22 controller: data.did, 20 23 publicKeyMultibase: info.publicKeyMultibase, ··· 65 68 } catch (err) { 66 69 throw new UnsupportedKeyError(key, err) 67 70 } 68 - const { jwtAlg, keyBytes } = keyInfo 71 + const { jwtAlg } = keyInfo 69 72 70 73 if (jwtAlg === crypto.P256_JWT_ALG) { 71 74 return { 72 75 context: 'https://w3id.org/security/suites/ecdsa-2019/v1', 73 - type: 'EcdsaSecp256r1VerificationKey2019', 74 - publicKeyMultibase: `z${uint8arrays.toString(keyBytes, 'base58btc')}`, 76 + type: 'Multikey', 77 + publicKeyMultibase: key.replace(/^(did:key:)/, ''), 75 78 } 76 79 } else if (jwtAlg === crypto.SECP256K1_JWT_ALG) { 77 80 return { 78 81 context: 'https://w3id.org/security/suites/secp256k1-2019/v1', 79 - type: 'EcdsaSecp256k1VerificationKey2019', 80 - publicKeyMultibase: `z${uint8arrays.toString(keyBytes, 'base58btc')}`, 82 + type: 'Multikey', 83 + publicKeyMultibase: key.replace(/^(did:key:)/, ''), 81 84 } 82 85 } 83 86 throw new UnsupportedKeyError(key, `Unsupported key type: ${jwtAlg}`)
+7 -8
packages/lib/tests/document.test.ts
··· 38 38 ) 39 39 expect(doc['@context']).toEqual([ 40 40 'https://www.w3.org/ns/did/v1', 41 + 'https://w3id.org/security/multikey/v1', 41 42 'https://w3id.org/security/suites/secp256k1-2019/v1', 42 43 'https://w3id.org/security/suites/ecdsa-2019/v1', 43 44 ]) ··· 46 47 47 48 expect(doc.verificationMethod.length).toBe(2) 48 49 49 - expect(doc.verificationMethod[0].id).toEqual('#atproto') 50 + expect(doc.verificationMethod[0].id).toEqual(data.did + '#atproto') 50 51 expect(doc.verificationMethod[0].type).toEqual( 51 - 'EcdsaSecp256k1VerificationKey2019', 52 + 'Multikey', 52 53 ) 53 54 expect(doc.verificationMethod[0].controller).toEqual(data.did) 54 55 const parsedAtprotoKey = parseDidKey(atprotoKey.did()) 55 - const atprotoKeyMultibase = 56 - 'z' + uint8arrays.toString(parsedAtprotoKey.keyBytes, 'base58btc') 56 + const atprotoKeyMultibase = atprotoKey.did().replace(/^(did:key:)/, '') 57 57 expect(doc.verificationMethod[0].publicKeyMultibase).toEqual( 58 58 atprotoKeyMultibase, 59 59 ) 60 60 61 - expect(doc.verificationMethod[1].id).toEqual('#other') 61 + expect(doc.verificationMethod[1].id).toEqual(data.did + '#other') 62 62 expect(doc.verificationMethod[1].type).toEqual( 63 - 'EcdsaSecp256r1VerificationKey2019', 63 + 'Multikey', 64 64 ) 65 65 expect(doc.verificationMethod[1].controller).toEqual(data.did) 66 66 const parsedOtherKey = parseDidKey(otherKey.did()) 67 - const otherKeyMultibase = 68 - 'z' + uint8arrays.toString(parsedOtherKey.keyBytes, 'base58btc') 67 + const otherKeyMultibase = otherKey.did().replace(/^(did:key:)/, '') 69 68 expect(doc.verificationMethod[1].publicKeyMultibase).toEqual( 70 69 otherKeyMultibase, 71 70 )