Skip to main content

Configure a cyclic group

In order to perform any Pedersen operations (like splitting a secret, combining a secret or verifying a secret part or every secret parts), a cyclic group GqG_q must be generated. In particular given two large primes pp and qq such that qq divides p1p-1, GqG_q is the unique subgroup of Zq\mathbb{Z}^*_q of order qq. Let gg and hh be two generators of GqG_q.

The cyclic group GqG_q can be instantiated in two ways.

Generate a new group

In this case a fresh cyclic group is generated at random by using the function pedersen.NewSchnorrGroup():

import (
"github.com/matteoarella/pedersen"
)

groupSize := 1024

group, err := pedersen.NewSchnorrGroup(groupSize)
if err != nil {
panic(err)
}

Use a previously generated group

For reconstructing a secret or validating the secret parts the same group that has been adopted for splitting the secret must be used. In this case you cannot use the pedersen.NewSchnorrGroup() function otherwise a fresh group is generated.

The pedersen.Group object must be instantiated by specifying the pp, qq, gg and hh parameters as follows:

import (
"github.com/matteoarella/pedersen"
"github.com/matteoarella/pedersen/big"
)

p, err := big.NewInt()
// check err
q, err := big.NewInt()
// check err
g, err := big.NewInt()
// check err
h, err := big.NewInt()
// check err

err = p.SetDecString("17634709279010524619")
// check err
err = q.SetDecString("8817354639505262309")
// check err
err = g.SetDecString("8414335786771157015")
// check err
err = h.SetDecString("15078279289296123424")
// check err

group := pedersen.Group{
P: p, // prime p
Q: q, // prime q
G: g, // first generator g
H: h, // second generator h
}

Use a group

The group object created with one of the two methods depicted above can be used for instantiating a pedersen.Pedersen object as follows:

schemeParts := 5
schemeThreshold := 3

p, err := pedersen.NewPedersen(schemeParts, schemeThreshold, pedersen.CyclicGroup(group))
if err != nil {
panic(err)
}