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  }