Skip to content

Instantly share code, notes, and snippets.

@btchip
Last active November 10, 2021 18:48
Show Gist options
  • Save btchip/85b4018f0c421bd72c8f818ec31c69ef to your computer and use it in GitHub Desktop.
Save btchip/85b4018f0c421bd72c8f818ec31c69ef to your computer and use it in GitHub Desktop.
Minimalistic Python implementation of Ledger Live HID proxy
from ledgerblue.comm import getDongle, CommException
import asyncio
import websockets
import json
import binascii
dongle = None
async def hidProxy(websocket, path):
global dongle
while True:
data = await websocket.recv()
print("Processing " + data)
response = {}
if data == "open":
response['type'] = "opened"
await websocket.send(json.dumps(response))
continue
if dongle == None:
dongle = getDongle(True)
apduResponse = None
sw = None
try:
apduResponse = dongle.exchange(binascii.unhexlify(data))
except CommException as e:
sw = e.sw
except Exception:
try:
dongle.close()
except:
pass
dongle = None
try:
dongle = getDongle(True)
apduResponse = dongle.exchange(binascii.unhexlify(data))
except:
pass
if sw != None:
response['type'] = "response"
response['data'] = "%0.4X" % sw
else:
if apduResponse != None:
response['type'] = "response"
response['data'] = binascii.hexlify(apduResponse).decode('utf-8') + "9000"
else:
response['type'] = "error"
response['data'] = "Failed to exchange APDU"
await websocket.send(json.dumps(response))
print("Running websocket server")
server = websockets.serve(hidProxy, "localhost", 8435)
asyncio.get_event_loop().run_until_complete(server)
asyncio.get_event_loop().run_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment