gitee.com/lh-her-team/common@v1.5.1/opencrypto/gmssl/sm2/sm2.go (about) 1 package sm2 2 3 import ( 4 "crypto" 5 "encoding/pem" 6 "io" 7 8 "gitee.com/lh-her-team/common/opencrypto/utils" 9 10 "gitee.com/lh-her-team/common/opencrypto/gmssl/gmssl" 11 "github.com/pkg/errors" 12 ) 13 14 func GenerateKeyPair() (*PrivateKey, error) { 15 sm2keygenargs := &gmssl.PkeyCtxParams{ 16 Keys: []string{"ec_paramgen_curve", "ec_param_enc"}, 17 Values: []string{"sm2p256v1", "named_curve"}, 18 } 19 sk, err := gmssl.GeneratePrivateKey("EC", sm2keygenargs, nil) 20 if err != nil { 21 return nil, err 22 } 23 skPem, err := sk.GetUnencryptedPEM() 24 if err != nil { 25 return nil, err 26 } 27 p, _ := pem.Decode([]byte(skPem)) 28 if p == nil { 29 return nil, errors.New("invalid private key pem") 30 } 31 pkPem, err := sk.GetPublicKeyPEM() 32 if err != nil { 33 return nil, err 34 } 35 pk, err := gmssl.NewPublicKeyFromPEM(pkPem) 36 if err != nil { 37 return nil, err 38 } 39 pubKey := PublicKey{ 40 PublicKey: pk, 41 pkPem: pkPem, 42 } 43 return &PrivateKey{PrivateKey: sk, skPem: skPem, Pub: pubKey}, nil 44 } 45 46 type signer struct { 47 PrivateKey 48 } 49 50 //this is for crypto.Signer impl 51 func (s *signer) Public() crypto.PublicKey { 52 return s.PublicKey 53 } 54 55 func (s *signer) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) { 56 return s.PrivateKey.signWithSM3(msg, utils.SM2_DEFAULT_USER_ID) 57 }