#!/usr/bin/env python3 """Send a raw APDU (hex) to whatever app is currently open on a connected Ledger. Usage: ./scripts/send-apdu E005010015058000002C8000374F800000000000000000000000 Or pipe: echo E005010015058000002C8000374F800000000000000000000000 | ./scripts/send-apdu """ import sys from ledgerwallet.transport import enumerate_devices def main() -> int: if len(sys.argv) > 1: hex_apdu = sys.argv[1] else: hex_apdu = sys.stdin.read().strip() hex_apdu = hex_apdu.replace(" ", "").replace("\n", "") if not hex_apdu: print("usage: send-apdu ", file=sys.stderr) return 2 apdu = bytes.fromhex(hex_apdu) devices = enumerate_devices() if not devices: print("no Ledger device found", file=sys.stderr) return 1 transport = devices[0] transport.open() try: print(f"-> {apdu.hex().upper()}") # 60s timeout to give the user time to confirm on-device. response = transport.exchange(apdu, timeout=60000) if len(response) < 2: print(f"<- short response: {response.hex().upper()}") return 1 data, sw = response[:-2], int.from_bytes(response[-2:], "big") print(f"<- sw={sw:04x} data={data.hex().upper()} ({len(data)} bytes)") finally: transport.close() return 0 if response[-2:] == b"\x90\x00" else 1 if __name__ == "__main__": sys.exit(main())