Primary browser requests a pairing
The server creates a random pairing identifier and an authorization value for the primary side. The server stores pairing identifiers and timestamps so the primary can resume during the configured lifetime.
Technical trust and limits
A concrete account of what the browser generates, what crosses the service, what remains local, what metadata the server can still see, how recovery behaves, and which paths are actually covered by automated tests.
Pairing lifecycle
The service coordinates two browser endpoints. Pairing identity, cryptographic key agreement, content encryption, reconnect state, and user-visible recovery are separate layers.
The server creates a random pairing identifier and an authorization value for the primary side. The server stores pairing identifiers and timestamps so the primary can resume during the configured lifetime.
The current link is shaped like https://icyzip.com/?i=<pairId>. It does not contain the live-text secret, private ECDH key, derived AES key, current text, or file bytes.
The service connects the secondary browser to the waiting primary. Both sides exchange browser-generated public key data through the same WebSocket protocol or the text-only HTTP fallback.
Each side keeps its private key local, imports the peer public key, derives shared ECDH bits, and produces purpose-specific encryption keys. The service forwards public material but does not receive either private key.
Live text becomes an authenticated encrypted envelope before a text command is sent. File bytes become encrypted binary frames before leaving the sender. The paired browser authenticates and decrypts them.
A resumable tab can reconnect to the same pair. If the server-side pair is gone, IcyZip removes the stale identity, preserves the local draft, creates a fresh pair, and tells the user to scan the fresh QR code.
Cryptography in current product browsers
The implementation uses the browser WebCrypto API. This section names the actual construction so the phrase end-to-end encryption has a checkable technical meaning.
Each browser generates a P-256 ECDH keypair for the pairing. Public JWK data crosses the service. The private key remains browser-side and is exported only into that tab's local sessionStorage state for reload/reconnect continuity.
After importing the peer public key, each browser derives 256 shared ECDH bits. HKDF-SHA-256 uses the pair id as salt and the purpose string icyzip/text/ecdh/v2 to derive a 256-bit AES-GCM text key.
File transfer uses the same browser ECDH relationship only through a distinct HKDF context, icyzip/file/ecdh/v1. Each file chunk gets a fresh 96-bit nonce and an AES-GCM frame shaped as nonce, ciphertext, and authentication tag. Text and file keys are therefore purpose-separated.
Audit boundary: this construction is implemented and regression-tested, but IcyZip is not independently audited and does not claim formal verification. Wrong-key and deliberately corrupted-envelope browser cases remain a separately tracked coverage improvement.
Server visibility
Encryption protects payload contents from passive relay inspection. It does not make the coordination service disappear, and it does not hide every fact required to connect and route the pair.
The server can still see pairing identifiers, primary authorization state, connection and reconnect timing, message direction, encrypted envelope sizes, WebSocket or fallback activity, public ECDH key data, browser/device class, and IP-derived country where configured.
Current file control messages expose filename, MIME/type hint, plaintext size, encrypted wire size, chunk sizing, transfer identifiers, and timing. The file bytes are encrypted, but this metadata is not yet moved into a peer-only encrypted offer.
The service maintains aggregate counters for page requests, connections, pairings, file outcomes, broad client classes, countries, and privacy-safe diagnostic reason codes. Marked automated tests are stored separately from real counters.
IcyZip is not anonymous, serverless, zero-metadata, a public file host, a permanent share-link service, or a replacement for an independently audited secure messenger. Users should evaluate whether the remaining metadata fits their situation.
Storage and retention
Where data lives matters as much as what crosses the wire.
The server persists pairing identifiers, primary authorization values, creation time, and update time so a browser can resume. The configured lifetime is currently 30 days; cleanup removes expired pair records.
A tab may retain the current text draft and exported local keypair in sessionStorage. That state is scoped to the browser tab/session and can survive reload, but the draft may be plaintext at rest on the device.
The receiver creates a browser Blob and a local download action after successful decryption. The IcyZip server does not turn the received bytes into a persistent download object. The saved file and browser download history remain on the receiving device.
Connection recovery
Recovery behavior distinguishes an accidental transport interruption from a user intentionally ending the pair.
Visibility and online events prompt the client to evaluate the current WebSocket. A connecting socket that no longer makes progress is replaced. The client reconnects rather than leaving Android indefinitely at Connecting.
The client drops the stale pair identity and obsolete pair key, preserves the tab draft, creates a new primary pair, removes the dead ?i= from the URL, renders a fresh QR code, and shows an explicit rescan instruction.
The camera scanner accepts root pairing links from the current app origin, https://icyzip.com, staging, and controlled HTTPS IcyZip subdomains. It rejects HTTP, foreign lookalikes, credentials, wrong paths, and custom ports, and stops the camera track before navigation.
The Disconnect action destroys the pairing relationship. It does not silently reconnect to the same pair. A new session starts with a new pairing and new browser key agreement.
Automated coverage
Test coverage is evidence about exercised paths, not a guarantee for every browser version, extension, network, or operating-system policy.
| Area | Automated evidence | Current gap or qualification |
|---|---|---|
| Protocol and pairing | JSON commands, stable upgrades, cleanup, reconnect, disconnect, persistence, expiry, HTTP text fallback, and rejection of the retired colon protocol. | Production expiry uses the real 30-day configuration; the automated expiry test uses a short local TTL. |
| Chromium browser flows | Real QR pairing, two-browser text, action buttons, fullscreen, reload, multi-pair isolation, recovery, scanner fallbacks, network dampers, and encrypted file transfer with byte equality. | Extensions, enterprise policies, and every Chromium release are not enumerated. |
| Android behavior | Android Chrome emulation covers QR starts, paste focus, viewport behavior, sleep/visibility recovery, unavailable-pair fresh QR, scanner success/denial/unsupported paths, and forward progress. | Emulation is not the same as a physical-device lab across vendors and Android WebViews. |
| Firefox | A dedicated GeckoDriver action-matrix path covers browser actions in staging/production when run, and general source/protocol behavior is shared. | The full file/scanner matrix is not repeated in every Firefox release. |
| Safari and iOS | The implementation uses standard WebCrypto, file picker, link, and download mechanisms with visible fallbacks for scanner/clipboard limitations. | Safari/iOS is not currently part of the automated Linux gate; compatibility wording must remain qualified. |
| Cryptographic transport | Tests prove browser keypair exchange, no secret in the link, encrypted text envelopes, encrypted file frames, received-byte equality, keypair recovery, and text progress after reconnect. | Dedicated wrong-key, malformed-envelope, and nonce/ciphertext corruption browser regressions remain open, and there is no independent audit. |
Use decision
IcyZip is designed for short, active handoffs between two browser views you control. It is strongest when both devices are present, both tabs can stay online, and avoiding account/app/cloud-folder setup matters.
Short text, links, codes, one selected file, a nearby phone and computer, temporary paired use, and users who understand that routing metadata remains.
You need offline pickup, permanent public links, folders, large batches, resumable multi-gigabyte transfer, organizational identity/access controls, verified anonymity, or independently audited high-assurance messaging.
FAQ
These answers state the current boundary. They are intentionally narrower than generic claims such as anonymous, serverless, or zero-knowledge.
No. The current implementation has automated protocol, browser, encryption-frame, reconnect, and transfer tests, but this page does not claim an independent security audit or formal verification.
No. Current pairing links contain a pairing identifier only. Each browser generates a temporary P-256 ECDH keypair and exchanges public key data through the service.
No. The service still processes connection, timing, sizes, pairing activity, public key data, and file-offer metadata such as filename and type hint.
A tab can retain its pairing keypair and current text draft in sessionStorage so reload and reconnect can continue. This is local browser state, not server-side content storage, and the draft may be plaintext at rest in that tab.