Updated AirPod Keys (markdown)

Matthias Urhahn
2025-07-11 08:42:35 +02:00
parent 1b5a8d69ff
commit cd1e72d258
+66 -1
@@ -105,7 +105,72 @@ Any MacOS version should work. This example is from a Mac Air (M1) running Sonom
### Linux
You can retrieve the keys on Linux using the [Home Assistant Private BLE Device Integration](https://www.home-assistant.io/integrations/private_ble_device/). This integration allows you to extract the necessary information from the AirPods.
You can retrieve the keys via this custom script, thanks to [@kavishdevar](https://github.com/kavishdevar) :heart:
```python
import sys
import socket
PROXIMITY_KEY_TYPES = {
0x01: "IRK",
0x04: "ENC_KEY",
}
def parse_proximity_keys_response(data):
if len(data) < 7 or data[4] != 0x31:
return None
key_count = data[6]
keys = []
offset = 7
for _ in range(key_count):
if offset + 3 >= len(data):
break
key_type = data[offset]
key_length = data[offset + 2]
offset += 4
if offset + key_length > len(data):
break
key_bytes = data[offset:offset + key_length]
keys.append((PROXIMITY_KEY_TYPES.get(key_type, f"TYPE_{key_type:02X}"), key_bytes))
offset += key_length
return keys
def hexdump(data):
return " ".join(f"{b:02X}" for b in data)
def main():
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <MAC>")
sys.exit(1)
bdaddr = sys.argv[1]
PSM = 0x1001
handshake = bytes.fromhex("00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00")
key_req = bytes.fromhex("04 00 04 00 30 00 05 00")
sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP)
sock.connect((bdaddr, PSM))
sock.send(handshake)
sock.send(key_req)
try:
while True:
pkt = sock.recv(1024)
keys = parse_proximity_keys_response(pkt)
if keys is not None:
print("Proximity Keys:")
for name, key_bytes in keys:
print(f" {name}: {hexdump(key_bytes)}")
break
finally:
sock.close()
if __name__ == "__main__":
main()
```
_Via https://github.com/d4rken-org/capod/issues/290#issuecomment-3046151031_
### Windows