11package h2c
22
33import (
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.
2427type 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
6671type 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
7377func (e * encoding ) GetCurve () C.EllCurve { return e .E }
7478
7579type 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+
7789func (s * encodeToCurve ) IsRandomOracle () bool { return false }
7890func (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-
9397type hashToCurve struct { * encoding }
9498
9599func (s * hashToCurve ) IsRandomOracle () bool { return true }
0 commit comments