From 3f9f83dd94df424ba216f18fb896a457a8c163e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Mon, 24 Mar 2025 20:39:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/mixrepoimpl/cmb.go | 134 ++++++++++++++++++++++++++++++- internal/pkg/cmb/sm2_test.go | 11 ++- internal/pkg/cmbv2/sm2.go | 21 +++-- internal/pkg/cmbv2/sm2_test.go | 91 ++++++++++++++++++++- 4 files changed, 240 insertions(+), 17 deletions(-) diff --git a/internal/data/mixrepoimpl/cmb.go b/internal/data/mixrepoimpl/cmb.go index cc7a8b4..547c588 100644 --- a/internal/data/mixrepoimpl/cmb.go +++ b/internal/data/mixrepoimpl/cmb.go @@ -18,16 +18,31 @@ import ( "voucher/internal/biz/vo" "voucher/internal/conf" "voucher/internal/pkg/cmb" + "voucher/internal/pkg/cmbv2" "voucher/internal/pkg/helper" "voucher/internal/pkg/request" ) type CmbMixRepoImpl struct { bc *conf.Bootstrap + + cmb *cmbv2.Cmb + voucher *cmbv2.Cmb } -func NewCmbMixRepoImpl(bc *conf.Bootstrap) mixrepos.CmbMixRepo { - return &CmbMixRepoImpl{bc: bc} +func NewCmbMixRepoImpl(bc *conf.Bootstrap) (mixrepos.CmbMixRepo, error) { + + newCmb, err := cmbv2.NewCmb(bc.Cmb.CmbSm2Pik, bc.Cmb.CmbSm2Puk) + if err != nil { + return nil, err + } + + voucher, err := cmbv2.NewCmb(bc.Cmb.Sm2Prk, bc.Cmb.Sm2Puk) + if err != nil { + return nil, err + } + + return &CmbMixRepoImpl{bc: bc, cmb: newCmb, voucher: voucher}, nil } func (c *CmbMixRepoImpl) recordBody(ctx context.Context) { @@ -123,6 +138,27 @@ func (s *CmbMixRepoImpl) Verify(_ context.Context, req *v1.CmbRequest) (string, str := cmb.SortStructStr(req) + b, err := s.voucher.Verify(str, req.Sign) + if err != nil { + return "", err2.ErrorCmbVerifyFail(err.Error()) + } + + if !b { + return "", err2.ErrorCmbVerifyFail("签名验证失败") + } + + bizStr, err := s.cmb.Decrypt(req.EncryptBody) + if err != nil { + return "", err2.ErrorCmbBizContentDecryptFail(err.Error()) + } + + return bizStr, nil +} + +func (s *CmbMixRepoImpl) Verify2(_ context.Context, req *v1.CmbRequest) (string, error) { + + str := cmb.SortStructStr(req) + b, err := cmb.Verify(s.bc.Cmb.CmbSm2Puk, str, req.Sign) if err != nil { return "", err2.ErrorCmbVerifyFail(err.Error()) @@ -142,6 +178,38 @@ func (s *CmbMixRepoImpl) Verify(_ context.Context, req *v1.CmbRequest) (string, func (s *CmbMixRepoImpl) GetRequest(_ context.Context, reqBo *bo.CmbRequestBo) (*v1.CmbRequest, error) { + // 用他们的公钥加密 + encryptBody, err := s.cmb.Encrypt([]byte(reqBo.BizContent)) + if err != nil { + return nil, err + } + + req := &v1.CmbRequest{ + Mid: s.bc.Cmb.Mid, + Aid: s.bc.Cmb.Aid, + Date: time.Now().Format("20060102150405"), + Random: string(cmb.RandomBytes(16)), + KeyAlias: s.bc.Cmb.KeyAlias, + CmbKeyAlias: s.bc.Cmb.CmbKeyAlias, + EncryptBody: encryptBody, + Sign: "", + } + + str := fmt.Sprintf("%s?%s", reqBo.FuncName, cmb.SortStructStr(req)) + + // 用自己的私钥签名 + sing, err := s.voucher.Sign([]byte(str)) + if err != nil { + return nil, err + } + + req.Sign = sing + + return req, nil +} + +func (s *CmbMixRepoImpl) GetRequest2(_ context.Context, reqBo *bo.CmbRequestBo) (*v1.CmbRequest, error) { + encryptBody, err := cmb.Encrypt(s.bc.Cmb.CmbSm2Puk, reqBo.BizContent) if err != nil { return nil, err @@ -180,7 +248,8 @@ func (s *CmbMixRepoImpl) GetMockRequest(_ context.Context, bizContent string) (* return nil, errors.New("mock cmb sm2 pik is empty") } - encryptBody, err := cmb.Encrypt(s.bc.Cmb.Sm2Puk, bizContent) + // 用他们的公钥加密 + encryptBody, err := s.cmb.Encrypt([]byte(bizContent)) if err != nil { return nil, err } @@ -196,7 +265,8 @@ func (s *CmbMixRepoImpl) GetMockRequest(_ context.Context, bizContent string) (* Sign: "", } - sign, err := cmb.Sign(s.bc.Cmb.CmbSm2Pik, cmb.SortStructStr(req)) + // 用我们的私钥签名 + sign, err := s.voucher.Sign([]byte(cmb.SortStructStr(req))) if err != nil { return nil, err } @@ -210,6 +280,23 @@ func (s *CmbMixRepoImpl) VerifyResponse(_ context.Context, req *v1.CmbReply) err str := cmb.SortStructStr(req) + // 用他们的公钥验签 + b, err := s.cmb.Verify(str, req.Sign) + if err != nil { + return err + } + + if !b { + return errors.New("签名验证失败") + } + + return nil +} + +func (s *CmbMixRepoImpl) VerifyResponse2(_ context.Context, req *v1.CmbReply) error { + + str := cmb.SortStructStr(req) + b, err := cmb.Verify(s.bc.Cmb.CmbSm2Puk, str, req.Sign) if err != nil { return err @@ -234,6 +321,36 @@ func (s *CmbMixRepoImpl) GetResponse(_ context.Context, reqBo *bo.CmbResponseBo) Sign: "", } + if len(reqBo.BizContent) > 0 { + encryptBody, err := s.cmb.Encrypt([]byte(reqBo.BizContent)) + if err != nil { + return nil, err + } + reply.EncryptBody = encryptBody + } + + sign, err := s.voucher.Sign([]byte(cmb.SortStructStr(reply))) + if err != nil { + return nil, err + } + + reply.Sign = sign + + return reply, nil +} + +func (s *CmbMixRepoImpl) GetResponse2(_ context.Context, reqBo *bo.CmbResponseBo) (*v1.CmbReply, error) { + + reply := &v1.CmbReply{ + RespCode: reqBo.RespCode, + RespMsg: reqBo.RespMsg, + Date: time.Now().Format("20060102150405"), + KeyAlias: s.bc.Cmb.KeyAlias, + CmbKeyAlias: s.bc.Cmb.CmbKeyAlias, + EncryptBody: "", + Sign: "", + } + if len(reqBo.BizContent) > 0 { encryptBody, err := cmb.Encrypt(s.bc.Cmb.CmbSm2Puk, reqBo.BizContent) if err != nil { @@ -296,5 +413,14 @@ func (s *CmbMixRepoImpl) Decrypt(_ context.Context, encryptBody string) (string, return "", errors.New("mock CmbSm2Pik is empty") } + return s.cmb.Decrypt(encryptBody) +} + +func (s *CmbMixRepoImpl) Decrypt2(_ context.Context, encryptBody string) (string, error) { + + if len(s.bc.Cmb.CmbSm2Pik) == 0 { + return "", errors.New("mock CmbSm2Pik is empty") + } + return cmb.Decrypt(s.bc.Cmb.CmbSm2Pik, encryptBody) } diff --git a/internal/pkg/cmb/sm2_test.go b/internal/pkg/cmb/sm2_test.go index 0944e0c..7ef1fb2 100644 --- a/internal/pkg/cmb/sm2_test.go +++ b/internal/pkg/cmb/sm2_test.go @@ -63,7 +63,8 @@ func TestEncryptDecrypt(t *testing.T) { } func TestSign(t *testing.T) { - priKey := "9450c673cf801164435b9c164ac1404e87997245bc6f323fde22015875a03f6e" + //priKey := "9450c673cf801164435b9c164ac1404e87997245bc6f323fde22015875a03f6e" + priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20240314091628&encryptBody=BNhquiza494xicGIOvE7G5jLr7nhQI6Tp4V5j3a+3P98oD+uUKVXAPXt+ae3GsDvs+FyOaqoNSzdYsSqNDW3rA1AFUbsljTI9EaWMB+FAHpZ3Wjn6Qyl8EzJpUIbCnqAIOWjr2hDsexJd+NPVxQwNqq9W66lC/PBC4/1/QCz+87Yq8b4hHx7bP2u5h95|YwTJn3uKMQfhDSuJKIx3hyFZcoLm9M2xKnVDmNLPq5PbGedoZY/4g1Z/sKk8cWzH&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=320bcb8c8cf7419e98d562439bdb3baa" @@ -72,10 +73,12 @@ func TestSign(t *testing.T) { } func TestVerify(t *testing.T) { - pukKey := "04838f74275e6f4f2373d4e6e974ac790c10ab6f9c17e273cf0c84848c6838979c158315932e36f0b9444442f145e4671b1ee5d43d5d63913a70d4d0d52cc3c0d6" + //pukKey := "04838f74275e6f4f2373d4e6e974ac790c10ab6f9c17e273cf0c84848c6838979c158315932e36f0b9444442f145e4671b1ee5d43d5d63913a70d4d0d52cc3c0d6" + pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" - content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20250305115032&encryptBody=BHeko/ZYFzQOJn6Q3y46X1AjNz8Nh5fq1FfMuWebh+TangLnlK5iFqePCst4rjG/FKJInijiKO2Qq18sJULlMEEgri05s+bHHDKM+Y+73crAbCnIhHbZxUjt8A0cq2rKjzkl8bxW33dU18uuiTEAmsAvKvmZgE6zJ1eDyjFWefHEIFJaKCNY2cTQOInt|8UYFZFTkx0DovPhaWCbdBkAqbgGmegT14F5gwXLJ6G1uWdYNvX+i5QWAYUGtd8u9&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=286d97b1d8ed4bbf822b004470c92ae8" - signDataBase64 := "MEUCIAg1zxnKG+X8t/hlwEoyL/T33iKgle09S6bfb3eZh/FqAiEAxtK5TdGAo+JpK7JmL15tT4nlQyrUzC14flu0Tq+9Svo=" + content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20240314091628&encryptBody=BNhquiza494xicGIOvE7G5jLr7nhQI6Tp4V5j3a+3P98oD+uUKVXAPXt+ae3GsDvs+FyOaqoNSzdYsSqNDW3rA1AFUbsljTI9EaWMB+FAHpZ3Wjn6Qyl8EzJpUIbCnqAIOWjr2hDsexJd+NPVxQwNqq9W66lC/PBC4/1/QCz+87Yq8b4hHx7bP2u5h95|YwTJn3uKMQfhDSuJKIx3hyFZcoLm9M2xKnVDmNLPq5PbGedoZY/4g1Z/sKk8cWzH&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=320bcb8c8cf7419e98d562439bdb3baa" + //signDataBase64 := "MEUCIAg1zxnKG+X8t/hlwEoyL/T33iKgle09S6bfb3eZh/FqAiEAxtK5TdGAo+JpK7JmL15tT4nlQyrUzC14flu0Tq+9Svo=" + signDataBase64 := "MEUCICL72ttxrYiuooO25vLsnp42YMKAoaN2y79/LED+M5WcAiEAgneRDvfZ+LhN3XvgxL3B4L6TYrzBnzeqjIb9B7KPxVc=" xx, err := Verify(pukKey, content, signDataBase64) t.Log(xx, err) diff --git a/internal/pkg/cmbv2/sm2.go b/internal/pkg/cmbv2/sm2.go index a40ba7e..f445552 100644 --- a/internal/pkg/cmbv2/sm2.go +++ b/internal/pkg/cmbv2/sm2.go @@ -25,7 +25,8 @@ type Cmb struct { c3Len int uid []byte - sdk sdk.SDK + sdk sdk.SDK + cmbLifeSdk sdk.SDK sm2P256 *utils.Sm2P256Curve } @@ -36,14 +37,17 @@ func NewCmb(privateKey, sopPublicKey string) (*Cmb, error) { uid: model.DefaultUid, cipherType: model.C1C3C2, - sdk: sdk.NewBaseSdk(), + sdk: sdk.NewBaseSdk(), + cmbLifeSdk: sdk.NewCmbLifeSdk(), } sm2P256 := utils.NewP256Sm2() cmb.sm2P256 = &sm2P256 - if err := cmb.setHexPrivateKey(privateKey); err != nil { - return nil, err + if len(privateKey) > 0 { + if err := cmb.setHexPrivateKey(privateKey); err != nil { + return nil, err + } } if err := cmb.setHexPublicKey(sopPublicKey); err != nil { @@ -122,7 +126,7 @@ func (s *Cmb) encrypt(data []byte) ([]byte, error) { c1 = elliptic.Marshal(s.publicKey.Curve, c1x, c1y) kx, ky = s.publicKey.Curve.ScalarMult(s.publicKey.X, s.publicKey.Y, k.Bytes()) - err = s.sdk.Kdf(s.publicKey, kx, ky, c2) + err = s.cmbLifeSdk.Kdf(s.publicKey, kx, ky, c2) if err != nil { return nil, fmt.Errorf("kdf error: %v", err) } @@ -131,7 +135,7 @@ func (s *Cmb) encrypt(data []byte) ([]byte, error) { } } - c3 := s.sdk.CalculateHash(kx, data, ky) + c3 := s.cmbLifeSdk.CalculateHash(kx, data, ky) c1Len := len(c1) c2Len := len(c2) @@ -221,6 +225,7 @@ func (s *Cmb) decrypt(data []byte) (string, error) { dBC1X, dBC1Y := s.privateKey.Curve.ScalarMult(x, y, s.privateKey.D.Bytes()) c2Len := len(data) - c1Len - s.c3Len + c2 := make([]byte, c2Len) c3 := make([]byte, s.c3Len) @@ -234,11 +239,11 @@ func (s *Cmb) decrypt(data []byte) (string, error) { return "", fmt.Errorf("cipher type not support") } - if err := s.sdk.Kdf(s.privateKey.Curve, dBC1X, dBC1Y, c2); err != nil { + if err := s.cmbLifeSdk.Kdf(s.privateKey.Curve, dBC1X, dBC1Y, c2); err != nil { return "", fmt.Errorf("kdf error: %v", err) } - u := s.sdk.CalculateHash(dBC1X, c2, dBC1Y) + u := s.cmbLifeSdk.CalculateHash(dBC1X, c2, dBC1Y) if bytes.Compare(u, c3) == 0 { return string(c2), nil } diff --git a/internal/pkg/cmbv2/sm2_test.go b/internal/pkg/cmbv2/sm2_test.go index 266d671..3996fa1 100644 --- a/internal/pkg/cmbv2/sm2_test.go +++ b/internal/pkg/cmbv2/sm2_test.go @@ -4,6 +4,51 @@ import ( "testing" ) +func TestCmb_Encrypt(t *testing.T) { + priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" + pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" + + n, err := NewCmb(priKey, pukKey) + if err != nil { + t.Errorf("NewCmb() error = %v", err) + return + } + + content := `{"name":"zhangxx","phoneNo":"137xxxxxxxx"}` + + got, err := n.Encrypt([]byte(content)) + if err != nil { + t.Errorf("Encrypt() error = %v", err) + return + } + + t.Log(got) +} + +func TestCmb_Decrypt(t *testing.T) { + //priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" + priKey := "f6a8d2f412e289686aba6a0f33cad1a64367d0ba012046ee0fbbefd3ffd675bd" + //pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" + pukKey := "043b2fade30067b6bd8e61b42771b1e953116fc5a0f9ed6939fceb9254b8d7d6989902c913642c3c68c42a2b56364512675ea0b517dd4469e73b73c888a2f4e8e3" + + n, err := NewCmb(priKey, pukKey) + if err != nil { + t.Errorf("NewCmb() error = %v", err) + return + } + + //input := "BJAwi/eC8AHtVVbbCFN58lQhJOIhO4b8ua6CS6AKGma4dGGVgedIlX4B5QbZOb58mNLTXA6dcUIQwFQxrc8z05Ckf9UZ6LQKgLxMcnbvdqlXQCLYEqjxhomkn543Nexw9MINybonMseYh8oy9eSEu4WgvjjfkNrkAF52njJXMiDgqKjTz+xlkGNrCx/9|TZgKpHqElSZEuP05q0/UdP6Sju9e45nIWReMjSao9yDghYJXMwW73exZ3tKUQeLI" + input := "BBwR1zhvi1cp5osiTFuTzE5ei74SYzHA1XLb7TCKh1XAquRbAoGcTYIzMgftTY5Jj6kziilMF5yg3FxxKCn4cnWa5JMYHJ4ifEdpEZP2+W9T773Di0XC8GpZ89k4dzDGlTcYoiIv3ebReyCPve2QF5hx6t2EH1YKbVpoU32MTDzL8Mz6XuhhnwLKLePu|u8s9XJxe8gWCyZlL1mkGdZq428qmEl5qjzzIO4Bn+MjBi+iEeULR4HlyrD9/fPPsdhwjUNdrBgRmDJidc0Eksfo4QCYhaytWrUBvJxAkmPCkGNyiHAFipqfmGM0A0HLoR81zWdEIjChlNYWu4/x3+FFWgMRAvgEk9ggqGWRoqHQTvSXu2FMZGJoTgfUDSAuyuwfpTLKULCFyZmymPubN0Jjg67ZrbGro+/43MnPeZNE1HpAhwGbQaUugJWtk9a/u" + + got2, err := n.Decrypt(input) + if err != nil { + t.Errorf("%v", err) + return + } + + t.Log(got2) +} + func TestCmb_EncryptDecrypt(t *testing.T) { priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" @@ -33,6 +78,50 @@ func TestCmb_EncryptDecrypt(t *testing.T) { t.Log(got2) } +func TestCmb_Sign(t *testing.T) { + priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" + pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" + + n, err := NewCmb(priKey, pukKey) + if err != nil { + t.Errorf("NewCmb() error = %v", err) + return + } + + content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20240314091628&encryptBody=BNhquiza494xicGIOvE7G5jLr7nhQI6Tp4V5j3a+3P98oD+uUKVXAPXt+ae3GsDvs+FyOaqoNSzdYsSqNDW3rA1AFUbsljTI9EaWMB+FAHpZ3Wjn6Qyl8EzJpUIbCnqAIOWjr2hDsexJd+NPVxQwNqq9W66lC/PBC4/1/QCz+87Yq8b4hHx7bP2u5h95|YwTJn3uKMQfhDSuJKIx3hyFZcoLm9M2xKnVDmNLPq5PbGedoZY/4g1Z/sKk8cWzH&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=320bcb8c8cf7419e98d562439bdb3baa" + + got, err := n.Sign([]byte(content)) + if err != nil { + t.Errorf("Sign() error = %v", err) + return + } + + t.Log(got) +} + +func TestCmb_Verify(t *testing.T) { + priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" + pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" + + n, err := NewCmb(priKey, pukKey) + if err != nil { + t.Errorf("NewCmb() error = %v", err) + return + } + + content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20240314091628&encryptBody=BNhquiza494xicGIOvE7G5jLr7nhQI6Tp4V5j3a+3P98oD+uUKVXAPXt+ae3GsDvs+FyOaqoNSzdYsSqNDW3rA1AFUbsljTI9EaWMB+FAHpZ3Wjn6Qyl8EzJpUIbCnqAIOWjr2hDsexJd+NPVxQwNqq9W66lC/PBC4/1/QCz+87Yq8b4hHx7bP2u5h95|YwTJn3uKMQfhDSuJKIx3hyFZcoLm9M2xKnVDmNLPq5PbGedoZY/4g1Z/sKk8cWzH&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=320bcb8c8cf7419e98d562439bdb3baa" + + sign := "MEYCIQDGqIJzzhAvXbOS1mnctYsKmCA6M+Dorm+YeYMUncYu6QIhALjazOfd2Doix00lrU2w95uq8SHbPFwxoXXBs56apKjG" + + got2, err := n.Verify(content, sign) + if err != nil { + t.Errorf("Verify() error = %v", err) + return + } + + t.Log(got2) +} + func TestCmb_SignVerify(t *testing.T) { priKey := "8d39ff3d2559258c163f4510f082727f51531e1953ab203d5ab1ea4a6d94fd73" pukKey := "04d827a7dbaaa358ce45b8c7794a7f54819f5c175005a702370e47f135ef6f5f9732758b1474f218419fe9e87f90c28c3b05f08254c651db27df35fae67b77b2e4" @@ -43,7 +132,7 @@ func TestCmb_SignVerify(t *testing.T) { return } - content := `{"name":"zhangxx","phoneNo":"137xxxxxxxx"}` + content := "accessToken.json?aid=9dad6d3900ec3ffabd80e46522a10ead&cmbKeyAlias=SM2_CMBLIFE&date=20240314091628&encryptBody=BNhquiza494xicGIOvE7G5jLr7nhQI6Tp4V5j3a+3P98oD+uUKVXAPXt+ae3GsDvs+FyOaqoNSzdYsSqNDW3rA1AFUbsljTI9EaWMB+FAHpZ3Wjn6Qyl8EzJpUIbCnqAIOWjr2hDsexJd+NPVxQwNqq9W66lC/PBC4/1/QCz+87Yq8b4hHx7bP2u5h95|YwTJn3uKMQfhDSuJKIx3hyFZcoLm9M2xKnVDmNLPq5PbGedoZY/4g1Z/sKk8cWzH&keyAlias=CO_PUB_KEY_SM2&mid=f806c259d86e3b9aa956c98d475b6af7&random=320bcb8c8cf7419e98d562439bdb3baa" got, err := n.Sign([]byte(content)) if err != nil {