@@ -4,15 +4,14 @@ import (
44 "fmt"
55 "strings"
66
7- mbase "github.com/multiformats/go-multibase"
8- "github.com/multiformats/go-varint"
9-
107 "github.com/INFURA/go-did"
118 "github.com/INFURA/go-did/crypto"
9+ "github.com/INFURA/go-did/crypto/_helpers"
1210 "github.com/INFURA/go-did/crypto/ed25519"
1311 "github.com/INFURA/go-did/crypto/p256"
1412 "github.com/INFURA/go-did/crypto/x25519"
1513 "github.com/INFURA/go-did/verifications/ed25519"
14+ "github.com/INFURA/go-did/verifications/multikey"
1615 "github.com/INFURA/go-did/verifications/x25519"
1716)
1817
@@ -39,61 +38,45 @@ func Decode(identifier string) (did.DID, error) {
3938
4039 msi := identifier [len (keyPrefix ):]
4140
42- baseCodec , bytes , err := mbase . Decode (msi )
41+ code , bytes , err := helpers . PublicKeyMultibaseDecode (msi )
4342 if err != nil {
44- return nil , fmt . Errorf ( "%w: %w" , did . ErrInvalidDid , err )
43+ return nil , err
4544 }
46- // the specification enforces that encoding
47- if baseCodec != mbase .Base58BTC {
48- return nil , fmt .Errorf ("%w: not Base58BTC encoded" , did .ErrInvalidDid )
45+
46+ decoder , ok := map [uint64 ]func (b []byte ) (crypto.PublicKey , error ){
47+ ed25519 .MultibaseCode : func (b []byte ) (crypto.PublicKey , error ) { return ed25519 .PublicKeyFromBytes (b ) },
48+ p256 .MultibaseCode : func (b []byte ) (crypto.PublicKey , error ) { return p256 .PublicKeyFromBytes (b ) },
49+ x25519 .MultibaseCode : func (b []byte ) (crypto.PublicKey , error ) { return x25519 .PublicKeyFromBytes (b ) },
50+ }[code ]
51+ if ! ok {
52+ return nil , fmt .Errorf ("%w: unsupported did:key multicodec: 0x%x" , did .ErrInvalidDid , code )
4953 }
50- code , read , err := varint .FromUvarint (bytes )
54+
55+ pub , err := decoder (bytes )
5156 if err != nil {
5257 return nil , fmt .Errorf ("%w: %w" , did .ErrInvalidDid , err )
5358 }
54-
55- switch code {
56- case ed25519 .MultibaseCode :
57- pub , err := ed25519 .PublicKeyFromBytes (bytes [read :])
58- if err != nil {
59- return nil , fmt .Errorf ("%w: %w" , did .ErrInvalidDid , err )
60- }
61- return FromPublicKey (pub )
62- case p256 .MultibaseCode :
63- pub , err := p256 .PublicKeyFromBytes (bytes [read :])
64- if err != nil {
65- return nil , fmt .Errorf ("%w: %w" , did .ErrInvalidDid , err )
66- }
67- return FromPublicKey (pub )
68-
69- // case Secp256k1: // TODO
70- // case RSA: // TODO
71- }
72-
73- return nil , fmt .Errorf ("%w: unsupported did:key multicodec: 0x%x" , did .ErrInvalidDid , code )
59+ return FromPublicKey (pub )
7460}
7561
7662func FromPublicKey (pub crypto.PublicKey ) (did.DID , error ) {
77- var err error
7863 switch pub := pub .(type ) {
7964 case ed25519.PublicKey :
8065 d := DidKey {msi : pub .ToPublicKeyMultibase ()}
81- d .signature , err = ed25519vm .NewVerificationKey2020 (fmt .Sprintf ("did:key:%s#%s" , d .msi , d .msi ), pub , d )
82- if err != nil {
83- return nil , err
84- }
66+ d .signature = ed25519vm .NewVerificationKey2020 (fmt .Sprintf ("did:key:%s#%s" , d .msi , d .msi ), pub , d )
8567 xpub , err := x25519 .PublicKeyFromEd25519 (pub )
8668 if err != nil {
8769 return nil , fmt .Errorf ("%w: %w" , did .ErrInvalidDid , err )
8870 }
8971 xmsi := xpub .ToPublicKeyMultibase ()
90- d .keyAgreement , err = x25519vm .NewKeyAgreementKey2020 (fmt .Sprintf ("did:key:%s#%s" , d .msi , xmsi ), xpub , d )
91- if err != nil {
92- return nil , fmt .Errorf ("%w: %w" , did .ErrInvalidDid , err )
93- }
72+ d .keyAgreement = x25519vm .NewKeyAgreementKey2020 (fmt .Sprintf ("did:key:%s#%s" , d .msi , xmsi ), xpub , d )
73+ return d , nil
74+ case * p256.PublicKey :
75+ d := DidKey {msi : pub .ToPublicKeyMultibase ()}
76+ mk := multikey .NewMultiKey (fmt .Sprintf ("did:key:%s#%s" , d .msi , d .msi ), pub , d )
77+ d .signature = mk
78+ d .keyAgreement = mk
9479 return d , nil
95- // case *p256.PublicKey:
96- // d := DidKey{msi: pub.ToPublicKeyMultibase()}
9780
9881 default :
9982 return nil , fmt .Errorf ("unsupported public key: %T" , pub )
0 commit comments