package sm2 import ( "encoding/hex" "errors" "math/big" ) func ReadPrivateKeyFromHex(Dhex string) (*PrivateKey, error) { c := P256Sm2() d, err := hex.DecodeString(Dhex) if err != nil { return nil, err } k := new(big.Int).SetBytes(d) params := c.Params() one := new(big.Int).SetInt64(1) n := new(big.Int).Sub(params.N, one) if k.Cmp(n) >= 0 { return nil, errors.New("privateKey's D is overflow.") } priv := new(PrivateKey) priv.PublicKey.Curve = c priv.D = k priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes()) return priv, nil } func ReadPublicKeyFromHex(Qhex string) (*PublicKey, error) { q, err := hex.DecodeString(Qhex) if err != nil { return nil, err } if len(q) == 65 && q[0] == byte(0x04) { q = q[1:] } if len(q) != 64 { return nil, errors.New("publicKey is not uncompressed.") } pub := new(PublicKey) pub.Curve = P256Sm2() pub.X = new(big.Int).SetBytes(q[:32]) pub.Y = new(big.Int).SetBytes(q[32:]) return pub, nil }