package main import ( "crypto" "crypto/rand" "encoding/hex" "encoding/json" "fmt" "github.com/golang/protobuf/ptypes" "github.com/tjfoc/gmsm/sm2" "log" "math/big" "standard/json/pb" ) func main() { pubkey := "02e04ceeee7c25240de0d510ac1977ee50633d3494ac9a08481daeca3f288c8c50" privkey := "7785e7029108b80f2d8d0576bdac3bf554bb756aa523a42c3a62996089b91f6b" ichain := &pb.Body{ChainId: "zx00001", ChainName: "zx", ChainIntro: "test for zx"} body, err := ptypes.MarshalAny(ichain) pk := &pb.PublicKey{Type: "sm2", Key: pubkey} signerInfo := pb.SignerInfos{PublicKey: pk} signerInfos := []*pb.SignerInfos{&signerInfo} authinfo := pb.AuthInfo{SignerInfos: signerInfos,Uuid:"100000",ChainId:"zx00001"} unsignchain, _ := json.Marshal(pb.Request{Body: body, AuthInfo: &authinfo}) sign, err := Sign(unsignchain, privkey, pubkey) if err != nil { log.Fatalf("sign err : %s", err) } signatures := []string{sign} b,err := json.Marshal(pb.Request{Body: body, AuthInfo: &authinfo, Signatures: signatures}) fmt.Println(string(b)) resp := &pb.Response{Code:"000000",Msg:"success"} b,err = json.Marshal(resp) fmt.Println(string(b)) res := &pb.GetAllChainsReq{Page:1,Size:10,Sort:"chain_id",Order:pb.OrderType_DESC} b,err = json.Marshal(res) fmt.Println(string(b)) } //签名 func Sign(unsign []byte, privKey string, pubkey string) (string, error) { privKeyBytes, err2 := hex.DecodeString(privKey) if err2 != nil { return "", err2 } d := &big.Int{} d = d.SetBytes(privKeyBytes) priv := &sm2.PrivateKey{D: d} pubkeyBytes, err2 := hex.DecodeString(pubkey) if err2 != nil { return "", err2 } publicKey := sm2.Decompress(pubkeyBytes) priv.PublicKey = *publicKey //fmt.Println("privkey: ", hex.EncodeToString(priv.D.Bytes())) //fmt.Println("原文:", string(unsign)) sign, err := priv.Sign(rand.Reader, unsign, crypto.BLAKE2b_256) if err != nil { return "", err } pubkeyBytes = sm2.Compress(&priv.PublicKey) //fmt.Println("sign: ", hex.EncodeToString(sign)) //fmt.Println("pubkey: ", hex.EncodeToString(pubkeyBytes)) return hex.EncodeToString(sign), nil }