package main

import (
	"bytes"
	"crypto/rand"
	"encoding/base64"
	"encoding/hex"
	"fmt"
	"github.com/tjfoc/gmsm/x509"
)

func main() {
	//公钥
	var sm2PublicKey = "BNCLnbbD4c9Xyb135MlodTr7Ua79C/Hr8igUrr1gZuHBXHNT1RQCK0LJKveg8H7qgrm/Ea6ZDPDgwEKooC0cSIA="
	//私钥
	var sm2PrivateKey = "51NBw3BbaMfEtOWHLCgaCNAlgw2w79BOBq2Jkl5xxbE="
	//bese64解码
	sm2PublicKeyBase64Decode, err := base64.StdEncoding.DecodeString(sm2PublicKey)
	if err != nil {
		panic(err)
	}
	sm2PrivateKeyBase64Decode, err := base64.StdEncoding.DecodeString(sm2PrivateKey)
	if err != nil {
		panic(err)
	}
	//转16进制
	publickeyHex := hex.EncodeToString(sm2PublicKeyBase64Decode)
	privatekeyHex := hex.EncodeToString(sm2PrivateKeyBase64Decode)
	//转私钥公钥
	PubKey, err := x509.ReadPublicKeyFromHex(publickeyHex)
	if err != nil {
		panic(err)
	}
	PrivateKey, err := x509.ReadPrivateKeyFromHex(privatekeyHex)
	if err != nil {
		panic(err)
	}
	msg := []byte("en's blog")
	//sm2加密
	ciphertxt, err := PubKey.EncryptAsn1(msg, rand.Reader)
	if err != nil {
		panic(err)
	}
	fmt.Printf("加密结果:%x\n", ciphertxt)
	//sm2解密
	plaintxt, err := PrivateKey.DecryptAsn1(ciphertxt)
	if err != nil {
		panic(err)
	}
	fmt.Printf("解密结果:%x\n", string(plaintxt))
	if !bytes.Equal(msg, plaintxt) {
		panic("原文不匹配")
	}
	//sm2签名
	sign, err := PrivateKey.Sign(rand.Reader, msg, nil)
	if err != nil {
		panic(err)
	}
	//sm2验签
	isok := PubKey.Verify(msg, sign)
	fmt.Printf("Verified: %v\n", isok)
}