From 28ed1b122b96356219b54723b0cbb172274b019b Mon Sep 17 00:00:00 2001 From: Youngjoon Lee Date: Fri, 24 Feb 2023 15:52:01 +0900 Subject: [PATCH] convert pubkey comp to uncomp --- pkg/vc/command.go | 4 ++-- pkg/vc/framework.go | 16 +++++++--------- pkg/vdr/panacea_vdr.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/pkg/vc/command.go b/pkg/vc/command.go index f48d518..3f66e01 100644 --- a/pkg/vc/command.go +++ b/pkg/vc/command.go @@ -36,7 +36,7 @@ func (f *Framework) SignCredential(credential []byte, privKey []byte, opts *Proo func (f *Framework) VerifyCredential(vc []byte) error { _, err := verifiable.ParseCredential( vc, - verifiable.WithPublicKeyFetcher(f.resolver.PublicKeyFetcher()), + verifiable.WithPublicKeyFetcher(f.vdrKeyResolver.PublicKeyFetcher()), verifiable.WithJSONLDDocumentLoader(f.loader), ) if err != nil { @@ -112,7 +112,7 @@ func (f *Framework) VerifyPresentation(vp []byte, opts ...VerificationOption) (* // verify VP presentation, err := verifiable.ParsePresentation( vp, - verifiable.WithPresPublicKeyFetcher(f.resolver.PublicKeyFetcher()), + verifiable.WithPresPublicKeyFetcher(f.vdrKeyResolver.PublicKeyFetcher()), verifiable.WithPresJSONLDDocumentLoader(f.loader), ) if err != nil { diff --git a/pkg/vc/framework.go b/pkg/vc/framework.go index 507548c..5f42aa2 100644 --- a/pkg/vc/framework.go +++ b/pkg/vc/framework.go @@ -1,22 +1,22 @@ package vc import ( + "net/http" + "github.com/hyperledger/aries-framework-go/component/storageutil/mem" "github.com/hyperledger/aries-framework-go/pkg/doc/ld" "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" - "github.com/hyperledger/aries-framework-go/pkg/framework/aries/api/vdr" "github.com/hyperledger/aries-framework-go/pkg/framework/context" ldstore "github.com/hyperledger/aries-framework-go/pkg/store/ld" jsonld "github.com/piprate/json-gold/ld" - "net/http" ) type Framework struct { - loader *ld.DocumentLoader - resolver *verifiable.VDRKeyResolver + loader *ld.DocumentLoader + vdrKeyResolver *verifiable.VDRKeyResolver } -func NewFramework(vdr vdr.Registry) (*Framework, error) { +func NewFramework(vdrKeyResolver *verifiable.VDRKeyResolver) (*Framework, error) { storeProvider := mem.NewProvider() contextStore, err := ldstore.NewContextStore(storeProvider) if err != nil { @@ -44,10 +44,8 @@ func NewFramework(vdr vdr.Registry) (*Framework, error) { return nil, err } - resolver := verifiable.NewVDRKeyResolver(vdr) - return &Framework{ - loader: loader, - resolver: resolver, + loader: loader, + vdrKeyResolver: vdrKeyResolver, }, nil } diff --git a/pkg/vdr/panacea_vdr.go b/pkg/vdr/panacea_vdr.go index 3a90262..cb7b183 100644 --- a/pkg/vdr/panacea_vdr.go +++ b/pkg/vdr/panacea_vdr.go @@ -3,11 +3,15 @@ package vdr import ( "bytes" "context" + "crypto/elliptic" "errors" "fmt" + "github.com/btcsuite/btcd/btcec" "github.com/gogo/protobuf/jsonpb" "github.com/hyperledger/aries-framework-go/pkg/doc/did" + "github.com/hyperledger/aries-framework-go/pkg/doc/signature/verifier" + "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" "github.com/hyperledger/aries-framework-go/pkg/framework/aries/api/vdr" didtypes "github.com/medibloc/panacea-core/v2/x/did/types" ) @@ -64,3 +68,31 @@ func (r *PanaceaVDR) Deactivate(_ string, _ ...vdr.DIDMethodOption) error { func (r *PanaceaVDR) Close() error { return errors.New("not implemented") } + +type PanaceaVDRKeyResolver struct { + vdrKeyResolver *verifiable.VDRKeyResolver +} + +func NewPanaceaVDRKeyResolver(vdr *PanaceaVDR) *PanaceaVDRKeyResolver { + return &PanaceaVDRKeyResolver{ + vdrKeyResolver: verifiable.NewVDRKeyResolver(vdr), + } +} + +func (r *PanaceaVDRKeyResolver) PublicKeyFetcher() verifiable.PublicKeyFetcher { + return func(issuerID, keyID string) (*verifier.PublicKey, error) { + pubKey, err := r.vdrKeyResolver.PublicKeyFetcher()(issuerID, keyID) + if err != nil { + return nil, err + } + + if pubKey.Type == "Secp256k1VerificationKey2018" && pubKey.JWK == nil { + curve := btcec.S256() + x, y := elliptic.UnmarshalCompressed(curve, pubKey.Value) + if x != nil { // pubKey is compressed. so, convert it to uncompressed. + pubKey.Value = elliptic.Marshal(curve, x, y) + } // pubKey is uncompressed or invalid. so, do nothing + } + return pubKey, nil + } +}