Skip to content

Commit 2ed8b98

Browse files
committed
Adding a test for hashToScalar.
1 parent e3d456c commit 2ed8b98

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

hash.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package h2c
22

33
import (
4+
"fmt"
45
"math/big"
56

67
M "github.com/armfazh/h2c-go-ref/mapping"
78
C "github.com/armfazh/tozan-ecc/curve"
9+
"github.com/armfazh/tozan-ecc/field"
810
GF "github.com/armfazh/tozan-ecc/field"
911
)
1012

@@ -21,7 +23,10 @@ type HashToPoint interface {
2123
GetHashToScalar() HashToScalar
2224
}
2325

26+
// HashToScalar allows to hash string into the field of scalars used for scalar multiplication.
2427
type HashToScalar interface {
28+
// GetScalarField returns the field of scalars.
29+
GetScalarField() GF.Field
2530
// Hash returns an element of a field given a byte string.
2631
Hash(in []byte) GF.Elt
2732
}
@@ -32,11 +37,11 @@ type fieldEncoding struct {
3237
L uint
3338
}
3439

40+
func (f *fieldEncoding) GetScalarField() GF.Field { return f.F }
41+
3542
// Hash deterministically hashes a string msg of any length into
3643
// an element of the given finite field.
37-
func (f *fieldEncoding) Hash(msg []byte) GF.Elt {
38-
return f.hashToField(msg, 1)[0]
39-
}
44+
func (f *fieldEncoding) Hash(msg []byte) GF.Elt { return f.hashToField(msg, 1)[0] }
4045

4146
// hashToField is a function that hashes a string msg of any length into an
4247
// element of a finite field.
@@ -64,16 +69,23 @@ func (f *fieldEncoding) hashToField(
6469
}
6570

6671
type encoding struct {
67-
E C.EllCurve
68-
Mapping M.MapToCurve
69-
Field *fieldEncoding
70-
ScalarField GF.Field
72+
E C.EllCurve
73+
Mapping M.MapToCurve
74+
Field *fieldEncoding
7175
}
7276

7377
func (e *encoding) GetCurve() C.EllCurve { return e.E }
7478

7579
type encodeToCurve struct{ *encoding }
7680

81+
func (e *encoding) GetHashToScalar() HashToScalar {
82+
return &fieldEncoding{
83+
F: field.NewFp(fmt.Sprintf("%v", e.E.Order()), e.E.Order()),
84+
Exp: e.Field.Exp,
85+
L: e.Field.L,
86+
}
87+
}
88+
7789
func (s *encodeToCurve) IsRandomOracle() bool { return false }
7890
func (s *encodeToCurve) Hash(in []byte) C.Point {
7991
u := s.Field.hashToField(in, 1)
@@ -82,14 +94,6 @@ func (s *encodeToCurve) Hash(in []byte) C.Point {
8294
return P
8395
}
8496

85-
func (e *encoding) GetHashToScalar() HashToScalar {
86-
return &fieldEncoding{
87-
F: e.ScalarField,
88-
Exp: e.Field.Exp,
89-
L: e.Field.L,
90-
}
91-
}
92-
9397
type hashToCurve struct{ *encoding }
9498

9599
func (s *hashToCurve) IsRandomOracle() bool { return true }

suite_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ func (v vectorSuite) test(t *testing.T) {
5555
if err != nil {
5656
t.Skipf(err.Error())
5757
}
58-
//hashToScalar := hashToCurve.GetHashToScalar()
58+
hashToScalar := hashToCurve.GetHashToScalar()
5959
E := hashToCurve.GetCurve()
6060
F := E.Field()
61+
maxScalar := hashToScalar.GetScalarField().Order()
6162
for i := range v.Vectors {
6263
var x, y []interface{}
6364
for _, xi := range strings.Split(v.Vectors[i].P.X, ",") {
@@ -73,12 +74,11 @@ func (v vectorSuite) test(t *testing.T) {
7374
t.Fatalf("suite: %v\ngot: %v\nwant: %v", v.SuiteID, got, want)
7475
}
7576

76-
// TODO: test HashToScalar
77-
// gotH2S := hashToScalar.Hash([]byte(v.Vectors[i].Msg))
78-
// var wantH2S field.Elt // TATIANA: how do I get the "want" value here?
79-
// if !F.AreEqual(gotH2S, wantH2S) {
80-
// t.Fatalf("suite: %v\ngot: %v\nwant: %v", v.SuiteID, gotH2S, wantH2S)
81-
// }
77+
kElt := hashToScalar.Hash([]byte(v.Vectors[i].Msg))
78+
kInt := kElt.Polynomial()[0]
79+
if kInt.Sign() < 0 || kInt.Cmp(maxScalar) >= 0 {
80+
t.Fatalf("suite: %v\ngot: %v", v.SuiteID, kInt)
81+
}
8282
}
8383
}
8484

suites.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
C "github.com/armfazh/h2c-go-ref/curve"
1010
M "github.com/armfazh/h2c-go-ref/mapping"
11-
"github.com/armfazh/tozan-ecc/field"
1211
)
1312

1413
// SuiteID is the identifier of supported hash to curve suites.
@@ -54,8 +53,7 @@ func (id SuiteID) Get(dst []byte) (HashToPoint, error) {
5453
Exp: exp,
5554
L: s.L,
5655
},
57-
ScalarField: field.NewFp(fmt.Sprintf("%v", E.Order()), E.Order()),
58-
Mapping: m,
56+
Mapping: m,
5957
}
6058
if s.RO {
6159
return &hashToCurve{e}, nil

0 commit comments

Comments
 (0)