diff --git a/AirPod-Keys.md b/AirPod-Keys.md index 801f9ee..75df621 100644 --- a/AirPod-Keys.md +++ b/AirPod-Keys.md @@ -28,8 +28,154 @@ It's possible to retrieve the keys on any platform by using a virtual machine: ### macOS +#### Direct via script + +Thanks to [@akshaynexus](https://github.com/akshaynexus) :heart: + +
+ +airpod_key_retrieval.sh + +```bash +#!/usr/bin/env bash + +set -u + +SYSTEM_KEYCHAIN="/Library/Keychains/System.keychain" + +usage() { + cat <<'EOF' +Usage: + ./get_airpod_keys.sh + ./get_airpod_keys.sh --address AA:BB:CC:DD:EE:FF + +Extracts AirPods / Beats MagicAcc keys from the macOS MobileBluetooth +Keychain item for CAPod: + - MagicAccIRK -> CAPod Identity key + - MagicAccEncKey -> CAPod Encryption key + +macOS may show Keychain permission prompts. These keys are sensitive. +EOF +} + +normalize_mac() { + printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]' +} + +discover_bluetooth_addresses() { + system_profiler SPBluetoothDataType -json 2>/dev/null \ + | awk -F '"' '/"device_address"[[:space:]]*:/ { print $4 }' \ + | sort -u +} + +lookup_mobilebluetooth_item() { + local address="$1" + + security find-generic-password \ + -a "$address" \ + -s MobileBluetooth \ + -g "$SYSTEM_KEYCHAIN" 2>&1 +} + +extract_plist_value() { + local key="$1" + + # security(1) prints the password plist as an escaped one-line string, so + # this intentionally parses the ...... pattern. + sed -nE "s/.*${key}<\\/key>[^<]*([^<]+)<\\/string>.*/\\1/p" +} + +print_keys_for_address() { + local address="$1" + local output + local irk + local enc_key + local local_address + + output="$(lookup_mobilebluetooth_item "$address")" + + irk="$(printf '%s\n' "$output" | extract_plist_value "MagicAccIRK")" + enc_key="$(printf '%s\n' "$output" | extract_plist_value "MagicAccEncKey")" + local_address="$(printf '%s\n' "$output" | extract_plist_value "LocalAddress")" + + if [[ -z "$irk" || -z "$enc_key" ]]; then + return 1 + fi + + printf 'Bluetooth address: %s\n' "$address" + if [[ -n "$local_address" ]]; then + printf 'Local Mac address: %s\n' "$local_address" + fi + printf 'CAPod Identity key / MagicAccIRK:\n%s\n\n' "$irk" + printf 'CAPod Encryption key / MagicAccEncKey:\n%s\n' "$enc_key" + printf '%s\n' '---' + return 0 +} + +main() { + local addresses=() + local found=0 + + while [[ $# -gt 0 ]]; do + case "$1" in + --address|-a) + if [[ $# -lt 2 ]]; then + usage >&2 + exit 2 + fi + addresses+=("$(normalize_mac "$2")") + shift 2 + ;; + --help|-h) + usage + exit 0 + ;; + *) + printf 'Unknown argument: %s\n\n' "$1" >&2 + usage >&2 + exit 2 + ;; + esac + done + + if [[ ${#addresses[@]} -eq 0 ]]; then + while IFS= read -r address; do + [[ -n "$address" ]] && addresses+=("$(normalize_mac "$address")") + done < <(discover_bluetooth_addresses) + fi + + if [[ ${#addresses[@]} -eq 0 ]]; then + printf 'No Bluetooth device addresses found. Try --address AA:BB:CC:DD:EE:FF\n' >&2 + exit 1 + fi + + for address in "${addresses[@]}"; do + if print_keys_for_address "$address"; then + found=1 + fi + done + + if [[ "$found" -eq 0 ]]; then + printf 'No MobileBluetooth entries with MagicAccIRK/MagicAccEncKey were found.\n' >&2 + printf 'Make sure the AirPods are paired with this Mac, then try again.\n' >&2 + exit 1 + fi +} + +main "$@" +``` +
+ +_Via https://github.com/d4rken-org/capod/pull/597_ + +#### Manual via user interface + [Might not work on all macOS versions](https://github.com/d4rken-org/capod/issues/356). This example is from a Mac Air (M1) running Sonoma 14.6.1. +
+ +Manual guide + 1. Pair the AirPods. They should show up in the list of Bluetooth devices. @@ -106,12 +252,17 @@ It's possible to retrieve the keys on any platform by using a virtual machine: - +
### Linux -You can retrieve the keys via this custom script, thanks to [@kavishdevar](https://github.com/kavishdevar) :heart: +You can retrieve the keys via this custom python script, thanks to [@kavishdevar](https://github.com/kavishdevar) :heart: + + +
+ +airpod_key_retrieval.py ```python import sys @@ -176,6 +327,9 @@ if __name__ == "__main__": main() ``` +
+ + _Via https://github.com/d4rken-org/capod/issues/290#issuecomment-3046151031_ ### Windows