46 lines
980 B
Go
46 lines
980 B
Go
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
|
|
}
|