Skip to content

Commit db4b243

Browse files
authored
New structs for pseudonym system keys (xlab-si#75)
This commit adds definitions of PubKey, PubKeyEC and SecKey, which correspond to public keys for both implementations of pseudonym system scheme, and their secret keys, which are of the same type for both implementations. It replaces old OrgPubKeysEC and OrgPubKeys structs with newly introduced ones. Moreover, functions and structs that did not accept key parameters as structs were updated. Changes are propagated to all the affected packages. Signed-off-by: Manca Bizjak <[email protected]>
1 parent 67816d2 commit db4b243

21 files changed

+126
-150
lines changed

client/compatibility/doc.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@
6565
// Credential
6666
// CredentialEC
6767
// ECGroupElement
68-
// OrgPubKeys
69-
// OrgPubKeysEC
68+
// PubKey
69+
// PubKeyEC
7070
// Transcript
7171
// TranscriptEC
7272
// Pseudonym

client/compatibility/pseudonymsys.go

+12-13
Original file line numberDiff line numberDiff line change
@@ -72,30 +72,29 @@ func (c *Credential) getNativeType() (*pseudonymsys.Credential, error) {
7272
return cred, nil
7373
}
7474

75-
// OrgPubKeys represents an equivalent of pseudonymsys.OrgPubKeys, but has string
75+
// PubKey represents an equivalent of pseudonymsys.PubKey, but has string
7676
// field types to overcome type restrictions of Go language binding tools.
77-
type OrgPubKeys struct {
77+
type PubKey struct {
7878
H1 string
7979
H2 string
8080
}
8181

82-
func NewOrgPubKeys(h1, h2 string) *OrgPubKeys {
83-
return &OrgPubKeys{
82+
func NewPubKey(h1, h2 string) *PubKey {
83+
return &PubKey{
8484
H1: h1,
8585
H2: h2,
8686
}
8787
}
8888

89-
// getNativeType translates compatibility OrgPubKeys to emmy's native pseudonymsys.OrgPubKeys.
90-
func (k *OrgPubKeys) getNativeType() (*pseudonymsys.OrgPubKeys, error) {
89+
// getNativeType translates compatibility PubKey to emmy's native pseudonymsys.PubKey.
90+
func (k *PubKey) getNativeType() (*pseudonymsys.PubKey, error) {
9191
h1, h1Ok := new(big.Int).SetString(k.H1, 10)
9292
h2, h2Ok := new(big.Int).SetString(k.H2, 10)
9393
if !h1Ok || !h2Ok {
94-
return nil, fmt.Errorf("pubKeys.h1 or pubKeys.h2: %s", ArgsConversionError)
94+
return nil, fmt.Errorf("pubKey.h1 or pubKey.h2: %s", ArgsConversionError)
9595
}
9696

97-
orgPubKeys := pseudonymsys.NewOrgPubKeys(h1, h2)
98-
return orgPubKeys, nil
97+
return pseudonymsys.NewPubKey(h1, h2), nil
9998
}
10099

101100
// Transcript represents an equivalent of dlogproofs.Transcript, but has string
@@ -187,7 +186,7 @@ func (c *PseudonymsysClient) GenerateNym(userSecret string,
187186
}
188187

189188
func (c *PseudonymsysClient) ObtainCredential(userSecret string,
190-
nym *Pseudonym, pubKeys *OrgPubKeys) (*Credential, error) {
189+
nym *Pseudonym, publicKey *PubKey) (*Credential, error) {
191190
// Translate secret
192191
secret, secretOk := new(big.Int).SetString(userSecret, 10)
193192
if !secretOk {
@@ -200,14 +199,14 @@ func (c *PseudonymsysClient) ObtainCredential(userSecret string,
200199
return nil, err
201200
}
202201

203-
// Translate OrgPubKeys
204-
orgPubKeys, err := pubKeys.getNativeType()
202+
// Translate PubKey
203+
pubKey, err := publicKey.getNativeType()
205204
if err != nil {
206205
return nil, err
207206
}
208207

209208
// Call PseudonymsysClient client with translated parameters
210-
credential, err := c.PseudonymsysClient.ObtainCredential(secret, pseudonym, orgPubKeys)
209+
credential, err := c.PseudonymsysClient.ObtainCredential(secret, pseudonym, pubKey)
211210
if err != nil {
212211
return nil, err
213212
}

client/compatibility/pseudonymsys_ec.go

+13-14
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,32 @@ import (
2828
"github.com/xlab-si/emmy/crypto/zkp/schemes/pseudonymsys"
2929
)
3030

31-
// OrgPubKeysEC represents an equivalent of pseudonymsys.OrgPubKeysEC,
31+
// PubKeyEC represents an equivalent of pseudonymsys.PubKeyEC,
3232
// but has field types compatible with Go language binding tools.
33-
type OrgPubKeysEC struct {
33+
type PubKeyEC struct {
3434
H1 *ECGroupElement
3535
H2 *ECGroupElement
3636
}
3737

38-
func NewOrgPubKeysEC(h1, h2 *ECGroupElement) *OrgPubKeysEC {
39-
return &OrgPubKeysEC{
38+
func NewPubKeyEC(h1, h2 *ECGroupElement) *PubKeyEC {
39+
return &PubKeyEC{
4040
H1: h1,
4141
H2: h2,
4242
}
4343
}
4444

45-
// getNativeType translates compatibility OrgPubKeysEC to emmy's native pseudonymsys.OrgPubKeysEC.
46-
func (k *OrgPubKeysEC) getNativeType() (*pseudonymsys.OrgPubKeysEC, error) {
45+
// getNativeType translates compatibility PubKeyEC to emmy's native pseudonymsys.PubKeyEC.
46+
func (k *PubKeyEC) getNativeType() (*pseudonymsys.PubKeyEC, error) {
4747
h1, err := k.H1.getNativeType()
4848
if err != nil {
49-
return nil, fmt.Errorf("pubKeys.H1: %s", err)
49+
return nil, fmt.Errorf("pubKey.H1: %s", err)
5050
}
5151
h2, err := k.H2.getNativeType()
5252
if err != nil {
53-
return nil, fmt.Errorf("pubKeys.H2: %s", err)
53+
return nil, fmt.Errorf("pubKey.H2: %s", err)
5454
}
5555

56-
orgPubKeys := pseudonymsys.NewOrgPubKeysEC(h1, h2)
57-
return orgPubKeys, nil
56+
return pseudonymsys.NewPubKeyEC(h1, h2), nil
5857
}
5958

6059
// TranscriptEC represents an equivalent of dlogproofs.TranscriptEC, but has string
@@ -204,7 +203,7 @@ func (c *PseudonymsysClientEC) GenerateNym(userSecret string,
204203
}
205204

206205
func (c *PseudonymsysClientEC) ObtainCredential(userSecret string,
207-
nym *PseudonymEC, pubKeys *OrgPubKeysEC) (*CredentialEC, error) {
206+
nym *PseudonymEC, publicKey *PubKeyEC) (*CredentialEC, error) {
208207
// Translate secret
209208
secret, secretOk := new(big.Int).SetString(userSecret, 10)
210209
if !secretOk {
@@ -217,14 +216,14 @@ func (c *PseudonymsysClientEC) ObtainCredential(userSecret string,
217216
return nil, err
218217
}
219218

220-
// Translate OrgPubKeysEC
221-
orgPubKeys, err := pubKeys.getNativeType()
219+
// Translate PubKeyEC
220+
pubKey, err := publicKey.getNativeType()
222221
if err != nil {
223222
return nil, err
224223
}
225224

226225
// Call PseudonymsysClientEC client with translated parameters
227-
credential, err := c.PseudonymsysClientEC.ObtainCredential(secret, pseudonym, orgPubKeys)
226+
credential, err := c.PseudonymsysClientEC.ObtainCredential(secret, pseudonym, pubKey)
228227
if err != nil {
229228
return nil, err
230229
}

client/pseudonymsys.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (c *PseudonymsysClient) GenerateNym(userSecret *big.Int,
129129

130130
// ObtainCredential returns anonymous credential.
131131
func (c *PseudonymsysClient) ObtainCredential(userSecret *big.Int,
132-
nym *pseudonymsys.Pseudonym, orgPubKeys *pseudonymsys.OrgPubKeys) (
132+
nym *pseudonymsys.Pseudonym, orgPubKeys *pseudonymsys.PubKey) (
133133
*pseudonymsys.Credential, error) {
134134
if err := c.openStream(c.grpcClient, "ObtainCredential"); err != nil {
135135
return nil, err

client/pseudonymsys_ec.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func (c *PseudonymsysClientEC) GenerateNym(userSecret *big.Int,
139139

140140
// ObtainCredential returns anonymous credential.
141141
func (c *PseudonymsysClientEC) ObtainCredential(userSecret *big.Int,
142-
nym *pseudonymsys.PseudonymEC, orgPubKeys *pseudonymsys.OrgPubKeysEC) (
142+
nym *pseudonymsys.PseudonymEC, orgPubKeys *pseudonymsys.PubKeyEC) (
143143
*pseudonymsys.CredentialEC, error) {
144144
if err := c.openStream(c.grpcClient, "ObtainCredential_EC"); err != nil {
145145
return nil, err

client/pseudonymsys_ec_test.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/stretchr/testify/assert"
2525
"github.com/xlab-si/emmy/config"
2626
"github.com/xlab-si/emmy/crypto/groups"
27-
"github.com/xlab-si/emmy/crypto/zkp/schemes/pseudonymsys"
2827
)
2928

3029
func TestPseudonymsysEC(t *testing.T) {
@@ -63,10 +62,7 @@ func TestPseudonymsysEC(t *testing.T) {
6362
assert.NotNil(t, err, "Should produce an error")
6463

6564
orgName := "org1"
66-
h1X, h1Y, h2X, h2Y := config.LoadPseudonymsysOrgPubKeysEC(orgName)
67-
h1 := groups.NewECGroupElement(h1X, h1Y)
68-
h2 := groups.NewECGroupElement(h2X, h2Y)
69-
orgPubKeys := pseudonymsys.NewOrgPubKeysEC(h1, h2)
65+
orgPubKeys := config.LoadPseudonymsysOrgPubKeysEC(orgName)
7066
credential, err := c1.ObtainCredential(userSecret, nym1, orgPubKeys)
7167
if err != nil {
7268
t.Errorf(err.Error())

client/pseudonymsys_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424

2525
"github.com/stretchr/testify/assert"
2626
"github.com/xlab-si/emmy/config"
27-
"github.com/xlab-si/emmy/crypto/zkp/schemes/pseudonymsys"
2827
"github.com/xlab-si/emmy/server"
2928
)
3029

@@ -38,7 +37,7 @@ func TestPseudonymsys(t *testing.T) {
3837
}
3938

4039
// usually the endpoint is different from the one used for CA:
41-
c1, err := NewPseudonymsysClient(testGrpcClientConn, group)
40+
c1, err := NewPseudonymsysClient(testGrpcClientConn, group)
4241
userSecret := c1.GenerateMasterKey()
4342

4443
masterNym := caClient.GenerateMasterNym(userSecret)
@@ -66,8 +65,7 @@ func TestPseudonymsys(t *testing.T) {
6665
assert.NotNil(t, err, "Should produce an error")
6766

6867
orgName := "org1"
69-
h1, h2 := config.LoadPseudonymsysOrgPubKeys(orgName)
70-
orgPubKeys := pseudonymsys.NewOrgPubKeys(h1, h2)
68+
orgPubKeys := config.LoadPseudonymsysOrgPubKeys(orgName)
7169
credential, err := c1.ObtainCredential(userSecret, nym1, orgPubKeys)
7270
if err != nil {
7371
t.Errorf(err.Error())

config/config.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
"github.com/spf13/viper"
2828
"github.com/xlab-si/emmy/crypto/groups"
29+
"github.com/xlab-si/emmy/crypto/zkp/schemes/pseudonymsys"
2930
)
3031

3132
// init loads the default config file
@@ -138,27 +139,30 @@ func LoadQRRSA() *groups.QRRSA {
138139
return qr
139140
}
140141

141-
func LoadPseudonymsysOrgSecrets(orgName, dlogType string) (*big.Int, *big.Int) {
142+
func LoadPseudonymsysOrgSecrets(orgName, dlogType string) *pseudonymsys.SecKey {
142143
org := viper.GetStringMap(fmt.Sprintf("pseudonymsys.%s.%s", orgName, dlogType))
143144
s1, _ := new(big.Int).SetString(org["s1"].(string), 10)
144145
s2, _ := new(big.Int).SetString(org["s2"].(string), 10)
145-
return s1, s2
146+
return pseudonymsys.NewSecKey(s1, s2)
146147
}
147148

148-
func LoadPseudonymsysOrgPubKeys(orgName string) (*big.Int, *big.Int) {
149+
func LoadPseudonymsysOrgPubKeys(orgName string) *pseudonymsys.PubKey {
149150
org := viper.GetStringMap(fmt.Sprintf("pseudonymsys.%s.%s", orgName, "dlog"))
150151
h1, _ := new(big.Int).SetString(org["h1"].(string), 10)
151152
h2, _ := new(big.Int).SetString(org["h2"].(string), 10)
152-
return h1, h2
153+
return pseudonymsys.NewPubKey(h1, h2)
153154
}
154155

155-
func LoadPseudonymsysOrgPubKeysEC(orgName string) (*big.Int, *big.Int, *big.Int, *big.Int) {
156+
func LoadPseudonymsysOrgPubKeysEC(orgName string) *pseudonymsys.PubKeyEC {
156157
org := viper.GetStringMap(fmt.Sprintf("pseudonymsys.%s.%s", orgName, "ecdlog"))
157158
h1X, _ := new(big.Int).SetString(org["h1x"].(string), 10)
158159
h1Y, _ := new(big.Int).SetString(org["h1y"].(string), 10)
159160
h2X, _ := new(big.Int).SetString(org["h2x"].(string), 10)
160161
h2Y, _ := new(big.Int).SetString(org["h2y"].(string), 10)
161-
return h1X, h1Y, h2X, h2Y
162+
return pseudonymsys.NewPubKeyEC(
163+
groups.NewECGroupElement(h1X, h1Y),
164+
groups.NewECGroupElement(h2X, h2Y),
165+
)
162166
}
163167

164168
func LoadPseudonymsysCASecret() *big.Int {
@@ -167,11 +171,11 @@ func LoadPseudonymsysCASecret() *big.Int {
167171
return s
168172
}
169173

170-
func LoadPseudonymsysCAPubKey() (*big.Int, *big.Int) {
174+
func LoadPseudonymsysCAPubKey() *pseudonymsys.PubKey {
171175
ca := viper.GetStringMap("pseudonymsys.ca")
172176
x, _ := new(big.Int).SetString(ca["x"].(string), 10)
173177
y, _ := new(big.Int).SetString(ca["y1"].(string), 10)
174-
return x, y
178+
return pseudonymsys.NewPubKey(x, y)
175179
}
176180

177181
func LoadServiceInfo() (string, string, string) {

crypto/zkp/schemes/pseudonymsys/ca.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ func NewCACertificate(blindedA, blindedB, r, s *big.Int) *CACertificate {
5252
}
5353
}
5454

55-
func NewCA(group *groups.SchnorrGroup, d, x, y *big.Int) *CA {
55+
func NewCA(group *groups.SchnorrGroup, d *big.Int, caPubKey *PubKey) *CA {
5656
c := groups.GetEllipticCurve(groups.P256)
57-
pubKey := ecdsa.PublicKey{Curve: c, X: x, Y: y}
57+
pubKey := ecdsa.PublicKey{Curve: c, X: caPubKey.H1, Y: caPubKey.H2}
5858
privateKey := ecdsa.PrivateKey{PublicKey: pubKey, D: d}
5959

6060
schnorrVerifier := dlogproofs.NewSchnorrVerifier(group, protocoltypes.Sigma)

crypto/zkp/schemes/pseudonymsys/ca_ec.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ func NewCACertificateEC(blindedA, blindedB *groups.ECGroupElement, r, s *big.Int
5353
}
5454
}
5555

56-
func NewCAEC(d, x, y *big.Int, curveType groups.ECurve) *CAEC {
56+
func NewCAEC(d *big.Int, caPubKey *PubKey, curveType groups.ECurve) *CAEC {
5757
c := groups.GetEllipticCurve(curveType)
58-
pubKey := ecdsa.PublicKey{Curve: c, X: x, Y: y}
58+
pubKey := ecdsa.PublicKey{Curve: c, X: caPubKey.H1, Y: caPubKey.H2}
5959
privateKey := ecdsa.PrivateKey{PublicKey: pubKey, D: d}
6060

6161
schnorrVerifier := dlogproofs.NewSchnorrECVerifier(curveType, protocoltypes.Sigma)

crypto/zkp/schemes/pseudonymsys/keygen.go

+28-7
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,48 @@ import (
2424
"github.com/xlab-si/emmy/crypto/groups"
2525
)
2626

27+
type SecKey struct {
28+
S1, S2 *big.Int
29+
}
30+
31+
func NewSecKey(s1, s2 *big.Int) *SecKey {
32+
return &SecKey{s1, s2}
33+
}
34+
35+
type PubKey struct {
36+
H1, H2 *big.Int
37+
}
38+
39+
func NewPubKey(h1, h2 *big.Int) *PubKey {
40+
return &PubKey{h1, h2}
41+
}
42+
43+
type PubKeyEC struct {
44+
H1, H2 *groups.ECGroupElement
45+
}
46+
47+
func NewPubKeyEC(h1, h2 *groups.ECGroupElement) *PubKeyEC {
48+
return &PubKeyEC{h1, h2}
49+
}
50+
2751
// GenerateKeyPair takes a schnorr group and constructs a pair of secret and public key for
2852
// pseudonym system scheme.
29-
// TODO return (SecKey, PubKey) instead
30-
func GenerateKeyPair(group *groups.SchnorrGroup) (*big.Int, *big.Int, *big.Int, *big.Int) {
53+
func GenerateKeyPair(group *groups.SchnorrGroup) (*SecKey, *PubKey) {
3154
s1 := common.GetRandomInt(group.Q)
3255
s2 := common.GetRandomInt(group.Q)
3356
h1 := group.Exp(group.G, s1)
3457
h2 := group.Exp(group.G, s2)
3558

36-
return s1, s2, h1, h2
59+
return NewSecKey(s1, s2), NewPubKey(h1, h2)
3760
}
3861

3962
// GenerateECKeyPair takes EC group and constructs a public key for pseudonym system scheme in EC
4063
// arithmetic.
41-
// TODO return (SecKey, PubKeyEC) instead
42-
func GenerateECKeyPair(group *groups.ECGroup) (*big.Int, *big.Int, *groups.ECGroupElement,
43-
*groups.ECGroupElement) {
64+
func GenerateECKeyPair(group *groups.ECGroup) (*SecKey, *PubKeyEC) {
4465
s1 := common.GetRandomInt(group.Q)
4566
s2 := common.GetRandomInt(group.Q)
4667
h1 := group.ExpBaseG(s1)
4768
h2 := group.ExpBaseG(s2)
4869

49-
return s1, s2, h1, h2
70+
return NewSecKey(s1, s2), NewPubKeyEC(h1, h2)
5071
}

0 commit comments

Comments
 (0)