Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
6a95e01
eos singing
Sriep Mar 18, 2019
b88791b
Add eos support to RecoverAddressFromTypedSig
Sriep Mar 18, 2019
b9a69c0
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Mar 19, 2019
c21a49a
add github.com/eosspark/eos-go/crypto
Sriep Mar 19, 2019
0d7c319
non evm build
Sriep Mar 19, 2019
2872439
fix ecc revision, refactor.
Sriep Mar 19, 2019
c89c26c
refactoring.
Sriep Mar 19, 2019
29f3fed
eosspark
Sriep Mar 19, 2019
6be0373
syntax error
Sriep Mar 19, 2019
30461e2
refactoring
Sriep Mar 19, 2019
f1b5ffa
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 11, 2019
9e4f123
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 12, 2019
d636938
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 17, 2019
65a351d
add scatter
Sriep Apr 18, 2019
d23fcae
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 18, 2019
fda6b84
add SignatureType_EOS_SCATTER
Sriep Apr 18, 2019
65385f8
add SignatureType_EOS_SCATTER
Sriep Apr 18, 2019
6706bc7
Updated scatter sign hash
eduardonunesp Apr 23, 2019
5cb6578
Merge branch 'eos-siging' of https://github.com/loomnetwork/go-loom i…
Sriep Apr 24, 2019
d347eb7
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 24, 2019
9e6e75c
Checking scatter sign
eduardonunesp Apr 24, 2019
570d110
Fixed eos sig len
eduardonunesp Apr 24, 2019
025b5fd
Checking scatter hash
eduardonunesp Apr 25, 2019
d6ace71
Checking scatter hash
eduardonunesp Apr 25, 2019
352eedf
Updated hash check for scatter
eduardonunesp Apr 26, 2019
615f9b1
add SignatureType_EOS_SCATTER
Sriep Apr 29, 2019
cf96726
Merge remote-tracking branch 'origin/eos-scatter-sign' into eos-scatt…
Sriep Apr 29, 2019
0f70c1f
Merge pull request #360 from loomnetwork/eos-scatter-sign
Sriep Apr 29, 2019
bb51b76
eos-scatter sign
Sriep Apr 29, 2019
aca6a1b
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep Apr 30, 2019
c51bc0c
merge master
Sriep May 9, 2019
8cb57b7
renamne eos-scatter to scatter
Sriep May 15, 2019
859bb8f
Merge remote-tracking branch 'remotes/origin/master' into eos-siging
Sriep May 15, 2019
193b90d
renamne eos-scatter to scatter
Sriep May 15, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ PROTOC = protoc --plugin=./protoc-gen-gogo -I$(GOPATH)/src -I/usr/local/include
GOGO_PROTOBUF_DIR = $(GOPATH)/src/github.com/gogo/protobuf
HASHICORP_DIR = $(GOPATH)/src/github.com/hashicorp/go-plugin
GETH_DIR = $(GOPATH)/src/github.com/ethereum/go-ethereum
EOS_DIR = $(GOPATH)/src/github.com/eosspark/eos-go
SSHA3_DIR = $(GOPATH)/src/github.com/miguelmota/go-solidity-sha3
# This commit sha should match the one in loomchain repo
GETH_GIT_REV = 1fb6138d017a4309105d91f187c126cf979c93f9

EOS_GIT_REV = 2a0f2243770a4ca745ebe30d0594a76e135d6a4d
.PHONY: all evm examples get_lint update_lint example-cli evmexample-cli example-plugins example-plugins-external plugins proto test lint deps clean test-evm deps-evm deps-all lint

all: examples
Expand Down Expand Up @@ -101,6 +102,9 @@ $(SSHA3_DIR):
$(GETH_DIR):
git clone -q https://github.com/loomnetwork/go-ethereum.git $@

$(EOS_DIR):
git clone -q https://github.com/eosspark/eos-go.git $@

deps-all: deps deps-evm

deps:
Expand All @@ -121,8 +125,9 @@ deps:
cd $(GOGO_PROTOBUF_DIR) && git checkout v1.1.1
cd $(HASHICORP_DIR) && git checkout f4c3476bd38585f9ec669d10ed1686abd52b9961

deps-evm: $(SSHA3_DIR) $(GETH_DIR)
deps-evm: $(SSHA3_DIR) $(GETH_DIR) $(EOS_DIR)
cd $(GETH_DIR) && git checkout master && git pull && git checkout $(GETH_GIT_REV)
cd $(EOS_DIR) && git checkout master && git pull && git checkout $(EOS_GIT_REV)
go get \
github.com/loomnetwork/yubihsm-go \
gopkg.in/check.v1
Expand Down
52 changes: 52 additions & 0 deletions auth/eos-signer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// +build evm

package auth

import (
"crypto/ecdsa"
"crypto/sha256"
"encoding/hex"
"strconv"
"strings"

"github.com/eosspark/eos-go/crypto/ecc"
"github.com/ethereum/go-ethereum/crypto"
"github.com/gogo/protobuf/proto"
"github.com/loomnetwork/go-loom/common/evmcompat"
)

type EosSigner struct {
PrivateKey *ecc.PrivateKey
}

func (e *EosSigner) Sign(txBytes []byte) []byte {
hash := sha256.Sum256([]byte(strings.ToUpper(hex.EncodeToString(txBytes))))
var nonceTx NonceTx
if err := proto.Unmarshal(txBytes, &nonceTx); err != nil {
panic(err)
}
typedSignature := []byte{byte(evmcompat.SignatureType_EOS)}

nonceBytes := []byte(strconv.FormatUint(nonceTx.Sequence, 10))[:6]
typedSignature = append(typedSignature, nonceBytes...)

nonceHash := sha256.Sum256([]byte(hex.EncodeToString(nonceBytes)))
scatterMsgHash := sha256.Sum256([]byte(hex.EncodeToString(hash[:]) + hex.EncodeToString(nonceHash[:])))

signature, err := e.PrivateKey.Sign(scatterMsgHash[:])
if err != nil {
panic(err)
}
typedSignature = append(typedSignature, []byte(signature.String())...)

return typedSignature
}

func (e *EosSigner) PublicKey() []byte {
btcecPubKey, err := e.PrivateKey.PublicKey().Key()
if err != nil {
panic(err)
}
ecdsaPubKey := ecdsa.PublicKey(*btcecPubKey)
return crypto.FromECDSAPub(&ecdsaPubKey)
}
13 changes: 13 additions & 0 deletions auth/no-evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package auth
import (
"crypto/ecdsa"
"fmt"
"github.com/eosspark/eos-go/crypto/ecc"
)

func GetTxHash(_ []byte) ([]byte, error) {
Expand Down Expand Up @@ -38,3 +39,15 @@ func (k *TronSigner) Sign(_ []byte) []byte {
func (k *TronSigner) PublicKey() []byte {
return nil
}

type EosSigner struct {
PrivateKey *ecc.PrivateKey
}

func (k *EosSigner) Sign(_ []byte) []byte {
return nil
}

func (k *EosSigner) PublicKey() []byte {
return nil
}
92 changes: 72 additions & 20 deletions common/evmcompat/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ package evmcompat
import (
"bytes"
"crypto/ecdsa"
"crypto/sha256"
"encoding/binary"
"encoding/hex"
"errors"
"fmt"
"math/big"
"strconv"
"strings"

"github.com/pkg/errors"

"github.com/eosspark/eos-go/crypto/ecc"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto/sha3"
Expand All @@ -22,9 +25,10 @@ import (
type SignatureType uint8

const (
SignatureType_EIP712 SignatureType = 0
SignatureType_GETH SignatureType = 1
SignatureType_TREZOR SignatureType = 2
SignatureType_EIP712 SignatureType = iota
SignatureType_GETH
SignatureType_TREZOR
SignatureType_EOS
)

// SoliditySign signs the given data with the specified private key and returns the 65-byte signature.
Expand Down Expand Up @@ -78,30 +82,78 @@ func GenerateTypedSig(data []byte, privKey *ecdsa.PrivateKey, sigType SignatureT
// RecoverAddressFromTypedSig recovers the Ethereum address from a signed hash and a 66-byte signature
// (the first byte of which is expected to denote the SignatureType).
func RecoverAddressFromTypedSig(hash []byte, sig []byte) (common.Address, error) {
var signer common.Address

if len(sig) != 66 {
return signer, fmt.Errorf("signature must be 66 bytes, not %d bytes", len(sig))
}
var err error

switch SignatureType(sig[0]) {
case SignatureType_EIP712:
err = recoverAddressFromEIP712(sig[1:])
case SignatureType_GETH:
hash = ssha.SoliditySHA3(
ssha.String("\x19Ethereum Signed Message:\n32"),
ssha.Bytes32(hash),
)
hash, err = recoverAddressFromGeth(hash, sig[1:])
case SignatureType_TREZOR:
hash = ssha.SoliditySHA3(
ssha.String("\x19Ethereum Signed Message:\n\x20"),
ssha.Bytes32(hash),
)
hash, err = recoverAddressFromTrezor(hash, sig[1:])
case SignatureType_EOS:
return recoverAddressFromEos(hash, sig[1:])
default:
return signer, fmt.Errorf("invalid signature type: %d", sig[0])
err = fmt.Errorf("invalid signature type: %d", sig[0])
}
if err != nil {
return common.Address{}, err
}

return SolidityRecover(hash, sig[1:])
}

func recoverAddressFromEIP712(sig []byte) error {
if len(sig) != 65 {
return fmt.Errorf("signature must be 66 bytes, not %d bytes", len(sig))
}
return nil
}

func recoverAddressFromGeth(hash []byte, sig []byte) ([]byte, error) {
if len(sig) != 65 {
return nil, fmt.Errorf("signature must be 66 bytes, not %d bytes", len(sig))
}
return ssha.SoliditySHA3(
ssha.String("\x19Ethereum Signed Message:\n32"),
ssha.Bytes32(hash),
), nil
}

signer, err := SolidityRecover(hash, sig[1:])
return signer, err
func recoverAddressFromTrezor(hash []byte, sig []byte) ([]byte, error) {
if len(sig) != 65 {
return nil, fmt.Errorf("signature must be 66 bytes, not %d bytes", len(sig))
}
return ssha.SoliditySHA3(
ssha.String("\x19Ethereum Signed Message:\n\x20"),
ssha.Bytes32(hash),
), nil
}

func recoverAddressFromEos(hash []byte, sig []byte) (common.Address, error) {
var signer common.Address

if len(sig) != 107 {
return signer, fmt.Errorf("eos signature must be 107 bytes, not %d bytes", len(sig))
}
signature, err := ecc.NewSignature(string(sig[6:]))
if err != nil {
return signer, fmt.Errorf("cannot unpack eos signature %v", string(sig))
}

nonceHash := sha256.Sum256([]byte(hex.EncodeToString(sig[:6])))
scatterMsgHash := sha256.Sum256([]byte(hex.EncodeToString(hash) + hex.EncodeToString(nonceHash[:])))

pubKey, err := signature.PublicKey(scatterMsgHash[:])
if err != nil {
return signer, fmt.Errorf("cannot get publlic key from hash %v", string(hash))
}
btcecPubKey, err := pubKey.Key()
if err != nil {
return signer, errors.Wrapf(err, "retrieve btcec key from eos key %v", pubKey)
}
local := crypto.PubkeyToAddress(ecdsa.PublicKey(*btcecPubKey))
return local, nil
}

//TODO in future all interfaces and not do conversions from strings
Expand Down