88 lines
1.7 KiB
Go
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
|
|
}
|