good morning!!!!

Skip to content
Snippets Groups Projects
Commit 61c5edcb authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Cleanup.

parent af153e78
No related branches found
No related tags found
No related merge requests found
......@@ -61,27 +61,30 @@ func ripemd160Func(in []byte) []byte {
return common.LeftPadBytes(crypto.Ripemd160(in), 32)
}
const EcRecoverInputLength = 128
const ecRecoverInputLength = 128
func ecrecoverFunc(in []byte) []byte {
// "in" is (hash, v, r, s), each 32 bytes
// but for ecrecover we want (r, s, v)
if len(in) < EcRecoverInputLength {
if len(in) < ecRecoverInputLength {
return nil
}
hash := in[:32]
// v is only a bit, but comes as 32 bytes from vm. We only need least significant byte
encodedV := in[32:64]
v := encodedV[31] - 27
if !(v == 0 || v == 1) {
// Treat V as a 256bit integer
v := new(big.Int).Sub(common.Bytes2Big(in[32:64]), big.NewInt(27))
// Ethereum requires V to be either 0 or 1 => (27 || 28)
if !(v.Cmp(Zero) == 0 || v.Cmp(One) == 0) {
return nil
}
sig := append(in[64:], v)
pubKey := crypto.Ecrecover(append(hash, sig...))
// secp256.go returns either nil or 65 bytes
// v needs to be moved to the end
rsv := append(in[64:128], byte(v.Uint64()))
pubKey := crypto.Ecrecover(in[:32], rsv)
// make sure the public key is a valid one
if pubKey == nil || len(pubKey) != 65 {
return nil
}
// the first byte of pubkey is bitcoin heritage
return common.LeftPadBytes(crypto.Sha3(pubKey[1:])[12:], 32)
}
......
......@@ -68,13 +68,8 @@ func Ripemd160(data []byte) []byte {
return ripemd.Sum(nil)
}
func Ecrecover(data []byte) []byte {
var in = struct {
hash []byte
sig []byte
}{data[:32], data[32:]}
r, _ := secp256k1.RecoverPubkey(in.hash, in.sig)
func Ecrecover(hash, sig []byte) []byte {
r, _ := secp256k1.RecoverPubkey(hash, sig)
return r
}
......@@ -151,9 +146,12 @@ func GenerateKey() (*ecdsa.PrivateKey, error) {
}
func SigToPub(hash, sig []byte) *ecdsa.PublicKey {
s := Ecrecover(append(hash, sig...))
x, y := elliptic.Unmarshal(S256(), s)
s := Ecrecover(hash, sig)
if s == nil || len(s) != 65 {
return nil
}
x, y := elliptic.Unmarshal(S256(), s)
return &ecdsa.PublicKey{S256(), x, y}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment