Skip to content

Commit 0273b97

Browse files
committed
introduce typed signer deserializer
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 0ea8bf8 commit 0273b97

File tree

22 files changed

+188
-144
lines changed

22 files changed

+188
-144
lines changed

docs/core/extension/zkatdlog/nogh/v2/driver/base.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
idriver "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
2121
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemix"
2222
msp2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemix/crypto"
23+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
2324
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/membership"
2425
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/role"
2526
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/wallet"
@@ -67,7 +68,7 @@ func (d *base) newWalletService(
6768
) (*wallet.Service, error) {
6869
pp := publicParams.(*v2.PublicParams)
6970
roles := wallet.NewRoles()
70-
deserializerManager := deserializer.NewMultiplexDeserializer()
71+
deserializerManager := deserializer.NewTypedSignerDeserializerMultiplex()
7172
tmsID := tmsConfig.ID()
7273
identityDB, err := storageProvider.IdentityStore(tmsID)
7374
if err != nil {
@@ -83,6 +84,9 @@ func (d *base) newWalletService(
8384
return nil, errors.WithMessagef(err, "failed to create identity config")
8485
}
8586

87+
// interop deserializer
88+
deserializerManager.AddTypedSignerDeserializer(htlc.ScriptType, htlc.NewSenderSignerDeserializer(deserializerManager))
89+
8690
// Prepare roles
8791
roleFactory := role.NewFactory(
8892
logger,

token/core/common/authrorization.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (o *AuthorizationMultiplexer) Issued(ctx context.Context, issuer token.Iden
116116
}
117117

118118
// OwnerType returns the type of owner (e.g. 'idemix' or 'htlc') and the identity bytes
119-
func (o *AuthorizationMultiplexer) OwnerType(raw []byte) (string, []byte, error) {
119+
func (o *AuthorizationMultiplexer) OwnerType(raw []byte) (driver.IdentityType, []byte, error) {
120120
owner, err := identity.UnmarshalTypedIdentity(raw)
121121
if err != nil {
122122
return "", nil, err

token/core/fabtoken/v1/driver/base.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/config"
1818
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/deserializer"
1919
driver2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
20+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
2021
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/role"
2122
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/wallet"
2223
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/x509"
@@ -53,7 +54,7 @@ func (d *base) newWalletService(
5354
) (*wallet.Service, error) {
5455
tmsID := tmsConfig.ID()
5556

56-
deserializerManager := deserializer.NewMultiplexDeserializer()
57+
deserializerManager := deserializer.NewTypedSignerDeserializerMultiplex()
5758
identityDB, err := storageProvider.IdentityStore(tmsID)
5859
if err != nil {
5960
return nil, errors.Wrapf(err, "failed to open identity db for tms [%s]", tmsID)
@@ -68,6 +69,9 @@ func (d *base) newWalletService(
6869
return nil, errors.WithMessagef(err, "failed to create identity config")
6970
}
7071

72+
// interop deserializer
73+
deserializerManager.AddTypedSignerDeserializer(htlc.ScriptType, htlc.NewSenderSignerDeserializer(deserializerManager))
74+
7175
// Prepare roles
7276
keyStore := x509.NewKeyStore(baseKeyStore)
7377
roleFactory := role.NewFactory(

token/core/zkatdlog/nogh/v1/driver/base.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
idriver "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
2121
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemix"
2222
msp2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemix/crypto"
23+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
2324
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/membership"
2425
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/role"
2526
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/wallet"
@@ -67,7 +68,7 @@ func (d *base) newWalletService(
6768
) (*wallet.Service, error) {
6869
pp := publicParams.(*v1.PublicParams)
6970
roles := wallet.NewRoles()
70-
deserializerManager := deserializer.NewMultiplexDeserializer()
71+
deserializerManager := deserializer.NewTypedSignerDeserializerMultiplex()
7172
tmsID := tmsConfig.ID()
7273
identityDB, err := storageProvider.IdentityStore(tmsID)
7374
if err != nil {
@@ -83,6 +84,9 @@ func (d *base) newWalletService(
8384
return nil, errors.WithMessagef(err, "failed to create identity config")
8485
}
8586

87+
// interop deserializer
88+
deserializerManager.AddTypedSignerDeserializer(htlc.ScriptType, htlc.NewSenderSignerDeserializer(deserializerManager))
89+
8690
// Prepare roles
8791
roleFactory := role.NewFactory(
8892
logger,

token/driver/wallet.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ type IdentityConfiguration struct {
133133
// Ultimately, it is the token driver to decide which types are allowed.
134134
type WalletLookupID = any
135135

136+
// IdentityType identifies the type of identity
137+
type IdentityType = string
138+
136139
// Authorization defines method to check the relation between a token
137140
// and wallets (owner, auditor, etc.)
138141
type Authorization interface {
@@ -148,7 +151,7 @@ type Authorization interface {
148151
// Issued returns true if the passed issuer issued the passed token
149152
Issued(ctx context.Context, issuer Identity, tok *token.Token) bool
150153
// OwnerType returns the type of owner (e.g. 'idemix' or 'htlc') and the identity bytes
151-
OwnerType(raw []byte) (string, []byte, error)
154+
OwnerType(raw []byte) (IdentityType, []byte, error)
152155
}
153156

154157
//go:generate counterfeiter -o mock/ws.go -fake-name WalletService . WalletService
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package deserializer
8+
9+
import (
10+
"context"
11+
12+
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
13+
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
14+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
15+
)
16+
17+
type TypedAuditInfoMatcher struct {
18+
matcher driver.Matcher
19+
}
20+
21+
func (t *TypedAuditInfoMatcher) Match(ctx context.Context, id []byte) error {
22+
// match identity and audit info
23+
recipient, err := identity.UnmarshalTypedIdentity(id)
24+
if err != nil {
25+
return errors.Wrapf(err, "failed to unmarshal identity [%s]", id)
26+
}
27+
err = t.matcher.Match(ctx, recipient.Identity)
28+
if err != nil {
29+
return errors.Wrapf(err, "failed to match identity [%s] to audit infor", id)
30+
}
31+
return nil
32+
}
File renamed without changes.

token/services/identity/deserializer/multiplexer.go

Lines changed: 0 additions & 78 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package deserializer
8+
9+
import (
10+
"context"
11+
errors2 "errors"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
14+
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
15+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
16+
driver2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
17+
)
18+
19+
type TypedSignerDeserializer = driver2.TypedSignerDeserializer
20+
21+
type TypedSignerDeserializerMultiplex struct {
22+
deserializers map[string][]TypedSignerDeserializer
23+
}
24+
25+
func NewTypedSignerDeserializerMultiplex() *TypedSignerDeserializerMultiplex {
26+
return &TypedSignerDeserializerMultiplex{deserializers: map[string][]TypedSignerDeserializer{}}
27+
}
28+
29+
func (v *TypedSignerDeserializerMultiplex) AddTypedSignerDeserializer(typ driver2.IdentityType, d driver2.TypedSignerDeserializer) {
30+
_, ok := v.deserializers[typ]
31+
if !ok {
32+
v.deserializers[typ] = []TypedSignerDeserializer{d}
33+
return
34+
}
35+
v.deserializers[typ] = append(v.deserializers[typ], d)
36+
}
37+
38+
func (v *TypedSignerDeserializerMultiplex) DeserializeSigner(ctx context.Context, id []byte) (driver.Signer, error) {
39+
si, err := identity.UnmarshalTypedIdentity(id)
40+
if err != nil {
41+
return nil, errors.Wrap(err, "failed to unmarshal to TypedIdentity")
42+
}
43+
dess, ok := v.deserializers[si.Type]
44+
if !ok {
45+
return nil, errors.Errorf("no deserializer found for [%s]", si.Type)
46+
}
47+
logger.DebugfContext(ctx, "deserializing [%s] with type [%s]", id, si.Type)
48+
var errs []error
49+
for _, deserializer := range dess {
50+
verifier, err := deserializer.DeserializeSigner(ctx, si.Type, si.Identity)
51+
if err != nil {
52+
errs = append(errs, err)
53+
continue
54+
}
55+
return verifier, nil
56+
}
57+
return nil, errors.Wrapf(errors2.Join(errs...), "failed to deserialize verifier for [%s]", si.Type)
58+
}

token/services/identity/deserializer/typed.go renamed to token/services/identity/deserializer/verifier.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ type TypedVerifierDeserializer interface {
2727
GetAuditInfoMatcher(ctx context.Context, owner driver.Identity, auditInfo []byte) (driver.Matcher, error)
2828
}
2929

30-
// AuditMatcherDeserializer deserializes raw bytes into a matcher, which allows an auditor to match an identity to an enrollment ID
31-
type AuditMatcherDeserializer interface {
32-
GetAuditInfoMatcher(ctx context.Context, owner driver.Identity, auditInfo []byte) (driver.Matcher, error)
33-
}
34-
3530
type TypedVerifierDeserializerMultiplex struct {
3631
deserializers map[string][]TypedVerifierDeserializer
3732
}
@@ -196,20 +191,3 @@ func (t *TypedIdentityVerifierDeserializer) GetAuditInfo(ctx context.Context, id
196191
func (t *TypedIdentityVerifierDeserializer) GetAuditInfoMatcher(ctx context.Context, owner driver.Identity, auditInfo []byte) (driver.Matcher, error) {
197192
return t.MatcherDeserializer.GetAuditInfoMatcher(ctx, owner, auditInfo)
198193
}
199-
200-
type TypedAuditInfoMatcher struct {
201-
matcher driver.Matcher
202-
}
203-
204-
func (t *TypedAuditInfoMatcher) Match(ctx context.Context, id []byte) error {
205-
// match identity and audit info
206-
recipient, err := identity.UnmarshalTypedIdentity(id)
207-
if err != nil {
208-
return errors.Wrapf(err, "failed to unmarshal identity [%s]", id)
209-
}
210-
err = t.matcher.Match(ctx, recipient.Identity)
211-
if err != nil {
212-
return errors.Wrapf(err, "failed to match identity [%s] to audit infor", id)
213-
}
214-
return nil
215-
}

0 commit comments

Comments
 (0)