Files
xgcl/sm/sm9/hash.go
T
2026-05-27 23:03:00 +08:00

88 lines
1.7 KiB
Go

package sm9
import (
"math/big"
"xdx.jelly/xgcl/gmath"
"xdx.jelly/xgcl/internal/kdf"
"xdx.jelly/xgcl/sm/sm3"
)
const (
macSize = sm3.Size
macKeySize = sm3.Size
)
func mac(key, msg []byte) []byte {
ret := sm3.Sum(msg, key)
return ret[:]
}
// const hlen = 320 / 8
var Kdf = kdf.StdKdf.Kdf
// h are fixed TODO: make it change with params
func _h(out, n *big.Int, tag byte, z ...[]byte) {
ha := make([]byte, 64)
s0 := sm3.NewDigest()
s1 := sm3.NewDigest()
_, _ = s0.Write([]byte{tag})
for _, w := range z {
_, _ = s0.Write(w)
}
buf := make([]byte, 4)
buf[3] = 1
*s1 = *s0
_, _ = s1.Write(buf)
d := s1.Sum(nil)
copy(ha, d)
buf[3] = 2
_, _ = s0.Write(buf)
d = s0.Sum(nil)
copy(ha[32:], d)
out.SetBytes(ha[:40])
out.Mod(out, n)
out.Add(out, gmath.BigInt1)
}
// H1 H1函数
func H1(z ...[]byte) *big.Int {
r := new(big.Int)
_h(r, nMinusOne, 1, z...)
return r
}
// H2 H2函数
func H2(z ...[]byte) *big.Int {
r := new(big.Int)
_h(r, nMinusOne, 2, z...)
return r
}
// ////////////////////////////////////////////// local functions
// hashToG1 hash id to a point of G1, (px, py) are KGC's master key
// return (x,y) = H1(id||hid)g1 + BasePoint, BasePoint相当于做一个平移。
// 可以理解为id在某个KGC下的公钥
func hashToG1(id []byte, base *G1, hid byte) *G1 {
h := H1(id, []byte{hid})
g := new(G1).ScalarBaseMult(h)
g.Add(g, base)
return g
}
// genKey return a key of length keylen, key = kdf(cx||cy||e(p,q)^k||id)
// k could be nil, then e(p,q)^k=e(p,q)
// func genKey(key, id []byte, c, p *G1, q *G2, k *big.Int)[]byte{
func genKey(key, id []byte, c *G1, w *GT) []byte {
_ = Kdf(key,
c.Marshal(),
w.Marshal(),
id)
return key
}