Skip to content

Commit 4de3374

Browse files
authored
Use the group-specific scalar type when hashing in BDN (#553)
Previously, `hashPointToR` would always use `mod.Int` but that only works with the Kilic backend. This change makes the BDN scheme work with all backends.
1 parent 0ba2750 commit 4de3374

File tree

4 files changed

+25
-30
lines changed

4 files changed

+25
-30
lines changed

sign/bdn/bdn.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,20 @@ import (
1313
"crypto/cipher"
1414
"errors"
1515
"fmt"
16-
"math/big"
16+
"slices"
1717

1818
"go.dedis.ch/kyber/v4"
19-
"go.dedis.ch/kyber/v4/group/mod"
2019
"go.dedis.ch/kyber/v4/pairing"
2120
"go.dedis.ch/kyber/v4/sign"
2221
"go.dedis.ch/kyber/v4/sign/bls"
2322
"golang.org/x/crypto/blake2s"
2423
)
2524

26-
// modulus128 can be provided to the big integer implementation to create numbers
27-
// over 128 bits
28-
var modulus128 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 128), big.NewInt(1))
29-
3025
// For the choice of H, we're mostly worried about the second preimage attack. In
3126
// other words, find m' where H(m) == H(m')
3227
// We also use the entire roster so that the coefficient will vary for the same
3328
// public key used in different roster
34-
func hashPointToR(pubs []kyber.Point) ([]kyber.Scalar, error) {
29+
func hashPointToR(group kyber.Group, pubs []kyber.Point) ([]kyber.Scalar, error) {
3530
h, err := blake2s.NewXOF(blake2s.OutputLengthUnknown, nil)
3631
if err != nil {
3732
return nil, err
@@ -55,7 +50,13 @@ func hashPointToR(pubs []kyber.Point) ([]kyber.Scalar, error) {
5550

5651
coefs := make([]kyber.Scalar, len(pubs))
5752
for i := range coefs {
58-
coefs[i] = mod.NewIntBytes(out[i*16:(i+1)*16], modulus128, kyber.LittleEndian)
53+
scalar := group.Scalar()
54+
bytes := out[i*16 : (i+1)*16]
55+
if scalar.ByteOrder() != kyber.LittleEndian {
56+
slices.Reverse(bytes)
57+
}
58+
scalar.SetBytes(bytes)
59+
coefs[i] = scalar
5960
}
6061

6162
return coefs, nil

sign/bdn/bdn_test.go

+8-14
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ func TestBDN_HashPointToR_BN256(t *testing.T) {
2424
p2 := suite.Point().Mul(two, suite.Point().Base())
2525
p3 := suite.Point().Mul(three, suite.Point().Base())
2626

27-
coefs, err := hashPointToR([]kyber.Point{p1, p2, p3})
27+
coefs, err := hashPointToR(suite, []kyber.Point{p1, p2, p3})
2828

2929
require.NoError(t, err)
3030
require.Equal(t, "35b5b395f58aba3b192fb7e1e5f2abd3", coefs[0].String())
3131
require.Equal(t, "14dcc79d46b09b93075266e47cd4b19e", coefs[1].String())
3232
require.Equal(t, "933f6013eb3f654f9489d6d45ad04eaf", coefs[2].String())
33-
require.Equal(t, 16, coefs[0].MarshalSize())
3433

35-
mask, _ := NewMask([]kyber.Point{p1, p2, p3}, nil)
34+
mask, _ := NewMask(suite, []kyber.Point{p1, p2, p3}, nil)
3635
mask.SetBit(0, true)
3736
mask.SetBit(1, true)
3837
mask.SetBit(2, true)
@@ -48,15 +47,14 @@ func TestBDN_HashPointToR_BN256(t *testing.T) {
4847

4948
func TestBDN_AggregateSignatures(t *testing.T) {
5049
msg := []byte("Hello Boneh-Lynn-Shacham")
51-
suite := bn256.NewSuite()
5250
private1, public1 := NewKeyPair(suite, random.New())
5351
private2, public2 := NewKeyPair(suite, random.New())
5452
sig1, err := Sign(suite, private1, msg)
5553
require.NoError(t, err)
5654
sig2, err := Sign(suite, private2, msg)
5755
require.NoError(t, err)
5856

59-
mask, _ := NewMask([]kyber.Point{public1, public2}, nil)
57+
mask, _ := NewMask(suite, []kyber.Point{public1, public2}, nil)
6058
mask.SetBit(0, true)
6159
mask.SetBit(1, true)
6260

@@ -85,7 +83,6 @@ func TestBDN_AggregateSignatures(t *testing.T) {
8583

8684
func TestBDN_SubsetSignature(t *testing.T) {
8785
msg := []byte("Hello Boneh-Lynn-Shacham")
88-
suite := bn256.NewSuite()
8986
private1, public1 := NewKeyPair(suite, random.New())
9087
private2, public2 := NewKeyPair(suite, random.New())
9188
_, public3 := NewKeyPair(suite, random.New())
@@ -94,7 +91,7 @@ func TestBDN_SubsetSignature(t *testing.T) {
9491
sig2, err := Sign(suite, private2, msg)
9592
require.NoError(t, err)
9693

97-
mask, _ := NewMask([]kyber.Point{public1, public3, public2}, nil)
94+
mask, _ := NewMask(suite, []kyber.Point{public1, public3, public2}, nil)
9895
mask.SetBit(0, true)
9996
mask.SetBit(2, true)
10097

@@ -113,7 +110,6 @@ func TestBDN_SubsetSignature(t *testing.T) {
113110

114111
func TestBDN_RogueAttack(t *testing.T) {
115112
msg := []byte("Hello Boneh-Lynn-Shacham")
116-
suite := bn256.NewSuite()
117113
scheme := bls.NewSchemeOnG1(suite)
118114
// honest
119115
_, public1 := scheme.NewKeyPair(random.New())
@@ -133,7 +129,7 @@ func TestBDN_RogueAttack(t *testing.T) {
133129
require.NoError(t, scheme.Verify(agg, msg, sig))
134130

135131
// New scheme that should detect
136-
mask, _ := NewMask(pubs, nil)
132+
mask, _ := NewMask(suite, pubs, nil)
137133
mask.SetBit(0, true)
138134
mask.SetBit(1, true)
139135
agg, err = AggregatePublicKeys(suite, mask)
@@ -142,7 +138,6 @@ func TestBDN_RogueAttack(t *testing.T) {
142138
}
143139

144140
func Benchmark_BDN_AggregateSigs(b *testing.B) {
145-
suite := bn256.NewSuite()
146141
private1, public1 := NewKeyPair(suite, random.New())
147142
private2, public2 := NewKeyPair(suite, random.New())
148143
msg := []byte("Hello many times Boneh-Lynn-Shacham")
@@ -151,7 +146,7 @@ func Benchmark_BDN_AggregateSigs(b *testing.B) {
151146
sig2, err := Sign(suite, private2, msg)
152147
require.Nil(b, err)
153148

154-
mask, _ := NewMask([]kyber.Point{public1, public2}, nil)
149+
mask, _ := NewMask(suite, []kyber.Point{public1, public2}, nil)
155150
mask.SetBit(0, true)
156151
mask.SetBit(1, false)
157152

@@ -172,7 +167,7 @@ func Benchmark_BDN_BLS12381_AggregateVerify(b *testing.B) {
172167
privKeys[i], pubKeys[i] = schemeOnG2.NewKeyPair(rng)
173168
}
174169

175-
mask, err := NewMask(pubKeys, nil)
170+
mask, err := NewMask(suite.G1(), pubKeys, nil)
176171
require.NoError(b, err)
177172
for i := range pubKeys {
178173
require.NoError(b, mask.SetBit(i, true))
@@ -210,7 +205,6 @@ func unmarshalHex[T encoding.BinaryUnmarshaler](t *testing.T, into T, s string)
210205
// This tests exists to make sure we don't accidentally make breaking changes to signature
211206
// aggregation by using checking against known aggregated signatures and keys.
212207
func TestBDNFixtures(t *testing.T) {
213-
suite := bn256.NewSuite()
214208
schemeOnG1 := NewSchemeOnG1(suite)
215209

216210
public1 := unmarshalHex(t, suite.G2().Point(), "1a30714035c7a161e286e54c191b8c68345bd8239c74925a26290e8e1ae97ed6657958a17dca12c943fadceb11b824402389ff427179e0f10194da3c1b771c6083797d2b5915ea78123cbdb99ea6389d6d6b67dcb512a2b552c373094ee5693524e3ebb4a176f7efa7285c25c80081d8cb598745978f1a63b886c09a316b1493")
@@ -243,7 +237,7 @@ func TestBDNFixtures(t *testing.T) {
243237
require.Nil(t, err)
244238
require.Equal(t, sig3Exp, sig3)
245239

246-
mask, _ := NewMask([]kyber.Point{public1, public2, public3}, nil)
240+
mask, _ := NewMask(suite, []kyber.Point{public1, public2, public3}, nil)
247241
mask.SetBit(0, true)
248242
mask.SetBit(1, false)
249243
mask.SetBit(2, true)

sign/bdn/mask.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Mask struct {
3131
// The returned Mask will contain pre-computed terms and coefficients for all provided public
3232
// keys, so it should be re-used for optimal performance (e.g., by creating a "base" mask and
3333
// cloning it whenever aggregating signatures and/or public keys).
34-
func NewMask(publics []kyber.Point, myKey kyber.Point) (*Mask, error) {
34+
func NewMask(group kyber.Group, publics []kyber.Point, myKey kyber.Point) (*Mask, error) {
3535
m := &Mask{
3636
publics: publics,
3737
}
@@ -49,7 +49,7 @@ func NewMask(publics []kyber.Point, myKey kyber.Point) (*Mask, error) {
4949
}
5050

5151
var err error
52-
m.publicCoefs, err = hashPointToR(publics)
52+
m.publicCoefs, err = hashPointToR(group, publics)
5353
if err != nil {
5454
return nil, fmt.Errorf("failed to hash public keys: %w", err)
5555
}

sign/bdn/mask_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func init() {
2323
}
2424

2525
func TestMask_CreateMask(t *testing.T) {
26-
mask, err := NewMask(publics, nil)
26+
mask, err := NewMask(suite, publics, nil)
2727
require.NoError(t, err)
2828

2929
require.Equal(t, len(publics), len(mask.Publics()))
@@ -32,19 +32,19 @@ func TestMask_CreateMask(t *testing.T) {
3232
require.Equal(t, n/8+1, mask.Len())
3333
require.Equal(t, uint8(0), mask.Mask()[0])
3434

35-
mask, err = NewMask(publics, publics[2])
35+
mask, err = NewMask(suite, publics, publics[2])
3636
require.NoError(t, err)
3737

3838
require.Equal(t, len(publics), len(mask.Publics()))
3939
require.Equal(t, 1, mask.CountEnabled())
4040
require.Equal(t, uint8(0x4), mask.Mask()[0])
4141

42-
_, err = NewMask(publics, suite.G1().Point())
42+
_, err = NewMask(suite, publics, suite.G1().Point())
4343
require.Error(t, err)
4444
}
4545

4646
func TestMask_SetBit(t *testing.T) {
47-
mask, err := NewMask(publics, publics[2])
47+
mask, err := NewMask(suite, publics, publics[2])
4848
require.NoError(t, err)
4949

5050
// Make sure the mask is initially as we'd expect.
@@ -111,7 +111,7 @@ func TestMask_SetBit(t *testing.T) {
111111
}
112112

113113
func TestMask_SetAndMerge(t *testing.T) {
114-
mask, err := NewMask(publics, publics[2])
114+
mask, err := NewMask(suite, publics, publics[2])
115115
require.NoError(t, err)
116116

117117
err = mask.SetMask([]byte{})
@@ -129,7 +129,7 @@ func TestMask_SetAndMerge(t *testing.T) {
129129
}
130130

131131
func TestMask_PositionalQueries(t *testing.T) {
132-
mask, err := NewMask(publics, publics[2])
132+
mask, err := NewMask(suite, publics, publics[2])
133133
require.NoError(t, err)
134134

135135
for i := 0; i < 10000; i++ {

0 commit comments

Comments
 (0)