Kindshare: Ontvang bestanden via Android Quick Share op een gejailbreakte Kindle

Het programma kan de Kindle transformeren in een Wi-Fi-toegangspunt (SoftAP) voor situaties waarin geen netwerk beschikbaar is, zodat de telefoon direct met de Kindle kan verbinden. Naast Android werken alle Quick Share-verzenders; versturen vanaf macOS met NearDrop is eveneens geverifieerd.

Bestanden worden opgeslagen in /mnt/us/documents, waardoor een verzonden epub-bestand direct in je bibliotheek verschijnt. Kindshare wordt geleverd als een KOReader-plugin. Alle functies worden aangestuurd via KOReaderNetwerkQuick Share / SoftAP. Hier kun je de ontvangst in- of uitschakelen, automatische start bij opstarten inschakelen, het toegangspunt beheren en diagnostische gegevens inzien — volledig op het apparaat, zonder dat er na installatie een shell nodig is.

Interface van de Quick Share / SoftAP plugin

  • Receiving: AAN (tikken om te stoppen)
  • Start receiving at boot: [x]
  • Service status
  • Start access point
  • Stop access point, restore Wi-Fi
  • Keep access point up (disarm timer)
  • Diagnostics
  • Save diagnostics to /mnt/us

De plugin fungeert enkel als besturingslaag; de ontvanger zelf draait als een kleine achtergrond-daemon, waardoor transfers blijven werken als KOReader niet is geopend.

Compatibiliteit: Geverifieerd op een Kindle Voyage, firmware 5.13.6 (kernel 3.0.35-lab126, Atheros AR6003 / ath6kl_sdio). Raadpleeg docs/COMPATIBILITY.md voor meer informatie. Let op: de Quick Share-functionaliteit vereist geen toegangspunt-ondersteuning, wat het compatibel maakt met veel meer hardware dan de SoftAP-functie.

Projectstructuur

PadBeschrijving
plugin/kindleap.koplugin/KOReader-plugin — de gebruikersinterface op het apparaat
src/kindshare/De Quick Share-ontvanger daemon (Go)
src/kindrop/Een eenvoudige HTTP-uploadpagina als fallback-ontvanger
device/Scripts en configuraties die op het apparaat worden geïnstalleerd
proto/Protobuf-definities voor het Nearby Share-protocol
build/Dockerfile voor het cross-compileren van hostapd voor armv7
docs/Informatie over compatibiliteit, porting, protocolnotities en probleemoplossing

Vereisten

  • Een gejailbreakte Kindle met KUAL en KOReader.
  • SSH-toegang (meestal via de usbnetwork hack).
  • Een Linux/macOS/Windows-machine met Go en Docker om het project te bouwen.
  • Op de telefoon is niets extra's nodig; Quick Share is een standaardfunctie van Android.

Installatie

1. De ontvanger bouwen

Bouw de ontvanger als een statisch binary zonder libc-afhankelijkheid op het apparaat:

cd src/kindshare
GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o kindshare .

2. Bestanden kopiëren naar de Kindle

scp kindshare            root@KINDLE:/mnt/us/kindler/bin/
scp ../../device/*.sh    root@KINDLE:/mnt/us/kindler/
scp ../../device/*.conf  root@KINDLE:/mnt/us/kindler/etc/
scp -r ../../plugin/kindleap.koplugin root@KINDLE:/mnt/us/koreader/plugins/

3. Activeren op het apparaat

chmod +x /mnt/us/kindler/*.sh /mnt/us/kindler/bin/*
/mnt/us/kindler/kindshare-svc.sh start

Voor SoftAP is ook hostapd vereist (zie docs/PORTING.md).

Let op: Scripts moeten UNIX-regeleinden hebben. Als je ze op Windows bewerkt, voer dan sed -i 's/\r$//' *.sh uit op het apparaat om shell-fouten te voorkomen.

Automatisch opstarten (optioneel)

Om de service bij elke boot te starten, voer de volgende commando's uit:

mntroot rw
cp /mnt/us/kindler/kindshare.conf /etc/upstart/kindshare.conf
mntroot ro
/mnt/us/kindler/kindshare-svc.sh enable

Dit is de enige schrijfactie op het root-bestandssysteem. Daarna wordt het in- of uitschakelen van autostart beheerd via /mnt/us/kindler/autostart, zodat het root-systeem niet opnieuw gemount hoeft te worden.

KOReader-plugin setup

Installatie

Kopieer de plugin-map naar de plugins-directory van KOReader en start KOReader opnieuw op:

scp -r plugin/kindleap.koplugin root@KINDLE:/mnt/us/koreader/plugins/

Indien bewerkt op Windows, verwijder dan de carriage returns om parse-fouten in LuaJIT te voorkomen:

sed -i 's/\r$//' /mnt/us/koreader/plugins/kindleap.koplugin/*.lua

Je kunt controleren of de plugin correct parseert vóór het herstarten:

/mnt/us/koreader/luajit -e 'print(loadfile("/mnt/us/koreader/plugins/kindleap.koplugin/main.lua") and "OK" or "ERROR")'

De plugin verschijnt vervolgens onder NetwerkQuick Share / SoftAP in het hoofdmenu van KOReader.

Bedieningselementen

EntryFunctie
Receiving: ON / offStart of stopt de ontvanger onmiddellijk. Het label toont de werkelijke status van het proces.
Start receiving at boot $\square$Bepaalt of de ontvanger automatisch start na een reboot (vereist de upstart-job).
Service statusToont modus (station / softap / down), huidig adres, of de poort open is, ontvangen bestanden en de laatste fout.
Start access pointMaakt van de Kindle een AP. Let op: de SSH-sessie wordt verbroken omdat wlan0 de station-modus verlaat.
Stop access point, restore Wi-FiSluit het AP en herstelt de normale wifi-verbinding.
Keep access point up (disarm timer)Annuleert de automatische terugkeer naar wifi-modus.
DiagnosticsToont de huidige staat: interfaces, processen, firewall-tellers en recente logs.
Save diagnostics to /mnt/usSlaat een tijdstempel-bundle en ruwe logs op in /mnt/us/kindler/logs/.

De twee schakelaars (actueel gebruik en boot-start) zijn onafhankelijk van elkaar.

Automatische terugkeer: Als er binnen tien minuten geen client verbindt, wordt het toegangspunt automatisch gesloten en wordt de normale wifi hersteld. De timer wordt gereset zodra een client verbonden is, zodat een actieve transfer niet wordt onderbroken.

Gebruik

Basisgebruik

Op de telefoon: deel een bestand, selecteer de Kindle Voyage en voltooi de verzending.

Gebruik met SoftAP

Verbind eerst de telefoon met het netwerk van de Kindle:

  • Netwerk (SSID): kindrop
  • Wachtwoord: kindlevoyage
  • Beveiliging: WPA2-PSK (CCMP)
  • Adres van de Kindle: 192.168.55.1

Quick Share werkt automatisch over deze verbinding; de daemon volgt de adreswijziging automatisch.

Belangrijk: Wijzig het wachtwoord. Het bovenstaande is het standaardwachtwoord. Bewerk wpa_passphrase (en eventueel de SSID) in device/hostapd.conf, kopieer dit naar /mnt/us/kindler/etc/hostapd.conf en herstart het toegangspunt.

Noot over beveiliging: Het AP gebruikt WPA2 omdat de wifi-firmware op een open netwerk de client nooit autoriseert, waardoor er geen data zou vloeien.

Probleemoplossing: Als de Kindle niet wordt gevonden, controleer dan het wifi-icoon van de telefoon. Bij sommige Android-versies verbreekt Quick Share de wifi-verbinding. Een contra-intuïtieve oplossing is om de wifi-hotspot van de telefoon in te schakelen (zelfs als er niets verbindt); dit voorkomt dat Quick Share de wifi-verbinding verbreekt.

Technische Werking

Dataflow: Telefoon/Desktop $\xrightarrow{\text{mDNS query}}$ Kindle (kindshare adverteert FC9F5ED42C8A.tcp) Telefoon/Desktop $\xrightarrow{\text{TCP :12345}}$ Kindle (UKEY2 handshake P-256 ECDH) Telefoon/Desktop $\xrightarrow{\text{encrypted frames}}$ Kindle (AES-256-CBC + HMAC-SHA256) Telefoon/Desktop $\xrightarrow{\text{Introduction / PayloadTransfer}}$ Kindle (/mnt/us/documents)

Componenten

  1. kindshare (daemon): Beheert de listener en de mDNS-registratie. Draait onafhankelijk van KOReader zodat ontvangst altijd mogelijk is als wifi aan staat.
  2. kindle-ap.sh: Beheert uitsluitend de SoftAP-functie.
  3. KOReader-plugin: Dient enkel als bedieningspaneel.

De daemon controleert continu de interface en adverteert opnieuw bij adreswijzigingen. Dit is cruciaal omdat mDNS een A-record publiceert voor het adres op het moment van registratie; bij een wijziging in het DHCP-lease zou een simpele supervisor de status als "gezond" rapporteren terwijl de telefoon niet kan verbinden.

De mDNS-responder is vanaf nul gebouwd (src/kindshare/mdns.go) omdat bestaande libraries vaak niet correct reageren op queries voor de eigen SRV-record. De eigen implementatie beantwoordt adres-queries, kondigt elke 45 seconden opnieuw aan, gebruikt IP TTL 255 (conform RFC 6762) en herbouwt de socket bij adreswijzigingen of na het ontwaken uit slaapstand.

Beperkingen

  • Alleen ontvangen: Verzenden vanaf de Kindle is niet geïmplementeerd.
  • Geen transfers tijdens slaapstand: De Voyage schakelt wifi agressief uit tijdens slaap. De daemon registreert zich opnieuw bij het ontwaken.
  • Geen pairing: Er worden geen Nearby Share-certificaten gebruikt. De telefoon ziet de Kindle als een onbekend apparaat (PairedKeyResult is UNABLE). Transfers werken wel, maar zonder "bekende contact"-behandeling.
  • Automatische acceptatie: Bestanden worden direct geaccepteerd en geschreven naar /mnt/us/documents, omdat interactieve prompts op e-ink niet praktisch zijn.
  • WPA2 vereist: SoftAP werkt uitsluitend met WPA2 vanwege firmwarebeperkingen.

Credits & Licentie

Het protocolwerk is gebaseerd op prior reverse engineering:

  • grishka/NearDrop — Protocoldocumentatie en .proto bestanden.
  • Martichou/rquickshare — Rust-implementatie en de ontdekking dat BLE alleen nodig is voor de andere richting.
  • google/ukey2 — De handshake-specificatie.
  • NiLuJe — Voor de usbnetwork hack en fbink.

De definities in proto/ zijn verzameld door NearDrop uit Chromium-bronnen en worden hier herverdeeld onder de oorspronkelijke BSD-voorwaarden.

Licentie: MIT — zie LICENSE.