45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package sm2m
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"io"
|
|
"math/big"
|
|
|
|
"xdx.jelly/xgcl/gerrors"
|
|
"xdx.jelly/xgcl/gmath"
|
|
"xdx.jelly/xgcl/sm/sm2"
|
|
)
|
|
|
|
// ClientGenAuthKey 生成客户端授权密钥
|
|
// dc' = dc * r
|
|
func ClientGenAuthKey(clientKey *sm2.PrivateKey, rnd io.Reader) (*sm2.PrivateKey, []byte, error) {
|
|
var r *big.Int
|
|
var err error
|
|
for r == nil || gmath.IsBigInt0(r) {
|
|
r, err = rand.Int(rnd, sm2.OrderN())
|
|
if err != nil {
|
|
return nil, nil, gerrors.WithAnnotating(ErrInvalidInput, "input rnd must be nil, []byte or io.Reader")
|
|
}
|
|
}
|
|
|
|
authKey := sm2.NewPrivateKey()
|
|
|
|
authKey.D.Mul(clientKey.D, r)
|
|
authKey.D.Mod(authKey.D, sm2.OrderN())
|
|
return authKey, gmath.BigIntToNByte(r, sm2.ByteSize()), nil
|
|
}
|
|
|
|
// ServerGenAuthKey 生成服务端授权密钥
|
|
// // ds' = ds / r
|
|
func ServerGenAuthKey(serverKey *sm2.PrivateKey, r []byte) (*sm2.PrivateKey, error) {
|
|
bigR := new(big.Int).SetBytes(r)
|
|
if gmath.IsBigInt0(bigR) || bigR.Cmp(sm2.OrderN()) >= 0 {
|
|
return nil, gerrors.WithAnnotating(ErrInvalidInput, "input r is zero or bigger than order N")
|
|
}
|
|
bigR.ModInverse(bigR, sm2.OrderN())
|
|
authKey := sm2.NewPrivateKey()
|
|
authKey.D.Mul(serverKey.D, bigR)
|
|
authKey.D.Mod(authKey.D, sm2.OrderN())
|
|
return authKey, nil
|
|
}
|