def get_master_public_key(self, bip32_path): self.checkDevice() # bip32_path is of the form 44'/0'/1' # S-L-O-W - we don't handle the fingerprint directly, so compute # it manually from the previous node # This only happens once so it's bearable #self.get_client() # prompt for the PIN before displaying the dialog if necessary #self.handler.show_message("Computing master public key") splitPath = bip32_path.split('/') if splitPath[0] == 'm': splitPath = splitPath[1:] bip32_path = bip32_path[2:] fingerprint = 0 if len(splitPath) > 1: prevPath = "/".join(splitPath[0:len(splitPath) - 1]) nodeData = self.dongleObject.getWalletPublicKey(prevPath) publicKey = compress_public_key(nodeData['publicKey']) h = hashlib.new('ripemd160') h.update(hashlib.sha256(publicKey).digest()) fingerprint = unpack(">I", h.digest()[0:4])[0] nodeData = self.dongleObject.getWalletPublicKey(bip32_path) publicKey = bytes(compress_public_key(nodeData['publicKey'])) depth = len(splitPath) lastChild = splitPath[len(splitPath) - 1].split('\'') childnum = int(lastChild[0]) if len( lastChild) == 1 else 0x80000000 | int(lastChild[0]) derivation = BIP32Derivation( chain_code=nodeData['chainCode'], depth=depth, parent_fingerprint=pack_be_uint32(fingerprint), n=childnum) return BIP32PublicKey(PublicKey.from_bytes(publicKey), derivation, Net.COIN)
def f(x_pubkey): if x_pubkey.is_bip32_key(): xpub, path = x_pubkey.bip32_extended_key_and_path() else: xpub = BIP32PublicKey(bfh(x_pubkey), NULL_DERIVATION, Net.COIN) xpub = xpub.to_extended_key_string() path = [] node = self.ckd_public.deserialize(xpub) return self.types.HDNodePathType(node=node, address_n=path)
def f(x_pubkey): if is_xpubkey(x_pubkey): xpub, s = parse_xpubkey(x_pubkey) else: xpub = BIP32PublicKey(bfh(x_pubkey), NULL_DERIVATION, Net.COIN) xpub = xpub.to_extended_key_string() s = [] node = self.ckd_public.deserialize(xpub) return self.types.HDNodePathType(node=node, address_n=s)
def get_master_public_key(self, bip32_path, creating=False): address_n = bip32_decompose_chain_string(bip32_path) with self.run_flow(creating_wallet=creating): node = trezorlib.btc.get_public_node(self.client, address_n).node self.used() derivation = BIP32Derivation(chain_code=node.chain_code, depth=node.depth, parent_fingerprint=pack_be_uint32( node.fingerprint), n=node.child_num) return BIP32PublicKey(PublicKey.from_bytes(node.public_key), derivation, Net.COIN)
def get_master_public_key(self, bip32_path): address_n = bip32_decompose_chain_string(bip32_path) creating = False node = self.get_public_node(address_n, creating).node self.used() derivation = BIP32Derivation(chain_code=node.chain_code, depth=node.depth, parent_fingerprint=pack_be_uint32( node.fingerprint), n=node.child_num) return BIP32PublicKey(PublicKey.from_bytes(node.public_key), derivation, Net.COIN)
def get_master_public_key(self, bip32_path: str, creating: bool = False) -> BIP32PublicKey: address_n = bip32_decompose_chain_string(bip32_path) # This will be cleared by the wrapper around `get_public_node`. self.creating_wallet = creating node = self.get_public_node(address_n).node self.used() derivation = BIP32Derivation(chain_code=node.chain_code, depth=node.depth, parent_fingerprint=pack_be_uint32( node.fingerprint), n=node.child_num) return BIP32PublicKey(PublicKey.from_bytes(node.public_key), derivation, Net.COIN)