Kindshare is een software-oplossing voor gejailbreakte Kindles (getest op de Kindle Voyage) die het mogelijk maakt om bestanden direct van Android-apparaten te ontvangen via Quick Share (voorheen Nearby Share).
Belangrijkste kenmerken:
- Werking: Het systeem bestaat uit een in Go geschreven achtergrond-daemon en een KOReader-plugin die fungeert als gebruikersinterface.
- SoftAP-modus: De Kindle kan worden getransformeerd in een Wi-Fi-toegangspunt, waardoor bestanden verzonden kunnen worden zonder dat er een router of cloudservice aanwezig is.
- Integratie: Ontvangen bestanden worden direct opgeslagen in
/mnt/us/documents, waardoor e-books direct in de bibliotheek verschijnen.
- Techniek: Het project maakt gebruik van mDNS voor apparaatontdekking en hanteert een beveiligde handshake via UKEY2 met AES-256-CBC encryptie.
Beperkingen: Het systeem is uitsluitend bedoeld voor het ontvangen van bestanden. Daarnaast werken transfers niet tijdens de slaapstand van de Kindle, en worden bestanden automatisch geaccepteerd zonder interactieve prompts vanwege de beperkingen van e-ink schermen.
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 KOReader → Netwerk → Quick 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
| Pad | Beschrijving |
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 Netwerk → Quick Share / SoftAP in het hoofdmenu van KOReader.
Bedieningselementen
| Entry | Functie |
| Receiving: ON / off | Start 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 status | Toont modus (station / softap / down), huidig adres, of de poort open is, ontvangen bestanden en de laatste fout. |
| Start access point | Maakt van de Kindle een AP. Let op: de SSH-sessie wordt verbroken omdat wlan0 de station-modus verlaat. |
| Stop access point, restore Wi-Fi | Sluit het AP en herstelt de normale wifi-verbinding. |
| Keep access point up (disarm timer) | Annuleert de automatische terugkeer naar wifi-modus. |
| Diagnostics | Toont de huidige staat: interfaces, processen, firewall-tellers en recente logs. |
| Save diagnostics to /mnt/us | Slaat 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
kindshare (daemon): Beheert de listener en de mDNS-registratie. Draait onafhankelijk van KOReader zodat ontvangst altijd mogelijk is als wifi aan staat.
kindle-ap.sh: Beheert uitsluitend de SoftAP-functie.
- 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.
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 KOReader → Netwerk → Quick 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
| Pad | Beschrijving |
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 Netwerk → Quick Share / SoftAP in het hoofdmenu van KOReader.
Bedieningselementen
| Entry | Functie |
| Receiving: ON / off | Start 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 status | Toont modus (station / softap / down), huidig adres, of de poort open is, ontvangen bestanden en de laatste fout. |
| Start access point | Maakt van de Kindle een AP. Let op: de SSH-sessie wordt verbroken omdat wlan0 de station-modus verlaat. |
| Stop access point, restore Wi-Fi | Sluit het AP en herstelt de normale wifi-verbinding. |
| Keep access point up (disarm timer) | Annuleert de automatische terugkeer naar wifi-modus. |
| Diagnostics | Toont de huidige staat: interfaces, processen, firewall-tellers en recente logs. |
| Save diagnostics to /mnt/us | Slaat 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
kindshare (daemon): Beheert de listener en de mDNS-registratie. Draait onafhankelijk van KOReader zodat ontvangst altijd mogelijk is als wifi aan staat.
kindle-ap.sh: Beheert uitsluitend de SoftAP-functie.
- 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.