package txcrypto import ( "fmt" "github.com/btcsuite/btcd/btcec" appchainmgr "github.com/meshplus/bitxhub-core/appchain-mgr" "github.com/meshplus/bitxhub-kit/crypto" "github.com/meshplus/bitxhub-kit/crypto/ecdh" "github.com/meshplus/bitxhub-kit/crypto/sym" rpcx "gitlab.33.cn/link33/sidecar/hub/client" "gitlab.33.cn/link33/sidecar/internal/repo" "gitlab.33.cn/link33/sidecar/model/constant" ) type cryptor struct { client rpcx.Client mgr appchainmgr.AppchainMgr privKey crypto.PrivateKey keyMap map[string][]byte } func NewCryptor(client rpcx.Client, mgr appchainmgr.AppchainMgr, privKey crypto.PrivateKey) Cryptor { keyMap := make(map[string][]byte) return &cryptor{ client: client, mgr: mgr, privKey: privKey, keyMap: keyMap, } } func (d *cryptor) Encrypt(content []byte, address string, mode string) ([]byte, error) { des, err := d.getDesKey(address, mode) if err != nil { return nil, err } return des.Encrypt(content) } func (d *cryptor) Decrypt(content []byte, address string, mode string) ([]byte, error) { des, err := d.getDesKey(address, mode) if err != nil { return nil, err } return des.Decrypt(content) } func (d *cryptor) getDesKey(address string, mode string) (crypto.SymmetricKey, error) { pubKey, ok := d.keyMap[address] if !ok { var ( ret []byte get bool ) if mode == repo.DirectMode { get, ret = d.mgr.GetPubKeyByChainID(address) if !get { return nil, fmt.Errorf("cannot find the public key") } } if mode == repo.RelayMode { //TODO fix bug rp, err := d.client.InvokeBVMContract(constant.AppchainMgrContractAddr.Address(), "GetPubKeyByChainID", nil, rpcx.String(address)) if err != nil { return nil, err } ret = rp.Ret } d.keyMap[address] = ret pubKey = ret } ke, err := ecdh.NewEllipticECDH(btcec.S256()) if err != nil { return nil, err } secret, err := ke.ComputeSecret(d.privKey, pubKey) if err != nil { return nil, err } return sym.GenerateSymKey(crypto.ThirdDES, secret) }