package sm2a import ( "fmt" "io" "math/big" "xdx.jelly/xgcl/gmath" "xdx.jelly/xgcl/sm/sm2" ) // ServerEncKeyGen 服务端加密密钥生成 func ServerEncKeyGen(in []byte, rand io.Reader) (*sm2.PrivateKey, *sm2.PublicKey, []byte, error) { buf := make([]byte, sm2.ByteSize()) if n, err := rand.Read(buf); n != len(buf) || err != nil { return nil, nil, nil, fmt.Errorf("Generate random number error") } ds, _ := sm2.GenPrivateKey(buf) pk := sm2.GenPublicKey(ds) out := make([]byte, 0, 2*sm2.ByteSize()) out = append(out, gmath.BigIntToNByte(pk.X, sm2.ByteSize())...) out = append(out, gmath.BigIntToNByte(pk.Y, sm2.ByteSize())...) x := new(big.Int) y := new(big.Int) x.SetBytes(in[:sm2.ByteSize()]) y.SetBytes(in[sm2.ByteSize() : 2*sm2.ByteSize()]) pk.X, pk.Y = sm2.Curve().Add(pk.X, pk.Y, x, y) return ds, pk, out, nil }