Skip to content

Commit 4b6f290

Browse files
committed
[FAB-9694] Idemix Nym Key Deriver
This change-set does the following: - implement the idemix nym key deriver - testsi Change-Id: I3fee92246a7454473ed977f6d2479e6729e2e50c Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 20aa221 commit 4b6f290

File tree

7 files changed

+507
-6
lines changed

7 files changed

+507
-6
lines changed

bccsp/idemix/idemix.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,17 @@ type Big interface {
3434
Bytes() ([]byte, error)
3535
}
3636

37+
// Ecp represents an elliptic curve point
38+
type Ecp interface {
39+
// Bytes returns the byte representation of this key
40+
Bytes() ([]byte, error)
41+
}
42+
3743
// User is a local interface to decouple from the idemix implementation
3844
type User interface {
3945
// NewKey generates a new User secret key
4046
NewKey() (Big, error)
47+
48+
// MakeNym creates a new unlinkable pseudonym
49+
MakeNym(sk Big, key IssuerPublicKey) (Ecp, Big, error)
4150
}

bccsp/idemix/idemix_suite_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
//go:generate counterfeiter -o mock/issuer_public_key.go -fake-name IssuerPublicKey . IssuerPublicKey
1818
//go:generate counterfeiter -o mock/user.go -fake-name User . User
1919
//go:generate counterfeiter -o mock/big.go -fake-name Big . Big
20+
//go:generate counterfeiter -o mock/ecp.go -fake-name Ecp . Ecp
2021

2122
func TestPlain(t *testing.T) {
2223
RegisterFailHandler(Fail)

bccsp/idemix/issuer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ type issuerPublicKey struct {
6060
pk IssuerPublicKey
6161
}
6262

63+
func NewIssuerPublicKey(pk IssuerPublicKey) *issuerPublicKey {
64+
return &issuerPublicKey{pk}
65+
}
66+
6367
func (k *issuerPublicKey) Bytes() ([]byte, error) {
6468
return k.pk.Bytes()
6569
}

bccsp/idemix/mock/ecp.go

Lines changed: 93 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bccsp/idemix/mock/user.go

Lines changed: 73 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bccsp/idemix/nym.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package idemix
7+
8+
import (
9+
"crypto/sha256"
10+
11+
"github.com/hyperledger/fabric/bccsp"
12+
"github.com/pkg/errors"
13+
)
14+
15+
// nymSecretKey contains the nym secret key
16+
type nymSecretKey struct {
17+
// SKI of this key
18+
ski []byte
19+
// sk is the idemix reference to the nym secret
20+
sk Big
21+
// pk is the idemix reference to the nym public part
22+
pk Ecp
23+
// exportable if true, sk can be exported via the Bytes function
24+
exportable bool
25+
}
26+
27+
func computeSKI(serialise func() ([]byte, error)) ([]byte, error) {
28+
raw, err := serialise()
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
hash := sha256.New()
34+
hash.Write(raw)
35+
return hash.Sum(nil), nil
36+
37+
}
38+
39+
func NewNymSecretKey(sk Big, pk Ecp, exportable bool) (*nymSecretKey, error) {
40+
ski, err := computeSKI(sk.Bytes)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return &nymSecretKey{ski: ski, sk: sk, pk: pk, exportable: exportable}, nil
46+
}
47+
48+
func (k *nymSecretKey) Bytes() ([]byte, error) {
49+
if k.exportable {
50+
return k.sk.Bytes()
51+
}
52+
53+
return nil, errors.New("not supported")
54+
}
55+
56+
func (k *nymSecretKey) SKI() []byte {
57+
c := make([]byte, len(k.ski))
58+
copy(c, k.ski)
59+
return c
60+
}
61+
62+
func (*nymSecretKey) Symmetric() bool {
63+
return false
64+
}
65+
66+
func (*nymSecretKey) Private() bool {
67+
return true
68+
}
69+
70+
func (k *nymSecretKey) PublicKey() (bccsp.Key, error) {
71+
ski, err := computeSKI(k.pk.Bytes)
72+
if err != nil {
73+
return nil, err
74+
}
75+
return &nymPublicKey{ski: ski, pk: k.pk}, nil
76+
}
77+
78+
type nymPublicKey struct {
79+
// SKI of this key
80+
ski []byte
81+
// pk is the idemix reference to the nym public part
82+
pk Ecp
83+
}
84+
85+
func (k *nymPublicKey) Bytes() ([]byte, error) {
86+
return k.pk.Bytes()
87+
}
88+
89+
func (k *nymPublicKey) SKI() []byte {
90+
c := make([]byte, len(k.ski))
91+
copy(c, k.ski)
92+
return c
93+
}
94+
95+
func (*nymPublicKey) Symmetric() bool {
96+
return false
97+
}
98+
99+
func (*nymPublicKey) Private() bool {
100+
return false
101+
}
102+
103+
func (k *nymPublicKey) PublicKey() (bccsp.Key, error) {
104+
return k, nil
105+
}
106+
107+
// NymKeyDerivation derives nyms
108+
type NymKeyDerivation struct {
109+
// Exportable is a flag to allow an issuer secret key to be marked as Exportable.
110+
// If a secret key is marked as Exportable, its Bytes method will return the key's byte representation.
111+
Exportable bool
112+
// User implements the underlying cryptographic algorithms
113+
User User
114+
}
115+
116+
func (kd *NymKeyDerivation) KeyDeriv(k bccsp.Key, opts bccsp.KeyDerivOpts) (dk bccsp.Key, err error) {
117+
userSecretKey, ok := k.(*userSecretKey)
118+
if !ok {
119+
return nil, errors.New("invalid key, expected *userSecretKey")
120+
}
121+
nymKeyDerivationOpts, ok := opts.(*bccsp.IdemixNymKeyDerivationOpts)
122+
if !ok {
123+
return nil, errors.New("invalid options, expected *IdemixNymKeyDerivationOpts")
124+
}
125+
if nymKeyDerivationOpts.IssuerPK == nil {
126+
return nil, errors.New("invalid options, missing issuer public key")
127+
}
128+
issuerPK, ok := nymKeyDerivationOpts.IssuerPK.(*issuerPublicKey)
129+
if !ok {
130+
return nil, errors.New("invalid options, expected IssuerPK as *issuerPublicKey")
131+
}
132+
133+
Nym, RandNym, err := kd.User.MakeNym(userSecretKey.sk, issuerPK.pk)
134+
if err != nil {
135+
return nil, err
136+
}
137+
138+
return NewNymSecretKey(RandNym, Nym, kd.Exportable)
139+
}

0 commit comments

Comments
 (0)