diff --git a/accounts/scwallet/wallet.go b/accounts/scwallet/wallet.go index 5ceab98084..71b2c68af1 100644 --- a/accounts/scwallet/wallet.go +++ b/accounts/scwallet/wallet.go @@ -1049,27 +1049,25 @@ func (s *Session) sign(path accounts.DerivationPath, hash []byte) ([]byte, error // determinePublicKey uses a signature and the X component of a public key to // recover the entire public key. func determinePublicKey(sig, pubkeyX []byte) ([]byte, error) { - for v := 0; v < 2; v++ { - sig[64] = byte(v) - if pubkey, err := crypto.Ecrecover(DerivationSignatureHash[:], sig); err == nil { - if bytes.Equal(pubkey, pubkeyX) { - return pubkey, nil - } - } - } - return nil, ErrPubkeyMismatch + return makeRecoverableSignature(DerivationSignatureHash[:], sig, pubkeyX) } // makeRecoverableSignature uses a signature and an expected public key to // recover the v value and produce a recoverable signature. func makeRecoverableSignature(hash, sig, expectedPubkey []byte) ([]byte, error) { + var libraryError error for v := 0; v < 2; v++ { sig[64] = byte(v) if pubkey, err := crypto.Ecrecover(hash, sig); err == nil { if bytes.Equal(pubkey, expectedPubkey) { return sig, nil } + } else { + libraryError = err } } + if libraryError != nil { + return nil, libraryError + } return nil, ErrPubkeyMismatch }