En gjenbrukbar modul for ende-til-ende-kryptert kommunikasjon i egne apper — med samme type protokoll som brukes i Signal.
Shade er et monorepo som implementerer sikker meldingskryptering mellom to parter (for eksempel nettleser og server, eller to klienter). Meldingene er kryptert slik at transportlaget (HTTP, WebSocket, e.l.) bare ser uleselige bytes — ikke innholdet.
ShadeSessionManager (fra @shade/core) sammen med en CryptoProvider (f.eks. Web Crypto i nettleser/Bun) og lagring. Deretter kan du kalle encrypt / decrypt per motpart, akkurat som i demo-koden demo.ts.
Første melding til noen ny inneholder nøkkelavtale (X3DH). Etterpå bruker hver melding Double Ratchet: nye meldingsnøkler og periodiske DH-steg gir forward secrecy (gamle meldinger overlever ikke nøkkellekkasje) og post-compromise security (systemet «helbreder» seg over tid etter kompromittering).
Protokollen. X3DH, Double Ratchet, sesjonstyper, feiltyper. Ingen plattformkrypto her — bare grensesnittet CryptoProvider.
ShadeSessionManager — høynivå-API: initialize, createPreKeyBundle, initSessionFromBundle, encrypt, decryptImplementasjon av crypto for web/Bun/Node via SubtleCrypto — X25519, Ed25519, HKDF, HMAC, tilfeldige bytes.
shade-core i nettleser og i servere som støtter Web CryptoBinært wire-format for meldinger: versjon + type + lengdeprefiksede felt (big-endian).
0x01 = PreKeyMessage, 0x02 = RatchetMessageShadeEnvelope effektivt over nettetTransportadaptere — ikke selve krypteringen, men hvordan du sender bytes (f.eks. fetch eller WebSocket).
Prekey-server (Hono) — lagrer offentlige nøkler slik at Alice kan starte samtale mens Bob er «offline».
POST /v1/keys/register — registrer identitet + bundleGET /v1/keys/bundle/:address — hent bundle (forbruker én engangsnøkkel om tilgjengelig)POST /v1/keys/replenish — etterfyll engangsnøklerprocessPreKeyMessage fjerner den fra lager). Gir bedre beskyttelse mot visse angrep når mange klienter kobler til samme mottaker.
Klikk «Neste» for å gå gjennom rekkefølgen slik Shade er bygget. Dette speiler ShadeSessionManager og demoen i repoet.
X3DH løser problemet «jeg vil snakke med Bob nå, men Bob svarer ikke før senere». Bob legger ut en prekey bundle på serveren. Alice henter den, gjør 3 eller 4 DH-operasjoner (avhengig av om engangsnøkkel brukes), og deriverer en felles rot-nøkkel som begge kan rekonstruere uten at serveren kjenner hemmeligheten.
Double Ratchet bruker den roten som startpunkt. For hver melding (eller ved nye DH-nøkler) avledes nye nøkler; meldinger på ledningen er AES-GCM med autentisering (AAD binder kryptoteksten til ratchet-header). Protokollen håndterer også meldinger i feil rekkefølge innenfor grenser (MAX_SKIP).
Spesifikasjoner fra Signal (engelsk): X3DH · Double Ratchet.
Tenk på Shade som tre lag du kan kombinere etter behov:
Referansekjøring: bun demo.ts i rotmappen viser frontend/backend-flyt med minnelager og ekte kryptoprimitiver.