def buildTxApdu(dongle_path, data): """ Generate apdu from data. This apdu is to be sent into the ledger key. Argument: dongle_path -- value returned by parseBip32Path data -- bytes value returned by dposlib.core.crypto.getBytes Return bytes """ path_len = len(dongle_path) if len(data) > 255 - (path_len + 1): data1 = data[:255 - (path_len + 1)] data2 = data[255 - (path_len + 1):] p1 = util.unhexlify("e0040040") else: data1 = data data2 = util.unhexlify("") p1 = util.unhexlify("e0048040") return [ p1 + util.intasb(1 + path_len + len(data1)) + util.intasb(path_len // 4) + dongle_path + data1, util.unhexlify("e0048140") + util.intasb(len(data2)) + data2 if len(data2) else None ]
def buildSignatureApdu(data, dongle_path, what="tx", schnorr=True): apdu = [] path_len = len(dongle_path) payload = len(data) + len(dongle_path) + 1 if payload > payloadMax: raise CommException('Payload size:', payload, 'exceeds max length:', payloadMax) data = splitData(data, dongle_path) if len(data) == 1: first, body, last = data[0], [], None else: first, body, last = data[0], data[1:-1], data[-1] p2 = p2_schnorr_leg if schnorr else p2_ecdsa p1 = p1_single if last is None else p1_first op = getattr(sys.modules[__name__], "op_sign_" + what) apdu.append( unhexlify(cla + op + p1 + p2) + intasb(path_len + 1 + len(first)) + intasb(path_len // 4) + dongle_path + first) for b in body: apdu.append(unhexlify(cla + op + p1_more + p2) + intasb(len(b)) + b) if last is not None: apdu.append( unhexlify(cla + op + p1_last + p2) + intasb(len(last)) + last) return apdu
def buildPukApdu(dongle_path): path_len = len(dongle_path) return \ unhexlify(cla + op_puk + p1_non_confirm + p2_no_chaincode) + \ intasb(path_len + 1) + \ intasb(path_len // 4) + \ dongle_path
def buildPkeyApdu(dongle_path): """ Generate apdu to get public key from ledger key. Argument: dongle_path -- value returned by parseBip32Path Return bytes """ path_len = len(dongle_path) return util.unhexlify("e0020040") + util.intasb(1 + path_len) + \ util.intasb(path_len//4) + dongle_path
def buildPukApdu(dongle_path): """ Generate apdu to get public key from ledger key. Args: dongle_path (bytes): value returned by [`dposlib.ark.ldgr.parseBip44Path`]( crypto.md#parsebip44path ) Returns: public key apdu data as bytes """ path_len = len(dongle_path) return \ unhexlify(cla + op_puk + p1_non_confirm + p2_no_chaincode) + \ intasb(path_len + 1) + \ intasb(path_len // 4) + \ dongle_path
def getSignature(data, dongle_path, debug=False): """ Get ledger Nano S signature of given transaction. Argument: data -- transaction as bytes data returned by dposlib.core.crypto.getBytes dongle_path -- value returned by parseBip32Path Keyword argument: debug -- flag to activate debug messages from ledger key [default: False] Return str (hex) """ apdu1, apdu2 = buildTxApdu(dongle_path, data) dongle = getDongle(debug) result = dongle.exchange(bytes(apdu1), timeout=30) if apdu2: apdu = util.unhexlify("e0048140") + util.intasb(len(apdu2)) + apdu2 result = dongle.exchange(bytes(apdu), timeout=30) dongle.close() return util.hexlify(result)