def ecdsa_recover(message, signature): assert len(signature) == 65 pub = ecdsa_raw_recover(message, _decode_sig(signature)) assert pub, 'pubkey could not be recovered' pub = bitcoin.encode_pubkey(pub, 'bin_electrum') assert len(pub) == 64 return pub
def recover_sender(self): if self.v: if self.r >= N or self.s >= P or self.v < 27 or self.v > 28 \ or self.r == 0 or self.s == 0: raise InvalidSignature() rlpdata = rlp.encode(self, self.__class__.exclude(['v', 'r', 's'])) rawhash = sha3(rlpdata) pub = ecdsa_raw_recover(rawhash, (self.v, self.r, self.s)) if pub is False or pub == (0, 0): raise InvalidSignature() pub = encode_pubkey(pub, 'bin') return sha3(pub[1:])[-20:]
def sender(self): if not self._sender: # Determine sender if self.v: if self.r >= N or self.s >= P or self.v < 27 or self.v > 28: raise InvalidTransaction("Invalid signature values!") log.debug('recovering sender') rlpdata = rlp.encode(self, UnsignedTransaction) rawhash = utils.sha3(rlpdata) pub = encode_pubkey(ecdsa_raw_recover(rawhash, (self.v, self.r, self.s)), 'bin') self._sender = utils.sha3(pub[1:])[-20:] assert self.sender == self._sender else: self._sender = 0 return self._sender
def sender(self): if not self._sender: # Determine sender if self.v: if self.r >= N or self.s >= P or self.v < 27 or self.v > 28: raise InvalidTransaction("Invalid signature values!") log.debug('recovering sender') rlpdata = rlp.encode(self, UnsignedTransaction) rawhash = utils.sha3(rlpdata) pub = encode_pubkey( ecdsa_raw_recover(rawhash, (self.v, self.r, self.s)), 'bin') self._sender = utils.sha3(pub[1:])[-20:] assert self.sender == self._sender else: self._sender = 0 return self._sender
def sender(self): if not self._sender: # Determine sender if self.v: if self.r >= N or self.s >= P or self.v < 27 or self.v > 28 or self.r == 0 or self.s == 0: raise InvalidTransaction("Invalid signature values!") log.debug('recovering sender') rlpdata = rlp.encode(self, UnsignedTransaction) rawhash = utils.sha3(rlpdata) pub = ecdsa_raw_recover(rawhash, (self.v, self.r, self.s)) if pub is False: raise InvalidTransaction("Invalid signature values (x^3+7 is non-residue)") if pub == (0, 0): raise InvalidTransaction("Invalid signature (zero privkey cannot sign)") pub = encode_pubkey(pub, 'bin') self._sender = utils.sha3(pub[1:])[-20:] assert self.sender == self._sender else: self._sender = 0 return self._sender