init: v1.0.0
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package sm2a
|
||||
|
||||
import (
|
||||
"io"
|
||||
"math/big"
|
||||
|
||||
"xdx.jelly/xgcl/gmath"
|
||||
"xdx.jelly/xgcl/sm/sm2"
|
||||
"xdx.jelly/xgcl/sm/sm3"
|
||||
)
|
||||
|
||||
// ServerSign 服务端根据客户端的协同签名中间数据计算
|
||||
// in = e || [k_1](P+G)
|
||||
// out = r || k_2 + r*d_s
|
||||
func ServerSign(serverKey *sm2.PrivateKey, pk *sm2.PublicKey, in []byte, rand io.Reader) ([]byte, error) {
|
||||
k2 := make([]byte, sm2.ByteSize())
|
||||
if n, err := rand.Read(k2); n != len(k2) || err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var x, y *big.Int
|
||||
tx := new(big.Int)
|
||||
ty := new(big.Int)
|
||||
r := new(big.Int)
|
||||
r.SetBytes(in[:sm3.Size])
|
||||
tx.SetBytes(in[sm3.Size : sm3.Size+sm2.ByteSize()])
|
||||
ty.SetBytes(in[sm3.Size+sm2.ByteSize() : sm3.Size+2*sm2.ByteSize()])
|
||||
x, y = sm2.Curve().Add(pk.X, pk.Y, sm2.BaseX(), sm2.BaseY())
|
||||
x, y = sm2.Curve256.ScalarMult(x, y, k2)
|
||||
x, y = sm2.Curve().Add(x, y, tx, ty)
|
||||
r.Add(r, x)
|
||||
r.Mod(r, sm2.OrderN())
|
||||
x.Mul(r, serverKey.D)
|
||||
y.SetBytes(k2)
|
||||
x.Add(x, y)
|
||||
x.Mod(x, sm2.OrderN())
|
||||
out := make([]byte, 2*sm2.ByteSize())
|
||||
copy(out, gmath.BigIntToNByte(r, sm2.ByteSize()))
|
||||
copy(out[sm2.ByteSize():], gmath.BigIntToNByte(x, sm2.ByteSize()))
|
||||
|
||||
// 清除中间变量
|
||||
gmath.ClearBigInt(x)
|
||||
gmath.ClearBigInt(y)
|
||||
gmath.ClearBigInt(tx)
|
||||
gmath.ClearBigInt(ty)
|
||||
gmath.ClearBigInt(r)
|
||||
return out, nil
|
||||
}
|
||||
Reference in New Issue
Block a user